-
Notifications
You must be signed in to change notification settings - Fork 8
/
periodictable.js
119 lines (96 loc) · 2.76 KB
/
periodictable.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
class PeriodicTable
{
constructor()
{
this._rowcount = 10;
this._columncount = 19;
this._data = periodictabledata;
this._FilterChangedEventHandlers = [];
}
//---------------------------------------------------
// PROPERTIES
//---------------------------------------------------
get columncount() { return this._columncount };
get rowcount() { return this._rowcount; };
get data() { return this._data; };
//-----------------------------------------------------------------
// METHODS
//-------------------------------------------------------------------
AddFilterChangedEventHandler(handler)
{
this._FilterChangedEventHandlers.push(handler);
}
ApplyFilter(filtercriteria)
{
const changed = [];
for(let element of this._data)
{
const filterresults = [];
filterresults.push(this._Match(element.name, filtercriteria.name, true));
filterresults.push(this._Match(element.atomicnumber, filtercriteria.atomicnumber, false));
filterresults.push(this._Match(element.symbol, filtercriteria.symbol, true));
filterresults.push(this._Match(element.category, filtercriteria.category, false));
filterresults.push(this._Match(element.group, filtercriteria.group, false));
filterresults.push(this._Match(element.period, filtercriteria.period, false));
filterresults.push(this._Match(element.block, filtercriteria.block, false));
const show = filterresults.every( b => b === true );
if(show === true)
{
if(element.visible === false)
{
element.visible = true;
changed.push(element);
}
}
else
{
if(element.visible === true)
{
element.visible = false;
changed.push(element);
}
}
}
this._FireFilterChangedEvent(changed);
}
ClearFilter()
{
const changed = [];
for(let element of this._data)
{
if(element.visible === false)
{
element.visible = true;
changed.push(element);
}
}
this._FireFilterChangedEvent(changed);
}
GetElement(atomicnumber)
{
return this._data[atomicnumber - 1];
}
//-----------------------------------------------------------------
// FUNCTIONS
//-------------------------------------------------------------------
_FireFilterChangedEvent(changed)
{
this._FilterChangedEventHandlers.forEach(function (Handler) { Handler(changed); });
}
_Match(value, criteria, wildcard)
{
let match = true;
if(criteria.length > 0)
{
if(wildcard)
{
match = value.toString().toLowerCase().includes(criteria.toString().toLowerCase());
}
else
{
match = (value.toString().toLowerCase() === criteria.toString().toLowerCase());
}
}
return match;
}
}