chore: fix issue where tag could not be added to vault

This commit is contained in:
Aman Harwara
2023-08-07 17:53:28 +05:30
parent f0b3d939c5
commit 8a029950ec
5 changed files with 52 additions and 87 deletions

View File

@@ -28,7 +28,7 @@ const ContactItem = ({ contact }: Props) => {
<EditContactModal editContactUuid={contact.contactUuid} onCloseDialog={closeContactModal} /> <EditContactModal editContactUuid={contact.contactUuid} onCloseDialog={closeContactModal} />
</ModalOverlay> </ModalOverlay>
<div className="bg-gray-100 flex flex-row gap-3.5 rounded-lg px-3.5 py-2.5 border border-border shadow"> <div className="flex flex-row gap-3.5 rounded-lg px-3.5 py-2.5 border border-border shadow">
<Icon type="user" size="custom" className="mt-2 h-5 w-5 flex-shrink-0" /> <Icon type="user" size="custom" className="mt-2 h-5 w-5 flex-shrink-0" />
<div className="flex flex-col gap-1 py-1.5 overflow-hidden"> <div className="flex flex-col gap-1 py-1.5 overflow-hidden">
<span <span

View File

@@ -107,15 +107,15 @@ const VaultItem = ({ vault }: Props) => {
<EditVaultModal existingVaultUuid={vault.uuid} onCloseDialog={closeVaultModal} /> <EditVaultModal existingVaultUuid={vault.uuid} onCloseDialog={closeVaultModal} />
</ModalOverlay> </ModalOverlay>
<div className="bg-gray-100 flex flex-row gap-3.5 rounded-lg px-3.5 py-2.5 shadow-md"> <div className="flex flex-row gap-3.5 rounded-lg px-3.5 py-2.5 border border-border shadow">
<Icon type={'safe-square'} size="custom" className="mt-2.5 h-5.5 w-5.5 flex-shrink-0" /> <Icon type="safe-square" size="custom" className="mt-2.5 h-5.5 w-5.5 flex-shrink-0" />
<div className="flex flex-col gap-2 py-1.5"> <div className="flex flex-col gap-2 py-1.5">
<span className="mr-auto overflow-hidden text-ellipsis text-base font-bold">{vault.name}</span> <span className="mr-auto overflow-hidden text-ellipsis text-base font-bold">{vault.name}</span>
<span className="mr-auto overflow-hidden text-ellipsis text-sm">{vault.description}</span> <span className="mr-auto overflow-hidden text-ellipsis text-sm">{vault.description}</span>
<span className="mr-auto overflow-hidden text-ellipsis text-sm">Vault ID: {vault.systemIdentifier}</span> <span className="mr-auto overflow-hidden text-ellipsis text-sm">Vault ID: {vault.systemIdentifier}</span>
<div className="mt-2.5 flex w-full flex-row justify-between"> <div className="mt-2 flex w-full flex-row justify-between">
<div className="mt-2.5 flex flex-row"> <div className="flex flex-row">
<Button label="Edit" className={'mr-3 text-xs'} onClick={openEditModal} /> <Button label="Edit" className={'mr-3 text-xs'} onClick={openEditModal} />
{isAdmin && ( {isAdmin && (
<Button colorStyle="danger" label="Delete" className={'mr-3 text-xs'} onClick={deleteVault} /> <Button colorStyle="danger" label="Delete" className={'mr-3 text-xs'} onClick={deleteVault} />
@@ -124,7 +124,7 @@ const VaultItem = ({ vault }: Props) => {
<Button label="Leave Vault" className={'mr-3 text-xs'} onClick={leaveVault} /> <Button label="Leave Vault" className={'mr-3 text-xs'} onClick={leaveVault} />
)} )}
</div> </div>
<div className="mt-2.5 flex flex-row"> <div className="flex flex-row">
{vault.isSharedVaultListing() ? ( {vault.isSharedVaultListing() ? (
<Button label="Invite Contacts" className={'mr-3 text-xs'} onClick={openInviteModal} /> <Button label="Invite Contacts" className={'mr-3 text-xs'} onClick={openInviteModal} />
) : ( ) : (

View File

@@ -1,11 +1,10 @@
import { observer } from 'mobx-react-lite' import { observer } from 'mobx-react-lite'
import { useCallback, useRef, useMemo } from 'react' import { useCallback, useMemo } from 'react'
import Icon from '@/Components/Icon/Icon' import Icon from '@/Components/Icon/Icon'
import Menu from '@/Components/Menu/Menu' import Menu from '@/Components/Menu/Menu'
import MenuItem from '@/Components/Menu/MenuItem' import MenuItem from '@/Components/Menu/MenuItem'
import { usePremiumModal } from '@/Hooks/usePremiumModal' import { usePremiumModal } from '@/Hooks/usePremiumModal'
import { SNTag, VectorIconNameOrEmoji, DefaultTagIconName } from '@standardnotes/snjs' import { SNTag, VectorIconNameOrEmoji, DefaultTagIconName } from '@standardnotes/snjs'
import { useCloseOnClickOutside } from '@/Hooks/useCloseOnClickOutside'
import { NavigationController } from '@/Controllers/Navigation/NavigationController' import { NavigationController } from '@/Controllers/Navigation/NavigationController'
import HorizontalSeparator from '../Shared/HorizontalSeparator' import HorizontalSeparator from '../Shared/HorizontalSeparator'
import { formatDateForContextMenu } from '@/Utils/DateUtils' import { formatDateForContextMenu } from '@/Utils/DateUtils'
@@ -29,11 +28,6 @@ const TagContextMenu = ({ navigationController, isEntitledToFolders, selectedTag
const { contextMenuOpen, contextMenuClickLocation } = navigationController const { contextMenuOpen, contextMenuClickLocation } = navigationController
const contextMenuRef = useRef<HTMLDivElement>(null)
/** @TODO Needs fixing to handle clicking on the vault selection sub menu */
useCloseOnClickOutside(contextMenuRef, () => navigationController.setContextMenuOpen(false))
const onClickAddSubtag = useCallback(() => { const onClickAddSubtag = useCallback(() => {
if (!isEntitledToFolders) { if (!isEntitledToFolders) {
premiumModal.activate('Folders') premiumModal.activate('Folders')
@@ -77,7 +71,6 @@ const TagContextMenu = ({ navigationController, isEntitledToFolders, selectedTag
togglePopover={() => navigationController.setContextMenuOpen(!contextMenuOpen)} togglePopover={() => navigationController.setContextMenuOpen(!contextMenuOpen)}
className="py-2" className="py-2"
> >
<div ref={contextMenuRef}>
<Menu a11yLabel="Tag context menu" isOpen={contextMenuOpen}> <Menu a11yLabel="Tag context menu" isOpen={contextMenuOpen}>
<IconPicker <IconPicker
key={'icon-picker'} key={'icon-picker'}
@@ -126,7 +119,6 @@ const TagContextMenu = ({ navigationController, isEntitledToFolders, selectedTag
<span className="font-semibold">Tag ID:</span> {selectedTag.uuid} <span className="font-semibold">Tag ID:</span> {selectedTag.uuid}
</div> </div>
</div> </div>
</div>
</Popover> </Popover>
) )
} }

View File

@@ -107,7 +107,6 @@ const VaultMenu = ({ items }: { items: DecryptedItemInterface[] }) => {
} }
const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string; items: DecryptedItemInterface[] }) => { const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string; items: DecryptedItemInterface[] }) => {
const menuContainerRef = useRef<HTMLDivElement>(null)
const buttonRef = useRef<HTMLButtonElement>(null) const buttonRef = useRef<HTMLButtonElement>(null)
const [isSubMenuOpen, setIsSubMenuOpen] = useState(false) const [isSubMenuOpen, setIsSubMenuOpen] = useState(false)
@@ -121,7 +120,7 @@ const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string;
} }
return ( return (
<div ref={menuContainerRef}> <>
<MenuItem <MenuItem
className="justify-between" className="justify-between"
onClick={toggleSubMenu} onClick={toggleSubMenu}
@@ -150,7 +149,7 @@ const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string;
> >
<VaultMenu items={items} /> <VaultMenu items={items} />
</Popover> </Popover>
</div> </>
) )
} }

View File

@@ -1,26 +0,0 @@
import { useCallback, useEffect } from 'react'
export function useCloseOnClickOutside(container: { current: HTMLDivElement | null }, callback: () => void): void {
const closeOnClickOutside = useCallback(
(event: { target: EventTarget | null }) => {
if (!container.current) {
return
}
const isDescendantOfContainer = container.current.contains(event.target as Node)
const isDescendantOfDialog = (event.target as HTMLElement).closest('[role="dialog"]')
if (!isDescendantOfContainer && !isDescendantOfDialog) {
callback()
}
},
[container, callback],
)
useEffect(() => {
document.addEventListener('click', closeOnClickOutside, { capture: true })
return () => {
document.removeEventListener('click', closeOnClickOutside, {
capture: true,
})
}
}, [closeOnClickOutside])
}