diff --git a/src/common/utils/composable-responsibilities/orderable/orderable.ts b/src/common/utils/composable-responsibilities/orderable/orderable.ts index 5067dc6e62..5f402660b7 100644 --- a/src/common/utils/composable-responsibilities/orderable/orderable.ts +++ b/src/common/utils/composable-responsibilities/orderable/orderable.ts @@ -3,6 +3,17 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ +import { sortBy } from "lodash/fp"; + export interface Orderable { orderNumber: number; } + +export const orderByOrderNumber = (maybeOrderables: T[]) => + sortBy( + (orderable) => + "orderNumber" in orderable + ? orderable.orderNumber + : Number.MAX_SAFE_INTEGER, + maybeOrderables, + ); diff --git a/src/common/utils/composable-responsibilities/showable/showable.ts b/src/common/utils/composable-responsibilities/showable/showable.ts index c6d3ef90d1..5397600d9a 100644 --- a/src/common/utils/composable-responsibilities/showable/showable.ts +++ b/src/common/utils/composable-responsibilities/showable/showable.ts @@ -6,12 +6,8 @@ import type { IComputedValue } from "mobx"; import { isBoolean } from "../../type-narrowing"; -export interface Showable< - T extends IComputedValue | boolean = - | IComputedValue - | boolean, -> { - isShown?: T; +export interface Showable { + isShown: IComputedValue | boolean; } export const isShown = (showable: Showable | {}) => { diff --git a/src/features/application-menu/main/application-menu-item-composite.injectable.ts b/src/features/application-menu/main/application-menu-item-composite.injectable.ts index b0a8ae6449..b0e2a2eb79 100644 --- a/src/features/application-menu/main/application-menu-item-composite.injectable.ts +++ b/src/features/application-menu/main/application-menu-item-composite.injectable.ts @@ -12,8 +12,8 @@ import type { ApplicationMenuItemTypes } from "./menu-items/application-menu-ite import type { RootComposite } from "../../../common/utils/composite/interfaces"; import type { Discriminable } from "../../../common/utils/composable-responsibilities/discriminable/discriminable"; import type { Orderable } from "../../../common/utils/composable-responsibilities/orderable/orderable"; +import { orderByOrderNumber } from "../../../common/utils/composable-responsibilities/orderable/orderable"; import logErrorInjectable from "../../../common/log-error.injectable"; -import { sortBy } from "lodash/fp"; import { isShown } from "../../../common/utils/composable-responsibilities/showable/showable"; export type MenuItemRoot = Discriminable<"root"> & @@ -48,8 +48,8 @@ const applicationMenuItemCompositeInjectable = getInjectable({ transformChildren: (children) => pipeline( children, - sortBy((child) => child.orderNumber), - (children) => children.filter(child => isShown(child)), + orderByOrderNumber, + (children) => children.filter(isShown), ), handleMissingParentIds: ({ missingParentIds }) => { diff --git a/src/features/preferences/renderer/preference-items/preferences-composite.injectable.ts b/src/features/preferences/renderer/preference-items/preferences-composite.injectable.ts index 26e9b1ca01..e62915f4d3 100644 --- a/src/features/preferences/renderer/preference-items/preferences-composite.injectable.ts +++ b/src/features/preferences/renderer/preference-items/preferences-composite.injectable.ts @@ -7,12 +7,13 @@ import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-f import { computed } from "mobx"; import type { PreferenceTypes } from "./preference-item-injection-token"; import { preferenceItemInjectionToken } from "./preference-item-injection-token"; -import getComposite from "../../../../common/utils/composite/get-composite/get-composite"; -import { filter } from "lodash/fp"; import { pipeline } from "@ogre-tools/fp"; +import type { PreferenceTabsRoot } from "./preference-tab-root"; import { preferenceTabsRoot } from "./preference-tab-root"; import logErrorInjectable from "../../../../common/log-error.injectable"; import { isShown } from "../../../../common/utils/composable-responsibilities/showable/showable"; +import getCompositeFor from "../../../../common/utils/composite/get-composite/get-composite"; +import { orderByOrderNumber } from "../../../../common/utils/composable-responsibilities/orderable/orderable"; const preferencesCompositeInjectable = getInjectable({ id: "preferences-composite", @@ -22,25 +23,29 @@ const preferencesCompositeInjectable = getInjectable({ const preferenceItems = computedInjectMany(preferenceItemInjectionToken); const logError = di.inject(logErrorInjectable); + const getComposite = getCompositeFor({ + getId: (x) => x.id, + getParentId: (x) => x.parentId, + + handleMissingParentIds: (ids) => { + logError( + `Tried to create preferences, but encountered references to unknown ids: "${ids.missingParentIds.join( + '", "', + )}". Available ids are: "${ids.availableParentIds.join('", "')}"`, + ); + }, + + transformChildren: (children) => + pipeline( + children.filter(isShown), + orderByOrderNumber, + ), + }); + return computed(() => pipeline( [preferenceTabsRoot, ...preferenceItems.get()], - filter((item: PreferenceTypes) => isShown(item)), - - (items) => - getComposite({ - source: items, - - handleMissingParentIds: (ids) => { - logError( - `Tried to create preferences, but encountered references to unknown ids: "${ids.missingParentIds.join( - '", "', - )}". Available ids are: "${ids.availableParentIds.join( - '", "', - )}"`, - ); - }, - }), + getComposite, ), ); },