Skip to content

Commit e8f1ea5

Browse files
grzegorz-bielskiromanowski
authored andcommitted
Add jsdoc type annotations for List
1 parent 8798ae4 commit e8f1ea5

File tree

2 files changed

+94
-94
lines changed

2 files changed

+94
-94
lines changed
Lines changed: 73 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* @typedef { import("./Filter").Filter } Filter
3+
*/
4+
15
class DocumentableList extends Component {
26
constructor(props) {
37
super(props);
@@ -14,47 +18,30 @@ class DocumentableList extends Component {
1418
this.render(this.props);
1519
}
1620

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
2323
}
2424

2525
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'
3127
}
3228

3329
render({ filter }) {
34-
this.state.list.sectionsRefs.map((sectionRef) => {
30+
this.state.list.sectionsRefs.map(sectionRef => {
3531
const tabRef = this.state.list.getTabRefFromSectionRef(sectionRef);
3632

3733
const isTabVisible = this.state.list
3834
.getSectionListRefs(sectionRef)
3935
.filter((listRef) => {
4036
const isListVisible = this.state.list
4137
.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+
5845
return isElementVisible;
5946
}).length;
6047

@@ -68,83 +55,104 @@ class DocumentableList extends Component {
6855
}
6956
}
7057

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+
*/
7561

62+
class List {
63+
/**
64+
* @param tabsRef { Element[] }
65+
* @param sectionRefs { Element[] }
66+
*/
7667
constructor(tabsRef, sectionRefs) {
7768
this._tabsRef = tabsRef;
7869
this._sectionRefs = sectionRefs;
7970
}
8071

8172
get tabsRefs() {
82-
return this._tabsRef.filter((tabRef) => this.filterTab(this._getTogglable(tabRef)));
73+
return this._tabsRef.filter(tabRef => this.filterTab(this._getTogglable(tabRef)));
8374
}
8475

8576
get sectionsRefs() {
86-
return this._sectionRefs.filter( (sectionRef) => this.filterTab(this._getTogglable(sectionRef)));
77+
return this._sectionRefs.filter(sectionRef => this.filterTab(this._getTogglable(sectionRef)));
8778
}
8879

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+
*/
8990
getTabRefFromSectionRef(sectionRef) {
9091
return this.tabsRefs.find(
9192
(tabRef) => this._getTogglable(tabRef) === this._getTogglable(sectionRef)
9293
);
9394
}
9495

96+
/**
97+
* @param sectionRef { Element }
98+
* @returns { Element[] }
99+
*/
95100
getSectionListRefs(sectionRef) {
96101
return findRefs(".documentableList", sectionRef);
97102
}
98103

104+
/**
105+
* @param listRef { Element }
106+
* @returns { Element[] }
107+
*/
99108
getSectionListElementsRefs(listRef) {
100109
return findRefs(".documentableElement", listRef);
101110
}
102111

103-
mapListElementRef(elementRef) {
112+
/**
113+
* @param elementRef { Element }
114+
* @returns { ListElement }
115+
*/
116+
toListElement(elementRef) {
104117
return {
105118
ref: elementRef,
106119
name: getElementTextContent(getElementNameRef(elementRef)),
107120
description: getElementTextContent(getElementDescription(elementRef)),
108121
};
109122
}
110123

124+
/**
125+
* @param elementData { ListElement }
126+
* @param filter { Filter }
127+
*/
111128
isElementVisible(elementData, filter) {
112-
if (!this._areFiltersFromElementSelected(elementData, filter)) {
129+
if (!areFiltersFromElementSelected(elementData, filter)) {
113130
return false;
131+
} else {
132+
return includesInputValue(elementData, filter);
114133
}
115-
return this._includesInputValue(elementData, filter);
116-
}
117134

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);
121137
}
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-
});
139138

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"));
144142

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+
});
146148

147-
_startsWithF = (str) => startsWith(str, "f");
149+
return dataset.length ? hasCorrespondingFilters() : true;
150+
}
151+
}
148152

149-
_getTogglable = (elementRef) => elementRef.dataset.togglable;
153+
/**
154+
* @param elementData { ListElement }
155+
*/
156+
_getTogglable = elementData => elementData.dataset.togglable;
150157
}
158+

scala3doc/resources/dotty_res/scripts/components/Filter.js

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
1-
const defaultFilterGroup = {
2-
FOrdering: { Alphabetical: true },
3-
};
4-
51
/**
6-
* @typedef { Object } FilterItem
7-
* @prop { string } selected
8-
* @prop { number } visible
9-
*/
10-
11-
/**
12-
* @typedef { Record<string, FilterItem> } Filters
2+
* @typedef { { selected: boolean; visible: boolean } } FilterItem
3+
* @typedef { { fKeywords: Record<string, FilterItem> } } Filters
134
*/
145

156
class Filter {
167
/**
178
* @param value { string }
189
* @param filters { Filters }
19-
* @param elementsRefs { Element }
10+
* @param elementsRefs { Element[] }
2011
*/
2112
constructor(value, filters, elementsRefs, init = false) {
2213
this._init = init;
@@ -87,10 +78,10 @@ class Filter {
8778

8879
return name.includes(value) || description.includes(value);
8980
})
90-
.map((elRef) => this._getDatasetWithF(elRef.dataset))
81+
.map((elRef) => this._getDatasetWithKeywordData(elRef.dataset))
9182
.reduce((filtersObject, datasets) => {
92-
datasets.map(([key, value]) => {
93-
this._splitByComma(value).map((val) => {
83+
datasets.forEach(([key, value]) => {
84+
this._splitByComma(value).forEach((val) => {
9485
filtersObject[key] = {
9586
...filtersObject[key],
9687
[val]: {
@@ -150,24 +141,24 @@ class Filter {
150141
* @returns { Filters }
151142
*/
152143
_withNewFilters() {
153-
console.log("this._elementsRefs", this._elementsRefs)
144+
const newFilter = { selected: true, visible: true }
145+
154146
const newFilters = this._elementsRefs.reduce((filtersObject, elementRef) => {
155-
this._getDatasetWithF(elementRef.dataset).map(([key, value]) =>
156-
this._splitByComma(value).map((val) => {
157-
if (!filtersObject[key]) {
158-
filtersObject[key] = { [val]: { selected: true, visible: true } };
159-
} else {
160-
filtersObject[key] = {
161-
...filtersObject[key],
162-
[val]: filtersObject[key][val] ?? { selected: true, visible: true },
163-
};
164-
}
147+
this._getDatasetWithKeywordData(elementRef.dataset).forEach(([key, value]) =>
148+
this._splitByComma(value).forEach((val) => {
149+
filtersObject[key] = filtersObject[key]
150+
? { ...filtersObject[key], [val]: filtersObject[key][val] ?? newFilter}
151+
: { [val]: newFilter }
165152
})
166153
);
167154
return filtersObject;
168155
}, {});
169-
console.log("newFilters", newFilters)
170-
return newFilters
156+
157+
const shouldAddDefaultFilter = this._elementsRefs.some(ref => !!ref.dataset['fKeywords'])
158+
159+
return shouldAddDefaultFilter
160+
? { ...newFilters, fKeywords: { ...newFilters.fKeywords, default: newFilter } }
161+
: newFilters
171162
}
172163

173164
/**
@@ -198,7 +189,8 @@ class Filter {
198189
/**
199190
* @private
200191
* @param dataset { DOMStringMap }
192+
* @returns { [key: string, value: string][] }
201193
*/
202-
_getDatasetWithF = (dataset) =>
194+
_getDatasetWithKeywordData = (dataset) =>
203195
Object.entries(dataset).filter(([key]) => startsWith(key, "f"));
204196
}

0 commit comments

Comments
 (0)