Fix(view): Show Kanban View Creation (#5985)

# This PR
- Revise my previous work (PR #5969)
Because it would break the current logic and cause unexpected behavior.
(Issue #5979)
- Solve (Issue #5915) with another way

@lucasbordeau  What do you think about my current approach?
@JarWarren Please check it out—I'd love to get your feedback too!

---------

Co-authored-by: Achsan <achsanh@gmail.com>
Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
Us3r-gitHub
2024-06-24 21:05:40 +07:00
committed by GitHub
parent 57bbd7c129
commit 24c31f9b39
3 changed files with 16 additions and 22 deletions

View File

@ -1,5 +1,5 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';
import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView';
import { useGetAvailableFieldsForKanban } from '@/views/view-picker/hooks/useGetAvailableFieldsForKanban'; import { useGetAvailableFieldsForKanban } from '@/views/view-picker/hooks/useGetAvailableFieldsForKanban';
@ -22,9 +22,8 @@ export const ViewPickerCreateOrEditContentEffect = () => {
); );
const setViewPickerInputName = useSetRecoilState(viewPickerInputNameState); const setViewPickerInputName = useSetRecoilState(viewPickerInputNameState);
const setViewPickerKanbanFieldMetadataId = useSetRecoilState( const [viewPickerKanbanFieldMetadataId, setViewPickerKanbanFieldMetadataId] =
viewPickerKanbanFieldMetadataIdState, useRecoilState(viewPickerKanbanFieldMetadataIdState);
);
const setViewPickerType = useSetRecoilState(viewPickerTypeState); const setViewPickerType = useSetRecoilState(viewPickerTypeState);
const viewPickerReferenceViewId = useRecoilValue( const viewPickerReferenceViewId = useRecoilValue(
@ -50,13 +49,11 @@ export const ViewPickerCreateOrEditContentEffect = () => {
) { ) {
setViewPickerSelectedIcon(referenceView.icon); setViewPickerSelectedIcon(referenceView.icon);
setViewPickerInputName(referenceView.name); setViewPickerInputName(referenceView.name);
setViewPickerKanbanFieldMetadataId(referenceView.kanbanFieldMetadataId);
setViewPickerType(referenceView.type); setViewPickerType(referenceView.type);
} }
}, [ }, [
referenceView, referenceView,
setViewPickerInputName, setViewPickerInputName,
setViewPickerKanbanFieldMetadataId,
setViewPickerSelectedIcon, setViewPickerSelectedIcon,
setViewPickerType, setViewPickerType,
viewPickerIsPersisting, viewPickerIsPersisting,
@ -64,13 +61,22 @@ export const ViewPickerCreateOrEditContentEffect = () => {
]); ]);
useEffect(() => { useEffect(() => {
if (availableFieldsForKanban.length > 0 && !viewPickerIsDirty) { if (
setViewPickerKanbanFieldMetadataId(availableFieldsForKanban[0].id); isDefined(referenceView) &&
availableFieldsForKanban.length > 0 &&
viewPickerKanbanFieldMetadataId === ''
) {
setViewPickerKanbanFieldMetadataId(
referenceView.kanbanFieldMetadataId !== ''
? referenceView.kanbanFieldMetadataId
: availableFieldsForKanban[0].id,
);
} }
}, [ }, [
referenceView,
availableFieldsForKanban, availableFieldsForKanban,
viewPickerKanbanFieldMetadataId,
setViewPickerKanbanFieldMetadataId, setViewPickerKanbanFieldMetadataId,
viewPickerIsDirty,
]); ]);
return <></>; return <></>;

View File

@ -1,6 +1,6 @@
import { useTheme } from '@emotion/react'; import { useTheme } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useRecoilValue } from 'recoil';
import { import {
IconChevronDown, IconChevronDown,
IconList, IconList,
@ -19,7 +19,6 @@ import { ViewPickerListContent } from '@/views/view-picker/components/ViewPicker
import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId'; import { VIEW_PICKER_DROPDOWN_ID } from '@/views/view-picker/constants/ViewPickerDropdownId';
import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode'; import { useViewPickerMode } from '@/views/view-picker/hooks/useViewPickerMode';
import { useViewPickerPersistView } from '@/views/view-picker/hooks/useViewPickerPersistView'; import { useViewPickerPersistView } from '@/views/view-picker/hooks/useViewPickerPersistView';
import { useViewPickerStates } from '@/views/view-picker/hooks/useViewPickerStates';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
import { useViewStates } from '../../hooks/internal/useViewStates'; import { useViewStates } from '../../hooks/internal/useViewStates';
@ -53,8 +52,6 @@ export const ViewPickerDropdown = () => {
const { entityCountInCurrentViewState } = useViewStates(); const { entityCountInCurrentViewState } = useViewStates();
const { viewPickerIsDirtyState } = useViewPickerStates();
const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView(); const { currentViewWithCombinedFiltersAndSorts } = useGetCurrentView();
const { handleUpdate } = useViewPickerPersistView(); const { handleUpdate } = useViewPickerPersistView();
@ -63,8 +60,6 @@ export const ViewPickerDropdown = () => {
entityCountInCurrentViewState, entityCountInCurrentViewState,
); );
const setViewPickerIsDirty = useSetRecoilState(viewPickerIsDirtyState);
const { isDropdownOpen: isViewsListDropdownOpen } = useDropdown( const { isDropdownOpen: isViewsListDropdownOpen } = useDropdown(
VIEW_PICKER_DROPDOWN_ID, VIEW_PICKER_DROPDOWN_ID,
); );
@ -75,7 +70,6 @@ export const ViewPickerDropdown = () => {
const CurrentViewIcon = getIcon(currentViewWithCombinedFiltersAndSorts?.icon); const CurrentViewIcon = getIcon(currentViewWithCombinedFiltersAndSorts?.icon);
const handleClickOutside = async () => { const handleClickOutside = async () => {
setViewPickerIsDirty(false);
if (isViewsListDropdownOpen && viewPickerMode === 'edit') { if (isViewsListDropdownOpen && viewPickerMode === 'edit') {
await handleUpdate(); await handleUpdate();
} }

View File

@ -5,16 +5,13 @@ import { useRecoilValue, useSetRecoilState } from 'recoil';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState'; import { navigationMemorizedUrlState } from '@/ui/navigation/states/navigationMemorizedUrlState';
import { useViewStates } from '@/views/hooks/internal/useViewStates'; import { useViewStates } from '@/views/hooks/internal/useViewStates';
import { useViewPickerStates } from '@/views/view-picker/hooks/useViewPickerStates';
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
export const useGetAvailableFieldsForKanban = () => { export const useGetAvailableFieldsForKanban = () => {
const { viewObjectMetadataIdState } = useViewStates(); const { viewObjectMetadataIdState } = useViewStates();
const { viewPickerIsDirtyState } = useViewPickerStates();
const viewObjectMetadataId = useRecoilValue(viewObjectMetadataIdState); const viewObjectMetadataId = useRecoilValue(viewObjectMetadataIdState);
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const setViewPickerIsDirty = useSetRecoilState(viewPickerIsDirtyState);
const setNavigationMemorizedUrl = useSetRecoilState( const setNavigationMemorizedUrl = useSetRecoilState(
navigationMemorizedUrlState, navigationMemorizedUrlState,
); );
@ -32,15 +29,12 @@ export const useGetAvailableFieldsForKanban = () => {
const navigate = useNavigate(); const navigate = useNavigate();
const navigateToSelectSettings = useCallback(() => { const navigateToSelectSettings = useCallback(() => {
setViewPickerIsDirty(false);
setNavigationMemorizedUrl(location.pathname + location.search); setNavigationMemorizedUrl(location.pathname + location.search);
navigate(`/settings/objects/${objectMetadataItem?.namePlural}`); navigate(`/settings/objects/${objectMetadataItem?.namePlural}`);
}, [ }, [
navigate, navigate,
objectMetadataItem?.namePlural, objectMetadataItem?.namePlural,
setViewPickerIsDirty,
setNavigationMemorizedUrl, setNavigationMemorizedUrl,
location, location,
]); ]);