diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/ChangeFieldTypePopup.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/ChangeFieldTypePopup.tsx index d51c202a91..59203d5326 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/ChangeFieldTypePopup.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/ChangeFieldTypePopup.tsx @@ -1,7 +1,8 @@ import { FieldType } from '@/services/backend'; import { FieldTypeIcon } from '$app/components/_shared/EditRow/FieldTypeIcon'; import { FieldTypeName } from '$app/components/_shared/EditRow/FieldTypeName'; -import { useEffect, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; +import useOutsideClick from '$app/components/_shared/useOutsideClick'; const typesOrder: FieldType[] = [ FieldType.RichText, @@ -14,9 +15,22 @@ const typesOrder: FieldType[] = [ FieldType.Checklist, ]; -export const ChangeFieldTypePopup = ({ top, right, onClick }: { top: number; right: number; onClick: () => void }) => { +export const ChangeFieldTypePopup = ({ + top, + right, + onClick, + onOutsideClick, +}: { + top: number; + right: number; + onClick: () => void; + onOutsideClick: () => void; +}) => { const ref = useRef(null); - const [adjustedTop, setAdjustedTop] = useState(0); + const [adjustedTop, setAdjustedTop] = useState(-100); + useOutsideClick(ref, async () => { + onOutsideClick(); + }); useEffect(() => { if (!ref.current) return; @@ -31,7 +45,9 @@ export const ChangeFieldTypePopup = ({ top, right, onClick }: { top: number; rig return (
diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditFieldPopup.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditFieldPopup.tsx index 83879221d2..da6c2f922d 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditFieldPopup.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditFieldPopup.tsx @@ -8,7 +8,6 @@ import { TypeOptionController } from '$app/stores/effects/database/field/type_op import { Some } from 'ts-results'; import { FieldInfo } from '$app/stores/effects/database/field/field_controller'; import { MoreSvg } from '$app/components/_shared/svg/MoreSvg'; -import { ChangeFieldTypePopup } from '$app/components/_shared/EditRow/ChangeFieldTypePopup'; import { useAppSelector } from '$app/stores/store'; import { CellIdentifier } from '$app/stores/effects/database/cell/cell_bd_svc'; @@ -19,15 +18,15 @@ export const EditFieldPopup = ({ viewId, onOutsideClick, fieldInfo, - // changeFieldTypeClick, + changeFieldTypeClick, }: { top: number; right: number; cellIdentifier: CellIdentifier; viewId: string; - onOutsideClick?: () => void; + onOutsideClick: () => void; fieldInfo: FieldInfo | undefined; - // changeFieldTypeClick: (top: number, right: number) => void + changeFieldTypeClick: (buttonTop: number, buttonRight: number) => void; }) => { const databaseStore = useAppSelector((state) => state.database); const { t } = useTranslation(''); @@ -35,11 +34,11 @@ export const EditFieldPopup = ({ const changeTypeButtonRef = useRef(null); const [name, setName] = useState(''); - const [adjustedTop, setAdjustedTop] = useState(0); + const [adjustedTop, setAdjustedTop] = useState(-100); useOutsideClick(ref, async () => { await save(); - onOutsideClick && onOutsideClick(); + onOutsideClick(); }); useEffect(() => { @@ -65,17 +64,16 @@ export const EditFieldPopup = ({ const onChangeFieldTypeClick = () => { if (!changeTypeButtonRef.current) return; - const { top: newTop, right: newRight } = changeTypeButtonRef.current.getBoundingClientRect(); - // setChangeFieldTypeTop(newTop); - // setChangeFieldTypeRight(newRight); - // setShowChangeFieldTypePopup(true); - // changeFieldTypeClick(newTop, newRight); + const { top: buttonTop, right: buttonRight } = changeTypeButtonRef.current.getBoundingClientRect(); + changeFieldTypeClick(buttonTop, buttonRight); }; return (
diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditRow.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditRow.tsx index 88bac8f41c..bfb06bb658 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditRow.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/_shared/EditRow/EditRow.tsx @@ -6,7 +6,7 @@ import { EditCellWrapper } from '$app/components/_shared/EditRow/EditCellWrapper import AddSvg from '$app/components/_shared/svg/AddSvg'; import { useTranslation } from 'react-i18next'; import { EditFieldPopup } from '$app/components/_shared/EditRow/EditFieldPopup'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { CellIdentifier } from '$app/stores/effects/database/cell/cell_bd_svc'; import { ChangeFieldTypePopup } from '$app/components/_shared/EditRow/ChangeFieldTypePopup'; @@ -23,12 +23,22 @@ export const EditRow = ({ }) => { const { cells, onNewColumnClick } = useRow(viewId, controller, rowInfo); const { t } = useTranslation(''); + const [unveilBackdrop, setUnveilBackdrop] = useState(false); + const [unveilForm, setUnveilForm] = useState(false); const [showFieldEditor, setShowFieldEditor] = useState(false); const [editFieldTop, setEditFieldTop] = useState(0); const [editFieldRight, setEditFieldRight] = useState(0); const [showChangeFieldTypePopup, setShowChangeFieldTypePopup] = useState(false); const [changeFieldTypeTop, setChangeFieldTypeTop] = useState(0); const [changeFieldTypeRight, setChangeFieldTypeRight] = useState(0); + const [editingCell, setEditingCell] = useState<{ cellIdentifier: CellIdentifier; fieldId: string } | null>(null); + + useEffect(() => { + setUnveilBackdrop(true); + setTimeout(() => { + setUnveilForm(true); + }, 300); + }, []); const onEditFieldClick = (cell: { cellIdentifier: CellIdentifier; fieldId: string }, top: number, right: number) => { setEditingCell(cell); @@ -37,12 +47,38 @@ export const EditRow = ({ setShowFieldEditor(true); }; - const [editingCell, setEditingCell] = useState<{ cellIdentifier: CellIdentifier; fieldId: string } | null>(null); + const onChangeFieldTypeClick = (buttonTop: number, buttonRight: number) => { + setChangeFieldTypeTop(buttonTop); + setChangeFieldTypeRight(buttonRight); + setShowChangeFieldTypePopup(true); + }; + + const onOutsideEditFieldClick = () => { + if (!showChangeFieldTypePopup) { + setShowFieldEditor(false); + } + }; + + const onCloseClick = () => { + setUnveilBackdrop(false); + setUnveilForm(false); + setTimeout(() => { + onClose(); + }, 300); + }; return ( -
-
-
onClose()} className={'absolute top-4 right-4'}> +
+
+
onCloseClick()} className={'absolute top-4 right-4'}> @@ -64,8 +100,9 @@ export const EditRow = ({ right={editFieldRight} cellIdentifier={editingCell.cellIdentifier} viewId={viewId} - onOutsideClick={() => setShowFieldEditor(false)} + onOutsideClick={onOutsideEditFieldClick} fieldInfo={controller.fieldController.getField(editingCell.cellIdentifier.fieldId)} + changeFieldTypeClick={onChangeFieldTypeClick} > )} {showChangeFieldTypePopup && ( @@ -73,6 +110,7 @@ export const EditRow = ({ top={changeFieldTypeTop} right={changeFieldTypeRight} onClick={() => setShowChangeFieldTypePopup(false)} + onOutsideClick={() => setShowChangeFieldTypePopup(false)} > )}
diff --git a/frontend/appflowy_tauri/src/appflowy_app/components/error/ErrorModal.tsx b/frontend/appflowy_tauri/src/appflowy_app/components/error/ErrorModal.tsx index 1251c4dcfe..216dd872ec 100644 --- a/frontend/appflowy_tauri/src/appflowy_app/components/error/ErrorModal.tsx +++ b/frontend/appflowy_tauri/src/appflowy_app/components/error/ErrorModal.tsx @@ -3,7 +3,7 @@ import { CloseSvg } from '../_shared/svg/CloseSvg'; export const ErrorModal = ({ message, onClose }: { message: string; onClose: () => void }) => { return ( -
+