Add support for UUID fields in tables (#2529)
This commit is contained in:
@ -1,6 +1,8 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
|
|
||||||
import { RelationFieldDisplay } from '@/ui/object/field/meta-types/display/components/RelationFieldDisplay';
|
import { RelationFieldDisplay } from '@/ui/object/field/meta-types/display/components/RelationFieldDisplay';
|
||||||
|
import { UuidFieldDisplay } from '@/ui/object/field/meta-types/display/components/UuidFieldDisplay';
|
||||||
|
import { isFieldUuid } from '@/ui/object/field/types/guards/isFieldUuid';
|
||||||
|
|
||||||
import { FieldContext } from '../contexts/FieldContext';
|
import { FieldContext } from '../contexts/FieldContext';
|
||||||
import { ChipFieldDisplay } from '../meta-types/display/components/ChipFieldDisplay';
|
import { ChipFieldDisplay } from '../meta-types/display/components/ChipFieldDisplay';
|
||||||
@ -38,6 +40,8 @@ export const FieldDisplay = () => {
|
|||||||
<RelationFieldDisplay />
|
<RelationFieldDisplay />
|
||||||
) : isFieldText(fieldDefinition) ? (
|
) : isFieldText(fieldDefinition) ? (
|
||||||
<TextFieldDisplay />
|
<TextFieldDisplay />
|
||||||
|
) : isFieldUuid(fieldDefinition) ? (
|
||||||
|
<UuidFieldDisplay />
|
||||||
) : isFieldEmail(fieldDefinition) ? (
|
) : isFieldEmail(fieldDefinition) ? (
|
||||||
<EmailFieldDisplay />
|
<EmailFieldDisplay />
|
||||||
) : isFieldDate(fieldDefinition) ? (
|
) : isFieldDate(fieldDefinition) ? (
|
||||||
|
|||||||
@ -0,0 +1,8 @@
|
|||||||
|
import { TextDisplay } from '@/ui/object/field/meta-types/display/content-display/components/TextDisplay';
|
||||||
|
import { useUuidField } from '@/ui/object/field/meta-types/hooks/useUuidField';
|
||||||
|
|
||||||
|
export const UuidFieldDisplay = () => {
|
||||||
|
const { fieldValue } = useUuidField();
|
||||||
|
|
||||||
|
return <TextDisplay text={fieldValue} />;
|
||||||
|
};
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
import { useContext } from 'react';
|
||||||
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { isFieldUuid } from '@/ui/object/field/types/guards/isFieldUuid';
|
||||||
|
|
||||||
|
import { FieldContext } from '../../contexts/FieldContext';
|
||||||
|
import { useFieldInitialValue } from '../../hooks/useFieldInitialValue';
|
||||||
|
import { entityFieldsFamilySelector } from '../../states/selectors/entityFieldsFamilySelector';
|
||||||
|
import { assertFieldMetadata } from '../../types/guards/assertFieldMetadata';
|
||||||
|
import { isFieldTextValue } from '../../types/guards/isFieldTextValue';
|
||||||
|
|
||||||
|
export const useUuidField = () => {
|
||||||
|
const { entityId, fieldDefinition, hotkeyScope } = useContext(FieldContext);
|
||||||
|
|
||||||
|
assertFieldMetadata('UUID', isFieldUuid, fieldDefinition);
|
||||||
|
|
||||||
|
const fieldName = fieldDefinition.metadata.fieldName;
|
||||||
|
|
||||||
|
const [fieldValue, setFieldValue] = useRecoilState<string>(
|
||||||
|
entityFieldsFamilySelector({
|
||||||
|
entityId: entityId,
|
||||||
|
fieldName: fieldName,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
const fieldTextValue = isFieldTextValue(fieldValue) ? fieldValue : '';
|
||||||
|
|
||||||
|
const fieldInitialValue = useFieldInitialValue();
|
||||||
|
|
||||||
|
const initialValue = fieldInitialValue?.isEmpty
|
||||||
|
? ''
|
||||||
|
: fieldInitialValue?.value ?? fieldTextValue;
|
||||||
|
|
||||||
|
return {
|
||||||
|
fieldDefinition,
|
||||||
|
fieldValue: fieldTextValue,
|
||||||
|
initialValue,
|
||||||
|
setFieldValue,
|
||||||
|
hotkeyScope,
|
||||||
|
};
|
||||||
|
};
|
||||||
@ -1,5 +1,6 @@
|
|||||||
import { selectorFamily } from 'recoil';
|
import { selectorFamily } from 'recoil';
|
||||||
|
|
||||||
|
import { isFieldUuid } from '@/ui/object/field/types/guards/isFieldUuid';
|
||||||
import { assertNotNull } from '~/utils/assert';
|
import { assertNotNull } from '~/utils/assert';
|
||||||
|
|
||||||
import { FieldDefinition } from '../../types/FieldDefinition';
|
import { FieldDefinition } from '../../types/FieldDefinition';
|
||||||
@ -39,6 +40,7 @@ export const isEntityFieldEmptyFamilySelector = selectorFamily({
|
|||||||
}) => {
|
}) => {
|
||||||
return ({ get }) => {
|
return ({ get }) => {
|
||||||
if (
|
if (
|
||||||
|
isFieldUuid(fieldDefinition) ||
|
||||||
isFieldText(fieldDefinition) ||
|
isFieldText(fieldDefinition) ||
|
||||||
isFieldURL(fieldDefinition) ||
|
isFieldURL(fieldDefinition) ||
|
||||||
isFieldDate(fieldDefinition) ||
|
isFieldDate(fieldDefinition) ||
|
||||||
|
|||||||
@ -1,6 +1,11 @@
|
|||||||
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
|
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
|
||||||
import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
|
import { Entity } from '@/ui/input/relation-picker/types/EntityTypeForSelect';
|
||||||
|
|
||||||
|
export type FieldUuidMetadata = {
|
||||||
|
placeHolder: string;
|
||||||
|
fieldName: string;
|
||||||
|
};
|
||||||
|
|
||||||
export type FieldTextMetadata = {
|
export type FieldTextMetadata = {
|
||||||
placeHolder: string;
|
placeHolder: string;
|
||||||
fieldName: string;
|
fieldName: string;
|
||||||
@ -86,6 +91,7 @@ export type FieldBooleanMetadata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type FieldMetadata =
|
export type FieldMetadata =
|
||||||
|
| FieldUuidMetadata
|
||||||
| FieldTextMetadata
|
| FieldTextMetadata
|
||||||
| FieldRelationMetadata
|
| FieldRelationMetadata
|
||||||
| FieldChipMetadata
|
| FieldChipMetadata
|
||||||
@ -103,6 +109,7 @@ export type FieldMetadata =
|
|||||||
| FieldBooleanMetadata;
|
| FieldBooleanMetadata;
|
||||||
|
|
||||||
export type FieldTextValue = string;
|
export type FieldTextValue = string;
|
||||||
|
export type FieldUUidValue = string;
|
||||||
|
|
||||||
export type FieldChipValue = string;
|
export type FieldChipValue = string;
|
||||||
export type FieldDateValue = string | null;
|
export type FieldDateValue = string | null;
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
export type FieldType =
|
export type FieldType =
|
||||||
|
| 'UUID'
|
||||||
| 'TEXT'
|
| 'TEXT'
|
||||||
| 'RELATION'
|
| 'RELATION'
|
||||||
| 'CHIP'
|
| 'CHIP'
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import {
|
|||||||
FieldTextMetadata,
|
FieldTextMetadata,
|
||||||
FieldURLMetadata,
|
FieldURLMetadata,
|
||||||
FieldURLV2Metadata,
|
FieldURLV2Metadata,
|
||||||
|
FieldUuidMetadata,
|
||||||
} from '../FieldMetadata';
|
} from '../FieldMetadata';
|
||||||
import { FieldType } from '../FieldType';
|
import { FieldType } from '../FieldType';
|
||||||
|
|
||||||
@ -23,6 +24,8 @@ type AssertFieldMetadataFunction = <
|
|||||||
E extends FieldType,
|
E extends FieldType,
|
||||||
T extends E extends 'TEXT'
|
T extends E extends 'TEXT'
|
||||||
? FieldTextMetadata
|
? FieldTextMetadata
|
||||||
|
: E extends 'UUID'
|
||||||
|
? FieldUuidMetadata
|
||||||
: E extends 'RELATION'
|
: E extends 'RELATION'
|
||||||
? FieldRelationMetadata
|
? FieldRelationMetadata
|
||||||
: E extends 'CHIP'
|
: E extends 'CHIP'
|
||||||
|
|||||||
@ -0,0 +1,6 @@
|
|||||||
|
import { FieldDefinition } from '../FieldDefinition';
|
||||||
|
import { FieldMetadata, FieldUuidMetadata } from '../FieldMetadata';
|
||||||
|
|
||||||
|
export const isFieldUuid = (
|
||||||
|
field: FieldDefinition<FieldMetadata>,
|
||||||
|
): field is FieldDefinition<FieldUuidMetadata> => field.type === 'UUID';
|
||||||
Reference in New Issue
Block a user