Aggregate count variations (#9304)
Closes https://github.com/twentyhq/private-issues/issues/222 --------- Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com> Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
@ -1,3 +1,5 @@
|
||||
export * from './constants/TwentyCompaniesBaseUrl';
|
||||
export * from './constants/TwentyIconsBaseUrl';
|
||||
export * from './utils/aggregateOperations';
|
||||
export * from './utils/image/getImageAbsoluteURI';
|
||||
|
||||
|
||||
25
packages/twenty-shared/src/types/FieldMetadataType.ts
Normal file
25
packages/twenty-shared/src/types/FieldMetadataType.ts
Normal file
@ -0,0 +1,25 @@
|
||||
export enum FieldMetadataType {
|
||||
UUID = 'UUID',
|
||||
TEXT = 'TEXT',
|
||||
PHONES = 'PHONES',
|
||||
EMAILS = 'EMAILS',
|
||||
DATE_TIME = 'DATE_TIME',
|
||||
DATE = 'DATE',
|
||||
BOOLEAN = 'BOOLEAN',
|
||||
NUMBER = 'NUMBER',
|
||||
NUMERIC = 'NUMERIC',
|
||||
LINKS = 'LINKS',
|
||||
CURRENCY = 'CURRENCY',
|
||||
FULL_NAME = 'FULL_NAME',
|
||||
RATING = 'RATING',
|
||||
SELECT = 'SELECT',
|
||||
MULTI_SELECT = 'MULTI_SELECT',
|
||||
RELATION = 'RELATION',
|
||||
POSITION = 'POSITION',
|
||||
ADDRESS = 'ADDRESS',
|
||||
RAW_JSON = 'RAW_JSON',
|
||||
RICH_TEXT = 'RICH_TEXT',
|
||||
ACTOR = 'ACTOR',
|
||||
ARRAY = 'ARRAY',
|
||||
TS_VECTOR = 'TS_VECTOR',
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
import { FieldMetadataType } from 'src/types/FieldMetadataType';
|
||||
import { getSubfieldForAggregateOperation } from 'src/utils/aggregateOperations/getSubFieldForAggregateOperation.util';
|
||||
import { isCompositeFieldMetadataType } from 'src/utils/aggregateOperations/isCompositeFieldMetadataType.util';
|
||||
import { capitalize } from 'src/utils/strings/capitalize';
|
||||
|
||||
export const getColumnNameForAggregateOperation = (
|
||||
fieldName: string,
|
||||
fieldType: FieldMetadataType,
|
||||
) => {
|
||||
if (!isCompositeFieldMetadataType(fieldType)) {
|
||||
return fieldName;
|
||||
}
|
||||
|
||||
return `${fieldName}${capitalize(getSubfieldForAggregateOperation(fieldType) as string)}`;
|
||||
};
|
||||
@ -0,0 +1,29 @@
|
||||
import { FieldMetadataType } from 'src/types/FieldMetadataType';
|
||||
import { isCompositeFieldMetadataType } from 'src/utils/aggregateOperations/isCompositeFieldMetadataType.util';
|
||||
|
||||
export const getSubfieldForAggregateOperation = (
|
||||
fieldType: FieldMetadataType,
|
||||
) => {
|
||||
if (!isCompositeFieldMetadataType(fieldType)) {
|
||||
return undefined;
|
||||
} else {
|
||||
switch (fieldType) {
|
||||
case FieldMetadataType.CURRENCY:
|
||||
return 'amountMicros';
|
||||
case FieldMetadataType.FULL_NAME:
|
||||
return 'lastName';
|
||||
case FieldMetadataType.ADDRESS:
|
||||
return 'addressStreet1';
|
||||
case FieldMetadataType.LINKS:
|
||||
return 'primaryLinkLabel';
|
||||
case FieldMetadataType.ACTOR:
|
||||
return 'workspaceMemberId';
|
||||
case FieldMetadataType.EMAILS:
|
||||
return 'primaryEmail';
|
||||
case FieldMetadataType.PHONES:
|
||||
return 'primaryPhoneNumber';
|
||||
default:
|
||||
throw new Error(`Unsupported composite field type: ${fieldType}`);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,3 @@
|
||||
export * from './getColumnNameForAggregateOperation.util';
|
||||
export * from './getSubFieldForAggregateOperation.util';
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
import { FieldMetadataType } from 'src/types/FieldMetadataType';
|
||||
|
||||
export const isCompositeFieldMetadataType = (
|
||||
type: FieldMetadataType,
|
||||
): type is
|
||||
| FieldMetadataType.CURRENCY
|
||||
| FieldMetadataType.FULL_NAME
|
||||
| FieldMetadataType.ADDRESS
|
||||
| FieldMetadataType.LINKS
|
||||
| FieldMetadataType.ACTOR
|
||||
| FieldMetadataType.EMAILS
|
||||
| FieldMetadataType.PHONES => {
|
||||
return [
|
||||
FieldMetadataType.CURRENCY,
|
||||
FieldMetadataType.FULL_NAME,
|
||||
FieldMetadataType.ADDRESS,
|
||||
FieldMetadataType.LINKS,
|
||||
FieldMetadataType.ACTOR,
|
||||
FieldMetadataType.EMAILS,
|
||||
FieldMetadataType.PHONES,
|
||||
].includes(type);
|
||||
};
|
||||
7
packages/twenty-shared/src/utils/strings/capitalize.ts
Normal file
7
packages/twenty-shared/src/utils/strings/capitalize.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { isNonEmptyString } from '@sniptt/guards';
|
||||
|
||||
export const capitalize = (stringToCapitalize: string) => {
|
||||
if (!isNonEmptyString(stringToCapitalize)) return '';
|
||||
|
||||
return stringToCapitalize[0].toUpperCase() + stringToCapitalize.slice(1);
|
||||
};
|
||||
Reference in New Issue
Block a user