1
+ /**
2
+ * @typedef { import("./Filter").Filter } Filter
3
+ */
4
+
1
5
class DocumentableList extends Component {
2
6
constructor ( props ) {
3
7
super ( props ) ;
@@ -14,47 +18,30 @@ class DocumentableList extends Component {
14
18
this . render ( this . props ) ;
15
19
}
16
20
17
- toggleElementDatasetVisibility ( condition , element ) {
18
- if ( condition ) {
19
- element . dataset . visibility = true ;
20
- } else {
21
- element . dataset . visibility = false ;
22
- }
21
+ toggleElementDatasetVisibility ( isVisible , ref ) {
22
+ ref . dataset . visibility = isVisible
23
23
}
24
24
25
25
toggleDisplayStyles ( condition , ref , onVisibleStyle ) {
26
- if ( condition ) {
27
- ref . style . display = onVisibleStyle ;
28
- } else {
29
- ref . style . display = "none" ;
30
- }
26
+ ref . style . display = condition ? onVisibleStyle : 'none'
31
27
}
32
28
33
29
render ( { filter } ) {
34
- this . state . list . sectionsRefs . map ( ( sectionRef ) => {
30
+ this . state . list . sectionsRefs . map ( sectionRef => {
35
31
const tabRef = this . state . list . getTabRefFromSectionRef ( sectionRef ) ;
36
32
37
33
const isTabVisible = this . state . list
38
34
. getSectionListRefs ( sectionRef )
39
35
. filter ( ( listRef ) => {
40
36
const isListVisible = this . state . list
41
37
. getSectionListElementsRefs ( listRef )
42
- . map ( ( elementRef ) => this . state . list . mapListElementRef ( elementRef ) )
43
- . filter ( ( elementData ) => {
44
- const isElementVisible = this . state . list . isElementVisible (
45
- elementData ,
46
- filter
47
- ) ;
48
-
49
- this . toggleDisplayStyles (
50
- isElementVisible ,
51
- elementData . ref ,
52
- "table"
53
- ) ;
54
- this . toggleElementDatasetVisibility (
55
- isElementVisible ,
56
- elementData . ref
57
- ) ;
38
+ . map ( elementRef => this . state . list . toListElement ( elementRef ) )
39
+ . filter ( elementData => {
40
+ const isElementVisible = this . state . list . isElementVisible ( elementData , filter ) ;
41
+
42
+ this . toggleDisplayStyles ( isElementVisible , elementData . ref , "table" ) ;
43
+ this . toggleElementDatasetVisibility ( isElementVisible , elementData . ref ) ;
44
+
58
45
return isElementVisible ;
59
46
} ) . length ;
60
47
@@ -68,83 +55,104 @@ class DocumentableList extends Component {
68
55
}
69
56
}
70
57
71
- class List {
72
- filterTab ( name ) {
73
- return name !== "Linear supertypes" && name !== "Known subtypes" && name !== "Type hierarchy"
74
- }
58
+ /**
59
+ * @typedef { { ref: Element; name: string; description: string } } ListElement
60
+ */
75
61
62
+ class List {
63
+ /**
64
+ * @param tabsRef { Element[] }
65
+ * @param sectionRefs { Element[] }
66
+ */
76
67
constructor ( tabsRef , sectionRefs ) {
77
68
this . _tabsRef = tabsRef ;
78
69
this . _sectionRefs = sectionRefs ;
79
70
}
80
71
81
72
get tabsRefs ( ) {
82
- return this . _tabsRef . filter ( ( tabRef ) => this . filterTab ( this . _getTogglable ( tabRef ) ) ) ;
73
+ return this . _tabsRef . filter ( tabRef => this . filterTab ( this . _getTogglable ( tabRef ) ) ) ;
83
74
}
84
75
85
76
get sectionsRefs ( ) {
86
- return this . _sectionRefs . filter ( ( sectionRef ) => this . filterTab ( this . _getTogglable ( sectionRef ) ) ) ;
77
+ return this . _sectionRefs . filter ( sectionRef => this . filterTab ( this . _getTogglable ( sectionRef ) ) ) ;
87
78
}
88
79
80
+ /**
81
+ * @param name { string }
82
+ */
83
+ filterTab ( name ) {
84
+ return name !== "Linear supertypes" && name !== "Known subtypes" && name !== "Type hierarchy"
85
+ }
86
+
87
+ /**
88
+ * @param sectionRef { Element }
89
+ */
89
90
getTabRefFromSectionRef ( sectionRef ) {
90
91
return this . tabsRefs . find (
91
92
( tabRef ) => this . _getTogglable ( tabRef ) === this . _getTogglable ( sectionRef )
92
93
) ;
93
94
}
94
95
96
+ /**
97
+ * @param sectionRef { Element }
98
+ * @returns { Element[] }
99
+ */
95
100
getSectionListRefs ( sectionRef ) {
96
101
return findRefs ( ".documentableList" , sectionRef ) ;
97
102
}
98
103
104
+ /**
105
+ * @param listRef { Element }
106
+ * @returns { Element[] }
107
+ */
99
108
getSectionListElementsRefs ( listRef ) {
100
109
return findRefs ( ".documentableElement" , listRef ) ;
101
110
}
102
111
103
- mapListElementRef ( elementRef ) {
112
+ /**
113
+ * @param elementRef { Element }
114
+ * @returns { ListElement }
115
+ */
116
+ toListElement ( elementRef ) {
104
117
return {
105
118
ref : elementRef ,
106
119
name : getElementTextContent ( getElementNameRef ( elementRef ) ) ,
107
120
description : getElementTextContent ( getElementDescription ( elementRef ) ) ,
108
121
} ;
109
122
}
110
123
124
+ /**
125
+ * @param elementData { ListElement }
126
+ * @param filter { Filter }
127
+ */
111
128
isElementVisible ( elementData , filter ) {
112
- if ( ! this . _areFiltersFromElementSelected ( elementData , filter ) ) {
129
+ if ( ! areFiltersFromElementSelected ( elementData , filter ) ) {
113
130
return false ;
131
+ } else {
132
+ return includesInputValue ( elementData , filter ) ;
114
133
}
115
- return this . _includesInputValue ( elementData , filter ) ;
116
- }
117
134
118
- _includesInputValue = ( elementData , filter ) => {
119
- if ( elementData . name . includes ( filter . value ) ) {
120
- return true ;
135
+ function includesInputValue ( ) {
136
+ return elementData . name . includes ( filter . value ) || elementData . description . includes ( filter . value ) ;
121
137
}
122
- return elementData . description . includes ( filter . value ) ;
123
- } ;
124
-
125
- _areFiltersFromElementSelected ( elementRef , filter ) {
126
- const dataset = this . _getCorrectDatasetFromElement ( elementRef ) ;
127
- return dataset . length
128
- ? this . _hasCorrespodingFilters ( dataset , filter . filters )
129
- : true ;
130
- }
131
-
132
- _hasCorrespodingFilters = ( dataset , filters ) =>
133
- dataset . every ( ( [ key , value ] ) => {
134
- const filterGroup = filters [ key ] ;
135
- return this . _splitByComma ( value ) . every (
136
- ( val ) => filterGroup && filterGroup [ val ] . selected
137
- ) ;
138
- } ) ;
139
138
140
- _getCorrectDatasetFromElement = ( elementRef ) =>
141
- Object . entries ( elementRef . ref . dataset ) . filter ( ( [ key ] ) =>
142
- this . _startsWithF ( key )
143
- ) ;
139
+ function areFiltersFromElementSelected ( ) {
140
+ /** @type {[key: string, value: string][] } */
141
+ const dataset = Object . entries ( elementData . ref . dataset ) . filter ( ( [ key ] ) => startsWith ( key , "f" ) ) ;
144
142
145
- _splitByComma = ( str ) => str . split ( "," ) ;
143
+ const hasCorrespondingFilters = ( ) =>
144
+ dataset . every ( ( [ key , value ] ) => {
145
+ const filterGroup = filter . filters [ key ] ;
146
+ return value . split ( "," ) . every ( val => filterGroup && filterGroup [ val ] . selected ) ;
147
+ } ) ;
146
148
147
- _startsWithF = ( str ) => startsWith ( str , "f" ) ;
149
+ return dataset . length ? hasCorrespondingFilters ( ) : true ;
150
+ }
151
+ }
148
152
149
- _getTogglable = ( elementRef ) => elementRef . dataset . togglable ;
153
+ /**
154
+ * @param elementData { ListElement }
155
+ */
156
+ _getTogglable = elementData => elementData . dataset . togglable ;
150
157
}
158
+
0 commit comments