Add option to show known issues scatterplot
Test and deploy / deploy (push) Successful in 30s

This commit is contained in:
2026-07-29 13:12:46 -05:00
parent b36247faf4
commit cb6ce0b3c5
15 changed files with 192 additions and 37 deletions
@@ -1 +1 @@
{"product":"GlobalProtect-Android","releases":["6.0.1","6.0.2","6.0.3","6.0.4","6.0.5","6.0.12","6.1.0","6.1.4","6.1.5","6.1.6","6.1.7","6.1.9","6.1.10","6.1.11","6.1.12"],"points":[[0,14612,"GPC-14612"],[1,15068,"GPC-15068"],[1,15023,"GPC-15023"],[2,15088,"GPC-15088"],[3,16414,"GPC-16414"],[4,15977,"GPC-15977"],[4,15231,"GPC-15231"],[4,15023,"GPC-15023"],[5,21389,"GPC-21389"],[5,21707,"GPC-21707"],[5,20071,"GPC-20071"],[6,19030,"GPC-19030"],[6,18672,"GPC-18672"],[6,18207,"GPC-18207"],[6,17875,"GPC-17875"],[6,17635,"GPC-17635"],[6,17435,"GPC-17435"],[6,16741,"GPC-16741"],[6,15137,"GPC-15137"],[7,19340,"GPC-19340"],[7,19331,"GPC-19331"],[7,19289,"GPC-19289"],[7,19280,"GPC-19280"],[7,19193,"GPC-19193"],[7,19187,"GPC-19187"],[7,19162,"GPC-19162"],[7,19153,"GPC-19153"],[7,19143,"GPC-19143"],[7,19104,"GPC-19104"],[7,19083,"GPC-19083"],[7,19061,"GPC-19061"],[7,19060,"GPC-19060"],[7,19044,"GPC-19044"],[7,19023,"GPC-19023"],[7,19009,"GPC-19009"],[7,18983,"GPC-18983"],[7,18968,"GPC-18968"],[7,18903,"GPC-18903"],[7,18703,"GPC-18703"],[7,18854,"GPC-18854"],[7,18828,"GPC-18828"],[7,18525,"GPC-18525"],[7,16975,"GPC-16975"],[7,16597,"GPC-16597"],[8,20071,"GPC-20071"],[9,19861,"GPC-19861"],[10,21067,"GPC-21067"],[10,22254,"GPC-22254"],[10,22586,"GPC-22586"],[11,23499,"GPC-23499"],[11,22929,"GPC-22929"],[11,21308,"GPC-21308"],[12,24688,"GPC-24688"],[12,24657,"GPC-24657"],[12,22689,"GPC-22689"],[12,22929,"GPC-22929"],[12,23778,"GPC-23778"],[12,24024,"GPC-24024"],[13,24709,"GPC-24709"],[13,24688,"GPC-24688"],[13,24657,"GPC-24657"],[13,24024,"GPC-24024"],[13,22689,"GPC-22689"],[13,22929,"GPC-22929"],[13,23778,"GPC-23778"],[13,23965,"GPC-23965"],[13,24117,"GPC-24117"],[13,24228,"GPC-24228"],[13,24937,"GPC-24937"],[13,24185,"GPC-24185"],[13,24053,"GPC-24053"],[14,25634,"GPC-25634"]]}
{"product":"GlobalProtect-Android","addressed":{"releases":["6.0.1","6.0.2","6.0.3","6.0.4","6.0.5","6.0.12","6.1.0","6.1.4","6.1.5","6.1.6","6.1.7","6.1.9","6.1.10","6.1.11","6.1.12"],"points":[[0,14612,"GPC-14612"],[1,15068,"GPC-15068"],[1,15023,"GPC-15023"],[2,15088,"GPC-15088"],[3,16414,"GPC-16414"],[4,15977,"GPC-15977"],[4,15231,"GPC-15231"],[4,15023,"GPC-15023"],[5,21389,"GPC-21389"],[5,21707,"GPC-21707"],[5,20071,"GPC-20071"],[6,19030,"GPC-19030"],[6,18672,"GPC-18672"],[6,18207,"GPC-18207"],[6,17875,"GPC-17875"],[6,17635,"GPC-17635"],[6,17435,"GPC-17435"],[6,16741,"GPC-16741"],[6,15137,"GPC-15137"],[7,19340,"GPC-19340"],[7,19331,"GPC-19331"],[7,19289,"GPC-19289"],[7,19280,"GPC-19280"],[7,19193,"GPC-19193"],[7,19187,"GPC-19187"],[7,19162,"GPC-19162"],[7,19153,"GPC-19153"],[7,19143,"GPC-19143"],[7,19104,"GPC-19104"],[7,19083,"GPC-19083"],[7,19061,"GPC-19061"],[7,19060,"GPC-19060"],[7,19044,"GPC-19044"],[7,19023,"GPC-19023"],[7,19009,"GPC-19009"],[7,18983,"GPC-18983"],[7,18968,"GPC-18968"],[7,18903,"GPC-18903"],[7,18703,"GPC-18703"],[7,18854,"GPC-18854"],[7,18828,"GPC-18828"],[7,18525,"GPC-18525"],[7,16975,"GPC-16975"],[7,16597,"GPC-16597"],[8,20071,"GPC-20071"],[9,19861,"GPC-19861"],[10,21067,"GPC-21067"],[10,22254,"GPC-22254"],[10,22586,"GPC-22586"],[11,23499,"GPC-23499"],[11,22929,"GPC-22929"],[11,21308,"GPC-21308"],[12,24688,"GPC-24688"],[12,24657,"GPC-24657"],[12,22689,"GPC-22689"],[12,22929,"GPC-22929"],[12,23778,"GPC-23778"],[12,24024,"GPC-24024"],[13,24709,"GPC-24709"],[13,24688,"GPC-24688"],[13,24657,"GPC-24657"],[13,24024,"GPC-24024"],[13,22689,"GPC-22689"],[13,22929,"GPC-22929"],[13,23778,"GPC-23778"],[13,23778,"GPC-23778"],[13,23965,"GPC-23965"],[13,24117,"GPC-24117"],[13,24228,"GPC-24228"],[13,24937,"GPC-24937"],[13,24185,"GPC-24185"],[13,24053,"GPC-24053"],[14,25634,"GPC-25634"]]},"known":{"releases":["6.1"],"points":[[0,24536,"GPC-24536"],[0,19499,"GPC-19499"],[0,17099,"GPC-17099"],[0,15969,"GPC-15969"],[0,16570,"GPC-16570"]]}}
+1 -1
View File
@@ -1 +1 @@
{"product":"GlobalProtect-Linux","releases":["6.0.3","6.0.5","6.1.1","6.1.3","6.1.4","6.1.5","6.2.0","6.2.1","6.2.6","6.2.7","6.2.8","6.3.3","6.3.3-h1"],"points":[[0,15458,"GPC-15458"],[1,16269,"GPC-16269"],[1,15539,"GPC-15539"],[1,14490,"GPC-14490"],[2,16324,"GPC-16324"],[2,16029,"GPC-16029"],[2,15989,"GPC-15989"],[2,15994,"GPC-15994"],[2,15972,"GPC-15972"],[2,15834,"GPC-15834"],[2,15677,"GPC-15677"],[2,15991,"GPC-15991"],[2,15534,"GPC-15534"],[2,15167,"GPC-15167"],[3,19336,"GPC-19336"],[3,18964,"GPC-18964"],[3,18913,"GPC-18913"],[3,18907,"GPC-18907"],[3,18822,"GPC-18822"],[3,18788,"GPC-18788"],[3,18733,"GPC-18733"],[3,18728,"GPC-18728"],[3,18720,"GPC-18720"],[3,18599,"GPC-18599"],[3,18598,"GPC-18598"],[3,18594,"GPC-18594"],[3,18566,"GPC-18566"],[3,18528,"GPC-18528"],[3,18512,"GPC-18512"],[3,18471,"GPC-18471"],[3,18426,"GPC-18426"],[3,18383,"GPC-18383"],[3,18379,"GPC-18379"],[3,18367,"GPC-18367"],[3,18336,"GPC-18336"],[3,18318,"GPC-18318"],[3,18251,"GPC-18251"],[3,18230,"GPC-18230"],[3,18223,"GPC-18223"],[3,18200,"GPC-18200"],[3,18173,"GPC-18173"],[3,18171,"GPC-18171"],[3,18167,"GPC-18167"],[3,18157,"GPC-18157"],[3,18155,"GPC-18155"],[3,18146,"GPC-18146"],[3,18135,"GPC-18135"],[3,18107,"GPC-18107"],[3,18092,"GPC-18092"],[3,18060,"GPC-18060"],[3,18039,"GPC-18039"],[3,17914,"GPC-17914"],[3,17896,"GPC-17896"],[3,17640,"GPC-17640"],[3,17518,"GPC-17518"],[3,17492,"GPC-17492"],[3,17204,"GPC-17204"],[3,17161,"GPC-17161"],[3,17001,"GPC-17001"],[3,16609,"GPC-16609"],[3,16597,"GPC-16597"],[3,16441,"GPC-16441"],[3,16397,"GPC-16397"],[3,15697,"GPC-15697"],[4,19340,"GPC-19340"],[4,19331,"GPC-19331"],[4,19289,"GPC-19289"],[4,19280,"GPC-19280"],[4,19193,"GPC-19193"],[4,19187,"GPC-19187"],[4,19162,"GPC-19162"],[4,19153,"GPC-19153"],[4,19143,"GPC-19143"],[4,19104,"GPC-19104"],[4,19083,"GPC-19083"],[4,19061,"GPC-19061"],[4,19060,"GPC-19060"],[4,19044,"GPC-19044"],[4,19023,"GPC-19023"],[4,19009,"GPC-19009"],[4,18983,"GPC-18983"],[4,18968,"GPC-18968"],[4,18903,"GPC-18903"],[4,18703,"GPC-18703"],[4,18854,"GPC-18854"],[4,18828,"GPC-18828"],[4,18525,"GPC-18525"],[4,16975,"GPC-16975"],[4,16597,"GPC-16597"],[5,20193,"GPC-20193"],[5,20124,"GPC-20124"],[5,19792,"GPC-19792"],[5,19748,"GPC-19748"],[5,19353,"GPC-19353"],[5,19297,"GPC-19297"],[5,18903,"GPC-18903"],[5,17378,"GPC-17378"],[6,19792,"GPC-19792"],[6,19748,"GPC-19748"],[6,19353,"GPC-19353"],[6,19143,"GPC-19143"],[6,18903,"GPC-18903"],[6,18820,"GPC-18820"],[6,18512,"GPC-18512"],[6,18155,"GPC-18155"],[6,17598,"GPC-17598"],[6,16980,"GPC-16980"],[7,21151,"GPC-21151"],[7,20945,"GPC-20945"],[7,20605,"GPC-20605"],[7,20574,"GPC-20574"],[7,20544,"GPC-20544"],[7,20525,"GPC-20525"],[7,20449,"GPC-20449"],[7,20398,"GPC-20398"],[7,20340,"GPC-20340"],[7,19973,"GPC-19973"],[7,19297,"GPC-19297"],[7,18105,"GPC-18105"],[7,17378,"GPC-17378"],[8,22950,"GPC-22950"],[8,22872,"GPC-22872"],[8,22774,"GPC-22774"],[8,22766,"GPC-22766"],[8,22390,"GPC-22390"],[8,22306,"GPC-22306"],[8,22249,"GPC-22249"],[8,22130,"GPC-22130"],[8,22051,"GPC-22051"],[8,21951,"GPC-21951"],[8,21920,"GPC-21920"],[8,21915,"GPC-21915"],[8,21861,"GPC-21861"],[8,21762,"GPC-21762"],[8,21724,"GPC-21724"],[8,21651,"GPC-21651"],[8,21092,"GPC-21092"],[8,21478,"GPC-21478"],[9,23208,"GPC-23208"],[10,23208,"GPC-23208"],[11,23773,"GPC-23773"],[11,23647,"GPC-23647"],[11,23452,"GPC-23452"],[11,23447,"GPC-23447"],[11,23405,"GPC-23405"],[11,23208,"GPC-23208"],[11,21049,"GPC-21049"],[12,24173,"GPC-24173"]]}
{"product":"GlobalProtect-Linux","addressed":{"releases":["6.0.3","6.0.5","6.1.1","6.1.3","6.1.4","6.1.5","6.2.0","6.2.1","6.2.6","6.2.7","6.2.8","6.3.3","6.3.3-h1"],"points":[[0,15458,"GPC-15458"],[1,16269,"GPC-16269"],[1,15539,"GPC-15539"],[1,14490,"GPC-14490"],[2,16324,"GPC-16324"],[2,16029,"GPC-16029"],[2,15989,"GPC-15989"],[2,15994,"GPC-15994"],[2,15972,"GPC-15972"],[2,15834,"GPC-15834"],[2,15677,"GPC-15677"],[2,15991,"GPC-15991"],[2,15534,"GPC-15534"],[2,15167,"GPC-15167"],[3,19336,"GPC-19336"],[3,18964,"GPC-18964"],[3,18913,"GPC-18913"],[3,18907,"GPC-18907"],[3,18822,"GPC-18822"],[3,18788,"GPC-18788"],[3,18733,"GPC-18733"],[3,18728,"GPC-18728"],[3,18720,"GPC-18720"],[3,18599,"GPC-18599"],[3,18598,"GPC-18598"],[3,18594,"GPC-18594"],[3,18566,"GPC-18566"],[3,18528,"GPC-18528"],[3,18512,"GPC-18512"],[3,18471,"GPC-18471"],[3,18426,"GPC-18426"],[3,18383,"GPC-18383"],[3,18379,"GPC-18379"],[3,18367,"GPC-18367"],[3,18336,"GPC-18336"],[3,18318,"GPC-18318"],[3,18251,"GPC-18251"],[3,18230,"GPC-18230"],[3,18223,"GPC-18223"],[3,18200,"GPC-18200"],[3,18173,"GPC-18173"],[3,18171,"GPC-18171"],[3,18167,"GPC-18167"],[3,18157,"GPC-18157"],[3,18155,"GPC-18155"],[3,18146,"GPC-18146"],[3,18135,"GPC-18135"],[3,18107,"GPC-18107"],[3,18092,"GPC-18092"],[3,18060,"GPC-18060"],[3,18039,"GPC-18039"],[3,17914,"GPC-17914"],[3,17896,"GPC-17896"],[3,17640,"GPC-17640"],[3,17518,"GPC-17518"],[3,17492,"GPC-17492"],[3,17204,"GPC-17204"],[3,17161,"GPC-17161"],[3,17001,"GPC-17001"],[3,16609,"GPC-16609"],[3,16597,"GPC-16597"],[3,16441,"GPC-16441"],[3,16397,"GPC-16397"],[3,15697,"GPC-15697"],[4,19340,"GPC-19340"],[4,19331,"GPC-19331"],[4,19289,"GPC-19289"],[4,19280,"GPC-19280"],[4,19193,"GPC-19193"],[4,19187,"GPC-19187"],[4,19162,"GPC-19162"],[4,19153,"GPC-19153"],[4,19143,"GPC-19143"],[4,19104,"GPC-19104"],[4,19083,"GPC-19083"],[4,19061,"GPC-19061"],[4,19060,"GPC-19060"],[4,19044,"GPC-19044"],[4,19023,"GPC-19023"],[4,19009,"GPC-19009"],[4,18983,"GPC-18983"],[4,18968,"GPC-18968"],[4,18903,"GPC-18903"],[4,18703,"GPC-18703"],[4,18854,"GPC-18854"],[4,18828,"GPC-18828"],[4,18525,"GPC-18525"],[4,16975,"GPC-16975"],[4,16597,"GPC-16597"],[5,20193,"GPC-20193"],[5,20124,"GPC-20124"],[5,19792,"GPC-19792"],[5,19748,"GPC-19748"],[5,19353,"GPC-19353"],[5,19297,"GPC-19297"],[5,18903,"GPC-18903"],[5,17378,"GPC-17378"],[6,19792,"GPC-19792"],[6,19748,"GPC-19748"],[6,19353,"GPC-19353"],[6,19143,"GPC-19143"],[6,18903,"GPC-18903"],[6,18820,"GPC-18820"],[6,18512,"GPC-18512"],[6,18155,"GPC-18155"],[6,17598,"GPC-17598"],[6,16980,"GPC-16980"],[7,21151,"GPC-21151"],[7,20945,"GPC-20945"],[7,20605,"GPC-20605"],[7,20574,"GPC-20574"],[7,20544,"GPC-20544"],[7,20525,"GPC-20525"],[7,20449,"GPC-20449"],[7,20398,"GPC-20398"],[7,20340,"GPC-20340"],[7,19973,"GPC-19973"],[7,19297,"GPC-19297"],[7,18105,"GPC-18105"],[7,17378,"GPC-17378"],[8,22950,"GPC-22950"],[8,22872,"GPC-22872"],[8,22774,"GPC-22774"],[8,22766,"GPC-22766"],[8,22390,"GPC-22390"],[8,22306,"GPC-22306"],[8,22249,"GPC-22249"],[8,22130,"GPC-22130"],[8,22051,"GPC-22051"],[8,21951,"GPC-21951"],[8,21920,"GPC-21920"],[8,21915,"GPC-21915"],[8,21861,"GPC-21861"],[8,21762,"GPC-21762"],[8,21724,"GPC-21724"],[8,21651,"GPC-21651"],[8,21092,"GPC-21092"],[8,21478,"GPC-21478"],[9,23208,"GPC-23208"],[10,23208,"GPC-23208"],[11,23773,"GPC-23773"],[11,23647,"GPC-23647"],[11,23452,"GPC-23452"],[11,23447,"GPC-23447"],[11,23405,"GPC-23405"],[11,23208,"GPC-23208"],[11,21049,"GPC-21049"],[12,24173,"GPC-24173"]]},"known":{"releases":["6.1","6.2.0","6.2.1","6.2.7","6.2.8","6.2.9","6.3.3"],"points":[[0,24536,"GPC-24536"],[0,19499,"GPC-19499"],[0,17099,"GPC-17099"],[0,15969,"GPC-15969"],[0,16570,"GPC-16570"],[1,23149,"GPC-23149"],[1,21694,"GPC-21694"],[1,21558,"GPC-21558"],[1,21442,"GPC-21442"],[1,20970,"GPC-20970"],[1,20840,"GPC-20840"],[1,19339,"GPC-19339"],[1,19180,"GPC-19180"],[1,18964,"GPC-18964"],[1,18025,"GPC-18025"],[1,17820,"GPC-17820"],[1,17816,"GPC-17816"],[1,17727,"GPC-17727"],[1,17513,"GPC-17513"],[1,17447,"GPC-17447"],[1,17663,"GPC-17663"],[1,17555,"GPC-17555"],[1,17854,"GPC-17854"],[2,23149,"GPC-23149"],[2,21694,"GPC-21694"],[2,21558,"GPC-21558"],[2,21442,"GPC-21442"],[2,20970,"GPC-20970"],[2,20840,"GPC-20840"],[2,19339,"GPC-19339"],[2,19180,"GPC-19180"],[2,18964,"GPC-18964"],[2,18025,"GPC-18025"],[2,17820,"GPC-17820"],[2,17727,"GPC-17727"],[2,17513,"GPC-17513"],[2,17447,"GPC-17447"],[2,17663,"GPC-17663"],[2,17555,"GPC-17555"],[2,17854,"GPC-17854"],[3,19339,"GPC-19339"],[3,19180,"GPC-19180"],[3,17854,"GPC-17854"],[4,19339,"GPC-19339"],[4,19180,"GPC-19180"],[4,17854,"GPC-17854"],[5,19339,"GPC-19339"],[5,19180,"GPC-19180"],[5,17854,"GPC-17854"],[6,23912,"GPC-23912"],[6,19339,"GPC-19339"],[6,19180,"GPC-19180"],[6,17854,"GPC-17854"]]}}
+1 -1
View File
@@ -1 +1 @@
{"product":"GlobalProtect-iOS","releases":["6.0.2","6.0.4","6.0.5","6.0.6","6.0.12","6.1.0","6.1.4","6.1.5","6.1.6","6.1.7","6.1.9","6.1.10","6.1.11"],"points":[[0,15068,"GPC-15068"],[0,15023,"GPC-15023"],[1,15739,"GPC-15739"],[1,14941,"GPC-14941"],[1,14913,"GPC-14913"],[1,14686,"GPC-14686"],[2,16485,"GPC-16485"],[2,16149,"GPC-16149"],[2,15998,"GPC-15998"],[2,15984,"GPC-15984"],[2,15509,"GPC-15509"],[2,14952,"GPC-14952"],[3,16684,"GPC-16684"],[4,21389,"GPC-21389"],[4,21707,"GPC-21707"],[4,20071,"GPC-20071"],[5,19030,"GPC-19030"],[5,18672,"GPC-18672"],[5,18207,"GPC-18207"],[5,17875,"GPC-17875"],[5,17635,"GPC-17635"],[5,17435,"GPC-17435"],[5,16741,"GPC-16741"],[5,15137,"GPC-15137"],[6,19340,"GPC-19340"],[6,19331,"GPC-19331"],[6,19289,"GPC-19289"],[6,19280,"GPC-19280"],[6,19193,"GPC-19193"],[6,19187,"GPC-19187"],[6,19162,"GPC-19162"],[6,19153,"GPC-19153"],[6,19143,"GPC-19143"],[6,19104,"GPC-19104"],[6,19083,"GPC-19083"],[6,19061,"GPC-19061"],[6,19060,"GPC-19060"],[6,19044,"GPC-19044"],[6,19023,"GPC-19023"],[6,19009,"GPC-19009"],[6,18983,"GPC-18983"],[6,18968,"GPC-18968"],[6,18903,"GPC-18903"],[6,18703,"GPC-18703"],[6,18854,"GPC-18854"],[6,18828,"GPC-18828"],[6,18525,"GPC-18525"],[6,16975,"GPC-16975"],[6,16597,"GPC-16597"],[7,19631,"GPC-19631"],[8,21463,"GPC-21463"],[9,19861,"GPC-19861"],[10,23347,"GPC-23347"],[11,24688,"GPC-24688"],[11,24657,"GPC-24657"],[11,22689,"GPC-22689"],[11,22929,"GPC-22929"],[11,23778,"GPC-23778"],[11,24024,"GPC-24024"],[12,24709,"GPC-24709"],[12,24688,"GPC-24688"],[12,24657,"GPC-24657"],[12,24024,"GPC-24024"],[12,22689,"GPC-22689"],[12,22929,"GPC-22929"],[12,23778,"GPC-23778"],[12,23965,"GPC-23965"],[12,24117,"GPC-24117"],[12,24228,"GPC-24228"],[12,24937,"GPC-24937"],[12,24185,"GPC-24185"],[12,24053,"GPC-24053"]]}
{"product":"GlobalProtect-iOS","addressed":{"releases":["6.0.2","6.0.4","6.0.5","6.0.6","6.0.12","6.1.0","6.1.4","6.1.5","6.1.6","6.1.7","6.1.9","6.1.10","6.1.11"],"points":[[0,15068,"GPC-15068"],[0,15023,"GPC-15023"],[1,15739,"GPC-15739"],[1,14941,"GPC-14941"],[1,14913,"GPC-14913"],[1,14686,"GPC-14686"],[2,16485,"GPC-16485"],[2,16149,"GPC-16149"],[2,15998,"GPC-15998"],[2,15984,"GPC-15984"],[2,15509,"GPC-15509"],[2,14952,"GPC-14952"],[3,16684,"GPC-16684"],[4,21389,"GPC-21389"],[4,21707,"GPC-21707"],[4,20071,"GPC-20071"],[5,19030,"GPC-19030"],[5,18672,"GPC-18672"],[5,18207,"GPC-18207"],[5,17875,"GPC-17875"],[5,17635,"GPC-17635"],[5,17435,"GPC-17435"],[5,16741,"GPC-16741"],[5,15137,"GPC-15137"],[6,19340,"GPC-19340"],[6,19331,"GPC-19331"],[6,19289,"GPC-19289"],[6,19280,"GPC-19280"],[6,19193,"GPC-19193"],[6,19187,"GPC-19187"],[6,19162,"GPC-19162"],[6,19153,"GPC-19153"],[6,19143,"GPC-19143"],[6,19104,"GPC-19104"],[6,19083,"GPC-19083"],[6,19061,"GPC-19061"],[6,19060,"GPC-19060"],[6,19044,"GPC-19044"],[6,19023,"GPC-19023"],[6,19009,"GPC-19009"],[6,18983,"GPC-18983"],[6,18968,"GPC-18968"],[6,18903,"GPC-18903"],[6,18703,"GPC-18703"],[6,18854,"GPC-18854"],[6,18828,"GPC-18828"],[6,18525,"GPC-18525"],[6,16975,"GPC-16975"],[6,16597,"GPC-16597"],[7,19631,"GPC-19631"],[8,21463,"GPC-21463"],[9,19861,"GPC-19861"],[10,23347,"GPC-23347"],[11,24688,"GPC-24688"],[11,24657,"GPC-24657"],[11,22689,"GPC-22689"],[11,22929,"GPC-22929"],[11,23778,"GPC-23778"],[11,24024,"GPC-24024"],[12,24709,"GPC-24709"],[12,24688,"GPC-24688"],[12,24657,"GPC-24657"],[12,24024,"GPC-24024"],[12,22689,"GPC-22689"],[12,22929,"GPC-22929"],[12,23778,"GPC-23778"],[12,23778,"GPC-23778"],[12,23965,"GPC-23965"],[12,24117,"GPC-24117"],[12,24228,"GPC-24228"],[12,24937,"GPC-24937"],[12,24185,"GPC-24185"],[12,24053,"GPC-24053"]]},"known":{"releases":["6.1"],"points":[[0,24536,"GPC-24536"],[0,19499,"GPC-19499"],[0,17099,"GPC-17099"],[0,15969,"GPC-15969"],[0,16570,"GPC-16570"]]}}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
{"product":"Prisma Access Agent","releases":["25.3","25.3.1","25.4","25.6","25.6.2","25.7","25.7.1","26.1.1","26.1.2"],"points":[[0,6738,"PANG-6738"],[0,4616,"EPM-4616"],[1,7012,"PANG-7012"],[2,7949,"PANG-7949"],[2,7865,"PANG-7865"],[2,7960,"PANG-7960"],[2,7309,"PANG-7309"],[3,8845,"PANG-8845"],[3,8200,"PANG-8200"],[4,9620,"PANG-9620"],[4,9630,"PANG-9630"],[4,9276,"PANG-9276"],[4,9220,"PANG-9220"],[4,9092,"PANG-9092"],[4,9067,"PANG-9067"],[5,9242,"PANG-9242"],[5,8945,"PANG-8945"],[5,8929,"PANG-8929"],[6,9876,"PANG-9876"],[7,11201,"PANG-11201"],[7,11153,"PANG-11153"],[7,10723,"PANG-10723"],[8,11395,"PANG-11395"],[8,11328,"PANG-11328"],[8,11311,"PANG-11311"],[8,11293,"PANG-11293"],[8,11284,"PANG-11284"],[8,11274,"PANG-11274"]]}
{"product":"Prisma Access Agent","addressed":{"releases":["25.3","25.3.1","25.4","25.6","25.6.2","25.7","25.7.1","26.1.1","26.1.2"],"points":[[0,6738,"PANG-6738"],[0,4616,"EPM-4616"],[1,7012,"PANG-7012"],[2,7949,"PANG-7949"],[2,7865,"PANG-7865"],[2,7960,"PANG-7960"],[2,7309,"PANG-7309"],[3,8845,"PANG-8845"],[3,8200,"PANG-8200"],[4,9620,"PANG-9620"],[4,9630,"PANG-9630"],[4,9276,"PANG-9276"],[4,9220,"PANG-9220"],[4,9092,"PANG-9092"],[4,9067,"PANG-9067"],[5,9242,"PANG-9242"],[5,8945,"PANG-8945"],[5,8929,"PANG-8929"],[6,9876,"PANG-9876"],[7,11201,"PANG-11201"],[7,11153,"PANG-11153"],[7,10723,"PANG-10723"],[8,11395,"PANG-11395"],[8,11328,"PANG-11328"],[8,11311,"PANG-11311"],[8,11293,"PANG-11293"],[8,11284,"PANG-11284"],[8,11274,"PANG-11274"]]},"known":{"releases":["25.1","25.3","25.3.0-iOS","25.3.0.11-Android","25.3.1","25.4","25.6","25.6.1","25.6.2","25.7","25.7-Linux","25.7.1","26.1-Linux","26.1.1","26.1.2"],"points":[[0,4848,"EPM-4848"],[0,4821,"EPM-4821"],[1,7865,"PANG-7865"],[1,7012,"PANG-7012"],[2,8284,"PANG-8284"],[2,8283,"PANG-8283"],[2,8282,"PANG-8282"],[2,8223,"PANG-8223"],[3,8284,"PANG-8284"],[3,8283,"PANG-8283"],[3,8282,"PANG-8282"],[3,8223,"PANG-8223"],[4,8200,"PANG-8200"],[4,8053,"PANG-8053"],[4,7960,"PANG-7960"],[4,7309,"PANG-7309"],[5,8945,"PANG-8945"],[5,8864,"PANG-8864"],[5,8863,"PANG-8863"],[5,8646,"PANG-8646"],[6,9334,"PANG-9334"],[6,9282,"PANG-9282"],[6,9242,"PANG-9242"],[6,8929,"PANG-8929"],[6,49478,"ADI-49478"],[7,9362,"PANG-9362"],[7,9011,"PANG-9011"],[7,9001,"PANG-9001"],[8,9739,"PANG-9739"],[9,10092,"PANG-10092"],[9,10057,"PANG-10057"],[9,10005,"PANG-10005"],[10,10159,"PANG-10159"],[10,10022,"PANG-10022"],[10,10020,"PANG-10020"],[10,9990,"PANG-9990"],[10,9870,"PANG-9870"],[10,9351,"PANG-9351"],[10,9349,"PANG-9349"],[11,10158,"PANG-10158"],[11,10342,"PANG-10342"],[11,10309,"PANG-10309"],[11,10271,"PANG-10271"],[11,10019,"PANG-10019"],[12,11201,"PANG-11201"],[12,11153,"PANG-11153"],[12,10947,"PANG-10947"],[12,10865,"PANG-10865"],[12,10801,"PANG-10801"],[12,10668,"PANG-10668"],[12,9501,"PANG-9501"],[12,9196,"PANG-9196"],[13,11346,"PANG-11346"],[13,11254,"PANG-11254"],[13,11199,"PANG-11199"],[13,11178,"PANG-11178"],[13,11141,"PANG-11141"],[13,11103,"PANG-11103"],[13,10925,"PANG-10925"],[14,11429,"PANG-11429"]]}}
+2 -2
View File
@@ -4,7 +4,7 @@ import {
initializeTree,
renderProductTree,
restoreTreeState,
selectAddressedRelease
selectIssueRelease
} from './tree.js';
import { applyIssueSearchFilter, getIssueTypeFilters, initializeUI } from './ui.js';
import { expandFilePrefixLevel } from './product-tree-model.js';
@@ -33,7 +33,7 @@ function loadProductTree() {
await renderProductTree(productsData);
restoreTreeState();
const params = new URLSearchParams(window.location.search);
selectAddressedRelease(params.get('product'), params.get('release'));
selectIssueRelease(params.get('product'), params.get('release'), params.get('type'));
refreshIssuesForCurrentSelection();
})
.catch(error => console.error('Error loading products:', error));
+46 -10
View File
@@ -26,6 +26,7 @@ document.addEventListener('click', event => {
const productSelect = document.getElementById('issue-plot-product');
const trainSelect = document.getElementById('issue-plot-train');
const typeInputs = Array.from(document.querySelectorAll('input[name="issue-plot-type"]'));
const canvas = document.getElementById('issue-plot-canvas');
const tooltip = document.getElementById('issue-plot-tooltip');
const summary = document.getElementById('issue-plot-summary');
@@ -37,6 +38,7 @@ let hoveredPoint = null;
const initialParams = new URLSearchParams(window.location.search);
const initialProduct = initialParams.get('product') || 'PAN-OS';
const initialTrain = initialParams.get('train') || '11.1';
const initialType = initialParams.get('type') === 'known' ? 'known' : 'addressed';
let restoreInitialSelection = true;
function releaseTrain(version) {
@@ -52,11 +54,26 @@ function fillSelect(select, options) {
}));
}
function selectedIssueType() {
return typeInputs.find(input => input.checked)?.value ?? 'addressed';
}
function currentSeries() {
return currentProduct?.[selectedIssueType()] ?? { releases: [], points: [] };
}
function refreshTrainOptions(preferredTrain = trainSelect.value) {
const trains = Array.from(new Set(currentSeries().releases.map(releaseTrain))).reverse();
fillSelect(trainSelect, trains);
if (trains.includes(preferredTrain)) trainSelect.value = preferredTrain;
}
function updatePlotQuery() {
if (!currentProduct || !trainSelect.value) return;
const url = new URL(window.location.href);
url.searchParams.set('product', currentProduct.product);
url.searchParams.set('train', trainSelect.value);
url.searchParams.set('type', selectedIssueType());
history.replaceState(null, '', url);
}
@@ -77,6 +94,7 @@ function plotColors() {
grid: styles.getPropertyValue('--border').trim() || '#d0d7de',
base: styles.getPropertyValue('--plot-base').trim() || '#2e8b57',
hotfix: styles.getPropertyValue('--plot-hotfix').trim() || '#2c7be5',
resolved: styles.getPropertyValue('--plot-resolved').trim() || '#8b5cf6',
hover: styles.getPropertyValue('--plot-hover').trim() || '#d97706'
};
}
@@ -87,12 +105,14 @@ function formatIssueNumber(value) {
function drawPlot() {
if (!context || !currentProduct) return;
const issueType = selectedIssueType();
const series = currentSeries();
const selectedTrain = trainSelect.value;
const releaseIndexes = currentProduct.releases
const releaseIndexes = series.releases
.map((version, index) => ({ version, index }))
.filter(item => releaseTrain(item.version) === selectedTrain);
const indexPositions = new Map(releaseIndexes.map((item, position) => [item.index, position]));
const points = currentProduct.points.filter(point => indexPositions.has(point[0]));
const points = series.points.filter(point => indexPositions.has(point[0]));
const bounds = canvas.getBoundingClientRect();
const ratio = window.devicePixelRatio || 1;
@@ -112,9 +132,9 @@ function drawPlot() {
context.fillStyle = colors.text;
context.font = '14px system-ui, sans-serif';
context.textAlign = 'center';
context.fillText('No addressed Issue-IDs in this release train.', bounds.width / 2, bounds.height / 2);
context.fillText(`No ${issueType} Issue-IDs in this release train.`, bounds.width / 2, bounds.height / 2);
renderedPoints = [];
summary.textContent = `0 addressed issues across ${releaseIndexes.length.toLocaleString('en-US')} releases.`;
summary.textContent = `0 ${issueType} issues across ${releaseIndexes.length.toLocaleString('en-US')} releases.`;
return;
}
const minimum = Math.min(...values);
@@ -174,7 +194,8 @@ function drawPlot() {
y: yFor(point[1]) - Math.floor(overlap / 3) * 4,
id: point[2],
issueNumber: point[1],
release: currentProduct.releases[point[0]]
release: series.releases[point[0]],
resolved: Boolean(point[3])
};
});
@@ -184,12 +205,14 @@ function drawPlot() {
context.arc(point.x, point.y, hovered ? 5 : 3, 0, Math.PI * 2);
context.fillStyle = hovered
? colors.hover
: (/-h\d+(?:\D|$)/i.test(point.release) ? colors.hotfix : colors.base);
: (point.resolved
? colors.resolved
: (/-h\d+(?:\D|$)/i.test(point.release) ? colors.hotfix : colors.base));
context.globalAlpha = hovered ? 1 : 0.72;
context.fill();
});
context.globalAlpha = 1;
summary.textContent = `${points.length.toLocaleString('en-US')} addressed issue${points.length === 1 ? '' : 's'} across ${releaseIndexes.length.toLocaleString('en-US')} release${releaseIndexes.length === 1 ? '' : 's'}.`;
summary.textContent = `${points.length.toLocaleString('en-US')} ${issueType} issue${points.length === 1 ? '' : 's'} across ${releaseIndexes.length.toLocaleString('en-US')} release${releaseIndexes.length === 1 ? '' : 's'}.`;
}
function pointNear(event) {
@@ -208,7 +231,7 @@ canvas?.addEventListener('pointermove', event => {
hoveredPoint = point;
canvas.style.cursor = point ? 'pointer' : 'default';
if (point) {
tooltip.textContent = `${point.id} · ${point.release}`;
tooltip.textContent = `${point.id} · ${point.release}${point.resolved ? ' · resolved' : ''}`;
tooltip.hidden = false;
const frame = canvas.parentElement.getBoundingClientRect();
tooltip.style.left = `${Math.min(event.clientX - frame.left + 12, frame.width - tooltip.offsetWidth - 8)}px`;
@@ -231,7 +254,8 @@ canvas?.addEventListener('click', event => {
const params = new URLSearchParams({
issue: point.id,
product: currentProduct.product,
release: point.release
release: point.release,
type: selectedIssueType()
});
window.location.href = `index.html?${params}`;
}
@@ -244,10 +268,22 @@ trainSelect?.addEventListener('change', () => {
drawPlot();
});
typeInputs.forEach(input => {
input.checked = input.value === initialType;
input.addEventListener('change', () => {
if (!input.checked || !currentProduct) return;
hoveredPoint = null;
tooltip.hidden = true;
refreshTrainOptions();
updatePlotQuery();
drawPlot();
});
});
productSelect?.addEventListener('change', async () => {
try {
currentProduct = await loadProduct(productSelect.value);
fillSelect(trainSelect, Array.from(new Set(currentProduct.releases.map(releaseTrain))).reverse());
refreshTrainOptions(restoreInitialSelection ? initialTrain : '');
if (restoreInitialSelection && initialProduct === currentProduct.product && initialTrain &&
Array.from(trainSelect.options).some(option => option.value === initialTrain)) {
trainSelect.value = initialTrain;
+11 -2
View File
@@ -63,8 +63,12 @@ export function getCheckedFileRefs() {
}
export function selectAddressedRelease(product, release) {
return selectIssueRelease(product, release, 'addressed');
}
export function selectIssueRelease(product, release, issueType = 'addressed') {
if (!productTree || !product || !release) return false;
const node = findAddressedReleaseNode(productTree.nodesById.values(), product, release);
const node = findIssueReleaseNode(productTree.nodesById.values(), product, release, issueType);
if (!node) return false;
productTree.setSelectedIds([node.id]);
@@ -73,10 +77,15 @@ export function selectAddressedRelease(product, release) {
}
export function findAddressedReleaseNode(nodes, product, release) {
return findIssueReleaseNode(nodes, product, release, 'addressed');
}
export function findIssueReleaseNode(nodes, product, release, issueType = 'addressed') {
if (issueType !== 'addressed' && issueType !== 'known') return undefined;
const filename = `${release}.md`;
return Array.from(nodes).find(candidate =>
candidate.metadata?.path?.[0] === product &&
candidate.metadata?.addressed?.includes(filename)
candidate.metadata?.[issueType]?.includes(filename)
);
}
+4 -2
View File
@@ -65,8 +65,10 @@ function initializeIssueSearch() {
function initializeIssueTypeFilters(onSelectionChange) {
const addressedFilter = document.getElementById('filter-addressed');
const knownFilter = document.getElementById('filter-known');
if (new URLSearchParams(window.location.search).has('release')) {
issueTypeFilters.addressed = true;
const params = new URLSearchParams(window.location.search);
if (params.has('release')) {
const issueType = params.get('type') === 'known' ? 'known' : 'addressed';
issueTypeFilters[issueType] = true;
saveTypeFilters();
}
+6
View File
@@ -35,6 +35,11 @@
<label>Release train
<select id="issue-plot-train"></select>
</label>
<fieldset class="issue-plot-type">
<legend>Issue type</legend>
<label><input type="radio" name="issue-plot-type" value="addressed" checked> Addressed</label>
<label><input type="radio" name="issue-plot-type" value="known"> Known</label>
</fieldset>
</div>
</div>
<div class="issue-plot-frame">
@@ -44,6 +49,7 @@
<div class="issue-plot-legend" aria-label="Dot colors">
<span><i class="issue-plot-key issue-plot-key-base"></i>Base release</span>
<span><i class="issue-plot-key issue-plot-key-hotfix"></i>Hotfix release</span>
<span><i class="issue-plot-key issue-plot-key-resolved"></i>Resolved known issue</span>
</div>
<p id="issue-plot-summary" class="issue-plot-summary" aria-live="polite"></p>
</section>
+35
View File
@@ -17,6 +17,7 @@
--button-hover: #2e7d32;
--plot-base: #2e8b57;
--plot-hotfix: #2c7be5;
--plot-resolved: #8b5cf6;
--plot-hover: #d97706;
--shadow: rgba(20, 35, 50, 0.14);
}
@@ -40,6 +41,7 @@
--button-hover: #4ca653;
--plot-base: #56b881;
--plot-hotfix: #79b8ff;
--plot-resolved: #c4a7ff;
--plot-hover: #f2a93b;
--shadow: rgba(0, 0, 0, 0.35);
}
@@ -337,6 +339,35 @@ li:hover {
font: inherit;
}
.issue-plot-type {
display: flex;
align-items: center;
gap: 10px;
margin: 0;
border: 0;
padding: 0;
}
.issue-plot-type legend {
margin-bottom: 4px;
color: var(--text-muted);
font-size: 0.78rem;
font-weight: 600;
}
.issue-plot-type label {
display: inline-flex;
align-items: center;
gap: 4px;
color: var(--text);
font-size: 0.85rem;
font-weight: 400;
}
.issue-plot-type input {
margin: 0;
}
.issue-plot-frame {
position: relative;
}
@@ -393,6 +424,10 @@ li:hover {
background: var(--plot-hotfix);
}
.issue-plot-key-resolved {
background: var(--plot-resolved);
}
.stats-product {
margin-top: 32px;
}