PageSourceSearch

https://www.inesc-id.pt/wp-content/plugins/inesc-pages/js/intranet…/jsFilter_filtering.js?ver=1790239247

js inesc-id.pt collected 2026-09-24 08:41:39 UTC 13,042 bytes, 388 lines download raw bytes

1// This function filters arr within the range [min,max] of the tag key
2function jsFilter_filterObjectsByRange(arr, key, min, max) {
3  return arr.filter((obj) => obj[key] >= min && obj[key] <= max);
4}
5
6// Not needed, but kept because I am not sure if the new version works everytime...
7function jsFilter_filterObjectsByKeywordOld(
8  objectsArray,
9  propertyName,
10  keyword,
11  propertyName2
12) {
13  const returnValue = objectsArray.filter(function (obj) {
14    if (typeof obj != "object") {
15      console.log("typeof obj != 'object'");
16      return obj.toString() == keyword.toString();
17    } else if (obj[propertyName] == null) {
18      console.log("obj[propertyName] == null");
19      return keyword == "null";
20    } else if (keyword == null) {
21      console.log("keyword == null");
22      return false;
23    } else {
24      if (!Array.isArray(obj[propertyName]))
25        return obj[propertyName].toString() == keyword.toString();
26      else {
27        if (
28          jsFilter_filterObjectsByKeyword(
29            obj[propertyName],
30            propertyName2,
31            keyword,
32            ""
33          ).length > 0
34        )
35          return true;
36        else return false;
37      }
38    }
39  });
40  return returnValue;
41}
42
43// Function that filters an array based on a keyword
44//  - objectsArray: array to be filtered
45//  - propertyName: bibtex tag used to filter
46//  - keyword: string used to filter array. If the value of propertyName matches keyword, then keep it
47//  - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word
48function jsFilter_filterObjectsByKeyword(
49  objectsArray,
50  propertyName,
51  keyword,
52  propertyName2
53) {
54  const returnValue = objectsArray.filter(function (obj) {
55    if (!Array.isArray(obj[propertyName]))
56      if (obj[propertyName] == null) return keyword == "null";
57      else return obj[propertyName].toString() == keyword.toString();
58    else {
59      if (
60        jsFilter_filterObjectsByKeyword(
61          obj[propertyName],
62          propertyName2,
63          keyword,
64          ""
65        ).length > 0
66      )
67        return true;
68      else return false;
69    }
70  });
71  return returnValue;
72}
73
74// Function that filters an array based on a set of keyword
75//  - objectsArray: array to be filtered
76//  - propertyName: bibtex tag used to filter
77//  - keywords: set of strings to be used to filter array. If the value of propertyName matches keyword, then keep it
78//  - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word
79function jsFilter_filterObjectsByKeywords(
80  objectsArray,
81  propertyName,
82  keywords,
83  propertyName2
84) {
85  const returnValue = objectsArray.filter(function (obj) {
86    if (!Array.isArray(obj[propertyName])) {
87      if (obj[propertyName] == null) return keywords.includes("");
88      else return keywords.includes(obj[propertyName].toString());
89    } else {
90      if (
91        jsFilter_filterObjectsByKeywords(
92          obj[propertyName],
93          propertyName2,
94          keywords,
95          ""
96        ).length > 0
97      )
98        return true;
99      else return false;
100    }
101  });
102  return returnValue;
103}
104
105// Function that filters an array based on string similarity
106//  - arr: array to be filtered
107//  - targetWord: word searched to filter arr
108//  - propertyName: bibtex tag used to filter
109//  - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word
110function jsFilter_filterBySimilarity(
111  arr,
112  targetWord,
113  propertyName,
114  propertyName2
115) {
116  return arr.filter((item) => {
117    if (Array.isArray(item[propertyName])) {
118      if (
119        jsFilter_filterBySimilarity(
120          item[propertyName],
121          targetWord,
122          propertyName2,
123          ""
124        ).length > 0
125      )
126        return true;
127      else return false;
128    } else if (typeof item[propertyName] === "object") {
129      return jsFilter_simplifySpecialCharacters(
130        item[propertyName][propertyName2]
131      )
132        .toLowerCase()
133        .includes(jsFilter_simplifySpecialCharacters(targetWord).toLowerCase());
134    } else {
135      return jsFilter_simplifySpecialCharacters(item[propertyName])
136        .toLowerCase()
137        .includes(jsFilter_simplifySpecialCharacters(targetWord).toLowerCase());
138    }
139  });
140}
141
142// Function that filters an array based on string similarity of a array of several strings
143//  - arr: array to be filtered
144//  - targetWords: set of words searched to filter arr
145//  - propertyName: bibtex tag used to filter
146//  - propertyName2: if propertyName value is an obj ({}), then use propertyName2 as the bibtex word
147function jsFilter_filterBySimilarities(
148  arr,
149  targetWords,
150  propertyName,
151  propertyName2
152) {
153  return arr.filter((item) => {
154    if (Array.isArray(item[propertyName])) {
155      if (
156        jsFilter_filterBySimilarities(
157          item[propertyName],
158          targetWords,
159          propertyName2,
160          ""
161        ).length > 0
162      )
163        return true;
164      else return false;
165    } else if (typeof item[propertyName] === "object") {
166      return targetWords.some(function (str) {
167        return jsFilter_simplifySpecialCharacters(
168          item[propertyName][propertyName2]
169        )
170          .toLowerCase()
171          .includes(jsFilter_simplifySpecialCharacters(str).toLowerCase());
172      });
173    } else {
174      return targetWords.some(function (str) {
175        return jsFilter_simplifySpecialCharacters(item[propertyName])
176          .toLowerCase()
177          .includes(jsFilter_simplifySpecialCharacters(str).toLowerCase());
178      });
179    }
180  });
181}
182
183// Function that handles the functionality when a keyword is to be entered in a search bar
184//  - bibTexTags: bibTex tags used on the filtering of the search bar
185//  - value: string from the searchbar that will be entered
186//  - event: keypress event
187//  - div: element where the keyword will be placed after the enter event
188//  - name: name of the class to be given to the element corresponding to the keyword entered
189function jsFilter_handleKeyPressSearch(bibTexTags, value, event, div, name) {
190  if (event.key == "Enter") {
191    if (jsFilter_currentFilters[bibTexTags].includes(value)) return;
192    document.getElementById("mainBody").scrollTop = 0;
193    clearTimeout(jsFilter_timeoutId2);
194    jsFilter_timeoutId2 = setTimeout(() => {
195      if (jsFilter_currentData.length > 0) {
196        jsFilter_putLoadingScreen();
197        setTimeout(() => {
198          jsFilter_currentFilters[bibTexTags].push(...value.split(" "));
199          jsFilter_currentFilteringCategory = bibTexTags[0];
200          var className;
201          var divName;
202          var inputName;
203          className = name;
204          divName = div;
205          inputName = bibTexTags[0];
206          const newElement = document.createElement("p");
207          newElement.innerHTML = value + " (x)";
208          newElement.onclick = function () {
209            jsFilter_putLoadingScreen();
210            setTimeout(() => {
211              jsFilter_currentFilters[bibTexTags] = jsFilter_currentFilters[
212                bibTexTags
213              ].filter(function (element) {
214                return !value.split(" ").includes(element);
215              });
216              jsFilter_reCalculateFilteredList();
217              this.remove();
218              jsFilter_removeLoadingScreen();
219            }, 100);
220          };
221          newElement.classList.add(className);
222          newElement.classList.add("keyWord");
223          document.getElementById(divName).appendChild(newElement);
224          document.getElementById(inputName).value = "";
225          jsFilter_filteredData = jsFilter_currentData;
226          jsFilter_updateLabels();
227          jsFilter_removeLoadingScreen();
228        }, 100);
229      }
230    }, 500);
231  }
232}
233
234// Function that handles the functionality when a keyword is written, but not ey entered
235//  - bibTexTags: bibTex tags used on the filtering of the search bar
236//  - value: string from the searchbar that will be entered
237function jsFilter_triggerFilterSearch(bibTexTags, value) {
238  clearTimeout(jsFilter_timeoutId);
239  jsFilter_timeoutId = setTimeout(function () {
240    jsFilter_putLoadingScreen();
241    setTimeout(() => {
242      if (value.trim() != "") {
243        var temp = [];
244        var temp2 = [];
245        bibTexTags.forEach((element) => {
246          const secondProperty =
247            jsFilter_contextMappingRecursive[jsFilter_currentContext][element];
248          temp2 = temp2.concat(
249            jsFilter_filterBySimilarity(
250              jsFilter_filteredData,
251              value,
252              element,
253              secondProperty
254            )
255          );
256          value.split(" ").forEach((element2) => {
257            if (element2 != "")
258              temp = temp.concat(
259                jsFilter_filterBySimilarity(
260                  jsFilter_filteredData,
261                  element2,
262                  element,
263                  secondProperty
264                )
265              );
266          });
267        });
268        if (temp2.length > 0 && temp2.length <= temp.length)
269          jsFilter_currentData = jsFilter_removeDuplicatesObjects(temp2);
270        else jsFilter_currentData = jsFilter_removeDuplicatesObjects(temp);
271        jsFilter_updateList(jsFilter_currentData);
272      } else {
273        jsFilter_updateList(jsFilter_filteredData);
274      }
275      jsFilter_removeLoadingScreen();
276    }, 100);
277  }, 500);
278}
279
280// Function that updates the labels of the checkboxes
281function jsFilter_updateLabels() {
282  var checkBoxDivs = [];
283  Object.keys(jsFilter_contexMapping[jsFilter_currentContext]).forEach(
284    (key) => {
285      if (
286        jsFilter_contexMapping[jsFilter_currentContext][key][1] == "checkBox"
287      ) {
288        checkBoxDivs.push(key);
289      }
290    }
291  );
292  var tempFilteredData = jsFilter_filteredData;
293  checkBoxDivs.forEach((key) => {
294    var labels = [];
295    Array.from(
296      document.querySelectorAll("#" + key + "DIV " + "div.checkboxContainer")
297    ).forEach((element) => {
298      const input = element.querySelector("input");
299      const divBar = element.querySelector("div.labelContainer");
300      const labelSize = element.querySelector(".labelSize");
301      const labelText = divBar.querySelector("strong");
302      if (jsFilter_currentFilteringCategory != input.classList[1]) {
303        const sizeData = jsFilter_removeDuplicatesObjects(
304          jsFilter_filterObjectsByKeyword(
305            tempFilteredData,
306            input.classList[1],
307            input.id,
308            jsFilter_contextMappingRecursive[jsFilter_currentContext][
309              input.classList[1]
310            ]
311          )
312        ).length;
313        labelSize.textContent = "(" + sizeData + ")";
314        labels.push([divBar, sizeData]);
315        if (sizeData == 0) {
316          jsFilter_currentFilters[input.classList[1]] = jsFilter_currentFilters[
317            input.classList[1]
318          ].filter(function (element2) {
319            return element2 !== input.id;
320          });
321          input.checked = false;
322          input.disabled = true;
323          labelText.style.color = "lightgray";
324          input.style.cursor = "not-allowed";
325        } else {
326          input.disabled = false;
327          labelText.style.color = "#555";
328          input.style.cursor = "pointer";
329        }
330      }
331    });
332    jsFilter_createVis(labels);
333  });
334}
335
336// Function that calculates the new set of items to display based on the current filtering
337function jsFilter_reCalculateFilteredList() {
338  var tempFilteredData = [...jsFilter_originalData];
339  moveElementToBeginning(
340    Object.keys(jsFilter_contexMapping[jsFilter_currentContext]),
341    jsFilter_currentFilteringCategoryName
342  ).forEach((key) => {
343    const [filterType, inputType] =
344      jsFilter_contexMapping[jsFilter_currentContext][key];
345    switch (inputType) {
346      case "searchBar":
347        filterType.forEach((bibTexTag) => {
348          var checkBoxTemp = jsFilter_filterBySimilarities(
349            tempFilteredData,
350            jsFilter_currentFilters[filterType],
351            bibTexTag,
352            jsFilter_contextMappingRecursive[jsFilter_currentContext][bibTexTag]
353          );
354          if (checkBoxTemp.length > 0) tempFilteredData = checkBoxTemp;
355        });
356        break;
357      case "checkBox":
358        var checkBoxTemp = [];
359        if (jsFilter_currentFilters[filterType] != null)
360          checkBoxTemp = jsFilter_filterObjectsByKeywords(
361            tempFilteredData,
362            filterType,
363            jsFilter_currentFilters[filterType],
364            jsFilter_contextMappingRecursive[jsFilter_currentContext][
365              filterType
366            ]
367          );
368        if (checkBoxTemp.length > 0) tempFilteredData = checkBoxTemp;
369        break;
370      case "slider":
371        tempFilteredData = jsFilter_filterObjectsByRange(
372          tempFilteredData,
373          filterType,
374          jsFilter_currentFilters[filterType][1],
375          jsFilter_currentFilters[filterType][0]
376        );
377        break;
378
379      default:
380        break;
381    }
382  });
383
384  jsFilter_filteredData = tempFilteredData;
385  jsFilter_updateLabels();
386  jsFilter_updateList(jsFilter_filteredData);
387  window.scrollTo(0, 0);
388}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.