Skip to content
This repository has been archived by the owner on Jan 2, 2025. It is now read-only.

Commit

Permalink
Create dropdown button
Browse files Browse the repository at this point in the history
  • Loading branch information
ericvicenti committed Apr 30, 2024
1 parent 31dc9c1 commit 69b6735
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 26 deletions.
10 changes: 9 additions & 1 deletion frontend/packages/app/components/new-group.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {SubmitHandler, useForm} from 'react-hook-form'
import * as z from 'zod'
import {useCreateGroup} from '../models/groups'
import {useNavigate} from '../utils/useNavigate'
import {AppDialog, DialogTitle} from './dialog'
import {AppDialog, DialogTitle, useAppDialog} from './dialog'
import {FormInput} from './form-input'

const newGroupSchema = z.object({
Expand Down Expand Up @@ -117,3 +117,11 @@ export function CreateGroupButton({
/>
)
}

function AddGroupDialog({onClose}: {onClose: () => void}) {
return <AddGroupForm onClose={onClose} isOpen />
}

export function useCreateGroupDialog() {
return useAppDialog(AddGroupDialog)
}
26 changes: 16 additions & 10 deletions frontend/packages/app/components/options-dropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,20 @@ import {usePopoverState} from '../use-popover-state'
export type MenuItemType = {
key: string
label: string
subLabel?: string
icon: FC
onPress: () => void
}

export function OptionsDropdown({
menuItems,
hiddenUntilItemHover,
button,
}: {
menuItems: (MenuItemType | null)[]
hiddenUntilItemHover?: boolean
hover?: boolean
button?: JSX.Element
}) {
const popoverState = usePopoverState()
return (
Expand All @@ -35,16 +38,18 @@ export function OptionsDropdown({
>
<Popover {...popoverState} placement="bottom-end">
<Popover.Trigger asChild>
<Button
size="$1"
circular
data-trigger
onPress={(e) => {
// because we are nested in the outer button, we need to stop propagation or else onPress is triggered by parent button
e.stopPropagation()
}}
icon={MoreHorizontal}
/>
{button || (
<Button
size="$1"
circular
data-trigger
onPress={(e) => {
// because we are nested in the outer button, we need to stop propagation or else onPress is triggered by parent button
e.stopPropagation()
}}
icon={MoreHorizontal}
/>
)}
</Popover.Trigger>
<Popover.Content
padding={0}
Expand Down Expand Up @@ -72,6 +77,7 @@ export function OptionsDropdown({
popoverState.onOpenChange(false)
item.onPress()
}}
subTitle={item.subLabel}
title={item.label}
icon={item.icon}
/>
Expand Down
75 changes: 60 additions & 15 deletions frontend/packages/app/components/titlebar-common.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ import {
ArrowLeftFromLine,
ArrowRightFromLine,
ArrowUpRight,
Book,
Copy,
ExternalLink,
FileText,
Link,
Pencil,
Plus,
Expand Down Expand Up @@ -72,7 +74,7 @@ import {EditDocButton} from './edit-doc-button'
import {useEditGroupInfoDialog} from './edit-group-info'
import {useEditProfileDialog} from './edit-profile-dialog'
import {useFavoriteMenuItem} from './favoriting'
import {CreateGroupButton} from './new-group'
import {useCreateGroupDialog} from './new-group'
import {MenuItemType, OptionsDropdown} from './options-dropdown'
import {usePublishGroupDialog} from './publish-group'
import {TitleBarProps} from './titlebar'
Expand Down Expand Up @@ -744,48 +746,91 @@ function NewDocumentButton({
)
}

function CreateDropdown({groupVariant}: {groupVariant?: GroupVariant}) {
const openDraft = useOpenDraft('push')
const canEdit = useCanEditGroup(groupVariant?.groupId)
if (groupVariant && !canEdit) return null
const createGroup = useCreateGroupDialog()
return (
<>
<OptionsDropdown
menuItems={[
{
key: 'doc',
label: 'New Document',
icon: FileText,
onPress: () => {
openDraft(groupVariant)
},
},
{
key: 'group',
label: 'New Group',
icon: Book,
onPress: () => {
createGroup.open({})
},
},
]}
button={
<Button size="$2" icon={Plus}>
Create
</Button>
}
/>
{createGroup.content}
</>
)
}

export function PageActionButtons(props: TitleBarProps) {
const route = useNavRoute()

let buttonGroup: ReactNode[] = []
let buttonGroup: ReactNode[] = [<CreateDropdown key="create" />]
if (route.key === 'draft') {
buttonGroup = [<DraftPublicationButtons key="draftPublication" />]
} else if (route.key === 'documents') {
buttonGroup = [
<NewDocumentButton key="newDocument" groupVariant={undefined} />,
]
} else if (route.key == 'contacts') {
buttonGroup = [<ContactsPrompt key="addContact" />]
} else if (route.key == 'account' && route.tab === 'groups') {
buttonGroup = [
<CreateGroupButton key="addGroup" triggerLabel="New Group" />,
<ContactsPrompt key="addContact" />,
<CreateDropdown key="create" />,
]
} else if (route.key == 'account' && route.tab === 'groups') {
buttonGroup = [<CreateDropdown key="create" />]
} else if (route.key == 'group') {
buttonGroup = [
<VersionContext key="versionContext" route={route} />,
<GroupOptionsButton key="groupOptions" />,
<EditGroupButton route={route} key="editGroup" />,
<CreateGroupButton key="addGroup" triggerLabel="New Group" />,
<NewDocumentButton
key="newDocument"
label="Group Document"
// <NewDocumentButton
// key="newDocument"
// label="Group Document"
// groupVariant={{
// key: 'group',
// groupId: route.groupId,
// pathName: null,
// }}
// contextRoute={route}
// />,
<CreateDropdown
key="create"
groupVariant={{
key: 'group',
groupId: route.groupId,
pathName: null,
}}
contextRoute={route}
/>,
<GroupOptionsButton key="groupOptions" />,
]
} else if (route.key === 'publication') {
buttonGroup = [
<VersionContext key="versionContext" route={route} />,
<PublicationVariants key="variants" route={route} />,
<CreateDropdown key="create" />,
<DocOptionsButton key="options" />,
]
} else if (route.key === 'account') {
buttonGroup = [
<EditAccountButton key="editAccount" />,
<CreateDropdown key="create" />,
<AccountOptionsButton key="accountOptions" />,
]
}
Expand Down

0 comments on commit 69b6735

Please sign in to comment.