85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
|
import type { UpEntry } from "upend";
|
||
|
|
||
|
export type SortKeys = { [key: string]: string[] };
|
||
|
|
||
|
export function sortByValue(entries: UpEntry[], sortKeys: SortKeys): void {
|
||
|
entries
|
||
|
.sort((aEntry, bEntry) => {
|
||
|
if (
|
||
|
!sortKeys[aEntry.value.c]?.length ||
|
||
|
!sortKeys[bEntry.value.c]?.length
|
||
|
) {
|
||
|
if (
|
||
|
Boolean(sortKeys[aEntry.value.c]?.length) &&
|
||
|
!sortKeys[bEntry.value.c]?.length
|
||
|
) {
|
||
|
return -1;
|
||
|
} else if (
|
||
|
!sortKeys[aEntry.value.c]?.length &&
|
||
|
Boolean(sortKeys[bEntry.value.c]?.length)
|
||
|
) {
|
||
|
return 1;
|
||
|
} else {
|
||
|
return String(aEntry.value.c).localeCompare(String(bEntry.value.c));
|
||
|
}
|
||
|
} else {
|
||
|
return sortKeys[aEntry.value.c][0].localeCompare(
|
||
|
sortKeys[bEntry.value.c][0],
|
||
|
undefined,
|
||
|
{ numeric: true, sensitivity: "base" }
|
||
|
);
|
||
|
}
|
||
|
})
|
||
|
.sort((aEntry, bEntry) => {
|
||
|
return String(aEntry.value.c).length - String(bEntry.value.c).length;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export function sortByAttribute(entries: UpEntry[]): void {
|
||
|
entries.sort((aEntry, bEntry) => {
|
||
|
return aEntry.attribute.localeCompare(bEntry.attribute);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export function sortByEntity(entries: UpEntry[], sortKeys: SortKeys): void {
|
||
|
entries
|
||
|
.sort((aEntry, bEntry) => {
|
||
|
return aEntry.attribute.localeCompare(bEntry.attribute);
|
||
|
})
|
||
|
.sort((aEntry, bEntry) => {
|
||
|
if (
|
||
|
!sortKeys[aEntry.entity]?.length ||
|
||
|
!sortKeys[bEntry.entity]?.length
|
||
|
) {
|
||
|
if (
|
||
|
Boolean(sortKeys[aEntry.entity]?.length) &&
|
||
|
!sortKeys[bEntry.entity]?.length
|
||
|
) {
|
||
|
return -1;
|
||
|
} else if (
|
||
|
!sortKeys[aEntry.entity]?.length &&
|
||
|
Boolean(sortKeys[bEntry.entity]?.length)
|
||
|
) {
|
||
|
return 1;
|
||
|
} else {
|
||
|
return aEntry.entity.localeCompare(bEntry.entity);
|
||
|
}
|
||
|
} else {
|
||
|
return sortKeys[aEntry.entity][0].localeCompare(
|
||
|
sortKeys[bEntry.entity][0]
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export function defaultEntitySort(
|
||
|
entries: UpEntry[],
|
||
|
sortKeys: SortKeys
|
||
|
): UpEntry[] {
|
||
|
const result = entries.concat();
|
||
|
sortByValue(entries, sortKeys);
|
||
|
sortByAttribute(entries);
|
||
|
sortByEntity(entries, sortKeys);
|
||
|
return result;
|
||
|
}
|