• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

maxwroc / battery-state-card / 7358458641

29 Dec 2023 05:07PM UTC coverage: 91.909% (+3.4%) from 88.481%
7358458641

push

github

web-flow
Merge pull request #621 from maxwroc/NotExistsOperator

Added not_exists filter operator

324 of 368 branches covered (0.0%)

Branch coverage included in aggregate %.

403 of 423 relevant lines covered (95.27%)

20.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.72
/src/sorting.ts
1
import { IBatteryCollection } from "./battery-provider";
2
import { isNumber, log, safeGetConfigArrayOfObjects } from "./utils";
1✔
3

4
/**
5
 * Sorts batteries by given criterias and returns their IDs
6
 * @param config Card configuration
7
 * @param batteries List of all known battery elements
8
 * @returns List of battery IDs (batteries sorted by given criterias)
9
 */
10
 export const getIdsOfSortedBatteries = (config: IBatteryCardConfig, batteries: IBatteryCollection): string[] => {
1✔
11
    let batteriesToSort = Object.keys(batteries);
22✔
12

13
    const sortOptions = safeGetConfigArrayOfObjects(config.sort, "by");
22✔
14

15
    return batteriesToSort.sort((idA, idB) => {
22✔
16
        let result = 0;
156✔
17
        sortOptions.find(o => {
156✔
18

19
            let valA: any;
20
            let valB: any;
21

22
            switch(o.by) {
162✔
23
                case "name":
162✔
24
                    valA = batteries[idA].name;
70✔
25
                    valB = batteries[idB].name;
70✔
26
                    break;
70✔
27
                case "state":
28
                    valA = batteries[idA].state;
73✔
29
                    valB = batteries[idB].state;
73✔
30
                    break;
73✔
31
                default:
32
                    if ((<string>o.by).startsWith("entity.")) {
19✔
33
                        const pathChunks = (<string>o.by).split(".");
17✔
34
                        pathChunks.shift();
17✔
35
                        valA = pathChunks.reduce((acc, val, i) => acc === undefined ? undefined : acc[val], <any>batteries[idA].entityData);
17!
36
                        valB = pathChunks.reduce((acc, val, i) => acc === undefined ? undefined : acc[val], <any>batteries[idB].entityData);
17!
37
                    }
38
                    else {
39
                        log("Unknown sort field: " + o.by, "warn");
2✔
40
                    }
41
            }
42

43
            if (isNumber(valA) || isNumber(valB)) {
162✔
44
                result = compareNumbers(valA, valB);
69✔
45
            }
46
            else if (valA === undefined) {
93✔
47
                if (valB === undefined) {
6✔
48
                    result = 0;
4✔
49
                }
50
                else {
51
                    result = -1;
2✔
52
                }
53
            }
54
            else {
55
                result = compareStrings(valA, valB);
87✔
56
            }
57

58
            if (o.desc) {
162✔
59
                // opposite result
60
                result *= -1;
47✔
61
            }
62

63
            return result != 0;
162✔
64
        });
65

66
        return result;
156✔
67
    });
68
} 
69

70
/**
71
 * Number comparer
72
 * @param a Value A
73
 * @param b Value B
74
 * @returns Comparison result
75
 */
76
 const compareNumbers = (a: string, b: string): number => {
1✔
77
    let aNum = Number(a);
69✔
78
    let bNum = Number(b);
69✔
79
    aNum = isNaN(aNum) ? -1 : aNum;
69✔
80
    bNum = isNaN(bNum) ? -1 : bNum;
69✔
81
    return aNum - bNum;
69✔
82
}
83

84

85
/**
86
 * String comparer
87
 * @param a Value A
88
 * @param b Value B
89
 * @returns Comparison result
90
 */
91
 const compareStrings = (a: string, b: string): number => a.localeCompare(b);
87✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc