Create attractive VASL scenarios, with loads of useful information embedded to assist with game play. https://vasl-templates.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
vasl-templates/vasl_templates/webapp/templates/vo-notes-report.html

220 lines
7.9 KiB

<!doctype html> <!-- NOTE: For testing porpoises only! -->
<html lang="en">
<script>
var nat = "{{NATIONALITY}}" ;
var vo_type = "{{VO_TYPE}}" ;
var gTemplatePack = {} ;
var gVehicleOrdnanceNotes = {} ;
</script>
<head>
<meta charset="utf-8">
<style>
.notes .key { font-weight: bold ; }
.ma-note { margin: 0.5em 0 ; padding: 0.25em 0.5em ; border: 1px dotted #444 ; }
.ma-note .key { font-weight: bold ; }
table { margin-top: 2em ; border-collapse: collapse ; }
th { text-align: left ; padding: 0.2em 0.5em ; background: #eee ; border: 1px solid #ccc ; }
td { padding: 0.2em 0.5em ; }
</style>
</head>
<body>
<div id="results" style="display:none;"></div>
</body>
<script src="{{url_for('static',filename='jquery/jquery-3.3.1.min.js')}}"></script>
<script src="{{url_for('static',filename='snippets.js')}}"></script>
<script>
$(document).ready( function () {
// initialize
var vo_entries ;
var on_load_counter = 3 ;
function on_data_loaded() {
if ( --on_load_counter == 0 ) {
// everything's loaded - generate the report
load_vo_notes( vo_entries ) ;
}
}
// get the template pack
$.getJSON( "{{url_for('get_template_pack')}}", function(data) {
gTemplatePack = data ;
on_data_loaded() ;
} ).fail( function( xhr, status, errorMsg ) {
alert( "Can't get the template pack:\n\n" + errorMsg ) ;
} ) ;
// get the vehicle/ordnance listings
var url ;
if ( vo_type === "vehicles" )
url = "{{url_for( 'get_vehicle_listings', report=1 )}}" ; // nb: includes landing craft
else
url = "{{url_for( 'get_ordnance_listings', report=1 )}}" ;
$.getJSON( url, function( data ) {
vo_entries = data[ nat.substring(nat.length-6) === "-minor" ? nat+"-common" : nat ] ;
on_data_loaded() ;
} ).fail( function( xhr, status, errorMsg ) {
alert( "Can't get the {{VO_TYPE0}} listings:\n\n" + errorMsg ) ;
} ) ;
// get the vehicle/ordnance notes
if ( vo_type === "vehicles" )
url = "{{url_for('get_vehicle_notes')}}" ; // nb: includes landing craft
else
url = "{{url_for('get_ordnance_notes')}}" ;
$.getJSON( url, function( data ) {
gVehicleOrdnanceNotes[ vo_type ] = data ;
on_data_loaded() ;
} ).fail( function( xhr, status, errorMsg ) {
alert( "Can't get the vehicle/ordnance notes:\n\n" + errorMsg ) ;
} ) ;
} ) ;
function load_vo_notes( vo_entries )
{
var $results = $("#results") ;
var vo_notes = gVehicleOrdnanceNotes[ vo_type ][ nat ] ;
if ( !vo_notes && !vo_entries ) {
$results.html( "No results." ).show() ;
return ;
}
// initialize
var vo_type2 = (vo_type === "vehicles" ? "vehicle" : vo_type ) ;
var header = nat[0].toUpperCase() + nat.substring(1) + " " + vo_type2[0].toUpperCase() + vo_type2.substring(1) + " Notes" ;
document.title = header ;
var buf = [] ;
buf.push( "<h2>", header, "</h2>" ) ;
// show the vehicle/ordnance notes
if ( ! vo_notes )
buf.push( "<p> None found." ) ;
else {
var keys = Object.keys( vo_notes ) ;
function parse_key( val ) {
var pos = val.indexOf( "." ) ;
if ( pos === -1 )
return [ parseInt(val), 0 ] ;
else
return [ parseInt(val.substring(0,pos)), parseInt(val.substring(pos+1)) ] ;
}
keys.sort( function( lhs, rhs ) {
if ( lhs === "multi-applicable" && rhs === "multi-applicable" )
return 0 ;
else if ( lhs === "multi-applicable" )
return +1 ;
else if ( rhs === "multi-applicable" )
return -1 ;
// check if we have keys from an extension module (these always sort larger)
var lhsPos = lhs.indexOf( ":" ) ;
var rhsPos = rhs.indexOf( ":" ) ;
if ( lhsPos === -1 && rhsPos !== -1 )
return -1 ;
else if ( lhsPos !== -1 && rhsPos === -1 )
return +1 ;
else if ( lhsPos !== -1 && rhsPos !== -1 ) {
// both keys are from an extensions module, compare the extension ID's
var lhsExtnId = lhs.substring( 0, lhsPos ) ;
var rhsExtnId = rhs.substring( 0, rhsPos ) ;
if ( lhsExtnId < rhsExtnId )
return -1 ;
else if ( lhsExtnId > rhsExtnId )
return +1 ;
// both keys are from the same extension module, remove the extension ID and sort normally
lhs = lhs.substring( lhsPos+1 ) ;
rhs = rhs.substring( rhsPos+1 ) ;
}
// compare the two keys
var lhs = parse_key( lhs ) ;
var rhs = parse_key( rhs ) ;
if ( lhs[0] < rhs[0] )
return -1 ;
else if ( lhs[0] > rhs[0] )
return +1 ;
if ( lhs[1] < rhs[1] )
return -1 ;
else if ( lhs[1] > rhs[1] )
return +1 ;
return 0 ;
} ) ;
buf.push( "<table id='vo-notes'>" ) ;
for ( var i=0 ; i < keys.length ; ++i ) {
if ( keys[i] === "multi-applicable" )
continue ;
var vo_note = vo_notes[ keys[i] ] ;
buf.push( "<tr>",
"<td class='key'>", keys[i]+":",
"<td>", vo_note.content !== undefined ? "(HTML content)" : vo_note.filename
) ;
}
buf.push( "</table>" ) ;
}
// show each multi-applicable note
buf.push( "<h4> Multi-Applicable Notes </h4>" ) ;
ma_notes = vo_notes ? vo_notes["multi-applicable"] : null ;
if ( ! ma_notes )
buf.push( "<p> None found." ) ;
else {
var keys = sort_ma_notes_keys( nat, Object.keys(ma_notes) ) ;
if ( keys ) {
for ( var i=0 ; i < keys.length ; ++i ) {
buf.push( "<div class='ma-note'>" ) ;
buf.push( "<div class='key'>", keys[i]+": ", "</div>" ) ;
buf.push( "<div class='content'>", ma_notes[keys[i]], "</div>" ) ;
buf.push( "</div>" ) ;
}
}
}
// show the multi-applicable notes for each vehicle/ordnance
buf.push( "<table id='vo-entries'>" ) ;
buf.push( "<tr>", "<th> Name", "<th> Raw note#", "<th> Extracted note#", "<th> Raw m/a keys", "<th> Extracted m/a keys", "<th> Unrecognized", "<th> Missing" ) ;
for ( var i=0 ; i < vo_entries.length ; ++i ) {
var vo_entry = vo_entries[i] ;
buf.push( "<tr>" ) ;
buf.push( "<td class='name'>", vo_entry.name ) ;
buf.push( "<td class='vo-note-raw'>", vo_entry.note_number) ;
var vo_note_key = get_vo_note_key( vo_entry ) ;
if ( vo_note_key ) {
if ( ! get_vo_note( vo_type, nat, vo_note_key ) )
vo_note_key += " (missing)" ;
}
buf.push( "<td class='vo-note'>", vo_note_key ) ;
buf.push( "<td class='ma-notes-raw'>", vo_entry.notes ) ;
var result = get_ma_notes_keys( nat, [vo_entry], vo_type ) ;
var keys = result[0] ;
if ( result[1] || result[2] || result[3] )
buf.push( "*** UNEXPECTED EXTRA NOTES ***" ) ;
buf.push( "<td class='ma-notes'>", keys ) ;
var unrecognized = [] ;
for ( var j=0 ; j < result[4].length ; ++j )
unrecognized.push( result[4][j][1] ) ;
buf.push( "<td class='unrecognized'>", unrecognized ) ;
buf.push( "<td class='missing'>", find_missing_ma_notes(keys) ) ;
}
buf.push( "</table>" ) ;
$results.html( buf.join("") ).show() ;
}
function find_missing_ma_notes( keys )
{
// find Multi-Applicable Notes that are referenced but not defined
if ( ! keys )
return null ;
var missing_keys = [] ;
for ( var i=0 ; i < keys.length ; ++i ) {
if ( ! get_ma_note( nat, vo_type, keys[i] ) )
missing_keys.push( keys[i] ) ;
}
return missing_keys ;
}
</script>
</html>