From 0d70b7492d70517d563bc9c157561328406dae34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mose=20M=C3=BCller?= Date: Wed, 24 Jul 2024 14:53:13 +0200 Subject: [PATCH] frontend: adds support for displayOrder in web settings --- frontend/src/WebSettings.tsx | 2 +- .../src/components/DataServiceComponent.tsx | 11 +++++--- frontend/src/components/DictComponent.tsx | 7 +++-- frontend/src/components/ListComponent.tsx | 7 +++-- frontend/src/hooks/useSortedEntries.ts | 28 +++++++++++++++++++ 5 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 frontend/src/hooks/useSortedEntries.ts diff --git a/frontend/src/WebSettings.tsx b/frontend/src/WebSettings.tsx index d2c15ed..9af879b 100644 --- a/frontend/src/WebSettings.tsx +++ b/frontend/src/WebSettings.tsx @@ -5,5 +5,5 @@ export const WebSettingsContext = createContext>({}); export interface WebSetting { displayName: string; display: boolean; - index: number; + displayOrder: number; } diff --git a/frontend/src/components/DataServiceComponent.tsx b/frontend/src/components/DataServiceComponent.tsx index dfe7092..6ac443a 100644 --- a/frontend/src/components/DataServiceComponent.tsx +++ b/frontend/src/components/DataServiceComponent.tsx @@ -5,6 +5,7 @@ import { GenericComponent } from "./GenericComponent"; import { LevelName } from "./NotificationsComponent"; import { SerializedObject } from "../types/SerializedObject"; import useLocalStorage from "../hooks/useLocalStorage"; +import useSortedEntries from "../hooks/useSortedEntries"; interface DataServiceProps { props: DataServiceJSON; @@ -21,6 +22,8 @@ export const DataServiceComponent = React.memo( // Retrieve the initial state from localStorage, default to true if not found const [open, setOpen] = useLocalStorage(`dataServiceComponent-${id}-open`, true); + const sortedEntries = useSortedEntries(props); + if (displayName !== "") { return (
@@ -30,9 +33,9 @@ export const DataServiceComponent = React.memo( - {Object.entries(props).map(([key, value]) => ( + {sortedEntries.map((value) => ( - {Object.entries(props).map(([key, value]) => ( + {sortedEntries.map((value) => ( ; @@ -14,16 +15,16 @@ interface DictComponentProps { } export const DictComponent = React.memo((props: DictComponentProps) => { - const { value, docString, isInstantUpdate, addNotification, id } = props; + const { docString, isInstantUpdate, addNotification, id } = props; + const sortedEntries = useSortedEntries(props.value); const renderCount = useRenderCount(); - const valueArray = Object.values(value); return (
{process.env.NODE_ENV === "development" &&
Render count: {renderCount}
} - {valueArray.map((item) => { + {sortedEntries.map((item) => { return ( { - const { value, docString, isInstantUpdate, addNotification, id } = props; + const { docString, isInstantUpdate, addNotification, id } = props; + + const sortedEntries = useSortedEntries(props.value); const renderCount = useRenderCount(); @@ -22,7 +25,7 @@ export const ListComponent = React.memo((props: ListComponentProps) => {
{process.env.NODE_ENV === "development" &&
Render count: {renderCount}
} - {value.map((item) => { + {sortedEntries.map((item) => { return ( | SerializedObject[], +) { + const webSettings = useContext(WebSettingsContext); + + // Get the order for sorting + const getOrder = (fullAccessPath: string) => { + return webSettings[fullAccessPath]?.displayOrder ?? Number.MAX_SAFE_INTEGER; + }; + + // Sort entries based on whether props is an array or an object + let sortedEntries; + if (Array.isArray(props)) { + // Need to make copy of array to leave the original array unmodified + sortedEntries = [...props].sort((objectA, objectB) => { + return getOrder(objectA.full_access_path) - getOrder(objectB.full_access_path); + }); + } else { + sortedEntries = Object.values(props).sort((objectA, objectB) => { + return getOrder(objectA.full_access_path) - getOrder(objectB.full_access_path); + }); + } + return sortedEntries; +}