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:
@ -38,7 +38,7 @@ const initializeValue = (
|
||||
|
||||
return {
|
||||
amount: convertCurrencyMicrosToCurrency(fieldValue.amountMicros),
|
||||
currencyCode: fieldValue.currencyCode,
|
||||
currencyCode: CurrencyCode.USD,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -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,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -7,7 +7,6 @@ import { capitalize } from '~/utils/string/capitalize';
|
||||
|
||||
type useUpdateOneRecordProps = {
|
||||
objectNameSingular: string;
|
||||
refetchFindManyQuery?: boolean;
|
||||
};
|
||||
|
||||
export const useUpdateOneRecord = <T>({
|
||||
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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');
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user