mirror of
https://github.com/home-assistant/frontend.git
synced 2025-12-24 04:39:01 +00:00
@@ -1,4 +1,3 @@
|
|||||||
import { stringCompare } from "../common/string/compare";
|
|
||||||
import type { HomeAssistant } from "../types";
|
import type { HomeAssistant } from "../types";
|
||||||
import type { AreaRegistryEntry } from "./area_registry";
|
import type { AreaRegistryEntry } from "./area_registry";
|
||||||
import type { RegistryEntry } from "./registry";
|
import type { RegistryEntry } from "./registry";
|
||||||
@@ -75,27 +74,3 @@ export const getFloorAreaLookup = (
|
|||||||
}
|
}
|
||||||
return floorAreaLookup;
|
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 type { AreaRegistryEntry } from "../../../../../data/area_registry";
|
||||||
import { areaCompare } from "../../../../../data/area_registry";
|
import { areaCompare } from "../../../../../data/area_registry";
|
||||||
import type { FloorRegistryEntry } from "../../../../../data/floor_registry";
|
import type { FloorRegistryEntry } from "../../../../../data/floor_registry";
|
||||||
import { floorCompare } from "../../../../../data/floor_registry";
|
|
||||||
import type { LovelaceCardConfig } from "../../../../../data/lovelace/config/card";
|
import type { LovelaceCardConfig } from "../../../../../data/lovelace/config/card";
|
||||||
import type { HomeAssistant } from "../../../../../types";
|
import type { HomeAssistant } from "../../../../../types";
|
||||||
import { supportsAlarmModesCardFeature } from "../../../card-features/hui-alarm-modes-card-feature";
|
import { supportsAlarmModesCardFeature } from "../../../card-features/hui-alarm-modes-card-feature";
|
||||||
@@ -302,7 +301,12 @@ export const getFloors = (
|
|||||||
floorsOrder?: string[]
|
floorsOrder?: string[]
|
||||||
): FloorRegistryEntry[] => {
|
): FloorRegistryEntry[] => {
|
||||||
const floors = Object.values(entries);
|
const floors = Object.values(entries);
|
||||||
const compare = floorCompare(entries, floorsOrder);
|
|
||||||
|
if (!floorsOrder) {
|
||||||
|
return floors;
|
||||||
|
}
|
||||||
|
|
||||||
|
const compare = orderCompare(floorsOrder);
|
||||||
|
|
||||||
return floors.sort((floorA, floorB) =>
|
return floors.sort((floorA, floorB) =>
|
||||||
compare(floorA.floor_id, floorB.floor_id)
|
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