Fix various bugs before 0.2.2 (#3118)

* Fix various bugs before 0.2.2 release

* Additional fixes

* More fixes

* Fixes
This commit is contained in:
Charles Bochet
2023-12-21 23:48:52 +01:00
committed by GitHub
parent 69ffa0d229
commit 756b30815e
28 changed files with 183 additions and 245 deletions

View File

@ -38,7 +38,7 @@ const initializeValue = (
return {
amount: convertCurrencyMicrosToCurrency(fieldValue.amountMicros),
currencyCode: fieldValue.currencyCode,
currencyCode: CurrencyCode.USD,
};
};

View File

@ -8,7 +8,6 @@ import { capitalize } from '~/utils/string/capitalize';
type useCreateOneRecordProps = {
objectNameSingular: string;
refetchFindManyQuery?: boolean;
};
export const useCreateOneRecord = <T>({
@ -36,6 +35,7 @@ export const useCreateOneRecord = <T>({
const generatedEmptyRecord = generateEmptyRecord<Record<string, unknown>>({
id: recordId,
createdAt: new Date().toISOString(),
...input,
});
@ -53,7 +53,7 @@ export const useCreateOneRecord = <T>({
},
optimisticResponse: {
[`create${capitalize(objectMetadataItem.nameSingular)}`]:
generateEmptyRecord({ id: recordId, ...input }),
generatedEmptyRecord,
},
});

View File

@ -1,4 +1,5 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue';
export const useGenerateEmptyRecord = ({
objectMetadataItem,
@ -10,157 +11,14 @@ export const useGenerateEmptyRecord = ({
// Todo replace this by runtime typing
const validatedInput = input as { id: string } & { [key: string]: any };
if (objectMetadataItem.nameSingular === 'company') {
return {
id: validatedInput.id,
domainName: '',
accountOwnerId: null,
createdAt: new Date().toISOString(),
address: '',
people: [
{
edges: [],
__typename: 'PersonConnection',
},
],
xLink: {
label: '',
url: '',
__typename: 'Link',
},
attachments: {
edges: [],
__typename: 'AttachmentConnection',
},
activityTargets: {
edges: [],
__typename: 'ActivityTargetConnection',
},
idealCustomerProfile: null,
annualRecurringRevenue: {
amountMicros: null,
currencyCode: null,
__typename: 'Currency',
},
updatedAt: new Date().toISOString(),
employees: null,
accountOwner: null,
name: '',
linkedinLink: {
label: '',
url: '',
__typename: 'Link',
},
favorites: {
edges: [],
__typename: 'FavoriteConnection',
},
opportunities: {
edges: [],
__typename: 'OpportunityConnection',
},
__typename: 'Company',
} as T;
}
const emptyRecord = {} as Record<string, any>;
if (objectMetadataItem.nameSingular === 'person') {
return {
id: validatedInput.id,
activityTargets: {
edges: [],
__typename: 'ActivityTargetConnection',
},
opportunities: {
edges: [],
__typename: 'OpportunityConnection',
},
companyId: null,
favorites: {
edges: [],
__typename: 'FavoriteConnection',
},
phone: '',
company: null,
xLink: {
label: '',
url: '',
__typename: 'Link',
},
jobTitle: '',
pointOfContactForOpportunities: {
edges: [],
__typename: 'OpportunityConnection',
},
email: '',
attachments: {
edges: [],
__typename: 'AttachmentConnection',
},
name: {
firstName: '',
lastName: '',
__typename: 'FullName',
},
avatarUrl: '',
updatedAt: new Date().toISOString(),
createdAt: new Date().toISOString(),
city: '',
linkedinLink: {
label: '',
url: '',
__typename: 'Link',
},
__typename: 'Person',
} as T;
}
if (objectMetadataItem.nameSingular === 'opportunity') {
return {
id: validatedInput.id,
pipelineStepId: validatedInput.pipelineStepId,
closeDate: null,
updatedAt: new Date().toISOString(),
pipelineStep: null,
probability: '0',
pointOfContactId: null,
personId: null,
amount: {
amountMicros: null,
currencyCode: null,
__typename: 'Currency',
},
createdAt: new Date().toISOString(),
pointOfContact: null,
person: null,
company: null,
companyId: validatedInput.companyId,
__typename: 'Opportunity',
} as T;
}
if (objectMetadataItem.nameSingular === 'opportunity') {
return {
id: validatedInput.id,
pipelineStepId: validatedInput.pipelineStepId,
closeDate: null,
updatedAt: new Date().toISOString(),
pipelineStep: null,
probability: '0',
pointOfContactId: null,
personId: null,
amount: {
amountMicros: null,
currencyCode: null,
__typename: 'Currency',
},
createdAt: new Date().toISOString(),
pointOfContact: null,
person: null,
company: null,
companyId: validatedInput.companyId,
__typename: 'Opportunity',
} as T;
for (const fieldMetadataItem of objectMetadataItem.fields) {
emptyRecord[fieldMetadataItem.name] =
validatedInput[fieldMetadataItem.name] ??
generateEmptyFieldValue(fieldMetadataItem);
}
return emptyRecord as T;
};
return {

View File

@ -7,7 +7,6 @@ import { capitalize } from '~/utils/string/capitalize';
type useUpdateOneRecordProps = {
objectNameSingular: string;
refetchFindManyQuery?: boolean;
};
export const useUpdateOneRecord = <T>({

View File

@ -43,13 +43,11 @@ export const ColumnHead = ({ column }: ColumnHeadProps) => {
const Icon = getIcon(column.iconName);
return (
<>
<StyledTitle>
<StyledIcon>
<Icon size={theme.icon.size.md} />
</StyledIcon>
<StyledText>{column.label}</StyledText>
</StyledTitle>
</>
<StyledTitle>
<StyledIcon>
<Icon size={theme.icon.size.md} />
</StyledIcon>
<StyledText>{column.label}</StyledText>
</StyledTitle>
);
};

View File

@ -1,3 +1,5 @@
import styled from '@emotion/styled';
import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown';
import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope';
@ -14,6 +16,11 @@ type ColumnHeadWithDropdownProps = {
primaryColumnKey: string;
};
const StyledDropdown = styled(Dropdown)`
display: flex;
flex: 1;
`;
export const ColumnHeadWithDropdown = ({
column,
isFirstColumn,
@ -22,7 +29,7 @@ export const ColumnHeadWithDropdown = ({
}: ColumnHeadWithDropdownProps) => {
return (
<DropdownScope dropdownScopeId={column.fieldMetadataId + '-header'}>
<Dropdown
<StyledDropdown
clickableComponent={<ColumnHead column={column} />}
dropdownComponents={
<RecordTableColumnDropdownMenu

View File

@ -10,15 +10,17 @@ export const RecordTableBody = () => {
const tableRowIds = useRecoilValue(tableRowIdsState);
return (
<tbody>
{tableRowIds.map((rowId, rowIndex) => (
<RowIdContext.Provider value={rowId} key={rowId}>
<RowIndexContext.Provider value={rowIndex}>
<RecordTableRow key={rowId} rowId={rowId} />
</RowIndexContext.Provider>
</RowIdContext.Provider>
))}
<>
<tbody>
{tableRowIds.map((rowId, rowIndex) => (
<RowIdContext.Provider value={rowId} key={rowId}>
<RowIndexContext.Provider value={rowIndex}>
<RecordTableRow key={rowId} rowId={rowId} />
</RowIndexContext.Provider>
</RowIdContext.Provider>
))}
</tbody>
<RecordTableBodyFetchMoreLoader />
</tbody>
</>
);
};

View File

@ -30,11 +30,15 @@ export const RecordTableBodyFetchMoreLoader = () => {
onChange: onLastRowVisible,
});
return isFetchingMoreObjects ? (
<StyledRow ref={tbodyRef} selected={false}>
<td style={{ height: 50 }} colSpan={1000}>
Loading more...
</td>
</StyledRow>
) : null;
return (
<tbody ref={tbodyRef}>
{isFetchingMoreObjects ? (
<StyledRow selected={false}>
<td style={{ height: 50 }} colSpan={1000}>
Loading more...
</td>
</StyledRow>
) : null}
</tbody>
);
};

View File

@ -0,0 +1,57 @@
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
import { FieldMetadataType } from '~/generated/graphql';
export const generateEmptyFieldValue = (
fieldMetadataItem: FieldMetadataItem,
) => {
switch (fieldMetadataItem.type) {
case FieldMetadataType.Email:
case FieldMetadataType.Phone:
case FieldMetadataType.Text: {
return '';
}
case FieldMetadataType.Link: {
return {
label: '',
url: '',
__typename: 'Link',
};
}
case FieldMetadataType.FullName: {
return {
firstName: '',
lastName: '',
__typename: 'FullName',
};
}
case FieldMetadataType.DateTime: {
return null;
}
case FieldMetadataType.Number:
case FieldMetadataType.Rating:
case FieldMetadataType.Numeric: {
return null;
}
case FieldMetadataType.Uuid: {
return '';
}
case FieldMetadataType.Boolean: {
return true;
}
case FieldMetadataType.Relation: {
return null;
}
case FieldMetadataType.Currency: {
return {
amountMicros: null,
currencyCode: null,
__typename: 'Currency',
};
}
case FieldMetadataType.MultiSelect:
case FieldMetadataType.Select: {
throw new Error('Not implemented yet');
}
}
};

View File

@ -5,7 +5,9 @@ export const isFieldMetadataItemAvailable = (
fieldMetadataItem: FieldMetadataItem,
) =>
fieldMetadataItem.type !== 'UUID' &&
(fieldMetadataItem.type !== 'RELATION' ||
parseFieldRelationType(fieldMetadataItem) === 'TO_ONE_OBJECT') &&
!(
fieldMetadataItem.type === 'RELATION' &&
parseFieldRelationType(fieldMetadataItem) !== 'TO_ONE_OBJECT'
) &&
!fieldMetadataItem.isSystem &&
!!fieldMetadataItem.isActive;