/* global jQuery */
jQuery( document ).ready( function( $ ) {
/*
|--------------------------------------------------------------------------
| Variable Declaration
|--------------------------------------------------------------------------
*/
var $general_report = $( "#general-report" ),
$report_filters = $general_report.find( "#report-filters" ),
$report_filter_controls = $general_report.find( "#report-filter-controls" ),
$generate_report_btn = $general_report.find( "#generate-report-btn" ),
$report_main = $( "#report-main" ),
$responses_container = $( "#responses-container" ),
$participants_container = $( "#participants-container" );
/*
|--------------------------------------------------------------------------
| Render Survey Response Report
|--------------------------------------------------------------------------
*/
$generate_report_btn.on( 'validate_report_filter' , function( event , survey_id , $filter_field , error_filters ) {
if ( $filter_field.attr( 'id' ) == 'survey-filter' ) {
var survey_id = $.trim( $filter_field.find( "#as-survey" ).val() );
if ( survey_id == '' )
error_filters.push( "Please choose a survey to view stats" ); // TODO: Internationalize
$filter_field.find( "#as-survey" ).val( survey_id );
$filter_field.addClass( 'err' );
}
} );
$generate_report_btn.on( 'construct_report_filter' , function( event , survey_id , $filter_field , filters ) {
if ( $filter_field.attr( 'id' ) == 'date-range-filter' ) {
filters.push( {
'filter_type' : 'date_range',
'from_date' : $.trim( $filter_field.find( "#from-date" ).val() ),
'to_date' : $.trim( $filter_field.find( "#to-date" ).val() )
} );
}
} );
$responses_container.on( 'render_question_response_report_chart' , function( event , survey_id , response_data_report ) {
var question_type = response_data_report[ 'question-type' ];
if ( question_type == 'multiple-choice-single-answer' ) {
// TODO: Make it open for extensibility, ex. like if they want to change to display percentage instead of value
// TODO: or make the pie chart 3D, etc..
var page_number = response_data_report[ 'page-number' ],
order_number = response_data_report[ 'order-number' ],
question_text = response_data_report[ 'question-text' ],
chart_div = document.getElementById( 'chart_' + survey_id + '_' + page_number + '_' + order_number ),
choices_report = response_data_report[ 'multiple-choices' ],
choices_report_arr = [];
for ( var k in choices_report )
if ( choices_report.hasOwnProperty( k ) )
choices_report_arr.push( [ k , choices_report[ k ] ] );
// Create the data table.
var options = {
'title' : question_text,
'titleTextStyle' : { fontSize : 12 },
'width' : 400,
'height' : 300,
'pieSliceText' : 'value',
'sliceVisibilityThreshold' : 0
},
data = new google.visualization.DataTable();
data.addColumn( 'string' , 'Choice' );
data.addColumn( 'number' , 'Total Responses' );
data.addRows( choices_report_arr );
var chart = new google.visualization.PieChart( chart_div );
chart.draw( data , options );
}
} );
$participants_container.on( 'render_survey_responses_table_report' , function( event , survey_id , table_data ) {
var table_markup_heading = '' +
'' +
' ' +
'';
$participants_container.trigger( 'generate_survey_responses_table_report_heading' , [ survey_id , table_data , table_markup_heading ] );
var table_markup = '' + survey_response_general_report_params.i18n_order_no + ' ' +
'' + survey_response_general_report_params.i18n_date + ' ' +
'' + survey_response_general_report_params.i18n_user + ' ' +
'' + survey_response_general_report_params.i18n_response_details + ' ' +
'
| ' + table_data[ key ][ 'order_id' ] + ' | ' + '' + table_data[ key ][ 'response_date' ] + ' | ' + '' + user_data_markup + ' | ' + '' + survey_response_general_report_params.i18n_details + ' | ' + '
' + survey_response_general_report_params.i18n_generating_reports + '
' ); $participants_container.html( '' + survey_response_general_report_params.i18n_generating_reports + '
' ); $report_filter_controls .find( ".button" ).attr( 'disabled' , 'disabled' ).end() .find( ".spinner" ).css( 'visibility' , 'visible' ); // Validate report filters var error_filters = []; $report_filters.find( ".report-filter" ).each( function() { var $filter_field = $( this ); $filter_field.removeClass( "err" ); $generate_report_btn.trigger( "validate_report_filter" , [ survey_id , $filter_field , error_filters ] ); } ); if ( error_filters.length > 0 ) { var err_msg = "Report filter not filled up properly' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); $participants_container.html( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); $report_filter_controls .find( ".button" ).removeAttr( 'disabled' ).end() .find( ".spinner" ).css( 'visibility' , 'hidden' ); return false; } // Construct report filters var survey_id = parseInt( $.trim( $general_report.find( "#as-survey" ).val() ) , 10 ), filters = []; $report_filters.find( ".report-filter" ).each( function() { var $filter_field = $( this ); $generate_report_btn.trigger( "construct_report_filter" , [ survey_id , $filter_field , filters ] ); } ); $generate_report_btn.trigger( "generate_report" , [ survey_id , filters ] ); // get survey response report data as_survey_report_ajax_services.get_survey_responses_report( survey_id , filters ) .done( function( data , text_status , jqxhr ) { if ( data.status == 'success' ) { $generate_report_btn.trigger( 'success_retrieving_responses_report_data' , [ data , survey_id ] ); // Get survey response report data ( for table ) as_survey_report_ajax_services.get_survey_responses_list( survey_id , filters ) .done( function( data , text_status , jqxhr ) { if ( data.status == 'success' ) { $generate_report_btn.trigger( 'success_retrieving_participants_report_data' , [ data , survey_id ] ); $participants_container.trigger( "render_survey_responses_table_report" , [ survey_id , data.table_report_data ] ); } else { $generate_report_btn.trigger( 'fail_retrieving_participants_report_data' , [ data , survey_id ] ); vex.dialog.alert( data.error_message ); $participants_container.html( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); } } ) .fail( function( jqxhr , text_status , error_thrown ) { $generate_report_btn.trigger( 'error_retrieving_participants_report_data' , [ jqxhr , survey_id ] ); // TODO: Handle error console.log( jqxhr ); $participants_container.html( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); } ) .always( function() { $generate_report_btn.trigger( 'always_retrieving_participants_report_data' ); $report_filter_controls .find( ".button" ).removeAttr( 'disabled' ).end() .find( ".spinner" ).css( 'visibility' , 'hidden' ); } ); var response_data_report = data.response_data_report; $responses_container.empty(); // The purpose of this chunk of code is to add div placeholders for which the various charts are going to be rendered. // We "MUST" do it this way, otherwise there is a funny rendering bug on the charts. // Ex. when rendering a chart on a newly created dom element that isn't attached yet to the dom itself. for ( var key in response_data_report ) { if ( response_data_report.hasOwnProperty( key ) ) { var question_type = response_data_report[ key ][ 'question-type' ], page_number = response_data_report[ key ][ 'page-number' ], order_number = response_data_report[ key ][ 'order-number' ]; $responses_container.append( '' ); } } $report_main.prepend( '' + survey_response_general_report_params.i18n_total_responses + ' ' + data.total_responses + '
' ); $report_main.prepend( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); $participants_container.html( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); $report_filter_controls .find( ".button" ).removeAttr( 'disabled' ).end() .find( ".spinner" ).css( 'visibility' , 'hidden' ); } } ) .fail( function( jqxhr , text_status , error_thrown ) { $generate_report_btn.trigger( 'error_retrieving_responses_report_data' , [ jqxhr , survey_id ] ); // TODO: Handle error console.log( jqxhr ); $responses_container.html( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); $participants_container.html( '' + survey_response_general_report_params.i18n_view_survey_stats + '
' ); $report_filter_controls .find( ".button" ).removeAttr( 'disabled' ).end() .find( ".spinner" ).css( 'visibility' , 'hidden' ); } ) .always( function() { $generate_report_btn.trigger( 'always_retrieving_responses_report_data' ); } ); } /* |-------------------------------------------------------------------------- | Initialization |-------------------------------------------------------------------------- */ // Initialize google charts google.charts.load( 'current' , { packages : [ 'corechart' , 'table' ] } ); google.charts.setOnLoadCallback( initialize ); // Initialize report data tabs $report_main.find( "#report-data" ).tabs(); // Initialize report filters $general_report.find( "#as-survey" ).chosen( { allow_single_deselect : true } ); $report_filters.find( "#from-date" ).datepicker( { defaultDate: "+1w", showWeek: true, changeMonth: true, changeYear: true, onClose: function( selectedDate ) { $report_filters.find( "#to-date" ).datepicker( "option" , "minDate" , selectedDate ); } } ); $report_filters.find( "#to-date" ).datepicker( { defaultDate: "+1w", showWeek: true, changeMonth: true, changeYear: true, onClose: function( selectedDate ) { $report_filters.find( "#from-date" ).datepicker( "option" , "maxDate" , selectedDate ); } } ) ; // Initialize Vex Library vex.defaultOptions.className = 'vex-theme-plain'; } );