mirror of
https://github.com/lingble/twenty.git
synced 2025-11-08 16:53:16 +00:00
Refactor Field Inputs (#3658)
* Rename field to record-field folder * Simplify FieldInput * Fix perfs * Fixes * Fixes * Fix tests * Fix tests
This commit is contained in:
@@ -7,11 +7,11 @@ import { AttachmentIcon } from '@/activities/files/components/AttachmentIcon';
|
|||||||
import { Attachment } from '@/activities/files/types/Attachment';
|
import { Attachment } from '@/activities/files/types/Attachment';
|
||||||
import { downloadFile } from '@/activities/files/utils/downloadFile';
|
import { downloadFile } from '@/activities/files/utils/downloadFile';
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
|
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
|
||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
GenericFieldContextType,
|
GenericFieldContextType,
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
|
|
||||||
import { IconCalendar } from '@/ui/display/icon';
|
import { IconCalendar } from '@/ui/display/icon';
|
||||||
import { REACT_APP_SERVER_BASE_URL } from '~/config';
|
import { REACT_APP_SERVER_BASE_URL } from '~/config';
|
||||||
import { formatToHumanReadableDate } from '~/utils';
|
import { formatToHumanReadableDate } from '~/utils';
|
||||||
|
|||||||
@@ -3,11 +3,10 @@ import { useActivityTargetObjectRecords } from '@/activities/hooks/useActivityTa
|
|||||||
import { ActivityTargetInlineCellEditMode } from '@/activities/inline-cell/components/ActivityTargetInlineCellEditMode';
|
import { ActivityTargetInlineCellEditMode } from '@/activities/inline-cell/components/ActivityTargetInlineCellEditMode';
|
||||||
import { ActivityTarget } from '@/activities/types/ActivityTarget';
|
import { ActivityTarget } from '@/activities/types/ActivityTarget';
|
||||||
import { GraphQLActivity } from '@/activities/types/GraphQLActivity';
|
import { GraphQLActivity } from '@/activities/types/GraphQLActivity';
|
||||||
|
import { RecordFieldInputScope } from '@/object-record/record-field/scopes/RecordFieldInputScope';
|
||||||
import { RecordInlineCellContainer } from '@/object-record/record-inline-cell/components/RecordInlineCellContainer';
|
import { RecordInlineCellContainer } from '@/object-record/record-inline-cell/components/RecordInlineCellContainer';
|
||||||
import { FieldRecoilScopeContext } from '@/object-record/record-inline-cell/states/recoil-scope-contexts/FieldRecoilScopeContext';
|
|
||||||
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
import { RelationPickerHotkeyScope } from '@/object-record/relation-picker/types/RelationPickerHotkeyScope';
|
||||||
import { IconArrowUpRight, IconPencil } from '@/ui/display/icon';
|
import { IconArrowUpRight, IconPencil } from '@/ui/display/icon';
|
||||||
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
|
|
||||||
|
|
||||||
type ActivityTargetsInlineCellProps = {
|
type ActivityTargetsInlineCellProps = {
|
||||||
activity?: Pick<GraphQLActivity, 'id'> & {
|
activity?: Pick<GraphQLActivity, 'id'> & {
|
||||||
@@ -27,7 +26,7 @@ export const ActivityTargetsInlineCell = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<RecoilScope CustomRecoilScopeContext={FieldRecoilScopeContext}>
|
<RecordFieldInputScope recordFieldInputScopeId={activity?.id ?? ''}>
|
||||||
<RecordInlineCellContainer
|
<RecordInlineCellContainer
|
||||||
buttonIcon={IconPencil}
|
buttonIcon={IconPencil}
|
||||||
customEditHotkeyScope={{
|
customEditHotkeyScope={{
|
||||||
@@ -48,6 +47,6 @@ export const ActivityTargetsInlineCell = ({
|
|||||||
}
|
}
|
||||||
isDisplayModeContentEmpty={activityTargetObjectRecords.length === 0}
|
isDisplayModeContentEmpty={activityTargetObjectRecords.length === 0}
|
||||||
/>
|
/>
|
||||||
</RecoilScope>
|
</RecordFieldInputScope>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { getActivityPreview } from '@/activities/utils/getActivityPreview';
|
|||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
GenericFieldContextType,
|
GenericFieldContextType,
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { IconComment } from '@/ui/display/icon';
|
import { IconComment } from '@/ui/display/icon';
|
||||||
|
|
||||||
const StyledCard = styled.div<{ isSingleNote: boolean }>`
|
const StyledCard = styled.div<{ isSingleNote: boolean }>`
|
||||||
|
|||||||
@@ -3,16 +3,16 @@ import styled from '@emotion/styled';
|
|||||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
import {
|
|
||||||
FieldContext,
|
|
||||||
RecordUpdateHook,
|
|
||||||
RecordUpdateHookParams,
|
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext';
|
import { BoardCardIdContext } from '@/object-record/record-board-deprecated/contexts/BoardCardIdContext';
|
||||||
import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal';
|
import { useCurrentRecordBoardDeprecatedCardSelectedInternal } from '@/object-record/record-board-deprecated/hooks/internal/useCurrentRecordBoardDeprecatedCardSelectedInternal';
|
||||||
import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates';
|
import { useRecordBoardDeprecatedScopedStates } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedScopedStates';
|
||||||
import { isRecordBoardDeprecatedCardInCompactViewFamilyState } from '@/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState';
|
import { isRecordBoardDeprecatedCardInCompactViewFamilyState } from '@/object-record/record-board-deprecated/states/isRecordBoardDeprecatedCardInCompactViewFamilyState';
|
||||||
|
import {
|
||||||
|
FieldContext,
|
||||||
|
RecordUpdateHook,
|
||||||
|
RecordUpdateHookParams,
|
||||||
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
|
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
|
||||||
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
||||||
import { EntityChipVariant } from '@/ui/display/chip/components/EntityChip';
|
import { EntityChipVariant } from '@/ui/display/chip/components/EntityChip';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields';
|
import { mapBoardFieldDefinitionsToViewFields } from '@/companies/utils/mapBoardFieldDefinitionsToViewFields';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
describe('mapBoardFieldDefinitionsToViewFields', () => {
|
describe('mapBoardFieldDefinitionsToViewFields', () => {
|
||||||
it('should map board field definitions to view fields', () => {
|
it('should map board field definitions to view fields', () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { ViewField } from '@/views/types/ViewField';
|
import { ViewField } from '@/views/types/ViewField';
|
||||||
|
|
||||||
export const mapBoardFieldDefinitionsToViewFields = (
|
export const mapBoardFieldDefinitionsToViewFields = (
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { Nullable } from '~/types/Nullable';
|
import { Nullable } from '~/types/Nullable';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { ApolloClient, useMutation } from '@apollo/client';
|
import { ApolloClient, useMutation } from '@apollo/client';
|
||||||
import { getOperationName } from '@apollo/client/utilities';
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
|
|
||||||
import { FieldType } from '@/object-record/field/types/FieldType';
|
import { FieldType } from '@/object-record/record-field/types/FieldType';
|
||||||
import {
|
import {
|
||||||
CreateOneFieldMetadataItemMutation,
|
CreateOneFieldMetadataItemMutation,
|
||||||
CreateOneFieldMetadataItemMutationVariables,
|
CreateOneFieldMetadataItemMutationVariables,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { v4 } from 'uuid';
|
import { v4 } from 'uuid';
|
||||||
|
|
||||||
import { FieldType } from '@/object-record/field/types/FieldType';
|
import { FieldType } from '@/object-record/record-field/types/FieldType';
|
||||||
import { Field } from '~/generated/graphql';
|
import { Field } from '~/generated/graphql';
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||||
import { FieldType } from '@/object-record/field/types/FieldType';
|
import { FieldType } from '@/object-record/record-field/types/FieldType';
|
||||||
|
|
||||||
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType';
|
import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
|
|
||||||
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
import { FieldMetadataItem } from '../types/FieldMetadataItem';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||||
import { FieldDefinitionRelationType } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinitionRelationType } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import {
|
import {
|
||||||
FieldMetadataType,
|
FieldMetadataType,
|
||||||
RelationMetadataType,
|
RelationMetadataType,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FieldType } from '@/object-record/field/types/FieldType';
|
import { FieldType } from '@/object-record/record-field/types/FieldType';
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
export const parseFieldType = (fieldType: FieldMetadataType): FieldType => {
|
export const parseFieldType = (fieldType: FieldMetadataType): FieldType => {
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
import { act, renderHook } from '@testing-library/react';
|
|
||||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
|
||||||
|
|
||||||
import {
|
|
||||||
fieldMetadataId,
|
|
||||||
textfieldDefinition,
|
|
||||||
} from '@/object-record/field/__mocks__/fieldDefinitions';
|
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
|
||||||
import { entityFieldInitialValueFamilyState } from '@/object-record/field/states/entityFieldInitialValueFamilyState';
|
|
||||||
|
|
||||||
import { useFieldInitialValue } from '../useFieldInitialValue';
|
|
||||||
|
|
||||||
const entityId = 'entityId';
|
|
||||||
|
|
||||||
const wrapper = ({ children }: { children: ReactNode }) => (
|
|
||||||
<RecoilRoot>
|
|
||||||
<FieldContext.Provider
|
|
||||||
value={{
|
|
||||||
fieldDefinition: textfieldDefinition,
|
|
||||||
entityId,
|
|
||||||
hotkeyScope: 'hotkeyScope',
|
|
||||||
isLabelIdentifier: false,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{children}
|
|
||||||
</FieldContext.Provider>
|
|
||||||
</RecoilRoot>
|
|
||||||
);
|
|
||||||
|
|
||||||
describe('useFieldInitialValue', () => {
|
|
||||||
it('should work as expected', () => {
|
|
||||||
const { result } = renderHook(
|
|
||||||
() => {
|
|
||||||
const setFieldInitialValue = useSetRecoilState(
|
|
||||||
entityFieldInitialValueFamilyState({
|
|
||||||
fieldMetadataId,
|
|
||||||
entityId,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
setFieldInitialValue,
|
|
||||||
fieldInitialValue: useFieldInitialValue(),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
{
|
|
||||||
wrapper,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(result.current.fieldInitialValue).toBeUndefined();
|
|
||||||
|
|
||||||
const initialValue = { isEmpty: false, value: 'Sheldon Cooper' };
|
|
||||||
|
|
||||||
act(() => {
|
|
||||||
result.current.setFieldInitialValue(initialValue);
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(result.current.fieldInitialValue).toEqual(initialValue);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
import { act, renderHook } from '@testing-library/react';
|
|
||||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
|
||||||
|
|
||||||
import { phoneFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions';
|
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
|
||||||
import { useIsFieldEditModeValueEmpty } from '@/object-record/field/hooks/useIsFieldEditModeValueEmpty';
|
|
||||||
import { entityFieldsEditModeValueFamilyState } from '@/object-record/field/states/entityFieldsEditModeValueFamilyState';
|
|
||||||
|
|
||||||
const entityId = 'entityId';
|
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
|
||||||
<FieldContext.Provider
|
|
||||||
value={{
|
|
||||||
fieldDefinition: phoneFieldDefinition,
|
|
||||||
entityId,
|
|
||||||
hotkeyScope: 'hotkeyScope',
|
|
||||||
isLabelIdentifier: false,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<RecoilRoot>{children}</RecoilRoot>
|
|
||||||
</FieldContext.Provider>
|
|
||||||
);
|
|
||||||
|
|
||||||
describe('useIsFieldEditModeValueEmpty', () => {
|
|
||||||
it('should work as expected', () => {
|
|
||||||
const { result } = renderHook(
|
|
||||||
() => {
|
|
||||||
const setFieldEditModeValue = useSetRecoilState(
|
|
||||||
entityFieldsEditModeValueFamilyState(entityId),
|
|
||||||
);
|
|
||||||
return {
|
|
||||||
setFieldEditModeValue,
|
|
||||||
isFieldEditModeValueEmpty: useIsFieldEditModeValueEmpty(),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
{
|
|
||||||
wrapper: Wrapper,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(result.current.isFieldEditModeValueEmpty).toBe(true);
|
|
||||||
|
|
||||||
act(() => {
|
|
||||||
result.current.setFieldEditModeValue({
|
|
||||||
phone: '+1 233223',
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(result.current.isFieldEditModeValueEmpty).toBe(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
import { ReactNode } from 'react';
|
|
||||||
import { MockedProvider } from '@apollo/client/testing';
|
|
||||||
import { act, renderHook } from '@testing-library/react';
|
|
||||||
import { RecoilRoot, useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { phoneFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions';
|
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
|
||||||
import { useSaveFieldEditModeValue } from '@/object-record/field/hooks/useSaveFieldEditModeValue';
|
|
||||||
import { entityFieldsEditModeValueFamilySelector } from '@/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector';
|
|
||||||
|
|
||||||
const entityId = 'entityId';
|
|
||||||
const fieldName = 'phone';
|
|
||||||
|
|
||||||
const Wrapper = ({ children }: { children: ReactNode }) => {
|
|
||||||
return (
|
|
||||||
<MockedProvider addTypename={false}>
|
|
||||||
<FieldContext.Provider
|
|
||||||
value={{
|
|
||||||
fieldDefinition: phoneFieldDefinition,
|
|
||||||
entityId,
|
|
||||||
hotkeyScope: 'hotkeyScope',
|
|
||||||
isLabelIdentifier: false,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<RecoilRoot>{children}</RecoilRoot>
|
|
||||||
</FieldContext.Provider>
|
|
||||||
</MockedProvider>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
describe('useSaveFieldEditModeValue', () => {
|
|
||||||
it('should work as expected', () => {
|
|
||||||
const {
|
|
||||||
result: { current },
|
|
||||||
} = renderHook(
|
|
||||||
() => {
|
|
||||||
const entityFieldsEditModeValue = useRecoilValue(
|
|
||||||
entityFieldsEditModeValueFamilySelector({ entityId, fieldName }),
|
|
||||||
);
|
|
||||||
return {
|
|
||||||
saveFieldEditModeValue: useSaveFieldEditModeValue(),
|
|
||||||
entityFieldsEditModeValue,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
{ wrapper: Wrapper },
|
|
||||||
);
|
|
||||||
|
|
||||||
expect(current.entityFieldsEditModeValue).toBeUndefined();
|
|
||||||
|
|
||||||
act(() => {
|
|
||||||
current.saveFieldEditModeValue('test');
|
|
||||||
});
|
|
||||||
|
|
||||||
// We expect `current.entityFieldsEditModeValue` to be updated
|
|
||||||
// but I think it's async
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import { useContext } from 'react';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
|
||||||
import { entityFieldInitialValueFamilyState } from '../states/entityFieldInitialValueFamilyState';
|
|
||||||
|
|
||||||
export const useFieldInitialValue = () => {
|
|
||||||
const { entityId, fieldDefinition } = useContext(FieldContext);
|
|
||||||
|
|
||||||
const fieldInitialValue = useRecoilValue(
|
|
||||||
entityFieldInitialValueFamilyState({
|
|
||||||
fieldMetadataId: fieldDefinition.fieldMetadataId,
|
|
||||||
entityId,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return fieldInitialValue;
|
|
||||||
};
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import { useContext } from 'react';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
import { isEntityFieldEditModeEmptyFamilySelector } from '@/object-record/field/states/selectors/isEntityFieldEditModeEmptyFamilySelector';
|
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
|
||||||
|
|
||||||
export const useIsFieldEditModeValueEmpty = () => {
|
|
||||||
const { entityId, fieldDefinition } = useContext(FieldContext);
|
|
||||||
|
|
||||||
const isFieldEditModeValueEmpty = useRecoilValue(
|
|
||||||
isEntityFieldEditModeEmptyFamilySelector({
|
|
||||||
fieldDefinition: {
|
|
||||||
type: fieldDefinition.type,
|
|
||||||
},
|
|
||||||
fieldName: fieldDefinition.metadata.fieldName,
|
|
||||||
entityId,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return isFieldEditModeValueEmpty;
|
|
||||||
};
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
import { useContext } from 'react';
|
|
||||||
import { useRecoilCallback } from 'recoil';
|
|
||||||
|
|
||||||
import { entityFieldsEditModeValueFamilySelector } from '@/object-record/field/states/selectors/entityFieldsEditModeValueFamilySelector';
|
|
||||||
import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName';
|
|
||||||
import { isFieldFullNameValue } from '@/object-record/field/types/guards/isFieldFullNameValue';
|
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
|
||||||
import { isFieldBoolean } from '../types/guards/isFieldBoolean';
|
|
||||||
import { isFieldBooleanValue } from '../types/guards/isFieldBooleanValue';
|
|
||||||
import { isFieldCurrency } from '../types/guards/isFieldCurrency';
|
|
||||||
import { isFieldCurrencyValue } from '../types/guards/isFieldCurrencyValue';
|
|
||||||
import { isFieldDateTime } from '../types/guards/isFieldDateTime';
|
|
||||||
import { isFieldDateTimeValue } from '../types/guards/isFieldDateTimeValue';
|
|
||||||
import { isFieldEmail } from '../types/guards/isFieldEmail';
|
|
||||||
import { isFieldEmailValue } from '../types/guards/isFieldEmailValue';
|
|
||||||
import { isFieldLink } from '../types/guards/isFieldLink';
|
|
||||||
import { isFieldLinkValue } from '../types/guards/isFieldLinkValue';
|
|
||||||
import { isFieldNumber } from '../types/guards/isFieldNumber';
|
|
||||||
import { isFieldNumberValue } from '../types/guards/isFieldNumberValue';
|
|
||||||
import { isFieldPhone } from '../types/guards/isFieldPhone';
|
|
||||||
import { isFieldPhoneValue } from '../types/guards/isFieldPhoneValue';
|
|
||||||
import { isFieldRating } from '../types/guards/isFieldRating';
|
|
||||||
import { isFieldRatingValue } from '../types/guards/isFieldRatingValue';
|
|
||||||
import { isFieldRelation } from '../types/guards/isFieldRelation';
|
|
||||||
import { isFieldRelationValue } from '../types/guards/isFieldRelationValue';
|
|
||||||
import { isFieldText } from '../types/guards/isFieldText';
|
|
||||||
import { isFieldTextValue } from '../types/guards/isFieldTextValue';
|
|
||||||
|
|
||||||
export const useSaveFieldEditModeValue = () => {
|
|
||||||
const { entityId, fieldDefinition } = useContext(FieldContext);
|
|
||||||
|
|
||||||
const saveFieldEditModeValue = useRecoilCallback(
|
|
||||||
({ set }) =>
|
|
||||||
(currentValue: unknown) => {
|
|
||||||
const fieldIsRelation =
|
|
||||||
isFieldRelation(fieldDefinition) &&
|
|
||||||
isFieldRelationValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsText =
|
|
||||||
isFieldText(fieldDefinition) && isFieldTextValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsEmail =
|
|
||||||
isFieldEmail(fieldDefinition) && isFieldEmailValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsDateTime =
|
|
||||||
isFieldDateTime(fieldDefinition) &&
|
|
||||||
isFieldDateTimeValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsLink =
|
|
||||||
isFieldLink(fieldDefinition) && isFieldLinkValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsBoolean =
|
|
||||||
isFieldBoolean(fieldDefinition) && isFieldBooleanValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsProbability =
|
|
||||||
isFieldRating(fieldDefinition) && isFieldRatingValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsNumber =
|
|
||||||
isFieldNumber(fieldDefinition) && isFieldNumberValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsCurrency =
|
|
||||||
isFieldCurrency(fieldDefinition) &&
|
|
||||||
isFieldCurrencyValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsFullName =
|
|
||||||
isFieldFullName(fieldDefinition) &&
|
|
||||||
isFieldFullNameValue(currentValue);
|
|
||||||
|
|
||||||
const fieldIsPhone =
|
|
||||||
isFieldPhone(fieldDefinition) && isFieldPhoneValue(currentValue);
|
|
||||||
|
|
||||||
if (fieldIsRelation) {
|
|
||||||
const fieldName = fieldDefinition.metadata.fieldName;
|
|
||||||
|
|
||||||
set(
|
|
||||||
entityFieldsEditModeValueFamilySelector({ entityId, fieldName }),
|
|
||||||
currentValue,
|
|
||||||
);
|
|
||||||
} else if (
|
|
||||||
fieldIsText ||
|
|
||||||
fieldIsBoolean ||
|
|
||||||
fieldIsEmail ||
|
|
||||||
fieldIsProbability ||
|
|
||||||
fieldIsNumber ||
|
|
||||||
fieldIsDateTime ||
|
|
||||||
fieldIsPhone ||
|
|
||||||
fieldIsLink ||
|
|
||||||
fieldIsCurrency ||
|
|
||||||
fieldIsFullName
|
|
||||||
) {
|
|
||||||
const fieldName = fieldDefinition.metadata.fieldName;
|
|
||||||
|
|
||||||
set(
|
|
||||||
entityFieldsEditModeValueFamilySelector({ entityId, fieldName }),
|
|
||||||
currentValue,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
throw new Error(
|
|
||||||
`Invalid value to save: ${JSON.stringify(
|
|
||||||
currentValue,
|
|
||||||
)} for type : ${
|
|
||||||
fieldDefinition.type
|
|
||||||
}, type may not be implemented in useSaveFieldEditModeValue.`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[entityId, fieldDefinition],
|
|
||||||
);
|
|
||||||
|
|
||||||
return saveFieldEditModeValue;
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { atomFamily } from 'recoil';
|
|
||||||
|
|
||||||
import { FieldInitialValue } from '../types/FieldInitialValue';
|
|
||||||
|
|
||||||
export const entityFieldInitialValueFamilyState = atomFamily<
|
|
||||||
FieldInitialValue | undefined,
|
|
||||||
{ entityId: string; fieldMetadataId: string }
|
|
||||||
>({
|
|
||||||
key: 'entityFieldInitialValueFamilyState',
|
|
||||||
default: undefined,
|
|
||||||
});
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { atomFamily } from 'recoil';
|
|
||||||
|
|
||||||
export const entityFieldsEditModeValueFamilyState = atomFamily<
|
|
||||||
Record<string, unknown> | null,
|
|
||||||
string
|
|
||||||
>({
|
|
||||||
key: 'entityFieldsEditModeValueFamilyState',
|
|
||||||
default: null,
|
|
||||||
});
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
import { atomFamily } from 'recoil';
|
|
||||||
|
|
||||||
export const isFieldEmptyScopedState = atomFamily<boolean, string>({
|
|
||||||
key: 'isFieldEmptyScopedState',
|
|
||||||
default: false,
|
|
||||||
});
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import { selectorFamily } from 'recoil';
|
|
||||||
|
|
||||||
import { entityFieldsEditModeValueFamilyState } from '@/object-record/field/states/entityFieldsEditModeValueFamilyState';
|
|
||||||
|
|
||||||
export const entityFieldsEditModeValueFamilySelector = selectorFamily({
|
|
||||||
key: 'entityFieldsEditModeValueFamilySelector',
|
|
||||||
get:
|
|
||||||
<T>({ fieldName, entityId }: { fieldName: string; entityId: string }) =>
|
|
||||||
({ get }) =>
|
|
||||||
get(entityFieldsEditModeValueFamilyState(entityId))?.[fieldName] as T,
|
|
||||||
set:
|
|
||||||
<T>({ fieldName, entityId }: { fieldName: string; entityId: string }) =>
|
|
||||||
({ set }, newValue: T) =>
|
|
||||||
set(entityFieldsEditModeValueFamilyState(entityId), (prevState) => ({
|
|
||||||
...prevState,
|
|
||||||
[fieldName]: newValue,
|
|
||||||
})),
|
|
||||||
});
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import { selectorFamily } from 'recoil';
|
|
||||||
|
|
||||||
import { entityFieldsEditModeValueFamilyState } from '@/object-record/field/states/entityFieldsEditModeValueFamilyState';
|
|
||||||
import { isFieldValueEmpty } from '@/object-record/field/utils/isFieldValueEmpty';
|
|
||||||
|
|
||||||
import { FieldDefinition } from '../../types/FieldDefinition';
|
|
||||||
import { FieldMetadata } from '../../types/FieldMetadata';
|
|
||||||
|
|
||||||
export const isEntityFieldEditModeEmptyFamilySelector = selectorFamily({
|
|
||||||
key: 'isEntityFieldEditModeEmptyFamilySelector',
|
|
||||||
get: ({
|
|
||||||
fieldDefinition,
|
|
||||||
fieldName,
|
|
||||||
entityId,
|
|
||||||
}: {
|
|
||||||
fieldDefinition: Pick<FieldDefinition<FieldMetadata>, 'type'>;
|
|
||||||
fieldName: string;
|
|
||||||
entityId: string;
|
|
||||||
}) => {
|
|
||||||
return ({ get }) => {
|
|
||||||
const fieldValue = get(entityFieldsEditModeValueFamilyState(entityId))?.[
|
|
||||||
fieldName
|
|
||||||
];
|
|
||||||
|
|
||||||
return isFieldValueEmpty({
|
|
||||||
fieldDefinition,
|
|
||||||
fieldValue,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import { selectorFamily } from 'recoil';
|
|
||||||
|
|
||||||
import { isFieldValueEmpty } from '@/object-record/field/utils/isFieldValueEmpty';
|
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
|
||||||
|
|
||||||
import { FieldDefinition } from '../../types/FieldDefinition';
|
|
||||||
import { FieldMetadata } from '../../types/FieldMetadata';
|
|
||||||
|
|
||||||
export const isEntityFieldEmptyFamilySelector = selectorFamily({
|
|
||||||
key: 'isEntityFieldEmptyFamilySelector',
|
|
||||||
get: ({
|
|
||||||
fieldDefinition,
|
|
||||||
fieldName,
|
|
||||||
entityId,
|
|
||||||
}: {
|
|
||||||
fieldDefinition: Pick<FieldDefinition<FieldMetadata>, 'type'>;
|
|
||||||
fieldName: string;
|
|
||||||
entityId: string;
|
|
||||||
}) => {
|
|
||||||
return ({ get }) => {
|
|
||||||
const fieldValue = get(recordStoreFamilyState(entityId))?.[fieldName];
|
|
||||||
|
|
||||||
return isFieldValueEmpty({
|
|
||||||
fieldDefinition,
|
|
||||||
fieldValue,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
export type FieldInitialValue = {
|
|
||||||
isEmpty?: boolean;
|
|
||||||
value?: string;
|
|
||||||
};
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { isFieldBoolean } from '@/object-record/field/types/guards/isFieldBoolean';
|
|
||||||
import { isFieldCurrency } from '@/object-record/field/types/guards/isFieldCurrency';
|
|
||||||
import { isFieldCurrencyValue } from '@/object-record/field/types/guards/isFieldCurrencyValue';
|
|
||||||
import { isFieldDateTime } from '@/object-record/field/types/guards/isFieldDateTime';
|
|
||||||
import { isFieldEmail } from '@/object-record/field/types/guards/isFieldEmail';
|
|
||||||
import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName';
|
|
||||||
import { isFieldFullNameValue } from '@/object-record/field/types/guards/isFieldFullNameValue';
|
|
||||||
import { isFieldLink } from '@/object-record/field/types/guards/isFieldLink';
|
|
||||||
import { isFieldLinkValue } from '@/object-record/field/types/guards/isFieldLinkValue';
|
|
||||||
import { isFieldNumber } from '@/object-record/field/types/guards/isFieldNumber';
|
|
||||||
import { isFieldRating } from '@/object-record/field/types/guards/isFieldRating';
|
|
||||||
import { isFieldRelation } from '@/object-record/field/types/guards/isFieldRelation';
|
|
||||||
import { isFieldRelationValue } from '@/object-record/field/types/guards/isFieldRelationValue';
|
|
||||||
import { isFieldSelect } from '@/object-record/field/types/guards/isFieldSelect';
|
|
||||||
import { isFieldSelectValue } from '@/object-record/field/types/guards/isFieldSelectValue';
|
|
||||||
import { isFieldText } from '@/object-record/field/types/guards/isFieldText';
|
|
||||||
import { isFieldUuid } from '@/object-record/field/types/guards/isFieldUuid';
|
|
||||||
import { assertNotNull } from '~/utils/assert';
|
|
||||||
|
|
||||||
const isValueEmpty = (value: unknown) => !assertNotNull(value) || value === '';
|
|
||||||
|
|
||||||
export const isFieldValueEmpty = ({
|
|
||||||
fieldDefinition,
|
|
||||||
fieldValue,
|
|
||||||
}: {
|
|
||||||
fieldDefinition: Pick<FieldDefinition<FieldMetadata>, 'type'>;
|
|
||||||
fieldValue: unknown;
|
|
||||||
}) => {
|
|
||||||
if (
|
|
||||||
isFieldUuid(fieldDefinition) ||
|
|
||||||
isFieldText(fieldDefinition) ||
|
|
||||||
isFieldDateTime(fieldDefinition) ||
|
|
||||||
isFieldNumber(fieldDefinition) ||
|
|
||||||
isFieldRating(fieldDefinition) ||
|
|
||||||
isFieldEmail(fieldDefinition) ||
|
|
||||||
isFieldBoolean(fieldDefinition)
|
|
||||||
//|| isFieldPhone(fieldDefinition)
|
|
||||||
) {
|
|
||||||
return isValueEmpty(fieldValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFieldRelation(fieldDefinition)) {
|
|
||||||
return isFieldRelationValue(fieldValue) && isValueEmpty(fieldValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFieldSelect(fieldDefinition)) {
|
|
||||||
return isFieldSelectValue(fieldValue) && !assertNotNull(fieldValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFieldCurrency(fieldDefinition)) {
|
|
||||||
return (
|
|
||||||
!isFieldCurrencyValue(fieldValue) ||
|
|
||||||
isValueEmpty(fieldValue?.amountMicros)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFieldFullName(fieldDefinition)) {
|
|
||||||
return (
|
|
||||||
!isFieldFullNameValue(fieldValue) ||
|
|
||||||
isValueEmpty(fieldValue?.firstName + fieldValue?.lastName)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFieldLink(fieldDefinition)) {
|
|
||||||
return !isFieldLinkValue(fieldValue) || isValueEmpty(fieldValue?.url);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
`Entity field type not supported in isEntityFieldEditModeEmptyFamilySelector : ${fieldDefinition.type}}`,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -2,12 +2,12 @@ import { ReactNode } from 'react';
|
|||||||
|
|
||||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||||
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
|
||||||
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
RecordUpdateHook,
|
RecordUpdateHook,
|
||||||
RecordUpdateHookParams,
|
RecordUpdateHookParams,
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
|
||||||
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
||||||
|
|
||||||
export const useFieldContext = ({
|
export const useFieldContext = ({
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { useRecordBoardDeprecated } from '@/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated';
|
import { useRecordBoardDeprecated } from '@/object-record/record-board-deprecated/hooks/useRecordBoardDeprecated';
|
||||||
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
type RecordBoardDeprecatedEffectProps = {
|
type RecordBoardDeprecatedEffectProps = {
|
||||||
recordBoardId: string;
|
recordBoardId: string;
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import { act } from 'react-dom/test-utils';
|
|||||||
import { renderHook, waitFor } from '@testing-library/react';
|
import { renderHook, waitFor } from '@testing-library/react';
|
||||||
import { RecoilRoot, useRecoilState, useRecoilValue } from 'recoil';
|
import { RecoilRoot, useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { FieldType } from '@/object-record/field/types/FieldType';
|
|
||||||
import { useRecordBoardDeprecatedCardFieldsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal';
|
import { useRecordBoardDeprecatedCardFieldsInternal } from '@/object-record/record-board-deprecated/hooks/internal/useRecordBoardDeprecatedCardFieldsInternal';
|
||||||
import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState';
|
import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState';
|
||||||
import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState';
|
import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState';
|
||||||
import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState';
|
import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState';
|
||||||
|
import { FieldType } from '@/object-record/record-field/types/FieldType';
|
||||||
|
|
||||||
const recordBoardScopeId = 'recordBoardScopeId';
|
const recordBoardScopeId = 'recordBoardScopeId';
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext';
|
import { RecordBoardDeprecatedScopeInternalContext } from '@/object-record/record-board-deprecated/scopes/scope-internal-context/RecordBoardDeprecatedScopeInternalContext';
|
||||||
import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState';
|
import { onFieldsChangeScopedState } from '@/object-record/record-board-deprecated/states/onFieldsChangeScopedState';
|
||||||
import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState';
|
import { recordBoardCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/recordBoardDeprecatedCardFieldsScopedState';
|
||||||
import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState';
|
import { savedRecordBoardDeprecatedCardFieldsScopedState } from '@/object-record/record-board-deprecated/states/savedRecordBoardDeprecatedCardFieldsScopedState';
|
||||||
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition';
|
||||||
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
||||||
|
|
||||||
import { BoardFieldDefinition } from '../types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '../types/BoardFieldDefinition';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '@/object-record/record-board-deprecated/types/BoardFieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
||||||
|
|
||||||
export const onFieldsChangeScopedState = createStateScopeMap<
|
export const onFieldsChangeScopedState = createStateScopeMap<
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
||||||
|
|
||||||
import { BoardFieldDefinition } from '../types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '../types/BoardFieldDefinition';
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
||||||
|
|
||||||
import { BoardFieldDefinition } from '../types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '../types/BoardFieldDefinition';
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap';
|
import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap';
|
||||||
|
|
||||||
import { availableRecordBoardDeprecatedCardFieldsScopedState } from '../availableRecordBoardDeprecatedCardFieldsScopedState';
|
import { availableRecordBoardDeprecatedCardFieldsScopedState } from '../availableRecordBoardDeprecatedCardFieldsScopedState';
|
||||||
import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState';
|
import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState';
|
||||||
|
|
||||||
export const hiddenRecordBoardDeprecatedCardFieldsScopedSelector =
|
export const hiddenRecordBoardDeprecatedCardFieldsScopedSelector =
|
||||||
createSelectorScopeMap({
|
createSelectorReadOnlyScopeMap({
|
||||||
key: 'hiddenRecordBoardDeprecatedCardFieldsScopedSelector',
|
key: 'hiddenRecordBoardDeprecatedCardFieldsScopedSelector',
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ scopeId }) =>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { selectorFamily } from 'recoil';
|
import { selectorFamily } from 'recoil';
|
||||||
|
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
import { BoardFieldDefinition } from '../../types/BoardFieldDefinition';
|
import { BoardFieldDefinition } from '../../types/BoardFieldDefinition';
|
||||||
import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState';
|
import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState';
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap';
|
import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap';
|
||||||
|
|
||||||
import { isRecordBoardDeprecatedCardSelectedFamilyState } from '../isRecordBoardDeprecatedCardSelectedFamilyState';
|
import { isRecordBoardDeprecatedCardSelectedFamilyState } from '../isRecordBoardDeprecatedCardSelectedFamilyState';
|
||||||
import { recordBoardCardIdsByColumnIdFamilyState } from '../recordBoardCardIdsByColumnIdFamilyState';
|
import { recordBoardCardIdsByColumnIdFamilyState } from '../recordBoardCardIdsByColumnIdFamilyState';
|
||||||
import { recordBoardColumnsScopedState } from '../recordBoardColumnsScopedState';
|
import { recordBoardColumnsScopedState } from '../recordBoardColumnsScopedState';
|
||||||
|
|
||||||
export const selectedRecordBoardDeprecatedCardIdsScopedSelector =
|
export const selectedRecordBoardDeprecatedCardIdsScopedSelector =
|
||||||
createSelectorScopeMap<string[]>({
|
createSelectorReadOnlyScopeMap<string[]>({
|
||||||
key: 'selectedRecordBoardDeprecatedCardIdsScopedSelector',
|
key: 'selectedRecordBoardDeprecatedCardIdsScopedSelector',
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ scopeId }) =>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap';
|
import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap';
|
||||||
|
|
||||||
import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState';
|
import { recordBoardCardFieldsScopedState } from '../recordBoardDeprecatedCardFieldsScopedState';
|
||||||
|
|
||||||
export const visibleRecordBoardDeprecatedCardFieldsScopedSelector =
|
export const visibleRecordBoardDeprecatedCardFieldsScopedSelector =
|
||||||
createSelectorScopeMap({
|
createSelectorReadOnlyScopeMap({
|
||||||
key: 'visibleRecordBoardDeprecatedCardFieldsScopedSelector',
|
key: 'visibleRecordBoardDeprecatedCardFieldsScopedSelector',
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ scopeId }) =>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
export type BoardFieldDefinition<T extends FieldMetadata> =
|
export type BoardFieldDefinition<T extends FieldMetadata> =
|
||||||
FieldDefinition<T> & {
|
FieldDefinition<T> & {
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ export const RecordBoard = ({ recordBoardId }: RecordBoardProps) => {
|
|||||||
const boardRef = useRef<HTMLDivElement>(null);
|
const boardRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
const { getColumnIdsState } = useRecordBoardStates(recordBoardId);
|
const { getColumnIdsState } = useRecordBoardStates(recordBoardId);
|
||||||
|
|
||||||
const columnIds = useRecoilValue(getColumnIdsState());
|
const columnIds = useRecoilValue(getColumnIdsState());
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { recordBoardVisibleFieldDefinitionsScopedSelector } from '@/object-recor
|
|||||||
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
||||||
import { getFamilyState } from '@/ui/utilities/recoil-scope/utils/getFamilyState';
|
import { getFamilyState } from '@/ui/utilities/recoil-scope/utils/getFamilyState';
|
||||||
import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId';
|
import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId';
|
||||||
import { getSelector } from '@/ui/utilities/recoil-scope/utils/getSelector';
|
import { getSelectorReadOnly } from '@/ui/utilities/recoil-scope/utils/getSelectorReadOnly';
|
||||||
import { getState } from '@/ui/utilities/recoil-scope/utils/getState';
|
import { getState } from '@/ui/utilities/recoil-scope/utils/getState';
|
||||||
|
|
||||||
export const useRecordBoardStates = (recordBoardId?: string) => {
|
export const useRecordBoardStates = (recordBoardId?: string) => {
|
||||||
@@ -49,7 +49,7 @@ export const useRecordBoardStates = (recordBoardId?: string) => {
|
|||||||
recordBoardFieldDefinitionsStateScopeMap,
|
recordBoardFieldDefinitionsStateScopeMap,
|
||||||
scopeId,
|
scopeId,
|
||||||
),
|
),
|
||||||
getVisibleFieldDefinitionsState: getSelector(
|
getVisibleFieldDefinitionsState: getSelectorReadOnly(
|
||||||
recordBoardVisibleFieldDefinitionsScopedSelector,
|
recordBoardVisibleFieldDefinitionsScopedSelector,
|
||||||
scopeId,
|
scopeId,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { useRecoilCallback } from 'recoil';
|
|||||||
|
|
||||||
import { useRecordBoardStates } from '@/object-record/record-board/hooks/internal/useRecordBoardStates';
|
import { useRecordBoardStates } from '@/object-record/record-board/hooks/internal/useRecordBoardStates';
|
||||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||||
|
import { isDeeplyEqual } from '~/utils/isDeeplyEqual';
|
||||||
|
|
||||||
export const useSetRecordBoardRecordIds = (recordBoardId?: string) => {
|
export const useSetRecordBoardRecordIds = (recordBoardId?: string) => {
|
||||||
const {
|
const {
|
||||||
@@ -21,13 +22,20 @@ export const useSetRecordBoardRecordIds = (recordBoardId?: string) => {
|
|||||||
.getLoadable(columnsFamilySelector(columnId))
|
.getLoadable(columnsFamilySelector(columnId))
|
||||||
.getValue();
|
.getValue();
|
||||||
|
|
||||||
|
const existingColumnRecordIds = snapshot
|
||||||
|
.getLoadable(recordBoardRecordIdsByColumnIdFamilyState(columnId))
|
||||||
|
.getValue();
|
||||||
|
|
||||||
const columnRecordIds = records
|
const columnRecordIds = records
|
||||||
.filter((record) => record.stage === column?.value)
|
.filter((record) => record.stage === column?.value)
|
||||||
.map((record) => record.id);
|
.map((record) => record.id);
|
||||||
|
|
||||||
|
if (!isDeeplyEqual(existingColumnRecordIds, columnRecordIds)) {
|
||||||
set(
|
set(
|
||||||
recordBoardRecordIdsByColumnIdFamilyState(columnId),
|
recordBoardRecordIdsByColumnIdFamilyState(columnId),
|
||||||
columnRecordIds,
|
columnRecordIds,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ import styled from '@emotion/styled';
|
|||||||
import { useRecoilState, useRecoilValue } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { RecordChip } from '@/object-record/components/RecordChip';
|
import { RecordChip } from '@/object-record/components/RecordChip';
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
|
||||||
import { useRecordBoardStates } from '@/object-record/record-board/hooks/internal/useRecordBoardStates';
|
import { useRecordBoardStates } from '@/object-record/record-board/hooks/internal/useRecordBoardStates';
|
||||||
import { RecordBoardCardContext } from '@/object-record/record-board/record-board-card/contexts/RecordBoardCardContext';
|
import { RecordBoardCardContext } from '@/object-record/record-board/record-board-card/contexts/RecordBoardCardContext';
|
||||||
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
|
import { RecordInlineCell } from '@/object-record/record-inline-cell/components/RecordInlineCell';
|
||||||
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
import { InlineCellHotkeyScope } from '@/object-record/record-inline-cell/types/InlineCellHotkeyScope';
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
@@ -205,6 +205,7 @@ export const RecordBoardCard = () => {
|
|||||||
recoilScopeId: recordId + fieldDefinition.fieldMetadataId,
|
recoilScopeId: recordId + fieldDefinition.fieldMetadataId,
|
||||||
isLabelIdentifier: false,
|
isLabelIdentifier: false,
|
||||||
fieldDefinition: {
|
fieldDefinition: {
|
||||||
|
disableTooltip: true,
|
||||||
fieldMetadataId: fieldDefinition.fieldMetadataId,
|
fieldMetadataId: fieldDefinition.fieldMetadataId,
|
||||||
label: fieldDefinition.label,
|
label: fieldDefinition.label,
|
||||||
iconName: fieldDefinition.iconName,
|
iconName: fieldDefinition.iconName,
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { RecordBoardScopeInternalContext } from '@/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext';
|
import { RecordBoardScopeInternalContext } from '@/object-record/record-board/scopes/scope-internal-context/RecordBoardScopeInternalContext';
|
||||||
import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition';
|
import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition';
|
||||||
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
type RecordBoardScopeProps = {
|
type RecordBoardScopeProps = {
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition';
|
import { RecordBoardColumnDefinition } from '@/object-record/record-board/types/RecordBoardColumnDefinition';
|
||||||
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey';
|
import { StateScopeMapKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/StateScopeMapKey';
|
||||||
import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext';
|
import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext';
|
||||||
|
|
||||||
type RecordBoardDeprecatedScopeInternalContextProps = StateScopeMapKey & {
|
type RecordBoardScopeInternalContextProps = StateScopeMapKey & {
|
||||||
onFieldsChange: (fields: FieldDefinition<FieldMetadata>[]) => void;
|
onFieldsChange: (fields: FieldDefinition<FieldMetadata>[]) => void;
|
||||||
onColumnsChange: (column: RecordBoardColumnDefinition[]) => void;
|
onColumnsChange: (column: RecordBoardColumnDefinition[]) => void;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const RecordBoardScopeInternalContext =
|
export const RecordBoardScopeInternalContext =
|
||||||
createScopeInternalContext<RecordBoardDeprecatedScopeInternalContextProps>();
|
createScopeInternalContext<RecordBoardScopeInternalContextProps>();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
|
||||||
import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition';
|
import { RecordBoardFieldDefinition } from '@/object-record/record-board/types/RecordBoardFieldDefinition';
|
||||||
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
import { createStateScopeMap } from '@/ui/utilities/recoil-scope/utils/createStateScopeMap';
|
||||||
|
|
||||||
export const recordBoardFieldDefinitionsStateScopeMap = createStateScopeMap<
|
export const recordBoardFieldDefinitionsStateScopeMap = createStateScopeMap<
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { recordBoardFieldDefinitionsStateScopeMap } from '@/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap';
|
import { recordBoardFieldDefinitionsStateScopeMap } from '@/object-record/record-board/states/recordBoardFieldDefinitionsStateScopeMap';
|
||||||
import { createSelectorScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorScopeMap';
|
import { createSelectorReadOnlyScopeMap } from '@/ui/utilities/recoil-scope/utils/createSelectorReadOnlyScopeMap';
|
||||||
|
|
||||||
export const recordBoardVisibleFieldDefinitionsScopedSelector =
|
export const recordBoardVisibleFieldDefinitionsScopedSelector =
|
||||||
createSelectorScopeMap({
|
createSelectorReadOnlyScopeMap({
|
||||||
key: 'recordBoardVisibleFieldDefinitionsScopedSelector',
|
key: 'recordBoardVisibleFieldDefinitionsScopedSelector',
|
||||||
get:
|
get:
|
||||||
({ scopeId }) =>
|
({ scopeId }) =>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
export type RecordBoardFieldDefinition<T extends FieldMetadata> =
|
export type RecordBoardFieldDefinition<T extends FieldMetadata> =
|
||||||
FieldDefinition<T> & {
|
FieldDefinition<T> & {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import {
|
import {
|
||||||
FieldBooleanMetadata,
|
FieldBooleanMetadata,
|
||||||
FieldFullNameMetadata,
|
FieldFullNameMetadata,
|
||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
FieldRelationMetadata,
|
FieldRelationMetadata,
|
||||||
FieldSelectMetadata,
|
FieldSelectMetadata,
|
||||||
FieldTextMetadata,
|
FieldTextMetadata,
|
||||||
} from '@/object-record/field/types/FieldMetadata';
|
} from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
export const fieldMetadataId = 'fieldMetadataId';
|
export const fieldMetadataId = 'fieldMetadataId';
|
||||||
|
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
|
|
||||||
import { FullNameFieldInput } from '@/object-record/field/meta-types/input/components/FullNameFieldInput';
|
import { FullNameFieldInput } from '@/object-record/record-field/meta-types/input/components/FullNameFieldInput';
|
||||||
import { SelectFieldInput } from '@/object-record/field/meta-types/input/components/SelectFieldInput';
|
import { SelectFieldInput } from '@/object-record/record-field/meta-types/input/components/SelectFieldInput';
|
||||||
import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName';
|
import { RecordFieldInputScope } from '@/object-record/record-field/scopes/RecordFieldInputScope';
|
||||||
import { isFieldSelect } from '@/object-record/field/types/guards/isFieldSelect';
|
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
|
||||||
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
|
import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect';
|
||||||
|
import { getScopeIdFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdFromComponentId';
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
import { FieldContext } from '../contexts/FieldContext';
|
||||||
import { BooleanFieldInput } from '../meta-types/input/components/BooleanFieldInput';
|
import { BooleanFieldInput } from '../meta-types/input/components/BooleanFieldInput';
|
||||||
@@ -30,6 +31,7 @@ import { isFieldRelation } from '../types/guards/isFieldRelation';
|
|||||||
import { isFieldText } from '../types/guards/isFieldText';
|
import { isFieldText } from '../types/guards/isFieldText';
|
||||||
|
|
||||||
type FieldInputProps = {
|
type FieldInputProps = {
|
||||||
|
recordFieldInputdId: string;
|
||||||
onSubmit?: FieldInputEvent;
|
onSubmit?: FieldInputEvent;
|
||||||
onCancel?: () => void;
|
onCancel?: () => void;
|
||||||
onClickOutside?: FieldInputEvent;
|
onClickOutside?: FieldInputEvent;
|
||||||
@@ -40,6 +42,7 @@ type FieldInputProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const FieldInput = ({
|
export const FieldInput = ({
|
||||||
|
recordFieldInputdId,
|
||||||
onCancel,
|
onCancel,
|
||||||
onSubmit,
|
onSubmit,
|
||||||
onEnter,
|
onEnter,
|
||||||
@@ -51,11 +54,11 @@ export const FieldInput = ({
|
|||||||
const { fieldDefinition } = useContext(FieldContext);
|
const { fieldDefinition } = useContext(FieldContext);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<RecordFieldInputScope
|
||||||
|
recordFieldInputScopeId={getScopeIdFromComponentId(recordFieldInputdId)}
|
||||||
|
>
|
||||||
{isFieldRelation(fieldDefinition) ? (
|
{isFieldRelation(fieldDefinition) ? (
|
||||||
<RecoilScope>
|
|
||||||
<RelationFieldInput onSubmit={onSubmit} onCancel={onCancel} />
|
<RelationFieldInput onSubmit={onSubmit} onCancel={onCancel} />
|
||||||
</RecoilScope>
|
|
||||||
) : isFieldPhone(fieldDefinition) ? (
|
) : isFieldPhone(fieldDefinition) ? (
|
||||||
<PhoneFieldInput
|
<PhoneFieldInput
|
||||||
onEnter={onEnter}
|
onEnter={onEnter}
|
||||||
@@ -127,6 +130,6 @@ export const FieldInput = ({
|
|||||||
) : (
|
) : (
|
||||||
<></>
|
<></>
|
||||||
)}
|
)}
|
||||||
</>
|
</RecordFieldInputScope>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -5,11 +5,11 @@ import { RecoilRoot } from 'recoil';
|
|||||||
import {
|
import {
|
||||||
phoneFieldDefinition,
|
phoneFieldDefinition,
|
||||||
relationFieldDefinition,
|
relationFieldDefinition,
|
||||||
} from '@/object-record/field/__mocks__/fieldDefinitions';
|
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useGetButtonIcon } from '@/object-record/field/hooks/useGetButtonIcon';
|
import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon';
|
||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { IconPencil } from '@/ui/display/icon';
|
import { IconPencil } from '@/ui/display/icon';
|
||||||
|
|
||||||
const entityId = 'entityId';
|
const entityId = 'entityId';
|
||||||
@@ -2,9 +2,9 @@ import { ReactNode } from 'react';
|
|||||||
import { act, renderHook } from '@testing-library/react';
|
import { act, renderHook } from '@testing-library/react';
|
||||||
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
import { RecoilRoot, useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { phoneFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions';
|
import { phoneFieldDefinition } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useIsFieldEmpty } from '@/object-record/field/hooks/useIsFieldEmpty';
|
import { useIsFieldEmpty } from '@/object-record/record-field/hooks/useIsFieldEmpty';
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
|
|
||||||
const entityId = 'entityId';
|
const entityId = 'entityId';
|
||||||
@@ -5,11 +5,11 @@ import { RecoilRoot } from 'recoil';
|
|||||||
import {
|
import {
|
||||||
phoneFieldDefinition,
|
phoneFieldDefinition,
|
||||||
ratingfieldDefinition,
|
ratingfieldDefinition,
|
||||||
} from '@/object-record/field/__mocks__/fieldDefinitions';
|
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||||
import { FieldContext } from '@/object-record/field/contexts/FieldContext';
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useIsFieldInputOnly } from '@/object-record/field/hooks/useIsFieldInputOnly';
|
import { useIsFieldInputOnly } from '@/object-record/record-field/hooks/useIsFieldInputOnly';
|
||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
|
||||||
const entityId = 'entityId';
|
const entityId = 'entityId';
|
||||||
|
|
||||||
@@ -5,19 +5,19 @@ import { act, renderHook, waitFor } from '@testing-library/react';
|
|||||||
import { RecoilRoot, useRecoilValue } from 'recoil';
|
import { RecoilRoot, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
import {
|
import {
|
||||||
phoneFieldDefinition,
|
phoneFieldDefinition,
|
||||||
relationFieldDefinition,
|
relationFieldDefinition,
|
||||||
} from '@/object-record/field/__mocks__/fieldDefinitions';
|
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
RecordUpdateHook,
|
RecordUpdateHook,
|
||||||
RecordUpdateHookParams,
|
RecordUpdateHookParams,
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { usePersistField } from '@/object-record/field/hooks/usePersistField';
|
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
|
||||||
import { FieldDefinition } from '@/object-record/field/types/FieldDefinition';
|
import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition';
|
||||||
import { FieldMetadata } from '@/object-record/field/types/FieldMetadata';
|
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({
|
jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({
|
||||||
@@ -5,14 +5,14 @@ import { act, renderHook, waitFor } from '@testing-library/react';
|
|||||||
import { RecoilRoot } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||||
import { booleanFieldDefinition } from '@/object-record/field/__mocks__/fieldDefinitions';
|
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
||||||
|
import { booleanFieldDefinition } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
RecordUpdateHook,
|
RecordUpdateHook,
|
||||||
RecordUpdateHookParams,
|
RecordUpdateHookParams,
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { useToggleEditOnlyInput } from '@/object-record/field/hooks/useToggleEditOnlyInput';
|
import { useToggleEditOnlyInput } from '@/object-record/record-field/hooks/useToggleEditOnlyInput';
|
||||||
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
|
|
||||||
|
|
||||||
jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({
|
jest.mock('@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery', () => ({
|
||||||
useMapFieldMetadataToGraphQLQuery: () => () => '\n',
|
useMapFieldMetadataToGraphQLQuery: () => () => '\n',
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import { RecordFieldInputScopeInternalContext } from '@/object-record/record-field/scopes/scope-internal-context/RecordFieldInputScopeInternalContext';
|
||||||
|
import { recordFieldInputDraftValueSelectorScopeMap } from '@/object-record/record-field/states/selectors/recordFieldInputDraftValueSelectorScopeMap';
|
||||||
|
import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
|
||||||
|
import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
|
||||||
|
import { getScopeIdOrUndefinedFromComponentId } from '@/ui/utilities/recoil-scope/utils/getScopeIdOrUndefinedFromComponentId';
|
||||||
|
import { getSelector } from '@/ui/utilities/recoil-scope/utils/getSelector';
|
||||||
|
|
||||||
|
export const useRecordFieldInputStates = <FieldValue>(
|
||||||
|
recordFieldInputId?: string,
|
||||||
|
) => {
|
||||||
|
const scopeId = useAvailableScopeIdOrThrow(
|
||||||
|
RecordFieldInputScopeInternalContext,
|
||||||
|
getScopeIdOrUndefinedFromComponentId(recordFieldInputId),
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
scopeId,
|
||||||
|
getDraftValueSelector: getSelector<
|
||||||
|
FieldInputDraftValue<FieldValue> | undefined
|
||||||
|
>(recordFieldInputDraftValueSelectorScopeMap, scopeId),
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
|
|
||||||
import { isFieldRelation } from '@/object-record/field/types/guards/isFieldRelation';
|
import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation';
|
||||||
import { IconPencil } from '@/ui/display/icon';
|
import { IconPencil } from '@/ui/display/icon';
|
||||||
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { isFieldValueEmpty } from '@/object-record/field/utils/isFieldValueEmpty';
|
import { isFieldValueEmpty } from '@/object-record/record-field/utils/isFieldValueEmpty';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
import { FieldContext } from '../contexts/FieldContext';
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilCallback } from 'recoil';
|
import { useRecoilCallback } from 'recoil';
|
||||||
|
|
||||||
import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName';
|
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
|
||||||
import { isFieldFullNameValue } from '@/object-record/field/types/guards/isFieldFullNameValue';
|
import { isFieldFullNameValue } from '@/object-record/record-field/types/guards/isFieldFullNameValue';
|
||||||
import { isFieldSelect } from '@/object-record/field/types/guards/isFieldSelect';
|
import { isFieldSelect } from '@/object-record/record-field/types/guards/isFieldSelect';
|
||||||
import { isFieldSelectValue } from '@/object-record/field/types/guards/isFieldSelectValue';
|
import { isFieldSelectValue } from '@/object-record/record-field/types/guards/isFieldSelectValue';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
import { FieldContext } from '../contexts/FieldContext';
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import { useContext } from 'react';
|
||||||
|
import { isUndefined } from '@sniptt/guards';
|
||||||
|
import { useRecoilCallback, useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
|
import { useRecordFieldInputStates } from '@/object-record/record-field/hooks/internal/useRecordFieldInputStates';
|
||||||
|
import { FieldInputDraftValue } from '@/object-record/record-field/types/FieldInputDraftValue';
|
||||||
|
import { computeDraftValueFromFieldValue } from '@/object-record/record-field/utils/computeDraftValueFromFieldValue';
|
||||||
|
import { computeDraftValueFromString } from '@/object-record/record-field/utils/computeDraftValueFromString';
|
||||||
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
|
export const useRecordFieldInput = <FieldValue>(
|
||||||
|
recordFieldInputId?: string,
|
||||||
|
) => {
|
||||||
|
const { scopeId, getDraftValueSelector } =
|
||||||
|
useRecordFieldInputStates<FieldValue>(recordFieldInputId);
|
||||||
|
|
||||||
|
const { entityId, fieldDefinition } = useContext(FieldContext);
|
||||||
|
|
||||||
|
const setDraftValue = useSetRecoilState(getDraftValueSelector());
|
||||||
|
|
||||||
|
const initDraftValue = useRecoilCallback(
|
||||||
|
({ set, snapshot }) =>
|
||||||
|
(value?: string) => {
|
||||||
|
const recordFieldValue = snapshot
|
||||||
|
.getLoadable(
|
||||||
|
recordStoreFamilySelector<FieldValue>({
|
||||||
|
recordId: entityId,
|
||||||
|
fieldName: fieldDefinition.metadata.fieldName,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.getValue();
|
||||||
|
|
||||||
|
if (isUndefined(value)) {
|
||||||
|
set(
|
||||||
|
getDraftValueSelector(),
|
||||||
|
computeDraftValueFromFieldValue<FieldValue>({
|
||||||
|
fieldValue: recordFieldValue,
|
||||||
|
fieldDefinition,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
set(
|
||||||
|
getDraftValueSelector(),
|
||||||
|
computeDraftValueFromString<FieldValue>({ value, fieldDefinition }),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[entityId, fieldDefinition, getDraftValueSelector],
|
||||||
|
);
|
||||||
|
|
||||||
|
const isDraftValueEmpty = (
|
||||||
|
value: FieldInputDraftValue<FieldValue> | undefined,
|
||||||
|
) => {
|
||||||
|
if (value === null || value === undefined) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value === 'string' && value === '') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
scopeId,
|
||||||
|
setDraftValue,
|
||||||
|
getDraftValueSelector,
|
||||||
|
initDraftValue,
|
||||||
|
isDraftValueEmpty,
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
FieldContext,
|
FieldContext,
|
||||||
GenericFieldContextType,
|
GenericFieldContextType,
|
||||||
} from '@/object-record/field/contexts/FieldContext';
|
} from '@/object-record/record-field/contexts/FieldContext';
|
||||||
|
|
||||||
type FieldContextProviderProps = {
|
type FieldContextProviderProps = {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { RecordChip } from '@/object-record/components/RecordChip';
|
import { RecordChip } from '@/object-record/components/RecordChip';
|
||||||
import { useChipField } from '@/object-record/field/meta-types/hooks/useChipField';
|
import { useChipField } from '@/object-record/record-field/meta-types/hooks/useChipField';
|
||||||
|
|
||||||
export const ChipFieldDisplay = () => {
|
export const ChipFieldDisplay = () => {
|
||||||
const { objectNameSingular, record } = useChipField();
|
const { objectNameSingular, record } = useChipField();
|
||||||
@@ -3,7 +3,13 @@ import { CurrencyDisplay } from '@/ui/field/display/components/CurrencyDisplay';
|
|||||||
import { useCurrencyField } from '../../hooks/useCurrencyField';
|
import { useCurrencyField } from '../../hooks/useCurrencyField';
|
||||||
|
|
||||||
export const CurrencyFieldDisplay = () => {
|
export const CurrencyFieldDisplay = () => {
|
||||||
const { initialAmount } = useCurrencyField();
|
const { fieldValue } = useCurrencyField();
|
||||||
|
|
||||||
return <CurrencyDisplay amount={initialAmount} />;
|
return (
|
||||||
|
<CurrencyDisplay
|
||||||
|
amount={
|
||||||
|
fieldValue.amountMicros ? fieldValue.amountMicros / 1000000 : null
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useFullNameField } from '@/object-record/field/meta-types/hooks/useFullNameField';
|
import { useFullNameField } from '@/object-record/record-field/meta-types/hooks/useFullNameField';
|
||||||
import { TextDisplay } from '@/ui/field/display/components/TextDisplay';
|
import { TextDisplay } from '@/ui/field/display/components/TextDisplay';
|
||||||
|
|
||||||
export const FullNameFieldDisplay = () => {
|
export const FullNameFieldDisplay = () => {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useUuidField } from '@/object-record/field/meta-types/hooks/useUuidField';
|
import { useUuidField } from '@/object-record/record-field/meta-types/hooks/useUuidField';
|
||||||
import { TextDisplay } from '@/ui/field/display/components/TextDisplay';
|
import { TextDisplay } from '@/ui/field/display/components/TextDisplay';
|
||||||
|
|
||||||
export const UuidFieldDisplay = () => {
|
export const UuidFieldDisplay = () => {
|
||||||
@@ -3,7 +3,7 @@ import { MemoryRouter } from 'react-router-dom';
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
import { useSetRecoilState } from 'recoil';
|
import { useSetRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { ChipFieldDisplay } from '@/object-record/field/meta-types/display/components/ChipFieldDisplay';
|
import { ChipFieldDisplay } from '@/object-record/record-field/meta-types/display/components/ChipFieldDisplay';
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator';
|
import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator';
|
||||||
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { isFieldFullName } from '@/object-record/field/types/guards/isFieldFullName';
|
import { isFieldFullName } from '@/object-record/record-field/types/guards/isFieldFullName';
|
||||||
import { isFieldNumber } from '@/object-record/field/types/guards/isFieldNumber';
|
import { isFieldNumber } from '@/object-record/record-field/types/guards/isFieldNumber';
|
||||||
import { isFieldText } from '@/object-record/field/types/guards/isFieldText';
|
import { isFieldText } from '@/object-record/record-field/types/guards/isFieldText';
|
||||||
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
@@ -1,47 +1,18 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { CurrencyCode } from '@/object-record/field/types/CurrencyCode';
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
import { FieldInitialValue } from '@/object-record/field/types/FieldInitialValue';
|
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import { canBeCastAsIntegerOrNull } from '~/utils/cast-as-integer-or-null';
|
import { canBeCastAsIntegerOrNull } from '~/utils/cast-as-integer-or-null';
|
||||||
import {
|
import { convertCurrencyToCurrencyMicros } from '~/utils/convert-currency-amount';
|
||||||
convertCurrencyMicrosToCurrency,
|
|
||||||
convertCurrencyToCurrencyMicros,
|
|
||||||
} from '~/utils/convert-currency-amount';
|
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { usePersistField } from '../../hooks/usePersistField';
|
import { usePersistField } from '../../hooks/usePersistField';
|
||||||
import { FieldCurrencyValue } from '../../types/FieldMetadata';
|
import { FieldCurrencyValue } from '../../types/FieldMetadata';
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldCurrency } from '../../types/guards/isFieldCurrency';
|
import { isFieldCurrency } from '../../types/guards/isFieldCurrency';
|
||||||
import { isFieldCurrencyValue } from '../../types/guards/isFieldCurrencyValue';
|
import { isFieldCurrencyValue } from '../../types/guards/isFieldCurrencyValue';
|
||||||
|
|
||||||
const initializeValue = (
|
|
||||||
fieldInitialValue: FieldInitialValue | undefined,
|
|
||||||
fieldValue: FieldCurrencyValue,
|
|
||||||
) => {
|
|
||||||
if (fieldInitialValue?.isEmpty) {
|
|
||||||
return { amount: null, currencyCode: CurrencyCode.USD };
|
|
||||||
}
|
|
||||||
if (!isNaN(Number(fieldInitialValue?.value))) {
|
|
||||||
return {
|
|
||||||
amount: Number(fieldInitialValue?.value),
|
|
||||||
currencyCode: CurrencyCode.USD,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fieldValue) {
|
|
||||||
return { amount: null, currencyCode: CurrencyCode.USD };
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
amount: convertCurrencyMicrosToCurrency(fieldValue.amountMicros),
|
|
||||||
currencyCode: CurrencyCode.USD,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useCurrencyField = () => {
|
export const useCurrencyField = () => {
|
||||||
const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
|
const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
|
||||||
|
|
||||||
@@ -83,18 +54,16 @@ export const useCurrencyField = () => {
|
|||||||
persistField(newCurrencyValue);
|
persistField(newCurrencyValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldCurrencyValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const initialValue = initializeValue(fieldInitialValue, fieldValue);
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
|
|
||||||
const initialAmount = initialValue.amount;
|
|
||||||
const initialCurrencyCode = initialValue.currencyCode;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialAmount,
|
draftValue,
|
||||||
initialCurrencyCode,
|
setDraftValue,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
persistCurrencyField,
|
persistCurrencyField,
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
|
import { FieldDateTimeValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
@@ -22,9 +24,14 @@ export const useDateTimeField = () => {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { setDraftValue } = useRecordFieldInput<FieldDateTimeValue>(
|
||||||
|
`${entityId}-${fieldName}`,
|
||||||
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
|
setDraftValue,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
clearable,
|
clearable,
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
|
import { FieldEmailValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldEmail } from '../../types/guards/isFieldEmail';
|
import { isFieldEmail } from '../../types/guards/isFieldEmail';
|
||||||
|
|
||||||
@@ -22,16 +23,16 @@ export const useEmailField = () => {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldEmailValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const initialValue = fieldInitialValue?.isEmpty
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
? ''
|
|
||||||
: fieldInitialValue?.value ?? fieldValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialValue,
|
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
};
|
};
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { usePersistField } from '../../hooks/usePersistField';
|
import { usePersistField } from '../../hooks/usePersistField';
|
||||||
import { FieldFullNameValue } from '../../types/FieldMetadata';
|
import { FieldFullNameValue } from '../../types/FieldMetadata';
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
@@ -35,17 +35,17 @@ export const useFullNameField = () => {
|
|||||||
persistField(newValue);
|
persistField(newValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldFullNameValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const initialValue: FieldFullNameValue = fieldInitialValue?.isEmpty
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
? { firstName: '', lastName: '' }
|
|
||||||
: fieldValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialValue,
|
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
persistFullNameField,
|
persistFullNameField,
|
||||||
};
|
};
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { usePersistField } from '../../hooks/usePersistField';
|
import { usePersistField } from '../../hooks/usePersistField';
|
||||||
import { FieldLinkValue } from '../../types/FieldMetadata';
|
import { FieldLinkValue } from '../../types/FieldMetadata';
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
@@ -25,13 +25,10 @@ export const useLinkField = () => {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldLinkValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const initialValue: FieldLinkValue = fieldInitialValue?.isEmpty
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
? { url: '', label: '' }
|
|
||||||
: fieldInitialValue?.value
|
|
||||||
? { url: fieldInitialValue.value, label: '' }
|
|
||||||
: fieldValue;
|
|
||||||
|
|
||||||
const persistField = usePersistField();
|
const persistField = usePersistField();
|
||||||
|
|
||||||
@@ -46,7 +43,8 @@ export const useLinkField = () => {
|
|||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialValue,
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
persistLinkField,
|
persistLinkField,
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
|
import { FieldNumberValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import {
|
import {
|
||||||
canBeCastAsIntegerOrNull,
|
canBeCastAsIntegerOrNull,
|
||||||
@@ -8,7 +10,6 @@ import {
|
|||||||
} from '~/utils/cast-as-integer-or-null';
|
} from '~/utils/cast-as-integer-or-null';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { usePersistField } from '../../hooks/usePersistField';
|
import { usePersistField } from '../../hooks/usePersistField';
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldNumber } from '../../types/guards/isFieldNumber';
|
import { isFieldNumber } from '../../types/guards/isFieldNumber';
|
||||||
@@ -39,18 +40,16 @@ export const useNumberField = () => {
|
|||||||
persistField(castedValue);
|
persistField(castedValue);
|
||||||
};
|
};
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldNumberValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const initialValue = fieldInitialValue?.isEmpty
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
? null
|
|
||||||
: !isNaN(Number(fieldInitialValue?.value))
|
|
||||||
? Number(fieldInitialValue?.value)
|
|
||||||
: null ?? fieldValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialValue,
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
persistNumberField,
|
persistNumberField,
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { isPossiblePhoneNumber } from 'libphonenumber-js';
|
import { isPossiblePhoneNumber } from 'libphonenumber-js';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
|
import { FieldPhoneValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { usePersistField } from '../../hooks/usePersistField';
|
import { usePersistField } from '../../hooks/usePersistField';
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldPhone } from '../../types/guards/isFieldPhone';
|
import { isFieldPhone } from '../../types/guards/isFieldPhone';
|
||||||
@@ -13,7 +14,6 @@ import { isFieldPhone } from '../../types/guards/isFieldPhone';
|
|||||||
export const usePhoneField = () => {
|
export const usePhoneField = () => {
|
||||||
const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
|
const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
|
||||||
|
|
||||||
//assertFieldMetadata('PHONE', isFieldPhone, fieldDefinition);
|
|
||||||
assertFieldMetadata('TEXT', isFieldPhone, fieldDefinition);
|
assertFieldMetadata('TEXT', isFieldPhone, fieldDefinition);
|
||||||
|
|
||||||
const fieldName = fieldDefinition.metadata.fieldName;
|
const fieldName = fieldDefinition.metadata.fieldName;
|
||||||
@@ -32,18 +32,17 @@ export const usePhoneField = () => {
|
|||||||
|
|
||||||
persistField(newPhoneValue);
|
persistField(newPhoneValue);
|
||||||
};
|
};
|
||||||
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldPhoneValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
|
|
||||||
const initialValue = fieldInitialValue?.isEmpty
|
|
||||||
? ''
|
|
||||||
: fieldInitialValue?.value ?? fieldValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialValue,
|
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
persistPhoneField,
|
persistPhoneField,
|
||||||
};
|
};
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { useGetButtonIcon } from '@/object-record/field/hooks/useGetButtonIcon';
|
import { useGetButtonIcon } from '@/object-record/record-field/hooks/useGetButtonIcon';
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
|
import { FieldRelationValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldRelation } from '../../types/guards/isFieldRelation';
|
import { isFieldRelation } from '../../types/guards/isFieldRelation';
|
||||||
|
|
||||||
@@ -17,22 +18,20 @@ export const useRelationField = () => {
|
|||||||
|
|
||||||
const fieldName = fieldDefinition.metadata.fieldName;
|
const fieldName = fieldDefinition.metadata.fieldName;
|
||||||
|
|
||||||
const [fieldValue, setFieldValue] = useRecoilState<any | null>(
|
const [fieldValue, setFieldValue] = useRecoilState<FieldRelationValue>(
|
||||||
recordStoreFamilySelector({ recordId: entityId, fieldName }),
|
recordStoreFamilySelector({ recordId: entityId, fieldName }),
|
||||||
);
|
);
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { getDraftValueSelector } = useRecordFieldInput<FieldRelationValue>(
|
||||||
|
`${entityId}-${fieldName}`,
|
||||||
|
);
|
||||||
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
|
|
||||||
const initialSearchValue = fieldInitialValue?.isEmpty
|
const initialSearchValue = draftValue;
|
||||||
? null
|
|
||||||
: fieldInitialValue?.value;
|
|
||||||
|
|
||||||
const initialValue = fieldInitialValue?.isEmpty ? null : fieldValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue,
|
fieldValue,
|
||||||
initialValue,
|
|
||||||
initialSearchValue,
|
initialSearchValue,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
maxWidth: button && maxWidth ? maxWidth - 28 : maxWidth,
|
maxWidth: button && maxWidth ? maxWidth - 28 : maxWidth,
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { usePersistField } from '@/object-record/field/hooks/usePersistField';
|
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
import { FieldMetadataType } from '~/generated/graphql';
|
import { FieldMetadataType } from '~/generated/graphql';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { FieldSelectValue } from '../../types/FieldMetadata';
|
import { FieldSelectValue } from '../../types/FieldMetadata';
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldSelect } from '../../types/guards/isFieldSelect';
|
import { isFieldSelect } from '../../types/guards/isFieldSelect';
|
||||||
@@ -27,16 +27,18 @@ export const useSelectField = () => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const fieldSelectValue = isFieldSelectValue(fieldValue) ? fieldValue : null;
|
const fieldSelectValue = isFieldSelectValue(fieldValue) ? fieldValue : null;
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
|
||||||
|
|
||||||
const persistField = usePersistField();
|
const persistField = usePersistField();
|
||||||
|
|
||||||
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldSelectValue>(`${entityId}-${fieldName}`);
|
||||||
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
persistField,
|
persistField,
|
||||||
fieldValue: fieldSelectValue,
|
fieldValue: fieldSelectValue,
|
||||||
initialValue: fieldInitialValue,
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
};
|
};
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
|
import { useRecordFieldInput } from '@/object-record/record-field/hooks/useRecordFieldInput';
|
||||||
|
import { FieldTextValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldText } from '../../types/guards/isFieldText';
|
import { isFieldText } from '../../types/guards/isFieldText';
|
||||||
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
|
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
|
||||||
@@ -17,7 +18,7 @@ export const useTextField = () => {
|
|||||||
|
|
||||||
const fieldName = fieldDefinition.metadata.fieldName;
|
const fieldName = fieldDefinition.metadata.fieldName;
|
||||||
|
|
||||||
const [fieldValue, setFieldValue] = useRecoilState<string>(
|
const [fieldValue, setFieldValue] = useRecoilState<FieldTextValue>(
|
||||||
recordStoreFamilySelector({
|
recordStoreFamilySelector({
|
||||||
recordId: entityId,
|
recordId: entityId,
|
||||||
fieldName: fieldName,
|
fieldName: fieldName,
|
||||||
@@ -25,17 +26,17 @@ export const useTextField = () => {
|
|||||||
);
|
);
|
||||||
const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : '';
|
const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : '';
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
const { setDraftValue, getDraftValueSelector } =
|
||||||
|
useRecordFieldInput<FieldTextValue>(`${entityId}-${fieldName}`);
|
||||||
|
|
||||||
const initialValue = fieldInitialValue?.isEmpty
|
const draftValue = useRecoilValue(getDraftValueSelector());
|
||||||
? ''
|
|
||||||
: fieldInitialValue?.value ?? fieldTextValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
draftValue,
|
||||||
|
setDraftValue,
|
||||||
maxWidth,
|
maxWidth,
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue: fieldTextValue,
|
fieldValue: fieldTextValue,
|
||||||
initialValue,
|
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
};
|
};
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { isFieldUuid } from '@/object-record/field/types/guards/isFieldUuid';
|
import { FieldUUidValue } from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
import { isFieldUuid } from '@/object-record/record-field/types/guards/isFieldUuid';
|
||||||
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
import { recordStoreFamilySelector } from '@/object-record/record-store/states/selectors/recordStoreFamilySelector';
|
||||||
|
|
||||||
import { FieldContext } from '../../contexts/FieldContext';
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
|
||||||
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
|
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ export const useUuidField = () => {
|
|||||||
|
|
||||||
const fieldName = fieldDefinition.metadata.fieldName;
|
const fieldName = fieldDefinition.metadata.fieldName;
|
||||||
|
|
||||||
const [fieldValue, setFieldValue] = useRecoilState<string>(
|
const [fieldValue, setFieldValue] = useRecoilState<FieldUUidValue>(
|
||||||
recordStoreFamilySelector({
|
recordStoreFamilySelector({
|
||||||
recordId: entityId,
|
recordId: entityId,
|
||||||
fieldName: fieldName,
|
fieldName: fieldName,
|
||||||
@@ -24,16 +24,9 @@ export const useUuidField = () => {
|
|||||||
);
|
);
|
||||||
const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : '';
|
const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : '';
|
||||||
|
|
||||||
const fieldInitialValue = useFieldInitialValue();
|
|
||||||
|
|
||||||
const initialValue = fieldInitialValue?.isEmpty
|
|
||||||
? ''
|
|
||||||
: fieldInitialValue?.value ?? fieldTextValue;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldDefinition,
|
fieldDefinition,
|
||||||
fieldValue: fieldTextValue,
|
fieldValue: fieldTextValue,
|
||||||
initialValue,
|
|
||||||
setFieldValue,
|
setFieldValue,
|
||||||
hotkeyScope,
|
hotkeyScope,
|
||||||
};
|
};
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useSaveFieldEditModeValue } from '@/object-record/field/hooks/useSaveFieldEditModeValue';
|
import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode';
|
||||||
import { TextInput } from '@/ui/field/input/components/TextInput';
|
import { TextInput } from '@/ui/field/input/components/TextInput';
|
||||||
|
|
||||||
import { FieldInputOverlay } from '../../../../../ui/field/input/components/FieldInputOverlay';
|
import { FieldInputOverlay } from '../../../../../ui/field/input/components/FieldInputOverlay';
|
||||||
@@ -21,20 +21,14 @@ export const CurrencyFieldInput = ({
|
|||||||
onTab,
|
onTab,
|
||||||
onShiftTab,
|
onShiftTab,
|
||||||
}: CurrencyFieldInputProps) => {
|
}: CurrencyFieldInputProps) => {
|
||||||
const {
|
const { hotkeyScope, draftValue, persistCurrencyField, setDraftValue } =
|
||||||
hotkeyScope,
|
useCurrencyField();
|
||||||
initialAmount,
|
|
||||||
initialCurrencyCode,
|
|
||||||
persistCurrencyField,
|
|
||||||
} = useCurrencyField();
|
|
||||||
|
|
||||||
const saveEditModeValue = useSaveFieldEditModeValue();
|
|
||||||
|
|
||||||
const handleEnter = (newValue: string) => {
|
const handleEnter = (newValue: string) => {
|
||||||
onEnter?.(() => {
|
onEnter?.(() => {
|
||||||
persistCurrencyField({
|
persistCurrencyField({
|
||||||
amountText: newValue,
|
amountText: newValue,
|
||||||
currencyCode: initialCurrencyCode,
|
currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -43,7 +37,7 @@ export const CurrencyFieldInput = ({
|
|||||||
onEscape?.(() => {
|
onEscape?.(() => {
|
||||||
persistCurrencyField({
|
persistCurrencyField({
|
||||||
amountText: newValue,
|
amountText: newValue,
|
||||||
currencyCode: initialCurrencyCode,
|
currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -55,7 +49,7 @@ export const CurrencyFieldInput = ({
|
|||||||
onClickOutside?.(() => {
|
onClickOutside?.(() => {
|
||||||
persistCurrencyField({
|
persistCurrencyField({
|
||||||
amountText: newValue,
|
amountText: newValue,
|
||||||
currencyCode: initialCurrencyCode,
|
currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -64,7 +58,7 @@ export const CurrencyFieldInput = ({
|
|||||||
onTab?.(() => {
|
onTab?.(() => {
|
||||||
persistCurrencyField({
|
persistCurrencyField({
|
||||||
amountText: newValue,
|
amountText: newValue,
|
||||||
currencyCode: initialCurrencyCode,
|
currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -73,22 +67,22 @@ export const CurrencyFieldInput = ({
|
|||||||
onShiftTab?.(() =>
|
onShiftTab?.(() =>
|
||||||
persistCurrencyField({
|
persistCurrencyField({
|
||||||
amountText: newValue,
|
amountText: newValue,
|
||||||
currencyCode: initialCurrencyCode,
|
currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleChange = (newValue: string) => {
|
const handleChange = (newValue: string) => {
|
||||||
saveEditModeValue({
|
setDraftValue({
|
||||||
amountText: newValue,
|
amount: newValue,
|
||||||
currencyCode: initialCurrencyCode,
|
currencyCode: draftValue?.currencyCode ?? CurrencyCode.USD,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FieldInputOverlay>
|
<FieldInputOverlay>
|
||||||
<TextInput
|
<TextInput
|
||||||
value={initialAmount?.toString() ?? ''}
|
value={draftValue?.amount?.toString() ?? ''}
|
||||||
autoFocus
|
autoFocus
|
||||||
placeholder="Currency"
|
placeholder="Currency"
|
||||||
onClickOutside={handleClickOutside}
|
onClickOutside={handleClickOutside}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user