From 8742f7fb0ffc6c77031912299b216af767b7880f Mon Sep 17 00:00:00 2001 From: Taka Date: Wed, 4 Nov 2020 05:59:53 +0000 Subject: [PATCH] Added a report showing the number of 2's and 12's rolled, and SA's. --- vasl_templates/webapp/static/css/lfa.css | 17 ++- .../webapp/static/images/sniper.png | Bin 0 -> 25292 bytes vasl_templates/webapp/static/lfa.js | 136 +++++++++++++++++- vasl_templates/webapp/templates/lfa.html | 4 +- .../analyze-vlog/hotness-report-1.vlog | Bin 0 -> 2923 bytes .../analyze-vlog/hotness-report-2.vlog | Bin 0 -> 2521 bytes vasl_templates/webapp/tests/test_lfa.py | 111 ++++++++++++-- 7 files changed, 251 insertions(+), 17 deletions(-) create mode 100644 vasl_templates/webapp/static/images/sniper.png create mode 100644 vasl_templates/webapp/tests/fixtures/analyze-vlog/hotness-report-1.vlog create mode 100644 vasl_templates/webapp/tests/fixtures/analyze-vlog/hotness-report-2.vlog diff --git a/vasl_templates/webapp/static/css/lfa.css b/vasl_templates/webapp/static/css/lfa.css index 2b5ef70..6b0705e 100644 --- a/vasl_templates/webapp/static/css/lfa.css +++ b/vasl_templates/webapp/static/css/lfa.css @@ -63,7 +63,22 @@ border: 1px solid #ffc030 ; border-radius: 5px ; background: #fffcfc ; padding: 2px 5px ; } -#lfa .hotness img.dice { position: absolute ; left: -10px ; top : -25px ; height: 50px ; } +#lfa .hotness img.dice { position: absolute ; left: -10px ; top : -25px ; height: 50px ; cursor: pointer ; } + +/* hotness popup */ +#lfa .hotness-popup { + position: absolute ; + border: 1px solid #888 ; border-radius: 5px ; + padding: 0.5em ; + background: #f8f8f8 ; + z-index: 100 ; +} +#lfa .hotness-popup th { padding: 0.2em 0.5em 0 0.5em ; background: #ddd ; border: 1px dotted #ccc ; font-weight: normal ; } +#lfa .hotness-popup td.player { white-space: nowrap ; } +#lfa .hotness-popup .val { border: none ; text-align: center ; color: #444 ; } +#lfa .hotness-popup td.icon { width: 50px ; } +#lfa .hotness-popup img.die { height: 1.5em ; margin: 2px 0.2em 0 0 ; } +#lfa .hotness-popup img.sniper { height: 1.75em ; margin-top: 3px ; } /* options panel */ #lfa .options { diff --git a/vasl_templates/webapp/static/images/sniper.png b/vasl_templates/webapp/static/images/sniper.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7be9551203a0ecb4313c8985ef816c24c90769 GIT binary patch literal 25292 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�{Z9BSz&H=|}A+^79X@=2vU-^N%t*rV| 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 literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/static/lfa.js b/vasl_templates/webapp/static/lfa.js index 7c0a21d..1a6a3a5 100644 --- a/vasl_templates/webapp/static/lfa.js +++ b/vasl_templates/webapp/static/lfa.js @@ -50,7 +50,7 @@ var gDistribDatasetPlayerIndex={}, gPieDatasetPlayerIndex={}, gTimePlotDatasetPl var gDistribCharts={}, gPieCharts={}, gTimePlotChart, gHotnessChart ; var $gDialog ; -var $gBanner, $gHotness, $gSelectFilePopup, $gOptions, $gRollTypeDropList, $gStackBarGraphsCheckBox ; +var $gBanner, $gHotness, $gHotnessPopup, $gSelectFilePopup, $gOptions, $gRollTypeDropList, $gStackBarGraphsCheckBox ; var $gPlayerColorsButton, $gPlayerColorsPopup ; var $gTimePlot, $gTimePlotChartWrapper ; var $gTimePlotOptions, $gMovingAverageDropList, $gTimePlotZoomInButton, $gTimePlotZoomOutButton ; @@ -77,11 +77,14 @@ SHORTCUT_HANDLERS = { 71: function () { // "G" $gMovingAverageDropList.selectmenu("instance").button.focus() ; }, - 88: function () { //"X" + 88: function () { // "X" var $elem = $gBanner.find( ".select-file" ) ; if ( $elem.css( "display" ) != "none" ) $gBanner.find( ".select-file" ).click() ; }, + 50: function() { // "2" + $( "#lfa .hotness img.dice" ).click() ; + }, } ; gPrevSelectMenuKeyDownHandler = $.ui.selectmenu.prototype._buttonEvents.keydown ; @@ -170,6 +173,8 @@ window.show_lfa_dialog = function( resp ) loadDialog() ; }, close: function() { + // NOTE: We explicitly close everything so that they aren't visible next time we open. + closeAllPopupsAndDropLists() ; // clean up handlers gEventHandlers.cleanUp() ; // clean up charts @@ -195,6 +200,7 @@ function loadDialog() // initialize $gBanner = $( "#lfa .banner" ) ; $gHotness = $( "#lfa .hotness" ).hide() ; + $gHotnessPopup = $( "#lfa .hotness-popup" ) ; $gSelectFilePopup = $( "#lfa .select-file-popup" ) ; $gOptions = $( "#lfa .options" ) ; $gRollTypeDropList = $( "#lfa select[name='roll-type']" ) ; @@ -217,6 +223,9 @@ function loadDialog() gLogFileAnalysis = new LogFileAnalysis( gRawResponseData, -1 ) ; var rollTypes = gLogFileAnalysis.getRollTypes() ; + // initialize the hotness popup + initHotnessPopup() ; + // initialize the player colors var prevColorsLen = gUserSettings.lfa[ "player-colors" ].length ; // nb: this includes the "expected results" color gLogFileAnalysis.forEachPlayer( function( playerId, playerNo ) { @@ -343,6 +352,127 @@ function loadDialog() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +function initHotnessPopup() +{ + function makeReport() { + + // initialize + var rolls={}, snipers={} ; + gLogFileAnalysis.forEachPlayer( function( playerId, playerNo ) { + rolls[ playerId ] = {} ; + for ( var rollType in ROLL_TYPES ) + rolls[ playerId ][ rollType ] = { 2: 0, 12: 0 } ; + snipers[ playerId ] = { 1: 0, 2: 0 } ; + } ) ; + + // count how many 2's and 12's were rolled, and Sniper Activations + gLogFileAnalysis.extractEvents( 1, { + onRollEvent: function( evt ) { + var rollTotal = LogFileAnalysis.rollTotal( evt.rollValue ) ; + if ( evt.rollType == "SA" && ( rollTotal == 1 || rollTotal == 2 ) ) + ++ snipers[ evt.playerId ][ rollTotal ] ; + else if ( ! LogFileAnalysis.isSingleDie( evt.rollValue ) && ( rollTotal == 2 || rollTotal == 12 ) ) + ++ rolls[ evt.playerId ][ evt.rollType ][ rollTotal ] ; + } + } ) ; + + // figure out which roll types had at least one 2 or 12 + var rollTypesToShow = {} ; + gLogFileAnalysis.forEachPlayer( function( playerId, playerNo ) { + for ( var rollType in ROLL_TYPES ) { + if ( rolls[playerId][rollType][2] > 0 || rolls[playerId][rollType][12] > 0 ) + rollTypesToShow[ rollType ] = true ; + } + } ) ; + + // add the 2's and 12's to the report + var buf = [] ; + function addRollReport( tableClass, die1, die2 ) { + // add the header + buf.push( "" ) ; + buf.push( "", "", "
", + "", + "" + ) ; + for ( var rollType in ROLL_TYPES ) { + if ( rollTypesToShow[ rollType ] ) + buf.push( "", rollType ) ; + } + gLogFileAnalysis.forEachPlayer( function( playerId, playerNo ) { + buf.push( "
", makePlayerNameHTML(playerId) ) ; + for ( var rollType in ROLL_TYPES ) { + if ( ! rollTypesToShow[ rollType ] ) + continue ; + var nRollTypes = rolls[ playerId ][ rollType ][ die1+die2 ] ; + buf.push( "", nRollTypes === 0 ? "-" : nRollTypes ) ; + } + } ) ; + buf.push( "
" ) ; + } + addRollReport( "2s", 1, 1 ) ; + addRollReport( "12s", 6, 6 ) ; + + // add a divider + buf.push( + "
 
", + "
 
" + ) ; + + // add the Sniper Activations to the report + buf.push( "" ) ; + buf.push( "", "", "
", + "", + "", "dr 1", "", "dr 2" + ) ; + gLogFileAnalysis.forEachPlayer( function( playerId, playerNo ) { + buf.push( "
", makePlayerNameHTML(playerId) ) ; + [ 1, 2 ].forEach( function( val ) { + var nActivations = snipers[ playerId ][ val ] ; + buf.push( "", nActivations === 0 ? "-" : nActivations ) ; + } ) ; + } ) ; + buf.push( "
" ) ; + + // generate the report + return buf.join( "" ) ; + } + + function makePlayerNameHTML( playerId ) { + return escapeHTML( gLogFileAnalysis.playerName( playerId ) ) ; + } + + // add a click handler for the hotness popup + var $elem = $( "#lfa .hotness img.dice" ) ; + gEventHandlers.addHandler( $elem, "click", function( evt ) { + closeAllPopupsAndDropLists() ; + // NOTE: We have to re-generate the report each time it's shown, since the user + // may have chosen a different set of log files. + $gHotnessPopup.html( makeReport() ).show() ; + var maxWidth = 0 ; + $gHotnessPopup.find( "table" ).each( function() { + maxWidth = Math.max( $(this).outerWidth() , maxWidth ) ; + } ) ; + $gHotnessPopup.css( { width: maxWidth } ) ; + $gHotnessPopup.position( { + my: "right top", at: "left-5 top+2", of: $elem, collision: "fit" + } ) ; + stopEvent( evt ) ; + } ) ; + + // handle clicks outside the popup (to dismiss it) + // NOTE: We do this by adding a click handler to the main dialog window, and a click handler + // to the popup that prevents the event from bubbling up i.e. if the main dialog window receives + // a click event, it must've been outside the popup window. + gEventHandlers.addHandler( $gHotnessPopup, "click", function() { + return false ; + } ) ; + gEventHandlers.addHandler( $("#lfa"), "click", function() { + $gHotnessPopup.hide() ; + } ) ; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + function initSelectFilePopup() { // initialize the file selection popup @@ -1362,6 +1492,7 @@ function customTimePlotTooltip( tooltipModel ) var newLeft = position.left + window.pageXOffset + tooltipModel.caretX + marginX ; if ( newLeft >= position.width - tooltipElem.offsetWidth - 20 ) newLeft = tooltipModel.caretX - tooltipElem.offsetWidth ; + tooltipElem.style["z-index"] = 150 ; // nb: put this on top of the hotness popup tooltipElem.style.left = newLeft + "px" ; tooltipElem.style.top = position.top + window.pageYOffset + tooltipModel.caretY - tooltipElem.offsetHeight - marginY + "px" ; tooltipElem.style.background = tooltipModel.backgroundColor ; @@ -1816,6 +1947,7 @@ function closeAllPopupsAndDropLists() $(this).spectrum( "hide") ; } ) ; $gSelectFilePopup.hide() ; + $gHotnessPopup.hide() ; // close all droplists $( "#lfa select" ).each( function() { diff --git a/vasl_templates/webapp/templates/lfa.html b/vasl_templates/webapp/templates/lfa.html index 4343465..3f7d159 100644 --- a/vasl_templates/webapp/templates/lfa.html +++ b/vasl_templates/webapp/templates/lfa.html @@ -23,7 +23,7 @@
@@ -65,6 +65,8 @@ + +
diff --git a/vasl_templates/webapp/tests/fixtures/analyze-vlog/hotness-report-1.vlog b/vasl_templates/webapp/tests/fixtures/analyze-vlog/hotness-report-1.vlog new file mode 100644 index 0000000000000000000000000000000000000000..acdf0f130eae71b4d41b1d42ab74f409a778af3b GIT binary patch literal 2923 zcmZ`*c{CJUAC|F)FliD)MwAd^i!8k%jIqopTecX(gvf{*S*k&4s4PXHLL=K)W-Qsm zkeCQ#O*PrcQWFLfKHl$~ufF%3_qpeud(ZjZ=bq>H{Qh|mZ~)hS4n96UjswA7NRB_i zzjF`v2t|9Dd0a;KJHsl+^Tb@?3pd@=ioeQi1^WtX&qwi#%Q|&CDqxzsiVBu-icW1; z;ugjBY>k(k-rjCxKlZnUz0A1H>Nx^J+n!vT?pv@AX!S`&e8e)iTb$%!jZi6?9ryGCvj6NXm_uQg`a|6k~;oN8=7G`;ZF{gyw^t$0UUGOs$ichtGD4!=5CVGud4OEFgGQb?g#ot){s z9|Vf(9=g^e^evn=C$$~N)sVm1R&|G{U&2{#OFkGDmtB9PnVxg$`rVBPX& zno>5_3D+`(X8Wt0+hw^V{tA6XpVM2`{x10a{<_kY6GNE0O*mk{nskxXxcIZM5fKc>?*=&6h~??a4>%bLAHcSSi3X&V z;PWN*a@jJ~C)yX{6EPrC;?%V6BL8wp-Ks!#9*bvrzPSa$!2P&sfSPCCA&OtTKL?yd zm&%TT!y(U}zd09YV9IYVXo#<8T%+JBZ(Wxyb->^^Yvz(8yyZDTjCM$t3AjsmW7zFu z7`{vqa&G2DeS{hR2A`q~bC?~Sb{nZyIWouBEjyKF_MEc^_rNgpEPt@s(ydnIVpNtE zbw2Gmwz=}AP+NgR?T{f~`3nSt%@88_h@^r|ACea`{6yi+X-SYZwV?y61XK;4AQ>^r z0$th1FqUZ=4m_518~GO=_eSS5iNWm|RLkx8a^G9Z_@wNqCh_$_u+8f5-M6d`L+3ix z)2!jQ&zC?c-1@3(bp%a(|BL{UI|aLk81bT9=0&-hCrEzHJYQ|m4-k9A3XqehHfF%Q z=A3j>)Kqa_fFPi*iZBHRlmsyBKy@jW;9p+`!v&|ZueE-tefm%_205iqzmd?RGLnnC zm?CrWJZ7J3yq=sC^7g{FqqflRkTO4e;31joqWVyfs;yw5vQT`$^xZ>5$V6OGiVw=? zcKl@4`V!U3A?qrbMDQ?CZ-V|s2YnJuWh{ zr=(^M8yl9j*W|tviHKHV_lO(yC)D}H*WT_9oqyH#O3&XlzJu9%)o)8R1s>C|ujI*MiVHR)l;tRH51m zrAUXJpbBVdq}gq?y~c>Fa~2k;nwV(Kw&Kd&8r0@|qoFb;egF+Nt5gwt3zuFGJ6LE{ zvnkez?8FuMwcUYs*!Y_ZF0eE09F7d52K=OQ(zK%96y-|vwW)*43P;BaA@;}7ajsfG z6v5*sH%fLhIKjh;5(yosl^V*OAM%!%bhUb{WvMELU%98R@oj3ZS{X`mqhj>@Z&X;E zaU@FHJ6v#KlkzSdPss&p-Kk!U30z1WL)SAY;Pe!N(|naDv6_+N7wPNPsk+*pZ#@-v z{83W{(?Q+3vj|pGCyF$;i%f<|yQA9eoJM3)=)T7F)L?kg%HDK2c}l@ltoYTQcUiIP z;dps4yf~-g&dk8sO8IBymNr;8_Q9iN=`MxuL@-)6Uco~L#-y$r(SRh^>NZI8?iMy)whLoewA0B z-c8glAXhWZ+q^X| zs&W|W4mnkEpF+@mi8}xAE$uqS9jFviO^r`NJ_w{_H?$)X4^2-zNFsiF;-U{!^3bKx zXz9g1^&hVeBP^%x$F#;`ksref2CSf28&_Dt5hq(*LSr?nW9e|^yaSU8yoTAeT92DA zzUeP``h*6WtUmh2X2n`73}dpLD#yJ> zna_w`=TBnXGTt3(9qU5hAZg2ek_b>X(G+w4+9u&NrGD5j%cfvVjgdZK!5L5F26DU&;a4;FtOz# z)bNzANu6x&>N*wssGp3e$v<8=mIFro>x%e+;`saKw ztSsXkHaq#Udg670bxdBP6OTK#D|{~`N)MGhn~~EYmjY^-z|>kYG`!}oHqLvI7QF&0 zd&#pVR(j=UeQj)21_@Mp*lQ7&{6?~zZnGmFΒC428pe#uNjN8{d1n32r;J~Q{2 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 U5mpEIzQ66;T@|~h?B8Vn0oWpXDgXcg literal 0 HcmV?d00001 diff --git a/vasl_templates/webapp/tests/test_lfa.py b/vasl_templates/webapp/tests/test_lfa.py index 4536445..c586648 100644 --- a/vasl_templates/webapp/tests/test_lfa.py +++ b/vasl_templates/webapp/tests/test_lfa.py @@ -232,16 +232,6 @@ def test_multiple_files( webapp, webdriver ): assert player_names.pop() == "expected results" assert player_names == expected - def select_file( fname ): - """Select one of the files being analyzed.""" - find_child( "#lfa .banner .select-file" ).click() - popup = wait_for_elem( 2, "#lfa .select-file-popup" ) - for row in find_children( ".row", popup ): - if find_child( "label", row ).text == fname: - find_child( "input[type='radio']", row ).click() - return - assert False, "Couldn't find file: "+fname - def do_test(): #pylint: disable=missing-docstring # NOTE: The "1a" and "1b" log files have the same players (Alice and Bob), but the "2" log file @@ -325,7 +315,7 @@ def test_multiple_files( webapp, webdriver ): check_color_pickers( [ "Alice", "Bob", "Chuck" ] ) # select a file and check the results - select_file( "multiple-1a.vlog" ) + _select_log_file( "multiple-1a.vlog" ) _select_roll_type( "" ) lfa = _get_chart_data( 1 ) assert lfa["timePlot"] == [ @@ -351,7 +341,7 @@ def test_multiple_files( webapp, webdriver ): check_color_pickers( [ "Alice", "Bob" ] ) # select another file and check the results - select_file( "multiple-2.vlog" ) + _select_log_file( "multiple-2.vlog" ) _select_roll_type( "" ) lfa = _get_chart_data( 1 ) assert lfa["timePlot"] == [ @@ -376,7 +366,7 @@ def test_multiple_files( webapp, webdriver ): check_color_pickers( [ "Bob", "Chuck" ] ) # select all files and check the results - select_file( "All files" ) + _select_log_file( "All files" ) _select_roll_type( "" ) check_all_files() check_color_pickers( [ "Alice", "Bob", "Chuck" ] ) @@ -389,6 +379,91 @@ def test_multiple_files( webapp, webdriver ): # --------------------------------------------------------------------- +@pytest.mark.skipif( not pytest.config.option.vasl_mods, reason="--vasl-mods not specified" ) #pylint: disable=no-member +@pytest.mark.skipif( not pytest.config.option.vassal, reason="--vassal not specified" ) #pylint: disable=no-member +def test_hotness_report( webapp, webdriver ): + """Test generating the hotness popup.""" + + # initialize + control_tests = init_webapp( webapp, webdriver, vlog_persistence=1 ) + + def unload_report(): + """Unload the hotness popup.""" + find_child( "#lfa .hotness img.dice" ).click() + wait_for_elem( 2, "#lfa .hotness-popup" ) + report = {} + for key in ( "2s", "12s", "snipers" ): + report[ key ] = unload_table( + "//div[@class='hotness-popup']//table[@class='{}']//tr".format( key ) + ) + return report + + def do_test(): #pylint: disable=missing-docstring + + # load the test log files + # vlog #1 vlog #2 + # =============== =============== + # Alice SA 1 Alice TH 2 + # Bob TC 2 Chuck Rally 2 + # Chuck SA 2 Alice SA 2 + # Bob Rally 12 Bob TH 2 + # Bob SA 1 Chuck MC 12 + # Chuck SA 1 Chuck CC 2 + # Bob TC 12 + # Chuck MC 2 + # Chuck SA 1 + _analyze_vlogs( [ "hotness-report-1.vlog", "hotness-report-2.vlog" ] ) + + # check the hotness popup + assert unload_report() == { + "2s": [ + [ "MC", "Rally", "TH", "CC", "TC" ], + [ "Alice", "-", "-", "1", "-", "-" ], + [ "Bob", "-", "-", "1", "-", "1" ], + [ "Chuck", "1", "1", "-", "1", "-" ], + ], + "12s": [ + [ "MC", "Rally", "TH", "CC", "TC" ], + [ "Alice", "-", "-", "-", "-", "-" ], + [ "Bob", "-", "1", "-", "-", "1" ], + [ "Chuck", "1", "-", "-", "-", "-" ], + ], + "snipers": [ + [ "dr 1", "dr 2" ], + [ "Alice", "1", "1" ], + [ "Bob", "1", "-" ], + [ "Chuck", "2", "1" ], + ], + } + + # select only one of the log files and check the hotness popup + _select_log_file( "hotness-report-2.vlog" ) + assert unload_report() == { + "2s": [ + [ "MC", "Rally", "TH", "CC" ], + [ "Alice", "-", "-", "1", "-" ], + [ "Bob", "-", "-", "1", "-" ], + [ "Chuck", "-", "1", "-", "1" ], + ], + "12s": [ + [ "MC", "Rally", "TH", "CC" ], + [ "Alice", "-", "-", "-", "-" ], + [ "Bob", "-", "-", "-", "-" ], + [ "Chuck", "1", "-", "-", "-" ], + ], + "snipers": [ + [ "dr 1", "dr 2" ], + [ "Alice", "-", "1" ], + [ "Bob", "-", "-" ], + [ "Chuck", "-", "-" ], + ], + } + + # run the tests + run_vassal_tests( control_tests, do_test, False ) + +# --------------------------------------------------------------------- + @pytest.mark.skipif( not pytest.config.option.vasl_mods, reason="--vasl-mods not specified" ) #pylint: disable=no-member @pytest.mark.skipif( not pytest.config.option.vassal, reason="--vassal not specified" ) #pylint: disable=no-member def test_3d6( webapp, webdriver ): @@ -621,6 +696,16 @@ def _check_time_plot_values( expected_window_sizes, window_size, expected ): vals = _unload_table( "time-plot" ) assert vals == expected +def _select_log_file( fname ): + """Select one of the log files being analyzed.""" + find_child( "#lfa .banner .select-file" ).click() + popup = wait_for_elem( 2, "#lfa .select-file-popup" ) + for row in find_children( ".row", popup ): + if find_child( "label", row ).text == fname: + find_child( "input[type='radio']", row ).click() + return + assert False, "Couldn't find file: "+fname + def _unload_table( sel ): """Unload chart data from an HTML table.""" return unload_table(