mirror of
https://github.com/home-assistant/frontend.git
synced 2025-12-19 18:28:42 +00:00
@@ -1,4 +1,3 @@
|
||||
import { stringCompare } from "../common/string/compare";
|
||||
import type { HomeAssistant } from "../types";
|
||||
import type { AreaRegistryEntry } from "./area_registry";
|
||||
import type { RegistryEntry } from "./registry";
|
||||
@@ -75,27 +74,3 @@ export const getFloorAreaLookup = (
|
||||
}
|
||||
return floorAreaLookup;
|
||||
};
|
||||
|
||||
export const floorCompare =
|
||||
(entries?: HomeAssistant["floors"], order?: string[]) =>
|
||||
(a: string, b: string) => {
|
||||
const indexA = order ? order.indexOf(a) : -1;
|
||||
const indexB = order ? order.indexOf(b) : -1;
|
||||
if (indexA === -1 && indexB === -1) {
|
||||
const floorA = entries?.[a];
|
||||
const floorB = entries?.[b];
|
||||
if (floorA && floorB && floorA.level !== floorB.level) {
|
||||
return (floorB.level ?? -9999) - (floorA.level ?? -9999);
|
||||
}
|
||||
const nameA = floorA?.name ?? a;
|
||||
const nameB = floorB?.name ?? b;
|
||||
return stringCompare(nameA, nameB);
|
||||
}
|
||||
if (indexA === -1) {
|
||||
return 1;
|
||||
}
|
||||
if (indexB === -1) {
|
||||
return -1;
|
||||
}
|
||||
return indexA - indexB;
|
||||
};
|
||||
|
||||
@@ -7,7 +7,6 @@ import { orderCompare } from "../../../../../common/string/compare";
|
||||
import type { AreaRegistryEntry } from "../../../../../data/area_registry";
|
||||
import { areaCompare } from "../../../../../data/area_registry";
|
||||
import type { FloorRegistryEntry } from "../../../../../data/floor_registry";
|
||||
import { floorCompare } from "../../../../../data/floor_registry";
|
||||
import type { LovelaceCardConfig } from "../../../../../data/lovelace/config/card";
|
||||
import type { HomeAssistant } from "../../../../../types";
|
||||
import { supportsAlarmModesCardFeature } from "../../../card-features/hui-alarm-modes-card-feature";
|
||||
@@ -302,7 +301,12 @@ export const getFloors = (
|
||||
floorsOrder?: string[]
|
||||
): FloorRegistryEntry[] => {
|
||||
const floors = Object.values(entries);
|
||||
const compare = floorCompare(entries, floorsOrder);
|
||||
|
||||
if (!floorsOrder) {
|
||||
return floors;
|
||||
}
|
||||
|
||||
const compare = orderCompare(floorsOrder);
|
||||
|
||||
return floors.sort((floorA, floorB) =>
|
||||
compare(floorA.floor_id, floorB.floor_id)
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { floorCompare } from "../../src/data/floor_registry";
|
||||
import type { FloorRegistryEntry } from "../../src/data/floor_registry";
|
||||
|
||||
describe("floorCompare", () => {
|
||||
describe("floorCompare()", () => {
|
||||
it("sorts by floor ID alphabetically", () => {
|
||||
const floors = ["basement", "attic", "ground"];
|
||||
|
||||
expect(floors.sort(floorCompare())).toEqual([
|
||||
"attic",
|
||||
"basement",
|
||||
"ground",
|
||||
]);
|
||||
});
|
||||
|
||||
it("handles numeric strings in natural order", () => {
|
||||
const floors = ["floor10", "floor2", "floor1"];
|
||||
|
||||
expect(floors.sort(floorCompare())).toEqual([
|
||||
"floor1",
|
||||
"floor2",
|
||||
"floor10",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("floorCompare(entries)", () => {
|
||||
it("sorts by level descending (highest to lowest), then by name", () => {
|
||||
const entries = {
|
||||
floor1: { name: "Ground Floor", level: 0 } as FloorRegistryEntry,
|
||||
floor2: { name: "First Floor", level: 1 } as FloorRegistryEntry,
|
||||
floor3: { name: "Basement", level: -1 } as FloorRegistryEntry,
|
||||
};
|
||||
const floors = ["floor1", "floor2", "floor3"];
|
||||
|
||||
expect(floors.sort(floorCompare(entries))).toEqual([
|
||||
"floor2",
|
||||
"floor1",
|
||||
"floor3",
|
||||
]);
|
||||
});
|
||||
|
||||
it("treats null level as -9999, placing it at the end", () => {
|
||||
const entries = {
|
||||
floor1: { name: "Ground Floor", level: 0 } as FloorRegistryEntry,
|
||||
floor2: { name: "First Floor", level: 1 } as FloorRegistryEntry,
|
||||
floor3: { name: "Unassigned", level: null } as FloorRegistryEntry,
|
||||
};
|
||||
const floors = ["floor2", "floor3", "floor1"];
|
||||
|
||||
expect(floors.sort(floorCompare(entries))).toEqual([
|
||||
"floor2",
|
||||
"floor1",
|
||||
"floor3",
|
||||
]);
|
||||
});
|
||||
|
||||
it("sorts by name when levels are equal", () => {
|
||||
const entries = {
|
||||
floor1: { name: "Suite B", level: 1 } as FloorRegistryEntry,
|
||||
floor2: { name: "Suite A", level: 1 } as FloorRegistryEntry,
|
||||
};
|
||||
const floors = ["floor1", "floor2"];
|
||||
|
||||
expect(floors.sort(floorCompare(entries))).toEqual(["floor2", "floor1"]);
|
||||
});
|
||||
|
||||
it("falls back to floor ID when entry not found", () => {
|
||||
const entries = {
|
||||
floor1: { name: "Ground Floor" } as FloorRegistryEntry,
|
||||
};
|
||||
const floors = ["xyz", "floor1", "abc"];
|
||||
|
||||
expect(floors.sort(floorCompare(entries))).toEqual([
|
||||
"abc",
|
||||
"floor1",
|
||||
"xyz",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("floorCompare(entries, order)", () => {
|
||||
it("follows order array", () => {
|
||||
const entries = {
|
||||
basement: { name: "Basement" } as FloorRegistryEntry,
|
||||
ground: { name: "Ground Floor" } as FloorRegistryEntry,
|
||||
first: { name: "First Floor" } as FloorRegistryEntry,
|
||||
};
|
||||
const order = ["first", "ground", "basement"];
|
||||
const floors = ["basement", "first", "ground"];
|
||||
|
||||
expect(floors.sort(floorCompare(entries, order))).toEqual([
|
||||
"first",
|
||||
"ground",
|
||||
"basement",
|
||||
]);
|
||||
});
|
||||
|
||||
it("places items not in order array at the end, sorted by name", () => {
|
||||
const entries = {
|
||||
floor1: { name: "First Floor" } as FloorRegistryEntry,
|
||||
floor2: { name: "Ground Floor" } as FloorRegistryEntry,
|
||||
floor3: { name: "Basement" } as FloorRegistryEntry,
|
||||
};
|
||||
const order = ["floor1"];
|
||||
const floors = ["floor3", "floor2", "floor1"];
|
||||
|
||||
expect(floors.sort(floorCompare(entries, order))).toEqual([
|
||||
"floor1",
|
||||
"floor3",
|
||||
"floor2",
|
||||
]);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user