Sort Metadata Fields by Custom Status and Creation Date (#3254)
* Added sortFields function and used on active and disabled metadataFields * Added a sortFieldMetadataItem and used parseDate instead of vanila Date * Added tests for sortFieldMetadataItem (#3253) * Applied sortFieldMetadataItem (#3253)
This commit is contained in:
@ -25,6 +25,7 @@ import { Table } from '@/ui/layout/table/components/Table';
|
|||||||
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
|
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
|
||||||
import { TableSection } from '@/ui/layout/table/components/TableSection';
|
import { TableSection } from '@/ui/layout/table/components/TableSection';
|
||||||
import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb';
|
import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb';
|
||||||
|
import { sortFieldMetadataItem } from '~/utils/sortFieldMetadataItem';
|
||||||
|
|
||||||
const StyledDiv = styled.div`
|
const StyledDiv = styled.div`
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -51,12 +52,16 @@ export const SettingsObjectDetail = () => {
|
|||||||
|
|
||||||
if (!activeObjectMetadataItem) return null;
|
if (!activeObjectMetadataItem) return null;
|
||||||
|
|
||||||
const activeMetadataFields = activeObjectMetadataItem.fields.filter(
|
const activeMetadataFields = activeObjectMetadataItem.fields
|
||||||
(metadataField) => metadataField.isActive && !metadataField.isSystem,
|
.filter(
|
||||||
);
|
(metadataField) => metadataField.isActive && !metadataField.isSystem,
|
||||||
const disabledMetadataFields = activeObjectMetadataItem.fields.filter(
|
)
|
||||||
(metadataField) => !metadataField.isActive && !metadataField.isSystem,
|
.sort(sortFieldMetadataItem);
|
||||||
);
|
const disabledMetadataFields = activeObjectMetadataItem.fields
|
||||||
|
.filter(
|
||||||
|
(metadataField) => !metadataField.isActive && !metadataField.isSystem,
|
||||||
|
)
|
||||||
|
.sort(sortFieldMetadataItem);
|
||||||
|
|
||||||
const handleDisableObject = async () => {
|
const handleDisableObject = async () => {
|
||||||
await disableObjectMetadataItem(activeObjectMetadataItem);
|
await disableObjectMetadataItem(activeObjectMetadataItem);
|
||||||
|
|||||||
@ -0,0 +1,96 @@
|
|||||||
|
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||||
|
|
||||||
|
import { sortFieldMetadataItem } from '../sortFieldMetadataItem';
|
||||||
|
|
||||||
|
describe('sortFieldMetadataItem', () => {
|
||||||
|
it('should return an empty array for an empty array', () => {
|
||||||
|
const items: FieldMetadataItem[] = [];
|
||||||
|
const sortedItems = items.sort(sortFieldMetadataItem);
|
||||||
|
const expectedItems: FieldMetadataItem[] = [];
|
||||||
|
expect(sortedItems).toEqual(expectedItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return array with a single item for the same array', () => {
|
||||||
|
const item1 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-03T11:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const items: FieldMetadataItem[] = [item1];
|
||||||
|
const sortedItems = items.sort(sortFieldMetadataItem);
|
||||||
|
const expectedItems: FieldMetadataItem[] = [item1];
|
||||||
|
expect(sortedItems).toEqual(expectedItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly sort items based on createdAt', () => {
|
||||||
|
const item1 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-03T11:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item2 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-02T09:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item3 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-03T09:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const items = [item1, item2, item3];
|
||||||
|
const sortedItems = items.sort(sortFieldMetadataItem);
|
||||||
|
const expectedItems = [item2, item3, item1];
|
||||||
|
|
||||||
|
expect(sortedItems).toEqual(expectedItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly sort items based on isCustom and createdAt', () => {
|
||||||
|
const item1 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-03T09:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item2 = {
|
||||||
|
isCustom: true,
|
||||||
|
createdAt: '2024-01-02T09:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item3 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-01T09:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item4 = {
|
||||||
|
isCustom: true,
|
||||||
|
createdAt: '2024-01-04T09:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const items = [item1, item2, item3, item4];
|
||||||
|
const sortedItems = items.sort(sortFieldMetadataItem);
|
||||||
|
const expectedItems = [item3, item1, item2, item4];
|
||||||
|
|
||||||
|
expect(sortedItems).toEqual(expectedItems);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle arrays with items missing required properties', () => {
|
||||||
|
const item1 = {
|
||||||
|
isCustom: false,
|
||||||
|
createdAt: '2024-01-03T11:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item2 = {
|
||||||
|
// Missing createdAt property
|
||||||
|
isCustom: false,
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const item3 = {
|
||||||
|
// Missing isCustom property
|
||||||
|
createdAt: '2024-01-05T11:41:16.344Z',
|
||||||
|
} as FieldMetadataItem;
|
||||||
|
|
||||||
|
const items = [item1, item2, item3];
|
||||||
|
const sortedItems = items.sort(sortFieldMetadataItem);
|
||||||
|
expect(sortedItems).toHaveLength(items.length);
|
||||||
|
});
|
||||||
|
});
|
||||||
20
packages/twenty-front/src/utils/sortFieldMetadataItem.ts
Normal file
20
packages/twenty-front/src/utils/sortFieldMetadataItem.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem';
|
||||||
|
|
||||||
|
import { parseDate } from '../utils/date-utils';
|
||||||
|
|
||||||
|
export const sortFieldMetadataItem = (
|
||||||
|
a: FieldMetadataItem,
|
||||||
|
b: FieldMetadataItem,
|
||||||
|
) => {
|
||||||
|
const customCompare = a.isCustom === b.isCustom ? 0 : a.isCustom ? 1 : -1;
|
||||||
|
if (customCompare !== 0) return customCompare;
|
||||||
|
|
||||||
|
const dateA = a.createdAt ? parseDate(a.createdAt) : null;
|
||||||
|
const dateB = b.createdAt ? parseDate(b.createdAt) : null;
|
||||||
|
|
||||||
|
if (!dateA && !dateB) return 0;
|
||||||
|
if (!dateA) return 1;
|
||||||
|
if (!dateB) return -1;
|
||||||
|
|
||||||
|
return dateB.diff(dateA).milliseconds > 0 ? -1 : 1;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user