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:
Jeong Min Cho
2024-01-11 02:47:19 +09:00
committed by GitHub
parent 49f66fec70
commit a791d1f5ba
3 changed files with 127 additions and 6 deletions

View File

@ -25,6 +25,7 @@ import { Table } from '@/ui/layout/table/components/Table';
import { TableHeader } from '@/ui/layout/table/components/TableHeader';
import { TableSection } from '@/ui/layout/table/components/TableSection';
import { Breadcrumb } from '@/ui/navigation/bread-crumb/components/Breadcrumb';
import { sortFieldMetadataItem } from '~/utils/sortFieldMetadataItem';
const StyledDiv = styled.div`
display: flex;
@ -51,12 +52,16 @@ export const SettingsObjectDetail = () => {
if (!activeObjectMetadataItem) return null;
const activeMetadataFields = activeObjectMetadataItem.fields.filter(
(metadataField) => metadataField.isActive && !metadataField.isSystem,
);
const disabledMetadataFields = activeObjectMetadataItem.fields.filter(
(metadataField) => !metadataField.isActive && !metadataField.isSystem,
);
const activeMetadataFields = 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 () => {
await disableObjectMetadataItem(activeObjectMetadataItem);

View File

@ -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);
});
});

View 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;
};