Coverage for lobster/tools/core/html_report/html_report_js.py: 100%

1 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-09-22 04:43 +0000

1# LOBSTER - Lightweight Open BMW Software Traceability Evidence Report 

2# Copyright (C) 2024-2025 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) 

3# 

4# This program is free software: you can redistribute it and/or modify 

5# it under the terms of the GNU Affero General Public License as 

6# published by the Free Software Foundation, either version 3 of the 

7# License, or (at your option) any later version. 

8# 

9# This program is distributed in the hope that it will be useful, but 

10# WITHOUT ANY WARRANTY; without even the implied warranty of 

11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 

12# Affero General Public License for more details. 

13# 

14# You should have received a copy of the GNU Affero General Public 

15# License along with this program. If not, see 

16# <https://www.gnu.org/licenses/>. 

17 

18JAVA_SCRIPT = """ 

19function buttonFilter(filter) { 

20 var elms = document.getElementsByTagName("div"); 

21 var issue_elms = document.getElementsByClassName("issue"); 

22 for (i = 0; i < elms.length; i++) { 

23 if (elms[i].id.startsWith("item-")) { 

24 console.log("elms[i].className ", elms[i].className) 

25 if (filter == "all") { 

26 elms[i].style.display = "block"; 

27 } else if (elms[i].className == "item-" + filter) { 

28 elms[i].style.display = "block"; 

29 } else { 

30 elms[i].style.display = "none"; 

31 } 

32 } 

33 } 

34 // filter the issues list based on the issue filter button clicked 

35 for (i = 0; i < issue_elms.length; i++) { 

36 console.log("log ", issue_elms[i].className) 

37 if (filter == "all") { 

38 issue_elms[i].style.display = "list-item"; 

39 } else if (issue_elms[i].className.includes("issue issue-" + filter)) { 

40 issue_elms[i].style.display = "list-item"; 

41 } else { 

42 issue_elms[i].style.display = "none"; 

43 } 

44 } 

45 activeButton(filter); 

46 //call the search filering which could have been overwritten by the current filtering 

47 searchItem(); 

48} 

49 

50 

51function activeButton(filter) { 

52 var elms = document.getElementsByTagName("button"); 

53 console.log("the click buitton is " + filter); 

54 for (i = 0; i < elms.length; i++) { 

55 if (elms[i].className.includes("buttonActive")) { 

56 console.log("elem active found : " + elms[i].className); 

57 elms[i].className = elms[i].className.replace("buttonActive", ""); 

58 } else if (elms[i].className.toLowerCase().includes("button" + filter.toLowerCase())) { 

59 console.log("elem to be activated found : " + elms[i].className); 

60 elms[i].className = elms[i].className + " buttonActive"; 

61 } 

62 } 

63} 

64 

65 

66function ToggleIssues() { 

67 var div_issue = document.getElementById("issues-section"); 

68 if (div_issue.style.display == "block" || div_issue.style.display == "") { 

69 div_issue.style.display = "none"; 

70 document.getElementById("BtnToggleIssue").innerHTML = "Show Issues"; 

71 document.getElementById("BtnToggleIssue").className = document.getElementById("BtnToggleIssue").className + " buttonActive"; 

72 } else { 

73 div_issue.style = 'display: block; flex-direction: column; height: 200px;' + 

74 'overflow:auto;'; 

75 document.getElementById("BtnToggleIssue").innerHTML = "Hide Issues"; 

76 document.getElementById("BtnToggleIssue").className = document.getElementById("BtnToggleIssue").className.replace("buttonActive", ""); 

77 } 

78} 

79 

80 

81function searchItem() { 

82 var input = document.getElementById('search').value 

83 input = input.toLowerCase(); 

84 

85 var divs = document.getElementsByClassName('item-name'); 

86 for (i = 0; i < divs.length; i++) { 

87 var title = divs[i].parentNode.getAttribute("title"); 

88 // get requirement name: 2nd part when we cut the long string with /svg 

89 var reqname = divs[i].innerHTML.toLowerCase().split("</svg>").pop(); 

90 reqname = reqname.split(" ").pop(); 

91 if (reqname.includes(input)) { 

92 // the search pattern has been found, if this elem has the title "hidden-not-matching", put it back to diplayed 

93 if (title) { 

94 if (title.startsWith("hidden-not-matching")) { 

95 divs[i].parentNode.style.display = "block"; 

96 } 

97 } 

98 divs[i].parentNode.setAttribute("title", "matching-" + input) 

99 } else { 

100 // not maching, we hide 

101 divs[i].parentNode.setAttribute("title", "hidden-not-matching") 

102 divs[i].parentNode.style.display = "none"; 

103 } 

104 } 

105} 

106"""