From 254ba9a7942a4fee3a2b2d29d3fed7836bb3d63b Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:05:37 -0400 Subject: [PATCH 01/12] [HTML Report] Render Raid DPS chart early render the main raid DPS chart early so that it doesn't take forever to appear on large reports. motivated by full raid sim stacks like are published on simulationcraft.org --- engine/report/report_html_sim.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engine/report/report_html_sim.cpp b/engine/report/report_html_sim.cpp index 32dac66b791..4950a699949 100644 --- a/engine/report/report_html_sim.cpp +++ b/engine/report/report_html_sim.cpp @@ -377,16 +377,18 @@ void print_html_raid_summary( report::sc_html_stream& os, sim_t& sim ) { raid_dps.width_ += raid_dps.width_ + 12; raid_dps.set( "chart.marginLeft", margin ); + raid_dps.set( "plotOptions.series.animation", false ); // no initial draw animation on the main DPS chart os << raid_dps.to_target_div(); - sim.add_chart_data( raid_dps ); + os << "\n"; } if ( has_priority ) { priority_dps.width_ += priority_dps.width_ + 12; priority_dps.set( "chart.marginLeft", margin ); + priority_dps.set( "plotOptions.series.animation", false ); os << priority_dps.to_target_div(); - sim.add_chart_data( priority_dps ); + os << "\n"; } if ( !sim.raid_events_str.empty() ) From cc1589da3a61076485d039ff0815f79ba8c803d5 Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Mon, 1 Jun 2026 21:47:57 -0400 Subject: [PATCH 02/12] [HTML Report] Emit grouping classes by default the section-open / grouped-first / grouped-last classes that separate and round the report's sections were only applied by `validate_section()` on document.ready, causing a noticable layout shift when they snap apart on larger (longer-loading) reports. instead, we include them directly on the sections we know will be present: section-open for the default-open sections (raid summary and profile sets), grouped-first for hotfixes and grouped-last for the table of contents. this makes the styling and layout mostly correct before document.ready, improving the feel on larger reports. --- engine/report/report_html_sim.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/engine/report/report_html_sim.cpp b/engine/report/report_html_sim.cpp index 4950a699949..9060433c013 100644 --- a/engine/report/report_html_sim.cpp +++ b/engine/report/report_html_sim.cpp @@ -58,7 +58,7 @@ void print_html_contents( report::sc_html_stream& os, const sim_t& sim ) } } - os << "
\n" + os << "
\n" << "

Table of Contents

\n" << "
\n"; @@ -349,7 +349,7 @@ void print_html_sim_summary( report::sc_html_stream& os, sim_t& sim ) void print_html_raid_summary( report::sc_html_stream& os, sim_t& sim ) { - os << "
\n\n" + os << "
\n\n" << "

Raid Summary

\n" << "
\n"; @@ -890,7 +890,7 @@ void print_html_hotfixes( report::sc_html_stream& os, const sim_t& sim ) { std::vector entries = hotfix::hotfix_entries(); - os << "
\n"; + os << "
\n"; os << "

Current simulator hotfixes

\n"; os << "
\n"; @@ -1158,7 +1158,7 @@ void print_profilesets( std::ostream& out, const profileset::profilesets_t& prof return; } - out << "
\n"; + out << "
\n"; out << "

Profile sets

\n"; out << "
\n"; From 9042cfd1614ec8c2f109273fc6517c78fe82f4e6 Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Mon, 1 Jun 2026 23:47:08 -0400 Subject: [PATCH 03/12] [HTML Report] Emit `section-open` for main actor of single actor reports --- engine/report/report_html_player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/report/report_html_player.cpp b/engine/report/report_html_player.cpp index a262bb4575c..efc7a3579b5 100644 --- a/engine/report/report_html_player.cpp +++ b/engine/report/report_html_player.cpp @@ -3721,7 +3721,7 @@ void print_html_player_description( report::sc_html_stream& os, const player_t& bool one_player = sim.players_by_name.size() == 1 && !p.is_enemy() && sim.profilesets->n_profilesets() == 0; // Player Description - os << "
\n"; + os << "
\n"; os << "

Date: Tue, 2 Jun 2026 00:49:07 -0400 Subject: [PATCH 04/12] [HTML Report] Defer actor subsection loading A significant portion of page load time on larger reports is spent parsing HTML and building the DOM. By enclosiong heavier per-actor subsections (Abilities, Buffs, Procs/Uptimes/Benefits, Resources, Action Priority List, Statistics & Data Analysis, Stats, Gear, Profile, Talents (multi-player only), Parsed Player Effects) in `\n"; os << "

\n"; } diff --git a/engine/report/data/html_report_script.js b/engine/report/data/html_report_script.js index 68d91a4cb48..1b80f46186c 100644 --- a/engine/report/data/html_report_script.js +++ b/engine/report/data/html_report_script.js @@ -86,7 +86,7 @@ jQuery(document).ready(function ($) { } } }); - $('.toggle-details').click(function (e) { + $(document).on('click', '.toggle-details', function (e) { e.preventDefault(); e.stopPropagation(); var $me = $(this); @@ -99,16 +99,37 @@ jQuery(document).ready(function ($) { $row.fadeToggle(150); } }); - $('.toggle, .toggle-details').each(function() { - if ( __chartData[this.id] === undefined ) return; - $(this).one('click', function() { - var d = __chartData[this.id]; - for (var idx in d) { - $('#' + d[idx]['target']).highcharts(d[idx]['data']); - } + function bindChartLoaders($scope) { + $scope.find('.toggle, .toggle-details').each(function() { + if ( __chartData[this.id] === undefined ) return; + $(this).one('click', function() { + var d = __chartData[this.id]; + for (var idx in d) { + $('#' + d[idx]['target']).highcharts(d[idx]['data']); + } + }); }); + } + bindChartLoaders($(document)); + $('.toggle').each(function() { + if ( !this.id ) return; + var $deferred = $('script[type="text/x-deferred-html"][data-toggle="' + this.id + '"]'); + if ( !$deferred.length ) return; + var inject = function() { + $deferred.each(function() { + var $injected = $($.parseHTML(this.textContent)); + $(this).replaceWith($injected); + bindChartLoaders($injected); + }); + $('.stripetoprow').oddstripe(); + }; + if ( $(this).hasClass('open') ) { + inject(); + } else { + $(this).one('click', inject); + } }); - $('table.stripetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type').click(function (e) { + $(document).on('click', 'table.stripetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault(); $(this).children('.toggle-details').first().click(); }); @@ -202,7 +223,7 @@ jQuery(document).ready(function ($) { $cells.removeClass('pulse'); }, 150); } - $('.sort').on('click', 'th.toggle-sort', function (e) { + $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me = $(this); var $col = $me.closest('th'); diff --git a/engine/report/data/report_data.inc b/engine/report/data/report_data.inc index e55d8319aaf..7eaffb45f88 100644 --- a/engine/report/data/report_data.inc +++ b/engine/report/data/report_data.inc @@ -1139,46 +1139,51 @@ static const char* __html_report_script[] = { " $me.next('.toggle-content').slideToggle(150); var section = $me.parent('.section'); if (section.length) { section.v", "alidate_section(); if ($me.hasClass('open')) { var wh = $(window).height() / 3; var pos = section[0].getBoundingClie", "ntRect().top; if (pos > wh * 2) { $('html, body').animate( { scrollTop: section.offset().top - wh }, 300); } } } });", -" $('.toggle-details').click(function (e) { e.preventDefault(); e.stopPropagation(); var $me = $(this); var $row = $m", -"e.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeClass('open'); $row.fadeToggle(75", -"); } else { $me.addClass('open'); $row.fadeToggle(150); } }); $('.toggle, .toggle-details').each(function() { if ( _", -"_chartData[this.id] === undefined ) return; $(this).one('click', function() { var d = __chartData[this.id]; for (var", -" idx in d) { $('#' + d[idx]['target']).highcharts(d[idx]['data']); } }); }); $('table.stripetoprow .toprow td:first-", -"of-type, table.stripebody tbody td:first-of-type').click(function (e) { e.preventDefault(); $(this).children('.toggl", -"e-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(hoverTimeout); $('#active-hel", -"p','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(function (e) { var $target = $(thi", -"s.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HELP FOUND

PLEASE REPOR", -"T AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box').html(content); $('#active-", -"help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.top - $('#active-help').height", -"() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#active-help').fadeIn(300); }, ", -"750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $row; var ret; var idx = i; if", -" ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret = $row.children('td').eq(idx", -").text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').length; $row = $row.nextAll('.ch", -"ildrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td').eq(idx).text().trim(); } ", -"} return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace(/[^\\d.-]/g,''); } function", -" numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +strip(getCell(b, i, both)) ||", -" 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va = getCell(a, i, both); var vb", -" = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? 1 : -1; } } function pulseco", -"lumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table.find('.toprow:not(.childrow", -")').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both && (!cell.length || cell.is", -"(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.childrow').first(); if (row.leng", -"th && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length && !cell.is(':empty')) { $.me", -"rge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find('tbody tr:first-of-type td:n", -"th-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td:nth-of-type(' + (index + 1)", -" + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeClass('pulse'); }, 150); } $(", -"'.sort').on('click', 'th.toggle-sort', function (e) { e.preventDefault(); var $me = $(this); var $col = $me.closest(", -"'th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); var $sib = $col.siblings('.asc-sorte", -"d, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index(); var doAlpha = this.dataset.sort", -"type == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dataset.sortrows == 'both'; if (!($me.", -"hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sorted', !doAsc); } else { $me.toggleC", -"lass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('asc-sorted', !isDsc); var srt; if (do", -"Alpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(a, b, i, dsc, both); }; }; } else {", -" srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i, dsc, both); }; }; } var $bucket =", -" $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children('tr').first().nextUntil('.petrow')", -".addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.sort(srt(idx, isDsc, doRows)); $tbl.", -"append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = $remain.first(); $bucket = $petrow.", -"nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length > 1); if ($tbl.hasClass('stripetop", -"row')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", +" $(document).on('click', '.toggle-details', function (e) { e.preventDefault(); e.stopPropagation(); var $me = $(this", +"); var $row = $me.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeClass('open'); $r", +"ow.fadeToggle(75); } else { $me.addClass('open'); $row.fadeToggle(150); } }); function bindChartLoaders($scope) { $s", +"cope.find('.toggle, .toggle-details').each(function() { if ( __chartData[this.id] === undefined ) return; $(this).on", +"e('click', function() { var d = __chartData[this.id]; for (var idx in d) { $('#' + d[idx]['target']).highcharts(d[id", +"x]['data']); } }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id ) return; var $", +"deferred = $('script[type=\"text/x-deferred-html\"][data-toggle=\"' + this.id + '\"]'); if ( !$deferred.length ) ret", +"urn; var inject = function() { $deferred.each(function() { var $injected = $($.parseHTML(this.textContent)); $(this)", +".replaceWith($injected); bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); }; if ( $(this).hasClass('", +"open') ) { inject(); } else { $(this).one('click', inject); } }); $(document).on('click', 'table.stripetoprow .topro", +"w td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault(); $(this).children('.", +"toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(hoverTimeout); $('#activ", +"e-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(function (e) { var $target = ", +"$(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HELP FOUND

PLEASE ", +"REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box').html(content); $('#ac", +"tive-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.top - $('#active-help').h", +"eight() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#active-help').fadeIn(300)", +"; }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $row; var ret; var idx = ", +"i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret = $row.children('td').e", +"q(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').length; $row = $row.nextAll", +"('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td').eq(idx).text().trim(", +"); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace(/[^\\d.-]/g,''); } fun", +"ction numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +strip(getCell(b, i, both", +")) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va = getCell(a, i, both); v", +"ar vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? 1 : -1; } } function pu", +"lsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table.find('.toprow:not(.chi", +"ldrow)').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both && (!cell.length || ce", +"ll.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.childrow').first(); if (row", +".length && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length && !cell.is(':empty')) {", +" $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find('tbody tr:first-of-type", +" td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td:nth-of-type(' + (index", +" + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeClass('pulse'); }, 150);", +" } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me = $(this); var $col = ", +"$me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); var $sib = $col.siblings", +"('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index(); var doAlpha = this.", +"dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dataset.sortrows == 'both'", +"; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sorted', !doAsc); } else {", +" $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('asc-sorted', !isDsc); var", +" srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(a, b, i, dsc, both); };", +" }; } else { srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i, dsc, both); }; }; } v", +"ar $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children('tr').first().nextUnti", +"l('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.sort(srt(idx, isDsc, doR", +"ows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = $remain.first(); $bucke", +"t = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length > 1); if ($tbl.hasClas", +"s('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", }; // Automatically generated from file style.css diff --git a/engine/report/report_html_player.cpp b/engine/report/report_html_player.cpp index efc7a3579b5..bc3b596a262 100644 --- a/engine/report/report_html_player.cpp +++ b/engine/report/report_html_player.cpp @@ -1181,10 +1181,11 @@ void print_html_gear( report::sc_html_stream& os, const player_t& p ) if ( p.items.empty() ) return; + os << "
\n"; + os.printf( "

Gear

\n", p.index ); + os << "
\n"; + os.printf( "\n" << "
\n" << "
\n"; } @@ -1437,12 +1439,14 @@ void print_html_profile( report::sc_html_stream& os, const player_t& p, profile_str = util::encode_html( profile_str ); util::replace_all( profile_str, "\n", "
" ); - os << "
\n" - << "

Profile

\n" - << "
\n" - << "
\n" + os << "
\n"; + os.printf( "

Profile

\n", p.index ); + os << "
\n"; + os.printf( "\n" << "
\n" << "
\n"; } @@ -1475,10 +1479,11 @@ void print_html_stats( report::sc_html_stream& os, const player_t& p ) if ( p.collected_data.fight_length.mean() > 0 ) { - os << "
\n" - << "

Stats

\n" - << "
\n" - << "\n" + os << "
\n"; + os.printf( "

Stats

\n", p.index ); + os << "
\n"; + os.printf( "\n" << "
\n" << "
\n"; } @@ -2042,11 +2048,14 @@ void print_html_talents( report::sc_html_stream& os, const player_t& p ) *points_ptr += _rank; } - os << "
\n" - << "

Talents

\n" - << "
\n"; - auto num_players = p.sim->players_by_name.size(); + + os << "
\n"; + os.printf( "

Talents

\n", p.index ); + os << "
\n"; + if ( num_players > 1 ) + os.printf( "\n"; + os << "
\n" << "
\n"; } @@ -2475,9 +2487,10 @@ void print_html_sample_sequence_table_entry( report::sc_html_stream& os, void print_html_player_action_priority_list( report::sc_html_stream& os, const player_t& p ) { const sim_t& sim = *( p.sim ); - os << "
\n" - << "

Action Priority List

\n" - << "
\n"; + os << "
\n"; + os.printf( "

Action Priority List

\n", p.index ); + os << "
\n"; + os.printf( "\n"; os << "
\n" << "
\n"; } @@ -2652,10 +2666,11 @@ void print_html_player_statistics( report::sc_html_stream& os, const player_t& p { // Statistics & Data Analysis - os << "
\n" - "

Statistics & Data Analysis

\n" - "
\n" - "
\n"; + os << "
\n"; + os.printf( "

Statistics & Data Analysis

\n", p.index ); + os << "
\n"; + os.printf( "\n"; + os << "
\n" "
\n"; } @@ -2945,6 +2961,7 @@ void print_html_player_resources( report::sc_html_stream& os, const player_t& p os << "
\n" << "

Resources

\n" << "
\n"; + os.printf( "\n"; + os << "
\n"; // Open DIV for charts for ( resource_e r = RESOURCE_MAX; --r > RESOURCE_NONE; ) { @@ -3638,6 +3657,8 @@ void print_html_player_buffs( report::sc_html_stream& os, const player_t& p, << "

Buffs

\n" << "
\n"; + os.printf( "\n"; + os << "
\n" << "
\n"; } @@ -4429,9 +4452,11 @@ void print_html_player_abilities( report::sc_html_stream& os, const player_t& p << "

Abilities

\n" << "
\n"; + os.printf( "\n"; // close section os << "
\n" @@ -4743,6 +4768,8 @@ void print_html_player_procs( report::sc_html_stream& os, const player_t& p ) << "

Procs, Uptimes & Benefits

\n" << "
\n"; // Can't use columns as detail toggle will change widths + os.printf( "\n"; + os << "
\n" << "
\n"; } From 55262d31dec2ba7645cda2e3cfe2b576e4935cec Mon Sep 17 00:00:00 2001 From: Kate Martin <51387586+renanthera@users.noreply.github.com> Date: Sat, 6 Jun 2026 21:40:05 -0600 Subject: [PATCH 05/12] [report] Remove special casing for HTML reports based on actor count. --- engine/report/report_html_player.cpp | 30 ++++++++++------------------ engine/report/report_html_sim.cpp | 10 +--------- 2 files changed, 11 insertions(+), 29 deletions(-) diff --git a/engine/report/report_html_player.cpp b/engine/report/report_html_player.cpp index bc3b596a262..32d965537f5 100644 --- a/engine/report/report_html_player.cpp +++ b/engine/report/report_html_player.cpp @@ -2048,25 +2048,19 @@ void print_html_talents( report::sc_html_stream& os, const player_t& p ) *points_ptr += _rank; } - auto num_players = p.sim->players_by_name.size(); - os << "
\n"; os.printf( "

Talents

\n", p.index ); os << "
\n"; - if ( num_players > 1 ) - os.printf( "\n"; + os << "
\n"; + os << "\n"; os << "
\n" << "
\n"; diff --git a/engine/report/report_html_sim.cpp b/engine/report/report_html_sim.cpp index 9060433c013..ace050125fa 100644 --- a/engine/report/report_html_sim.cpp +++ b/engine/report/report_html_sim.cpp @@ -1278,15 +1278,7 @@ void print_html_( report::sc_html_stream& os, sim_t& sim ) if ( sim.decorated_tooltips ) { - //Apply the prettification stuff only if its a single report - if ( num_players > 1 ) - { - os << R"()"; - } - else - { - os << R"()"; - } + os << R"()"; if ( !sim.offline ) os << std::endl << R"()"; From cd567eb7ed258bd25cb4d2d6c9e9eff7bac5f00d Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:05:47 -0400 Subject: [PATCH 06/12] fix talent tables toggle --- engine/report/report_html_player.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/engine/report/report_html_player.cpp b/engine/report/report_html_player.cpp index 32d965537f5..81dbfcf5756 100644 --- a/engine/report/report_html_player.cpp +++ b/engine/report/report_html_player.cpp @@ -2057,10 +2057,12 @@ void print_html_talents( report::sc_html_stream& os, const player_t& p ) auto h_ = static_cast( 1165 - max_col * 28 ); os.format( R"()", raidbots_talent_render_src( p.talents_str, p.true_level, 1165, false, p.dbc->ptr ), h_ ); + os << "\n"; // Hide the talent table only if the Raidbots talent iframe is present. - os << "

Talent Tables

\n" - << "
\n"; + os.printf( "

Talent Tables

\n", p.index ); + os << "
\n"; + os.printf( "\n"; + os << "
\n"; os << "
\n" << "\n"; From bb81182c2c8940eccf805fc3e025bdab4c2028ff Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Sun, 7 Jun 2026 02:03:04 -0400 Subject: [PATCH 07/12] fix toggle onclick in deferred blocks --- engine/report/data/html_report_script.js | 2 +- engine/report/data/report_data.inc | 98 ++++++++++++------------ 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/engine/report/data/html_report_script.js b/engine/report/data/html_report_script.js index 1b80f46186c..8496178d539 100644 --- a/engine/report/data/html_report_script.js +++ b/engine/report/data/html_report_script.js @@ -67,7 +67,7 @@ jQuery(document).ready(function ($) { scrollTop: $anchor.parent().offset().top - $anchor.height() }, 300); }); - $('.toggle').click(function (e) { + $(document).on('click', '.toggle', function (e) { e.preventDefault(); var $me = $(this); $me.toggleClass('open'); diff --git a/engine/report/data/report_data.inc b/engine/report/data/report_data.inc index 7eaffb45f88..54a2cf89961 100644 --- a/engine/report/data/report_data.inc +++ b/engine/report/data/report_data.inc @@ -1135,55 +1135,55 @@ static const char* __html_report_script[] = { "$('a.ext').mouseover(function () { $(this).attr('target', '_blank'); }); $('ul.toc li a').click(function (e) { e.pre", "ventDefault(); var href = this.getAttribute('href'); var $anchor = $(href).children('h2').first(); if (!$anchor.hasC", "lass('open')) { $anchor.click(); } $('html, body').animate( { scrollTop: $anchor.parent().offset().top - $anchor.hei", -"ght() }, 300); }); $('.toggle').click(function (e) { e.preventDefault(); var $me = $(this); $me.toggleClass('open');", -" $me.next('.toggle-content').slideToggle(150); var section = $me.parent('.section'); if (section.length) { section.v", -"alidate_section(); if ($me.hasClass('open')) { var wh = $(window).height() / 3; var pos = section[0].getBoundingClie", -"ntRect().top; if (pos > wh * 2) { $('html, body').animate( { scrollTop: section.offset().top - wh }, 300); } } } });", -" $(document).on('click', '.toggle-details', function (e) { e.preventDefault(); e.stopPropagation(); var $me = $(this", -"); var $row = $me.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeClass('open'); $r", -"ow.fadeToggle(75); } else { $me.addClass('open'); $row.fadeToggle(150); } }); function bindChartLoaders($scope) { $s", -"cope.find('.toggle, .toggle-details').each(function() { if ( __chartData[this.id] === undefined ) return; $(this).on", -"e('click', function() { var d = __chartData[this.id]; for (var idx in d) { $('#' + d[idx]['target']).highcharts(d[id", -"x]['data']); } }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id ) return; var $", -"deferred = $('script[type=\"text/x-deferred-html\"][data-toggle=\"' + this.id + '\"]'); if ( !$deferred.length ) ret", -"urn; var inject = function() { $deferred.each(function() { var $injected = $($.parseHTML(this.textContent)); $(this)", -".replaceWith($injected); bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); }; if ( $(this).hasClass('", -"open') ) { inject(); } else { $(this).one('click', inject); } }); $(document).on('click', 'table.stripetoprow .topro", -"w td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault(); $(this).children('.", -"toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(hoverTimeout); $('#activ", -"e-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(function (e) { var $target = ", -"$(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HELP FOUND

PLEASE ", -"REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box').html(content); $('#ac", -"tive-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.top - $('#active-help').h", -"eight() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#active-help').fadeIn(300)", -"; }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $row; var ret; var idx = ", -"i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret = $row.children('td').e", -"q(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').length; $row = $row.nextAll", -"('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td').eq(idx).text().trim(", -"); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace(/[^\\d.-]/g,''); } fun", -"ction numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +strip(getCell(b, i, both", -")) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va = getCell(a, i, both); v", -"ar vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? 1 : -1; } } function pu", -"lsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table.find('.toprow:not(.chi", -"ldrow)').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both && (!cell.length || ce", -"ll.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.childrow').first(); if (row", -".length && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length && !cell.is(':empty')) {", -" $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find('tbody tr:first-of-type", -" td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td:nth-of-type(' + (index", -" + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeClass('pulse'); }, 150);", -" } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me = $(this); var $col = ", -"$me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); var $sib = $col.siblings", -"('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index(); var doAlpha = this.", -"dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dataset.sortrows == 'both'", -"; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sorted', !doAsc); } else {", -" $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('asc-sorted', !isDsc); var", -" srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(a, b, i, dsc, both); };", -" }; } else { srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i, dsc, both); }; }; } v", -"ar $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children('tr').first().nextUnti", -"l('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.sort(srt(idx, isDsc, doR", -"ows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = $remain.first(); $bucke", -"t = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length > 1); if ($tbl.hasClas", -"s('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", +"ght() }, 300); }); $(document).on('click', '.toggle', function (e) { e.preventDefault(); var $me = $(this); $me.togg", +"leClass('open'); $me.next('.toggle-content').slideToggle(150); var section = $me.parent('.section'); if (section.len", +"gth) { section.validate_section(); if ($me.hasClass('open')) { var wh = $(window).height() / 3; var pos = section[0]", +".getBoundingClientRect().top; if (pos > wh * 2) { $('html, body').animate( { scrollTop: section.offset().top - wh },", +" 300); } } } }); $(document).on('click', '.toggle-details', function (e) { e.preventDefault(); e.stopPropagation(); ", +"var $me = $(this); var $row = $me.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeC", +"lass('open'); $row.fadeToggle(75); } else { $me.addClass('open'); $row.fadeToggle(150); } }); function bindChartLoad", +"ers($scope) { $scope.find('.toggle, .toggle-details').each(function() { if ( __chartData[this.id] === undefined ) re", +"turn; $(this).one('click', function() { var d = __chartData[this.id]; for (var idx in d) { $('#' + d[idx]['target'])", +".highcharts(d[idx]['data']); } }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id", +" ) return; var $deferred = $('script[type=\"text/x-deferred-html\"][data-toggle=\"' + this.id + '\"]'); if ( !$defer", +"red.length ) return; var inject = function() { $deferred.each(function() { var $injected = $($.parseHTML(this.textCo", +"ntent)); $(this).replaceWith($injected); bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); }; if ( $(", +"this).hasClass('open') ) { inject(); } else { $(this).one('click', inject); } }); $(document).on('click', 'table.str", +"ipetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault(); $(t", +"his).children('.toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(hoverTim", +"eout); $('#active-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(function (e) ", +"{ var $target = $(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HELP FOUN", +"D

PLEASE REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box').html(", +"content); $('#active-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.top - $('", +"#active-help').height() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#active-he", +"lp').fadeIn(300); }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $row; var", +" ret; var idx = i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret = $row.", +"children('td').eq(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').length; $ro", +"w = $row.nextAll('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td').eq(i", +"dx).text().trim(); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace(/[^\\d", +".-]/g,''); } function numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +strip(ge", +"tCell(b, i, both)) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va = getCel", +"l(a, i, both); var vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? 1 : -1;", +" } } function pulsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table.find('", +".toprow:not(.childrow)').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both && (!c", +"ell.length || cell.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.childrow').", +"first(); if (row.length && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length && !cell", +".is(':empty')) { $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find('tbody ", +"tr:first-of-type td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td:nth-of", +"-type(' + (index + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeClass('p", +"ulse'); }, 150); } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me = $(th", +"is); var $col = $me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); var $sib", +" = $col.siblings('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index(); var", +" doAlpha = this.dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dataset.so", +"rtrows == 'both'; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sorted', !", +"doAsc); } else { $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('asc-sorte", +"d', !isDsc); var srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(a, b, i", +", dsc, both); }; }; } else { srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i, dsc, ", +"both); }; }; } var $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children('tr').", +"first().nextUntil('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.sort(srt", +"(idx, isDsc, doRows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = $remain", +".first(); $bucket = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length > 1); ", +"if ($tbl.hasClass('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", }; // Automatically generated from file style.css From 6f41342d825da49fd9c42716330d586f886614fb Mon Sep 17 00:00:00 2001 From: Kate Martin <51387586+renanthera@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:38:24 -0600 Subject: [PATCH 08/12] [report] Remove deferral for talent tree iframe to mitigate flashbang. --- engine/report/report_html_player.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/engine/report/report_html_player.cpp b/engine/report/report_html_player.cpp index 81dbfcf5756..a92d54cdc90 100644 --- a/engine/report/report_html_player.cpp +++ b/engine/report/report_html_player.cpp @@ -2049,17 +2049,14 @@ void print_html_talents( report::sc_html_stream& os, const player_t& p ) } os << "
\n"; - os.printf( "

Talents

\n", p.index ); + os.printf( "

Talents

\n", p.index ); os << "
\n"; - os.printf( "\n"; - // Hide the talent table only if the Raidbots talent iframe is present. os.printf( "

Talent Tables

\n", p.index ); os << "
\n"; os.printf( "\n"; - os << "
\n"; - - os << "
\n" + os << "\n" + << "
\n" + << "\n" << "\n"; } @@ -2950,7 +2949,6 @@ void print_html_player_resources( report::sc_html_stream& os, const player_t& p os << "
\n" << "

Resources

\n" << "
\n"; - os.printf( "\n"; os << "
\n"; // Open DIV for charts for ( resource_e r = RESOURCE_MAX; --r > RESOURCE_NONE; ) @@ -3646,8 +3643,6 @@ void print_html_player_buffs( report::sc_html_stream& os, const player_t& p, << "

Buffs

\n" << "
\n"; - os.printf( "\n"; - os << "
\n" << "
\n"; } @@ -4441,11 +4434,9 @@ void print_html_player_abilities( report::sc_html_stream& os, const player_t& p << "

Abilities

\n" << "
\n"; - os.printf( "\n"; // close section os << "
\n" @@ -4757,8 +4748,6 @@ void print_html_player_procs( report::sc_html_stream& os, const player_t& p ) << "

Procs, Uptimes & Benefits

\n" << "
\n"; // Can't use columns as detail toggle will change widths - os.printf( "\n"; - os << "
\n" << "
\n"; } From e655ae0e19750be3775632b46b7f477a230d2c48 Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Sun, 7 Jun 2026 03:56:14 -0400 Subject: [PATCH 10/12] make charts inside deferred blocks load properly --- engine/report/data/html_report_script.js | 19 ++++-- engine/report/data/report_data.inc | 87 ++++++++++++------------ 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/engine/report/data/html_report_script.js b/engine/report/data/html_report_script.js index 8496178d539..a0f6f68421d 100644 --- a/engine/report/data/html_report_script.js +++ b/engine/report/data/html_report_script.js @@ -99,21 +99,25 @@ jQuery(document).ready(function ($) { $row.fadeToggle(150); } }); + function renderCharts(id) { + var d = __chartData[id]; + if ( d === undefined ) return; + for (var idx in d) { + $('#' + d[idx]['target']).highcharts(d[idx]['data']); + } + } function bindChartLoaders($scope) { $scope.find('.toggle, .toggle-details').each(function() { if ( __chartData[this.id] === undefined ) return; - $(this).one('click', function() { - var d = __chartData[this.id]; - for (var idx in d) { - $('#' + d[idx]['target']).highcharts(d[idx]['data']); - } - }); + var id = this.id; + $(this).one('click', function() { renderCharts(id); }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id ) return; - var $deferred = $('script[type="text/x-deferred-html"][data-toggle="' + this.id + '"]'); + var id = this.id; + var $deferred = $('script[type="text/x-deferred-html"][data-toggle="' + id + '"]'); if ( !$deferred.length ) return; var inject = function() { $deferred.each(function() { @@ -122,6 +126,7 @@ jQuery(document).ready(function ($) { bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); + renderCharts(id); }; if ( $(this).hasClass('open') ) { inject(); diff --git a/engine/report/data/report_data.inc b/engine/report/data/report_data.inc index 54a2cf89961..f8ef8c5366f 100644 --- a/engine/report/data/report_data.inc +++ b/engine/report/data/report_data.inc @@ -1141,49 +1141,50 @@ static const char* __html_report_script[] = { ".getBoundingClientRect().top; if (pos > wh * 2) { $('html, body').animate( { scrollTop: section.offset().top - wh },", " 300); } } } }); $(document).on('click', '.toggle-details', function (e) { e.preventDefault(); e.stopPropagation(); ", "var $me = $(this); var $row = $me.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeC", -"lass('open'); $row.fadeToggle(75); } else { $me.addClass('open'); $row.fadeToggle(150); } }); function bindChartLoad", -"ers($scope) { $scope.find('.toggle, .toggle-details').each(function() { if ( __chartData[this.id] === undefined ) re", -"turn; $(this).one('click', function() { var d = __chartData[this.id]; for (var idx in d) { $('#' + d[idx]['target'])", -".highcharts(d[idx]['data']); } }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id", -" ) return; var $deferred = $('script[type=\"text/x-deferred-html\"][data-toggle=\"' + this.id + '\"]'); if ( !$defer", -"red.length ) return; var inject = function() { $deferred.each(function() { var $injected = $($.parseHTML(this.textCo", -"ntent)); $(this).replaceWith($injected); bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); }; if ( $(", -"this).hasClass('open') ) { inject(); } else { $(this).one('click', inject); } }); $(document).on('click', 'table.str", -"ipetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault(); $(t", -"his).children('.toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(hoverTim", -"eout); $('#active-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(function (e) ", -"{ var $target = $(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HELP FOUN", -"D

PLEASE REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box').html(", -"content); $('#active-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.top - $('", -"#active-help').height() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#active-he", -"lp').fadeIn(300); }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $row; var", -" ret; var idx = i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret = $row.", -"children('td').eq(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').length; $ro", -"w = $row.nextAll('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td').eq(i", -"dx).text().trim(); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace(/[^\\d", -".-]/g,''); } function numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +strip(ge", -"tCell(b, i, both)) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va = getCel", -"l(a, i, both); var vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? 1 : -1;", -" } } function pulsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table.find('", -".toprow:not(.childrow)').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both && (!c", -"ell.length || cell.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.childrow').", -"first(); if (row.length && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length && !cell", -".is(':empty')) { $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find('tbody ", -"tr:first-of-type td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td:nth-of", -"-type(' + (index + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeClass('p", -"ulse'); }, 150); } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me = $(th", -"is); var $col = $me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); var $sib", -" = $col.siblings('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index(); var", -" doAlpha = this.dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dataset.so", -"rtrows == 'both'; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sorted', !", -"doAsc); } else { $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('asc-sorte", -"d', !isDsc); var srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(a, b, i", -", dsc, both); }; }; } else { srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i, dsc, ", -"both); }; }; } var $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children('tr').", -"first().nextUntil('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.sort(srt", -"(idx, isDsc, doRows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = $remain", -".first(); $bucket = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length > 1); ", -"if ($tbl.hasClass('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", +"lass('open'); $row.fadeToggle(75); } else { $me.addClass('open'); $row.fadeToggle(150); } }); function renderCharts(", +"id) { var d = __chartData[id]; if ( d === undefined ) return; for (var idx in d) { $('#' + d[idx]['target']).highcha", +"rts(d[idx]['data']); } } function bindChartLoaders($scope) { $scope.find('.toggle, .toggle-details').each(function()", +" { if ( __chartData[this.id] === undefined ) return; var id = this.id; $(this).one('click', function() { renderChart", +"s(id); }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id ) return; var id = this", +".id; var $deferred = $('script[type=\"text/x-deferred-html\"][data-toggle=\"' + id + '\"]'); if ( !$deferred.length ", +") return; var inject = function() { $deferred.each(function() { var $injected = $($.parseHTML(this.textContent)); $(", +"this).replaceWith($injected); bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); renderCharts(id); }; ", +"if ( $(this).hasClass('open') ) { inject(); } else { $(this).one('click', inject); } }); $(document).on('click', 'ta", +"ble.stripetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault", +"(); $(this).children('.toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(h", +"overTimeout); $('#active-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(functi", +"on (e) { var $target = $(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HE", +"LP FOUND

PLEASE REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box'", +").html(content); $('#active-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.to", +"p - $('#active-help').height() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#ac", +"tive-help').fadeIn(300); }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $r", +"ow; var ret; var idx = i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret ", +"= $row.children('td').eq(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').leng", +"th; $row = $row.nextAll('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td", +"').eq(idx).text().trim(); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace", +"(/[^\\d.-]/g,''); } function numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +s", +"trip(getCell(b, i, both)) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va =", +" getCell(a, i, both); var vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? ", +"1 : -1; } } function pulsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table", +".find('.toprow:not(.childrow)').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both", +" && (!cell.length || cell.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.chil", +"drow').first(); if (row.length && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length &", +"& !cell.is(':empty')) { $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find(", +"'tbody tr:first-of-type td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td", +":nth-of-type(' + (index + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeC", +"lass('pulse'); }, 150); } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me", +" = $(this); var $col = $me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); v", +"ar $sib = $col.siblings('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index", +"(); var doAlpha = this.dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dat", +"aset.sortrows == 'both'; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sor", +"ted', !doAsc); } else { $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('as", +"c-sorted', !isDsc); var srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(", +"a, b, i, dsc, both); }; }; } else { srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i", +", dsc, both); }; }; } var $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children", +"('tr').first().nextUntil('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.s", +"ort(srt(idx, isDsc, doRows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = ", +"$remain.first(); $bucket = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length", +" > 1); if ($tbl.hasClass('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", }; // Automatically generated from file style.css From 3d183c8fc9afcf68db39080dfb44110c872fd109 Mon Sep 17 00:00:00 2001 From: Kate Martin <51387586+renanthera@users.noreply.github.com> Date: Sun, 7 Jun 2026 02:08:07 -0600 Subject: [PATCH 11/12] [report] Defer only actor, as nested script tags are not permitted. --- engine/player/player.cpp | 4 +--- engine/report/report_html_player.cpp | 29 ++++++++++------------------ 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/engine/player/player.cpp b/engine/player/player.cpp index 33965b83e7d..8276499f5d4 100644 --- a/engine/player/player.cpp +++ b/engine/player/player.cpp @@ -16441,9 +16441,8 @@ void player_t::print_parsed_effects( report::sc_html_stream& os ) const return; os << R"(
)"; - os.format( R"(

Parsed Player Effects

)", index ); + os.format( R"(

Parsed Player Effects

)", index ); os << R"(
)"; - os.format( R"(\n"; os << "
\n"; } diff --git a/engine/report/report_html_player.cpp b/engine/report/report_html_player.cpp index e4be044f6dc..32bd75c2b10 100644 --- a/engine/report/report_html_player.cpp +++ b/engine/report/report_html_player.cpp @@ -1182,9 +1182,8 @@ void print_html_gear( report::sc_html_stream& os, const player_t& p ) return; os << "
\n"; - os.printf( "

Gear

\n", p.index ); + os.printf( "

Gear

\n", p.index ); os << "
\n"; - os.printf( "\n" << "
\n" << "
\n"; } @@ -1440,13 +1438,11 @@ void print_html_profile( report::sc_html_stream& os, const player_t& p, util::replace_all( profile_str, "\n", "
" ); os << "
\n"; - os.printf( "

Profile

\n", p.index ); + os.printf( "

Profile

\n", p.index ); os << "
\n"; - os.printf( "\n" << "
\n" << "
\n"; } @@ -1480,9 +1476,8 @@ void print_html_stats( report::sc_html_stream& os, const player_t& p ) if ( p.collected_data.fight_length.mean() > 0 ) { os << "
\n"; - os.printf( "

Stats

\n", p.index ); + os.printf( "

Stats

\n", p.index ); os << "
\n"; - os.printf( "\n" << "
\n" << "
\n"; } @@ -2057,9 +2051,8 @@ void print_html_talents( report::sc_html_stream& os, const player_t& p ) os.format( R"()", raidbots_talent_render_src( p.talents_str, p.true_level, 1165, false, p.dbc->ptr ), h_ ); - os.printf( "

Talent Tables

\n", p.index ); + os.printf( "

Talent Tables

\n", p.index ); os << "
\n"; - os.printf( "\n" - << "
\n" + os << "
\n" << "\n" << "\n"; } @@ -2476,9 +2468,8 @@ void print_html_player_action_priority_list( report::sc_html_stream& os, const p { const sim_t& sim = *( p.sim ); os << "
\n"; - os.printf( "

Action Priority List

\n", p.index ); + os.printf( "

Action Priority List

\n", p.index ); os << "
\n"; - os.printf( "\n"; os << "
\n" << "
\n"; } @@ -2655,9 +2645,8 @@ void print_html_player_statistics( report::sc_html_stream& os, const player_t& p // Statistics & Data Analysis os << "
\n"; - os.printf( "

Statistics & Data Analysis

\n", p.index ); + os.printf( "

Statistics & Data Analysis

\n", p.index ); os << "
\n"; - os.printf( "\n"; os << "
\n" "
\n"; } @@ -3771,6 +3759,8 @@ void print_html_player_description( report::sc_html_stream& os, const player_t& } os << "\">\n"; + os.printf( R"(\n"; os << "\n" << "\n\n"; } From e993ada7e12624fcca49ccb541d6e6944c8d7a7e Mon Sep 17 00:00:00 2001 From: bees <78449839+hotbees@users.noreply.github.com> Date: Sun, 7 Jun 2026 05:10:19 -0400 Subject: [PATCH 12/12] fix charts again; cleanup --- engine/report/data/html_report_script.js | 48 +++++------- engine/report/data/report_data.inc | 98 ++++++++++++------------ engine/report/report_html_sim.cpp | 8 -- engine/sim/sim.cpp | 10 +-- engine/sim/sim.hpp | 7 +- 5 files changed, 71 insertions(+), 100 deletions(-) diff --git a/engine/report/data/html_report_script.js b/engine/report/data/html_report_script.js index a0f6f68421d..713b9fe7eff 100644 --- a/engine/report/data/html_report_script.js +++ b/engine/report/data/html_report_script.js @@ -70,6 +70,7 @@ jQuery(document).ready(function ($) { $(document).on('click', '.toggle', function (e) { e.preventDefault(); var $me = $(this); + revealSection(this.id); $me.toggleClass('open'); $me.next('.toggle-content').slideToggle(150); var section = $me.parent('.section'); @@ -90,6 +91,7 @@ jQuery(document).ready(function ($) { e.preventDefault(); e.stopPropagation(); var $me = $(this); + if ( this.id ) renderCharts(this.id); var $row = $me.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeClass('open'); @@ -99,41 +101,29 @@ jQuery(document).ready(function ($) { $row.fadeToggle(150); } }); - function renderCharts(id) { - var d = __chartData[id]; - if ( d === undefined ) return; - for (var idx in d) { - $('#' + d[idx]['target']).highcharts(d[idx]['data']); - } - } - function bindChartLoaders($scope) { - $scope.find('.toggle, .toggle-details').each(function() { - if ( __chartData[this.id] === undefined ) return; - var id = this.id; - $(this).one('click', function() { renderCharts(id); }); + function renderCharts(key) { + var items = __chartData[key]; + if ( items === undefined ) return; + items.forEach(function(chart) { + var $el = $('#' + chart.target); + if ( $el.length && !$el.highcharts() ) { + $el.highcharts(chart.data); + } }); } - bindChartLoaders($(document)); - $('.toggle').each(function() { - if ( !this.id ) return; - var id = this.id; - var $deferred = $('script[type="text/x-deferred-html"][data-toggle="' + id + '"]'); - if ( !$deferred.length ) return; - var inject = function() { + function revealSection(id) { + var $deferred = id ? $('script[type="text/x-deferred-html"][data-toggle="' + id + '"]') : $(); + if ( $deferred.length ) { $deferred.each(function() { - var $injected = $($.parseHTML(this.textContent)); - $(this).replaceWith($injected); - bindChartLoaders($injected); + $(this).replaceWith($($.parseHTML(this.textContent))); }); $('.stripetoprow').oddstripe(); - renderCharts(id); - }; - if ( $(this).hasClass('open') ) { - inject(); - } else { - $(this).one('click', inject); + renderCharts(''); } - }); + if ( id ) renderCharts(id); + } + $('.toggle.open').each(function() { revealSection(this.id); }); + renderCharts(''); $(document).on('click', 'table.stripetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault(); $(this).children('.toggle-details').first().click(); diff --git a/engine/report/data/report_data.inc b/engine/report/data/report_data.inc index f8ef8c5366f..c070c957ed7 100644 --- a/engine/report/data/report_data.inc +++ b/engine/report/data/report_data.inc @@ -1135,56 +1135,54 @@ static const char* __html_report_script[] = { "$('a.ext').mouseover(function () { $(this).attr('target', '_blank'); }); $('ul.toc li a').click(function (e) { e.pre", "ventDefault(); var href = this.getAttribute('href'); var $anchor = $(href).children('h2').first(); if (!$anchor.hasC", "lass('open')) { $anchor.click(); } $('html, body').animate( { scrollTop: $anchor.parent().offset().top - $anchor.hei", -"ght() }, 300); }); $(document).on('click', '.toggle', function (e) { e.preventDefault(); var $me = $(this); $me.togg", -"leClass('open'); $me.next('.toggle-content').slideToggle(150); var section = $me.parent('.section'); if (section.len", -"gth) { section.validate_section(); if ($me.hasClass('open')) { var wh = $(window).height() / 3; var pos = section[0]", -".getBoundingClientRect().top; if (pos > wh * 2) { $('html, body').animate( { scrollTop: section.offset().top - wh },", -" 300); } } } }); $(document).on('click', '.toggle-details', function (e) { e.preventDefault(); e.stopPropagation(); ", -"var $me = $(this); var $row = $me.closest('tr').nextAll('.details').first(); if ($me.hasClass('open')) { $me.removeC", -"lass('open'); $row.fadeToggle(75); } else { $me.addClass('open'); $row.fadeToggle(150); } }); function renderCharts(", -"id) { var d = __chartData[id]; if ( d === undefined ) return; for (var idx in d) { $('#' + d[idx]['target']).highcha", -"rts(d[idx]['data']); } } function bindChartLoaders($scope) { $scope.find('.toggle, .toggle-details').each(function()", -" { if ( __chartData[this.id] === undefined ) return; var id = this.id; $(this).one('click', function() { renderChart", -"s(id); }); }); } bindChartLoaders($(document)); $('.toggle').each(function() { if ( !this.id ) return; var id = this", -".id; var $deferred = $('script[type=\"text/x-deferred-html\"][data-toggle=\"' + id + '\"]'); if ( !$deferred.length ", -") return; var inject = function() { $deferred.each(function() { var $injected = $($.parseHTML(this.textContent)); $(", -"this).replaceWith($injected); bindChartLoaders($injected); }); $('.stripetoprow').oddstripe(); renderCharts(id); }; ", -"if ( $(this).hasClass('open') ) { inject(); } else { $(this).one('click', inject); } }); $(document).on('click', 'ta", -"ble.stripetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.preventDefault", -"(); $(this).children('.toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { clearTimeout(h", -"overTimeout); $('#active-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help').hover(functi", -"on (e) { var $target = $(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content = '

NO HE", -"LP FOUND

PLEASE REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynamic .help-box'", -").html(content); $('#active-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css({ top: pos.to", -"p - $('#active-help').height() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(function() { $('#ac", -"tive-help').fadeIn(300); }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, both) { var $r", -"ow; var ret; var idx = i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').first(); } ret ", -"= $row.children('td').eq(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[rowspan]').leng", -"th; $row = $row.nextAll('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row.children('td", -"').eq(idx).text().trim(); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0') + 1).replace", -"(/[^\\d.-]/g,''); } function numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0; var vb = +s", -"trip(getCell(b, i, both)) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, both) { var va =", -" getCell(a, i, both); var vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { return va > vb \? ", -"1 : -1; } } function pulsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetoprow')) { table", -".find('.toprow:not(.childrow)').each(function() { var me = $(this); var cell = me.children('td').eq(index); if (both", -" && (!cell.length || cell.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.nextAll('.chil", -"drow').first(); if (row.length && index >= span) { cell = row.children('td').eq(index - span); } } if (cell.length &", -"& !cell.is(':empty')) { $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells = table.find(", -"'tbody tr:first-of-type td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find('tbody tr td", -":nth-of-type(' + (index + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $cells.removeC", -"lass('pulse'); }, 150); } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefault(); var $me", -" = $(this); var $col = $me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('table.sort'); v", -"ar $sib = $col.siblings('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx = $col.index", -"(); var doAlpha = this.dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRows = this.dat", -"aset.sortrows == 'both'; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleClass('dsc-sor", -"ted', !doAsc); } else { $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.toggleClass('as", -"c-sorted', !isDsc); var srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { return alphaSort(", -"a, b, i, dsc, both); }; }; } else { srt = function(i, dsc, both) { return function(a, b) { return numberSort(a, b, i", -", dsc, both); }; }; } var $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bucket.children", -"('tr').first().nextUntil('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; do { $bucket.s", -"ort(srt(idx, isDsc, doRows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain); $petrow = ", -"$remain.first(); $bucket = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($bucket.length", -" > 1); if ($tbl.hasClass('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", +"ght() }, 300); }); $(document).on('click', '.toggle', function (e) { e.preventDefault(); var $me = $(this); revealSe", +"ction(this.id); $me.toggleClass('open'); $me.next('.toggle-content').slideToggle(150); var section = $me.parent('.se", +"ction'); if (section.length) { section.validate_section(); if ($me.hasClass('open')) { var wh = $(window).height() /", +" 3; var pos = section[0].getBoundingClientRect().top; if (pos > wh * 2) { $('html, body').animate( { scrollTop: sect", +"ion.offset().top - wh }, 300); } } } }); $(document).on('click', '.toggle-details', function (e) { e.preventDefault(", +"); e.stopPropagation(); var $me = $(this); if ( this.id ) renderCharts(this.id); var $row = $me.closest('tr').nextAl", +"l('.details').first(); if ($me.hasClass('open')) { $me.removeClass('open'); $row.fadeToggle(75); } else { $me.addCla", +"ss('open'); $row.fadeToggle(150); } }); function renderCharts(key) { var items = __chartData[key]; if ( items === un", +"defined ) return; items.forEach(function(chart) { var $el = $('#' + chart.target); if ( $el.length && !$el.highchart", +"s() ) { $el.highcharts(chart.data); } }); } function revealSection(id) { var $deferred = id \? $('script[type=\"text", +"/x-deferred-html\"][data-toggle=\"' + id + '\"]') : $(); if ( $deferred.length ) { $deferred.each(function() { $(thi", +"s).replaceWith($($.parseHTML(this.textContent))); }); $('.stripetoprow').oddstripe(); renderCharts(''); } if ( id ) ", +"renderCharts(id); } $('.toggle.open').each(function() { revealSection(this.id); }); renderCharts(''); $(document).on", +"('click', 'table.stripetoprow .toprow td:first-of-type, table.stripebody tbody td:first-of-type', function (e) { e.p", +"reventDefault(); $(this).children('.toggle-details').first().click(); }); var hoverTimeout; function hoverHide() { c", +"learTimeout(hoverTimeout); $('#active-help','.help-box').hide(); $('#active-help').removeAttr('style'); } $('.help')", +".hover(function (e) { var $target = $(this.dataset.help + ' .help-box'); var content; if (!$target.length) { content", +" = '

NO HELP FOUND

PLEASE REPORT AS A BUG

'; } else { content = $target.html(); } $('#active-help-dynam", +"ic .help-box').html(content); $('#active-help .help-box').show(); var pos = $(this).offset(); $('#active-help').css(", +"{ top: pos.top - $('#active-help').height() - $(this).height(), left: pos.left, }); hoverTimeout = setTimeout(functi", +"on() { $('#active-help').fadeIn(300); }, 750); }, hoverHide); window.onblur = hoverHide; function getCell(elem, i, b", +"oth) { var $row; var ret; var idx = i; if ($(elem).is('tr')) { $row = $(elem); } else { $row = $(elem).find('tr').fi", +"rst(); } ret = $row.children('td').eq(idx).text().trim(); if (!ret.length && both) { var span = $row.children('td[ro", +"wspan]').length; $row = $row.nextAll('.childrow').first(); if ($row.length && idx >= span) { idx -= span; ret = $row", +".children('td').eq(idx).text().trim(); } } return ret; } function strip(val) { return val.slice(val.indexOf('\\xa0')", +" + 1).replace(/[^\\d.-]/g,''); } function numberSort(a, b, i, dsc, both) { var va = +strip(getCell(a, i, both)) || 0", +"; var vb = +strip(getCell(b, i, both)) || 0; return dsc \? vb - va : va - vb; } function alphaSort(a, b, i, dsc, bot", +"h) { var va = getCell(a, i, both); var vb = getCell(b, i, both); if (dsc) { return va < vb \? 1 : -1; } else { retur", +"n va > vb \? 1 : -1; } } function pulsecolumn(table, index, both) { var $cells = $(); if (table.hasClass('stripetopr", +"ow')) { table.find('.toprow:not(.childrow)').each(function() { var me = $(this); var cell = me.children('td').eq(ind", +"ex); if (both && (!cell.length || cell.is(':empty'))) { var span = me.children('td[rowspan]').length; var row = me.n", +"extAll('.childrow').first(); if (row.length && index >= span) { cell = row.children('td').eq(index - span); } } if (", +"cell.length && !cell.is(':empty')) { $.merge($cells, cell); } }); } else if (table.hasClass('stripebody')) { $cells ", +"= table.find('tbody tr:first-of-type td:nth-of-type(' + (index + 1) + '):not(:empty)'); } else { $cells = table.find", +"('tbody tr td:nth-of-type(' + (index + 1) + '):not(:empty)'); } $cells.addClass('pulse'); setTimeout(function () { $", +"cells.removeClass('pulse'); }, 150); } $(document).on('click', '.sort th.toggle-sort', function (e) { e.preventDefau", +"lt(); var $me = $(this); var $col = $me.closest('th'); var $thd = $col.closest('thead'); var $tbl = $thd.closest('ta", +"ble.sort'); var $sib = $col.siblings('.asc-sorted, .dsc-sorted'); $sib.removeClass('asc-sorted dsc-sorted'); var idx", +" = $col.index(); var doAlpha = this.dataset.sorttype == 'alpha'; var doAsc = this.dataset.sortdir == 'asc'; var doRo", +"ws = this.dataset.sortrows == 'both'; if (!($me.hasClass('dsc-sorted') || $me.hasClass('asc-sorted'))) { $me.toggleC", +"lass('dsc-sorted', !doAsc); } else { $me.toggleClass('dsc-sorted'); } var isDsc = $me.hasClass('dsc-sorted'); $me.to", +"ggleClass('asc-sorted', !isDsc); var srt; if (doAlpha) { srt = function(i, dsc, both) { return function(a, b) { retu", +"rn alphaSort(a, b, i, dsc, both); }; }; } else { srt = function(i, dsc, both) { return function(a, b) { return numbe", +"rSort(a, b, i, dsc, both); }; }; } var $bucket = $thd.nextUntil('.petrow'); if ($bucket.length == 1) { $bucket = $bu", +"cket.children('tr').first().nextUntil('.petrow').addBack(); } var $remain = $bucket.last().nextAll(); var $petrow; d", +"o { $bucket.sort(srt(idx, isDsc, doRows)); $tbl.append($bucket); if (!$remain.length) { break; } $tbl.append($remain", +"); $petrow = $remain.first(); $bucket = $petrow.nextUntil('.petrow'); $remain = $bucket.last().nextAll(); } while ($", +"bucket.length > 1); if ($tbl.hasClass('stripetoprow')) { $tbl.oddstripe(); } pulsecolumn($tbl, idx, doRows); });});", }; // Automatically generated from file style.css diff --git a/engine/report/report_html_sim.cpp b/engine/report/report_html_sim.cpp index ace050125fa..fd0b58d94ab 100644 --- a/engine/report/report_html_sim.cpp +++ b/engine/report/report_html_sim.cpp @@ -1294,14 +1294,6 @@ void print_html_( report::sc_html_stream& os, sim_t& sim ) print_html_report_scripts( os ); os << "\n\n"; - os << "\n"; os << "