{"version":3,"sources":["llms-analytics.js"],"names":["$","window","llms","analytics","opts","this","charts_loaded","data","query","parseJSON","text","timeout","options","$widgets","init","google","charts","load","packages","setOnLoadCallback","charts_ready","bind","load_widgets","datepicker","dateFormat","maxDate","llmsStudentsSelect2","multiple","placeholder","LLMS","l10n","translate","allow_clear","on","e","preventDefault","slideToggle","val","attr","submit","draw_chart","is_loading_finished","el","document","getElementById","chart","visualization","ComboChart","get_chart_data","legend","chartArea","height","width","colors","lineWidth","seriesType","series","get_chart_series_options","vAxes","0","format","currency_format","1","length","arrayToDataTable","sort","column","draw","self","each","load_widget","$widget","status","method","$content","find","$retry","content_text","addClass","ajax","action","dates","courses","current_courses","memberships","current_memberships","students","current_students","url","ajaxurl","success","r","response","chart_data","results","remove","error","complete","statusText","append","removeClass","html","widget_finished","get_date_diff","end","Date","start","Math","abs","getTime","get_chart_data_object","res","i","d","date","diff","hasOwnProperty","init_date","getFullYear","getMonth","getDate","get_empty_data_object","type","key","obj","get_chart_headers","row","_date","item","indexOf","push","h","label","id","header","targetAxisIndex","string","parts","time","split","jQuery"],"mappings":"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","file":"../../js/llms-analytics.min.js","sourcesContent":[";/**\n * LifterLMS Admin Reporting Widgets & Charts\n *\n * @since 3.0.0\n * @since 3.17.2 Unknown.\n * @since 3.33.1 Fix issue that produced series options not aligned with the chart data.\n * @since 3.36.3 Added the `allow_clear` paramater when initializiing the `llmsStudentSelect2`.\n * @since 4.3.3 Legends will automatically display on top of the chart.\n * @since 4.5.1 Show sales reporting currency symbol based on LifterLMS site options.\n *\n */( function( $, undefined ) {\n\n\twindow.llms = window.llms || {};\n\n\t/**\n\t * LifterLMS Admin Analytics\n\t *\n\t * @since 3.0.0\n\t * @since 3.5.0 Unknown\n\t * @since 4.5.1 Added `opts` parameter.\n\t *\n\t * @param {Object} options Options object.\n\t * @return {Object} Class instance.\n\t */\n\tvar Analytics = function( opts ) {\n\n\t\tthis.charts_loaded = false;\n\t\tthis.data = {};\n\t\tthis.query = $.parseJSON( $( '#llms-analytics-json' ).text() );\n\t\tthis.timeout = 8000;\n\t\tthis.options = opts;\n\n\t\tthis.$widgets = $( '.llms-widget[data-method]' );\n\n\t\t/**\n\t\t * Initializer\n\t\t *\n\t\t * @return void\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.init = function() {\n\n\t\t\tgoogle.charts.load( 'current', {\n\t\t\t\tpackages: [\n\t\t\t\t\t'corechart'\n\t\t\t\t]\n\t\t\t} );\n\t\t\tgoogle.charts.setOnLoadCallback( this.charts_ready );\n\n\t\t\tthis.bind();\n\t\t\tthis.load_widgets();\n\n\t\t};\n\n\t\t/**\n\t\t * Bind DOM events\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since 3.36.3 Added the `allow_clear` paramater when initializiing the `llmsStudentSelect2`.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tthis.bind = function() {\n\n\t\t\t$( '.llms-datepicker' ).datepicker( {\n\t\t\t\tdateFormat: 'yy-mm-dd',\n\t\t\t\tmaxDate: 0,\n\t\t\t} );\n\n\t\t\t$( '#llms-students-ids-filter' ).llmsStudentsSelect2( {\n\t\t\t\tmultiple: true,\n\t\t\t\tplaceholder: LLMS.l10n.translate( 'Filter by Student(s)' ),\n\t\t\t\tallow_clear: true,\n\t\t\t} );\n\n\t\t\t$( 'a[href=\"#llms-toggle-filters\"]' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\t$( '.llms-analytics-filters' ).slideToggle( 100 );\n\t\t\t} );\n\n\t\t\t$( '#llms-custom-date-submit' ).on( 'click', function() {\n\t\t\t\t$( 'input[name=\"range\"]' ).val( 'custom' );\n\t\t\t} );\n\n\t\t\t$( '#llms-date-quick-filters a.llms-nav-link[data-range]' ).on( 'click', function( e ) {\n\n\t\t\t\te.preventDefault();\n\t\t\t\t$( 'input[name=\"range\"]' ).val( $( this ).attr( 'data-range' ) );\n\n\t\t\t\t$( 'form.llms-reporting-nav' ).submit();\n\n\t\t\t} );\n\n\t\t};\n\n\t\t/**\n\t\t * Called by Google Charts when the library is loaded and ready\n\t\t *\n\t\t * @return void\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.charts_ready = function() {\n\n\t\t\twindow.llms.analytics.charts_loaded = true;\n\t\t\twindow.llms.analytics.draw_chart();\n\n\t\t};\n\n\t\t/**\n\t\t * Render the chart\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since 3.17.6 Unknown\n\t\t * @since 4.3.3 Force the legend to appear on top of the chart.\n\t\t * @since 4.5.1 Display sales numbers according to the site's currency settings instead of the browser's locale.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tthis.draw_chart = function() {\n\n\t\t\tif ( ! this.charts_loaded || ! this.is_loading_finished() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar el = document.getElementById( 'llms-charts-wrapper' );\n\n\t\t\tif ( ! el ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar self = this,\n\t\t\t\tchart = new google.visualization.ComboChart( el ),\n\t\t\t\tdata = self.get_chart_data(),\n\t\t\t\toptions = {\n\t\t\t\t\tlegend: 'top',\n\t\t\t\t\tchartArea: {\n\t\t\t\t\t\theight: '75%',\n\t\t\t\t\t\twidth: '85%',\n\t\t\t\t\t},\n\t\t\t\t\tcolors: ['#606C38','#E85D75','#EF8354','#C64191','#731963'],\n\t\t\t\t\theight: 560,\n\t\t\t\t\tlineWidth: 4,\n\t\t\t\t\tseriesType: 'bars',\n\t\t\t\t\tseries: self.get_chart_series_options(),\n\t\t\t\t\tvAxes: {\n\t\t\t\t\t\t0: {\n\t\t\t\t\t\t\tformat: this.options.currency_format || 'currency',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t1: {\n\t\t\t\t\t\t\tformat: '',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t};\n\n\t\t\tif ( data.length ) {\n\n\t\t\t\tdata = google.visualization.arrayToDataTable( data );\n\t\t\t\tdata.sort( [{column: 0}] );\n\t\t\t\tchart.draw( data, options );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Check if a widget is still loading\n\t\t *\n\t\t * @return bool\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.is_loading_finished = function() {\n\t\t\tif ( $( '.llms-widget.is-loading' ).length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\t/**\n\t\t * Start loading all widgets on the current screen\n\t\t *\n\t\t * @return void\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.load_widgets = function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.$widgets.each( function() {\n\n\t\t\t\tself.load_widget( $( this ) );\n\n\t\t\t} );\n\n\t\t};\n\n\t\t/**\n\t\t * Load a specific widget\n\t\t *\n\t\t * @param obj $widget jQuery selector of the widget element\n\t\t * @return void\n\t\t * @since 3.0.0\n\t\t * @version 3.16.8\n\t\t */\n\t\tthis.load_widget = function( $widget ) {\n\n\t\t\tvar self = this,\n\t\t\t\tmethod = $widget.attr( 'data-method' ),\n\t\t\t\t$content = $widget.find( 'h1' ),\n\t\t\t\t$retry = $widget.find( '.llms-reload-widget' ),\n\t\t\t\tcontent_text = LLMS.l10n.translate( 'Error' ),\n\t\t\t\tstatus;\n\n\t\t\t$widget.addClass( 'is-loading' );\n\n\t\t\t$.ajax( {\n\n\t\t\t\tdata: {\n\t\t\t\t\taction: 'llms_widget_' + method,\n\t\t\t\t\tdates: self.query.dates,\n\t\t\t\t\tcourses: self.query.current_courses,\n\t\t\t\t\tmemberships: self.query.current_memberships,\n\t\t\t\t\tstudents: self.query.current_students,\n\t\t\t\t},\n\t\t\t\tmethod: 'POST',\n\t\t\t\ttimeout: self.timeout,\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tsuccess: function( r ) {\n\n\t\t\t\t\tstatus = 'success';\n\n\t\t\t\t\tif ( 'undefined' !== typeof r.response ) {\n\n\t\t\t\t\t\tcontent_text = r.response;\n\n\t\t\t\t\t\tself.data[method] = {\n\t\t\t\t\t\t\tchart_data: r.chart_data,\n\t\t\t\t\t\t\tresponse: r.response,\n\t\t\t\t\t\t\tresults: r.results,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t$retry.remove();\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\terror: function( r ) {\n\n\t\t\t\t\tstatus = 'error';\n\n\t\t\t\t},\n\t\t\t\tcomplete: function( r ) {\n\n\t\t\t\t\tif ( 'error' === status ) {\n\n\t\t\t\t\t\tif ( 'timeout' === r.statusText ) {\n\n\t\t\t\t\t\t\tcontent_text = LLMS.l10n.translate( 'Request timed out' );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcontent_text = LLMS.l10n.translate( 'Error' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! $retry.length ) {\n\n\t\t\t\t\t\t\t$retry = $( '' + LLMS.l10n.translate( 'Retry' ) + '' );\n\t\t\t\t\t\t\t$retry.on( 'click', function( e ) {\n\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tself.load_widget( $widget );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t$widget.append( $retry );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t$widget.removeClass( 'is-loading' );\n\t\t\t\t\t$content.html( content_text );\n\n\t\t\t\t\tself.widget_finished( $widget );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t/**\n\t\t * Get the time in seconds between the queried dates\n\t\t *\n\t\t * @return int\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.get_date_diff = function() {\n\n\t\t\tvar end = new Date( this.query.dates.end ),\n\t\t\t\tstart = new Date( this.query.dates.start );\n\n\t\t\treturn Math.abs( end.getTime() - start.getTime() );\n\n\t\t};\n\n\t\t/**\n\t\t * Builds an object of data that can be used to, ultimately, draw the screen's chart\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.0.0\n\t\t * @version 3.1.6\n\t\t */\n\t\tthis.get_chart_data_object = function() {\n\n\t\t\tvar self = this,\n\t\t\t\tmax_for_days = ( ( 1000 * 3600 * 24 ) * 30 ) * 4, // 4 months in seconds\n\t\t\t\tdiff = this.get_date_diff(),\n\t\t\t\tdata = {},\n\t\t\t\tres, i, d, date;\n\n\t\t\tfor ( var method in self.data ) {\n\n\t\t\t\tif ( ! self.data.hasOwnProperty( method ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( 'object' !== typeof self.data[ method ].chart_data || 'object' !== typeof self.data[ method ].results ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tres = self.data[ method ].results;\n\n\t\t\t\tif ( res ) {\n\n\t\t\t\t\tfor ( i = 0; i < res.length; i++ ) {\n\n\t\t\t\t\t\td = this.init_date( res[i].date );\n\n\t\t\t\t\t\t// group by days\n\t\t\t\t\t\tif ( diff <= max_for_days ) {\n\t\t\t\t\t\t\tdate = new Date( d.getFullYear(), d.getMonth(), d.getDate() );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// group by months\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdate = new Date( d.getFullYear(), d.getMonth(), 1 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! data[ date ] ) {\n\t\t\t\t\t\t\tdata[ date ] = this.get_empty_data_object( date )\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch ( self.data[ method ].chart_data.type ) {\n\n\t\t\t\t\t\t\tcase 'amount':\n\t\t\t\t\t\t\t\tdata[ date ][ method ] = data[ date ][ method ] + ( res[i][ self.data[ method ].chart_data.key ] * 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'count':\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tdata[ date ][ method ]++;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t};\n\n\t\t/**\n\t\t * Get the data google charts needs to initiate the current chart\n\t\t *\n\t\t * @return obj\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.get_chart_data = function() {\n\n\t\t\tvar self = this,\n\t\t\t\tobj = self.get_chart_data_object(),\n\t\t\t\tdata = self.get_chart_headers();\n\n\t\t\tfor ( var date in obj ) {\n\n\t\t\t\tif ( ! obj.hasOwnProperty( date ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar row = [ obj[ date ]._date ];\n\n\t\t\t\tfor ( var item in obj[ date ] ) {\n\t\t\t\t\tif ( ! obj[ date ].hasOwnProperty( item ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// skip meta items\n\t\t\t\t\tif ( 0 === item.indexOf( '_' ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\trow.push( obj[ date ][ item ] );\n\t\t\t\t}\n\n\t\t\t\tdata.push( row );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t};\n\n\t\t/**\n\t\t * Get a stub of the data object used by this.get_data_object\n\t\t *\n\t\t * @param string date date to instantiate the object with\n\t\t * @return obj\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.get_empty_data_object = function( date ) {\n\n\t\t\tvar self = this,\n\t\t\t\tobj = {\n\t\t\t\t\t_date: date,\n\t\t\t};\n\n\t\t\tfor ( var method in self.data ) {\n\t\t\t\tif ( ! self.data.hasOwnProperty( method ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( self.data[ method ].chart_data ) {\n\t\t\t\t\tobj[ method ] = 0;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn obj;\n\n\t\t};\n\n\t\t/**\n\t\t * Builds an array of chart header data\n\t\t *\n\t\t * @return array\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.get_chart_headers = function() {\n\n\t\t\tvar self = this,\n\t\t\t\th = [];\n\n\t\t\t// date headers go first\n\t\t\th.push( {\n\t\t\t\tlabel: LLMS.l10n.translate( 'Date' ),\n\t\t\t\tid: 'date',\n\t\t\t\ttype: 'date',\n\t\t\t} );\n\n\t\t\tfor ( var method in self.data ) {\n\t\t\t\tif ( ! self.data.hasOwnProperty( method ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( self.data[ method ].chart_data ) {\n\t\t\t\t\th.push( self.data[ method ].chart_data.header );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn [ h ];\n\n\t\t};\n\n\t\t/**\n\t\t * Get a object of series options needed to draw the chart.\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since Fix issue that produced series options not aligned with the chart data.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tthis.get_chart_series_options = function() {\n\n\t\t\tvar self = this,\n\t\t\t\toptions = {}\n\t\t\t\ti = 0;\n\n\t\t\tfor ( var method in self.data ) {\n\t\t\t\tif ( ! self.data.hasOwnProperty( method ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( self.data[ method ].chart_data ) {\n\n\t\t\t\t\tvar type = self.data[ method ].chart_data.type;\n\n\t\t\t\t\toptions[ i ] = {\n\t\t\t\t\t\ttype: ( 'count' === type ) ? 'bars' : 'line',\n\t\t\t\t\t\ttargetAxisIndex: ( 'count' === type ) ? 1 : 0,\n\t\t\t\t\t};\n\n\t\t\t\t\ti++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn options;\n\n\t\t};\n\n\t\t/**\n\t\t * Instantiate a Date instance via a date string\n\t\t *\n\t\t * @param string string date string, expected format should be from php date( 'Y-m-d H:i:s' )\n\t\t * @return obj\n\t\t * @since 3.1.4\n\t\t * @version 3.1.5\n\t\t */\n\t\tthis.init_date = function( string ) {\n\n\t\t\tvar parts, date, time;\n\n\t\t\tparts = string.split( ' ' );\n\n\t\t\tdate = parts[0].split( '-' );\n\t\t\ttime = parts[1].split( ':' );\n\n\t\t\treturn new Date( date[0], date[1] - 1, date[2], time[0], time[1], time[2] );\n\n\t\t};\n\n\t\t/**\n\t\t * Called when a widget is finished loading\n\t\t * Updates the current chart with the new data from the widget\n\t\t *\n\t\t * @param obj $widget jQuery selector of the widget element\n\t\t * @return void\n\t\t * @since 3.0.0\n\t\t * @version 3.0.0\n\t\t */\n\t\tthis.widget_finished = function( $widget ) {\n\n\t\t\tif ( this.is_loading_finished() ) {\n\t\t\t\tthis.draw_chart();\n\t\t\t}\n\n\t\t};\n\n\t\t// go\n\t\tthis.init();\n\n\t\t// return\n\t\treturn this;\n\n\t};\n\n\twindow.llms.analytics = new Analytics( window.llms.analytics || {} );\n\n} )( jQuery );\n"],"sourceRoot":"../../js"}