From cd649473d37066ba8af858748ecaf39e0cc6ded2 Mon Sep 17 00:00:00 2001 From: Sirttas Date: Thu, 27 Jul 2023 10:42:05 +0200 Subject: [PATCH] sort --- src/reprocess/ReprocessResultTable.vue | 18 ++++++----- src/table/SortableHeader.vue | 39 ++++++++++++++++++++++++ src/table/index.ts | 3 ++ src/table/sort.ts | 42 ++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 src/table/SortableHeader.vue create mode 100644 src/table/index.ts create mode 100644 src/table/sort.ts diff --git a/src/reprocess/ReprocessResultTable.vue b/src/reprocess/ReprocessResultTable.vue index 0e9d368..e850aa9 100644 --- a/src/reprocess/ReprocessResultTable.vue +++ b/src/reprocess/ReprocessResultTable.vue @@ -1,5 +1,6 @@ + + + + diff --git a/src/table/index.ts b/src/table/index.ts new file mode 100644 index 0000000..0019ad9 --- /dev/null +++ b/src/table/index.ts @@ -0,0 +1,3 @@ +export { default as SortableHeader } from './SortableHeader.vue'; +export * from './sort'; + diff --git a/src/table/sort.ts b/src/table/sort.ts new file mode 100644 index 0000000..36f6ef1 --- /dev/null +++ b/src/table/sort.ts @@ -0,0 +1,42 @@ +import { MaybeRefOrGetter, computed, ref, toValue } from "vue"; + +export type SortDirection = "asc" | "desc"; +export type UseSortOptions = { + defaultSortKey?: string; + defaultSortDirection?: SortDirection; +}; + +export const useSort = (array: MaybeRefOrGetter, options?: UseSortOptions) => { + const sortKey = ref(options?.defaultSortKey ?? null); + const sortDirection = ref(options?.defaultSortDirection ?? null); + const sortBy = (key: string, direction: SortDirection) => { + sortKey.value = key; + sortDirection.value = direction; + }; + const headerProps = computed(() => ({ + onSort: sortBy, + currentSortKey: sortKey.value, + sortDirection: sortDirection.value, + })); + + const sortedArray = computed(() => toValue(array).sort((a, b) => { + if (sortKey.value === null || sortDirection.value === null) { + return 0; + } + + const aValue = (a as any)[sortKey.value]; + const bValue = (b as any)[sortKey.value]; + + if (aValue === bValue) { + return 0; + } + + if (sortDirection.value === "asc") { + return aValue > bValue ? 1 : -1; + } else { + return aValue > bValue ? -1 : 1; + } + })); + + return { sortedArray, headerProps }; +} \ No newline at end of file