#1226-add-pdf-export-on-report

This commit is contained in:
Gilbert Paquin 2017-07-30 18:49:24 -04:00
parent 3fa08417e0
commit 04d9fe30eb
3 changed files with 418 additions and 274 deletions

View File

@ -14,6 +14,7 @@ class AbstractReport
public $totals = []; public $totals = [];
public $columns = []; public $columns = [];
public $data = []; public $data = [];
public $columns_labeled = [];
public function __construct($startDate, $endDate, $isExport, $options = false) public function __construct($startDate, $endDate, $isExport, $options = false)
{ {
@ -52,9 +53,7 @@ class AbstractReport
$this->totals[$currencyId][$dimension][$field] += $value; $this->totals[$currencyId][$dimension][$field] += $value;
} }
public function tableHeader() public function tableHeaderArray() {
{
$str = '';
foreach ($this->columns as $key => $val) { foreach ($this->columns as $key => $val) {
if (is_array($val)) { if (is_array($val)) {
@ -75,8 +74,18 @@ class AbstractReport
$class = count($class) ? implode(' ', $class) : 'group-false'; $class = count($class) ? implode(' ', $class) : 'group-false';
$label = trans("texts.{$field}"); $label = trans("texts.{$field}");
$str .= "<th class=\"{$class}\">{$label}</th>";
$this->columns_labeled[] = ['label' => $label, 'class' => $class, 'key' => $field];
} }
}
public function tableHeader()
{
$this->tableHeaderArray();
$str = '';
foreach ($this->columns_labeled as $field => $attr)
$str .= "<th class=\"{$attr['class']}\">{$attr['label']}</th>";
return $str; return $str;
} }

View File

@ -2389,6 +2389,7 @@ $LANG = array(
'currency_peruvian_sol' => 'Peruvian Sol', 'currency_peruvian_sol' => 'Peruvian Sol',
'use_english_version' => 'Make sure to use the English version of the files.<br/>We use the column headers to match the fields.', 'use_english_version' => 'Make sure to use the English version of the files.<br/>We use the column headers to match the fields.',
'download_pdf' => 'Download PDF'
); );

View File

@ -1,7 +1,7 @@
@extends('header') @extends('header')
@section('head') @section('head')
@parent @parent
<script src="{{ asset('js/daterangepicker.min.js') }}" type="text/javascript"></script> <script src="{{ asset('js/daterangepicker.min.js') }}" type="text/javascript"></script>
<link href="{{ asset('css/daterangepicker.css') }}" rel="stylesheet" type="text/css"/> <link href="{{ asset('css/daterangepicker.css') }}" rel="stylesheet" type="text/css"/>
@ -9,42 +9,47 @@
<link href="{{ asset('css/tablesorter.css') }}" rel="stylesheet" type="text/css"/> <link href="{{ asset('css/tablesorter.css') }}" rel="stylesheet" type="text/css"/>
<script src="{{ asset('js/tablesorter.min.js') }}" type="text/javascript"></script> <script src="{{ asset('js/tablesorter.min.js') }}" type="text/javascript"></script>
<style type="text/css"> <style type="text/css">
table.tablesorter th { table.tablesorter th {
color: white; color: white;
background-color: #777 !important; background-color: #777 !important;
} }
</style> </style>
@foreach ($account->getFontFolders() as $font)
<script src="{{ asset('js/vfs_fonts/'.$font.'.js') }}" type="text/javascript"></script>
@endforeach
<script src="{{ asset('pdf.built.js') }}?no_cache={{ NINJA_VERSION }}" type="text/javascript"></script>
@stop @stop
@section('content') @section('content')
@if (!Utils::isPro()) @if (!Utils::isPro())
<div class="alert alert-warning" style="font-size:larger;"> <div class="alert alert-warning" style="font-size:larger;">
<center> <center>
{!! trans('texts.pro_plan_reports', ['link'=>'<a href="javascript:showUpgradeModal()">' . trans('texts.pro_plan_remove_logo_link') . '</a>']) !!} {!! trans('texts.pro_plan_reports', ['link'=>'<a href="javascript:showUpgradeModal()">' . trans('texts.pro_plan_remove_logo_link') . '</a>']) !!}
</center> </center>
</div> </div>
@endif @endif
<script type="text/javascript"> <script type="text/javascript">
var chartStartDate = moment("{{ $startDate }}"); var chartStartDate = moment("{{ $startDate }}");
var chartEndDate = moment("{{ $endDate }}"); var chartEndDate = moment("{{ $endDate }}");
var dateRanges = {!! $account->present()->dateRangeOptions !!}; var dateRanges = {!! $account->present()->dateRangeOptions !!};
window.invoiceFonts = {!! json_encode(Cache::get('fonts')) !!};
$(function() { $(function () {
if (isStorageSupported()) { if (isStorageSupported()) {
var lastRange = localStorage.getItem('last:report_range'); var lastRange = localStorage.getItem('last:report_range');
lastRange = dateRanges[lastRange]; lastRange = dateRanges[lastRange];
if (lastRange) { if (lastRange) {
chartStartDate = lastRange[0]; chartStartDate = lastRange[0];
chartEndDate = lastRange[1]; chartEndDate = lastRange[1];
} }
} }
// Initialize date range selector // Initialize date range selector
function cb(start, end, label) { function cb(start, end, label) {
@ -52,20 +57,20 @@
$('#start_date').val(start.format('YYYY-MM-DD')); $('#start_date').val(start.format('YYYY-MM-DD'));
$('#end_date').val(end.format('YYYY-MM-DD')); $('#end_date').val(end.format('YYYY-MM-DD'));
if (isStorageSupported() && label && label != "{{ trans('texts.custom_range') }}") { if (isStorageSupported() && label && label != "{{ trans('texts.custom_range') }}") {
localStorage.setItem('last:report_range', label); localStorage.setItem('last:report_range', label);
} }
} }
$('#reportrange').daterangepicker({ $('#reportrange').daterangepicker({
locale: { locale: {
format: "{{ $account->getMomentDateFormat() }}", format: "{{ $account->getMomentDateFormat() }}",
customRangeLabel: "{{ trans('texts.custom_range') }}", customRangeLabel: "{{ trans('texts.custom_range') }}",
}, },
startDate: chartStartDate, startDate: chartStartDate,
endDate: chartEndDate, endDate: chartEndDate,
linkedCalendars: false, linkedCalendars: false,
ranges: dateRanges, ranges: dateRanges,
}, cb); }, cb);
cb(chartStartDate, chartEndDate); cb(chartStartDate, chartEndDate);
@ -78,135 +83,144 @@
{!! Former::open()->addClass('report-form')->rules(['start_date' => 'required', 'end_date' => 'required']) !!} {!! Former::open()->addClass('report-form')->rules(['start_date' => 'required', 'end_date' => 'required']) !!}
<div style="display:none"> <div style="display:none">
{!! Former::text('action') !!} {!! Former::text('action') !!}
</div> </div>
{!! Former::populateField('start_date', $startDate) !!} {!! Former::populateField('start_date', $startDate) !!}
{!! Former::populateField('end_date', $endDate) !!} {!! Former::populateField('end_date', $endDate) !!}
@if ( ! request()->report_type) @if ( ! request()->report_type)
{!! Former::populateField('group_when_sorted', 1) !!} {!! Former::populateField('group_when_sorted', 1) !!}
{!! Former::populateField('group_dates_by', 'monthyear') !!} {!! Former::populateField('group_dates_by', 'monthyear') !!}
@endif @endif
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">{!! trans('texts.report_settings') !!}</h3> <h3 class="panel-title">{!! trans('texts.report_settings') !!}</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
{!! Former::select('report_type')->options($reportTypes, $reportType)->label(trans('texts.type')) !!} {!! Former::select('report_type')->options($reportTypes, $reportType)->label(trans('texts.type')) !!}
<div class="form-group"> <div class="form-group">
<label for="reportrange" class="control-label col-lg-4 col-sm-4"> <label for="reportrange" class="control-label col-lg-4 col-sm-4">
{{ trans('texts.date_range') }} {{ trans('texts.date_range') }}
</label> </label>
<div class="col-lg-8 col-sm-8"> <div class="col-lg-8 col-sm-8">
<div id="reportrange" style="background: #f9f9f9; cursor: pointer; padding: 9px 14px; border: 1px solid #dfe0e1; margin-top: 0px;"> <div id="reportrange"
<i class="glyphicon glyphicon-calendar fa fa-calendar"></i>&nbsp; style="background: #f9f9f9; cursor: pointer; padding: 9px 14px; border: 1px solid #dfe0e1; margin-top: 0px;">
<span></span> <b class="caret"></b> <i class="glyphicon glyphicon-calendar fa fa-calendar"></i>&nbsp;
</div> <span></span> <b class="caret"></b>
</div>
<div style="display:none"> <div style="display:none">
{!! Former::text('start_date') !!} {!! Former::text('start_date') !!}
{!! Former::text('end_date') !!} {!! Former::text('end_date') !!}
</div>
</div> </div>
</div> </div>
<div id="statusField"
style="display:{{ in_array($reportType, [ENTITY_INVOICE, ENTITY_PRODUCT]) ? 'block' : 'none' }}">
{!! Former::select('invoice_status')->label('status')
->addOption(trans('texts.all'), 'all')
->addOption(trans('texts.draft'), 'draft')
->addOption(trans('texts.sent'), 'sent')
->addOption(trans('texts.unpaid'), 'unpaid')
->addOption(trans('texts.paid'), 'paid') !!}
</div>
<div id="dateField" style="display:{{ $reportType == ENTITY_TAX_RATE ? 'block' : 'none' }}">
{!! Former::select('date_field')->label(trans('texts.filter'))
->addOption(trans('texts.invoice_date'), FILTER_INVOICE_DATE)
->addOption(trans('texts.payment_date'), FILTER_PAYMENT_DATE) !!}
</div>
</div> </div>
<div class="col-md-6">
<div id="statusField" style="display:{{ in_array($reportType, [ENTITY_INVOICE, ENTITY_PRODUCT]) ? 'block' : 'none' }}"> {!! Former::checkbox('group_when_sorted')->text('enable') !!}
{!! Former::select('invoice_status')->label('status') {!! Former::select('group_dates_by')
->addOption(trans('texts.all'), 'all') ->addOption(trans('texts.day'), 'day')
->addOption(trans('texts.draft'), 'draft') ->addOption(trans('texts.month'), 'monthyear')
->addOption(trans('texts.sent'), 'sent') ->addOption(trans('texts.year'), 'year') !!}
->addOption(trans('texts.unpaid'), 'unpaid')
->addOption(trans('texts.paid'), 'paid') !!}
</div>
<div id="dateField" style="display:{{ $reportType == ENTITY_TAX_RATE ? 'block' : 'none' }}">
{!! Former::select('date_field')->label(trans('texts.filter'))
->addOption(trans('texts.invoice_date'), FILTER_INVOICE_DATE)
->addOption(trans('texts.payment_date'), FILTER_PAYMENT_DATE) !!}
</div> </div>
</div> </div>
<div class="col-md-6"> </div>
</div>
{!! Former::checkbox('group_when_sorted')->text('enable') !!} @if (!Auth::user()->hasFeature(FEATURE_REPORTS))
{!! Former::select('group_dates_by') <script>
->addOption(trans('texts.day'), 'day') $(function () {
->addOption(trans('texts.month'), 'monthyear') $('form.report-form').find('input, button').prop('disabled', true);
->addOption(trans('texts.year'), 'year') !!} });
</script>
</div> @endif
</div>
</div>
</div>
@if (!Auth::user()->hasFeature(FEATURE_REPORTS))
<script>
$(function() {
$('form.report-form').find('input, button').prop('disabled', true);
});
</script>
@endif
<center> <center>
{!! Button::primary(trans('texts.export')) @if(request()->report_type)
->withAttributes(array('onclick' => 'onExportClick()')) {!! Button::warning(trans('texts.download_pdf'))
->appendIcon(Icon::create('export')) ->withAttributes(array('onclick' => 'exportPDF()'))
->large() !!} ->appendIcon(Icon::create('save'))
{!! Button::success(trans('texts.run')) ->large() !!}
->withAttributes(array('id' => 'submitButton')) @endif
->submit() {!! Button::primary(trans('texts.export'))
->appendIcon(Icon::create('play')) ->withAttributes(array('onclick' => 'onExportClick()'))
->large() !!} ->appendIcon(Icon::create('export'))
</center><br/> ->large() !!}
{!! Button::success(trans('texts.run'))
->withAttributes(array('id' => 'submitButton'))
->submit()
->appendIcon(Icon::create('play'))
->large() !!}
</center>
<br/>
{!! Former::close() !!} {!! Former::close() !!}
@if (request()->report_type) @if (request()->report_type)
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
@if (count(array_values($reportTotals))) @if (count(array_values($reportTotals)))
<table class="tablesorter tablesorter-totals" style="display:none"> <table class="tablesorter tablesorter-totals" style="display:none">
<thead> <thead>
<tr> <tr>
<th>{{ trans("texts.totals") }}</th> <th>{{ trans("texts.totals") }}</th>
@foreach (array_values(array_values($reportTotals)[0])[0] as $key => $val) @foreach (array_values(array_values($reportTotals)[0])[0] as $key => $val)
<th>{{ trans("texts.{$key}") }}</th> <th>{{ trans("texts.{$key}") }}</th>
@endforeach @endforeach
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach ($reportTotals as $currencyId => $each) @foreach ($reportTotals as $currencyId => $each)
@foreach ($each as $dimension => $val) @foreach ($each as $dimension => $val)
<tr> <tr>
<td>{!! Utils::getFromCache($currencyId, 'currencies')->name !!} <td>{!! Utils::getFromCache($currencyId, 'currencies')->name !!}
@if ($dimension) @if ($dimension)
- {{ $dimension }} - {{ $dimension }}
@endif @endif
</td> </td>
@foreach ($val as $id => $field) @foreach ($val as $id => $field)
<td>{!! Utils::formatMoney($field, $currencyId) !!}</td> <td>{!! Utils::formatMoney($field, $currencyId) !!}</td>
@endforeach @endforeach
</tr> </tr>
@endforeach @endforeach
@endforeach @endforeach
</tbody> </tbody>
</table> </table>
<p>&nbsp;</p> <p>&nbsp;</p>
@endif @endif
<!-- <!--
<div class="columnSelectorWrapper"> <div class="columnSelectorWrapper">
<input id="colSelect1" type="checkbox" class="hidden"> <input id="colSelect1" type="checkbox" class="hidden">
<label class="columnSelectorButton" for="colSelect1">Column</label> <label class="columnSelectorButton" for="colSelect1">Column</label>
@ -216,153 +230,273 @@
</div> </div>
--> -->
<table class="tablesorter tablesorter-data" style="display:none"> <table class="tablesorter tablesorter-data" style="display:none">
<thead> <thead>
<tr> <tr>
{!! $report->tableHeader() !!} {!! $report->tableHeader() !!}
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@if (count($displayData)) @if (count($displayData))
@foreach ($displayData as $record) @foreach ($displayData as $record)
<tr> <tr>
@foreach ($record as $field) @foreach ($record as $field)
<td>{!! $field !!}</td> <td>{!! $field !!}</td>
@endforeach @endforeach
</tr> </tr>
@endforeach @endforeach
@else @else
<tr> <tr>
<td colspan="10" style="text-align: center">{{ trans('texts.empty_table') }}</td> <td colspan="10" style="text-align: center">{{ trans('texts.empty_table') }}</td>
</tr> </tr>
@endif @endif
</tbody> </tbody>
</table> </table>
<br/> <br/>
<div style="color:#888888"> <div style="color:#888888">
{{ trans('texts.reports_help') }} {{ trans('texts.reports_help') }}
</div> </div>
</div>
</div>
</div> </div>
</div>
</div> @endif
@endif <script type="text/javascript">
<script type="text/javascript"> function onExportClick() {
$('#action').val('export');
function onExportClick() { $('#submitButton').click();
$('#action').val('export'); $('#action').val('');
$('#submitButton').click();
$('#action').val('');
}
var sumColumns = [];
@foreach ($columns as $column)
sumColumns.push("{{ in_array($column, ['amount', 'paid', 'balance', 'cost', 'duration']) ? trans("texts.{$column}") : false }}");
@endforeach
$(function() {
$('.start_date .input-group-addon').click(function() {
toggleDatePicker('start_date');
});
$('.end_date .input-group-addon').click(function() {
toggleDatePicker('end_date');
});
$('#report_type').change(function() {
var val = $('#report_type').val();
if (val == '{{ ENTITY_TAX_RATE }}') {
$('#dateField').fadeIn();
} else {
$('#dateField').fadeOut();
} }
if (val == '{{ ENTITY_INVOICE }}' || val == '{{ ENTITY_PRODUCT }}') {
$('#statusField').fadeIn(); var sumColumns = [];
} else { @foreach ($columns as $column)
$('#statusField').fadeOut(); sumColumns.push("{{ in_array($column, ['amount', 'paid', 'balance', 'cost', 'duration']) ? trans("texts.{$column}") : false }}");
@endforeach
$(function () {
$('.start_date .input-group-addon').click(function () {
toggleDatePicker('start_date');
});
$('.end_date .input-group-addon').click(function () {
toggleDatePicker('end_date');
});
$('#report_type').change(function () {
var val = $('#report_type').val();
if (val == '{{ ENTITY_TAX_RATE }}') {
$('#dateField').fadeIn();
} else {
$('#dateField').fadeOut();
}
if (val == '{{ ENTITY_INVOICE }}' || val == '{{ ENTITY_PRODUCT }}') {
$('#statusField').fadeIn();
} else {
$('#statusField').fadeOut();
}
if (isStorageSupported()) {
localStorage.setItem('last:report_type', val);
}
});
// parse 1,000.00 or 1.000,00
function convertStringToNumber(str) {
str = str + '' || '';
if (str.indexOf(':') >= 0) {
return roundToTwo(moment.duration(str).asHours());
} else {
var number = Number(str.replace(/[^0-9]+/g, ''));
return number / 100;
}
}
$(function () {
$(".tablesorter-data").tablesorter({
@if (! request()->group_when_sorted)
sortList: [[0, 0]],
@endif
theme: 'bootstrap',
widgets: ['zebra', 'uitheme', 'filter'{!! request()->group_when_sorted ? ", 'group'" : "" !!}, 'columnSelector'],
headerTemplate: '{content} {icon}',
@if ($report)
dateFormat: '{{ $report->convertDateFormat() }}',
@endif
numberSorter: function (a, b, direction) {
var a = convertStringToNumber(a);
var b = convertStringToNumber(b);
return direction ? a - b : b - a;
},
widgetOptions: {
columnSelector_container: $('#columnSelector'),
filter_cssFilter: 'form-control',
group_collapsed: true,
group_saveGroups: false,
//group_formatter : function(txt, col, table, c, wo, data) {},
group_callback: function ($cell, $rows, column, table) {
for (var i = 0; i < sumColumns.length; i++) {
var label = sumColumns[i];
if (!label) {
continue;
}
var subtotal = 0;
$rows.each(function () {
var txt = $(this).find("td").eq(i).text();
subtotal += convertStringToNumber(txt);
});
$cell.find(".group-count").append(' - ' + label + ': ' + roundToTwo(subtotal));
}
},
}
}).show();
$(".tablesorter-totals").tablesorter({
theme: 'bootstrap',
widgets: ['zebra', 'uitheme'],
}).show();
var lastReportType = localStorage.getItem('last:report_type');
if (lastReportType) {
$('#report_type').val(lastReportType);
}
});
})
<?php
$summary = [];
$summary[] = array_merge([
trans("texts.totals")
], array_map(function ($key) {
return ['text' => trans("texts.{$key}"),
'style' => 'tableHeader'
];
}, array_keys(array_values(array_values($reportTotals)[0])[0])));
foreach ($reportTotals as $currencyId => $each) {
foreach ($each as $dimension => $val) {
$tmp = [];
$tmp[] = Utils::getFromCache($currencyId, 'currencies')->name . (($dimension) ? ' - ' . $dimension : '');
foreach ($val as $id => $field) $tmp[] = Utils::formatMoney($field, $currencyId);
$summary[] = $tmp;
}
}
?>
function addFont(font){
if(window.ninjaFontVfs[font.folder]){
folder = 'fonts/'+font.folder;
pdfMake.fonts[font.name] = {
normal: folder+'/'+font.normal,
italics: folder+'/'+font.italics,
bold: folder+'/'+font.bold,
bolditalics: folder+'/'+font.bolditalics
}
}
} }
if (isStorageSupported()) {
localStorage.setItem('last:report_type', val);
}
});
// parse 1,000.00 or 1.000,00 pdfMake.fonts = {}
function convertStringToNumber(str) { fonts = window.invoiceFonts || invoice.invoice_fonts;
str = str + '' || '';
if (str.indexOf(':') >= 0) {
return roundToTwo(moment.duration(str).asHours());
} else {
var number = Number(str.replace(/[^0-9]+/g, ''));
return number / 100;
}
}
$(function(){ // Add only the loaded fonts
$(".tablesorter-data").tablesorter({ $.each(fonts, function(i,font){
@if (! request()->group_when_sorted) addFont(font);
sortList: [[0,0]], });
@endif var dd = {!! html_entity_decode(json_encode( [
theme: 'bootstrap', 'pageOrientation' => 'landscape',
widgets: ['zebra', 'uitheme', 'filter'{!! request()->group_when_sorted ? ", 'group'" : "" !!}, 'columnSelector'], 'content' => [
headerTemplate : '{content} {icon}', [
@if ($report) 'text' => $reportTypes[$reportType],
dateFormat: '{{ $report->convertDateFormat() }}', 'style' => 'header'
@endif ],
numberSorter: function(a, b, direction) { [
var a = convertStringToNumber(a); 'style' => 'reportTable',
var b = convertStringToNumber(b); 'table' => [
return direction ? a - b : b - a; 'headerRows' => 1,
}, 'widths' => '*',
widgetOptions : { 'body' => $summary
columnSelector_container : $('#columnSelector'), ],
filter_cssFilter: 'form-control', 'layout' => 'lightHorizontalLines'
group_collapsed: true, ],
group_saveGroups: false, [
//group_formatter : function(txt, col, table, c, wo, data) {}, 'style' => 'reportTable',
group_callback: function ($cell, $rows, column, table) { 'table' => [
for (var i=0; i<sumColumns.length; i++) { 'headerRows' => 1,
var label = sumColumns[i]; 'widths' => '*',
if (!label) { 'body' =>
continue; array_merge(
} [array_map(function($array) {
var subtotal = 0; return [
$rows.each(function() { 'text' => $array['label'],
var txt = $(this).find("td").eq(i).text(); 'style' => 'tableHeader'
subtotal += convertStringToNumber(txt); ];
}); }, $report->columns_labeled)]
$cell.find(".group-count").append(' - ' + label + ': ' + roundToTwo(subtotal)); , array_map(function($row) {
} return array_map(function($col) {
}, if(strpos($col, "<a href") !== FALSE) {
} $hrefs = [];
}).show(); preg_match('#<a.*href=[\'"](.*)["\'].*>(.*)<.*#', $col, $hrefs);
return [
'text' => $hrefs[2],
'link' => $hrefs[1]
];
}
return $col;
}, $row);
}, $displayData))
$(".tablesorter-totals").tablesorter({ ],
theme: 'bootstrap', 'layout' => 'lightHorizontalLines'
widgets: ['zebra', 'uitheme'], ]
}).show(); ],
'styles' => [
var lastReportType = localStorage.getItem('last:report_type'); 'header' => [
if (lastReportType) { 'fontSize' => 18,
$('#report_type').val(lastReportType); 'bold' => true,
} 'margin' => [
}); 0,
}) 0,
0,
10
]
],
'reportTable' => [
'margin' => [
0,
5,
0,
50
]
],
'tableHeader' => [
'bold' => true,
'fontSize' => 13,
'color' => 'black'
]
],
'defaultStyle' => [
'font' => Cache::get('fonts')[0]['name']
]
] , JSON_PRETTY_PRINT)) !!}
function exportPDF() {
pdfMake.createPdf(dd).download($('#reportrange').data('daterangepicker').startDate.format('YYYY-MM-DD') + '-' + $('#reportrange').data('daterangepicker').endDate.format('YYYY-MM-DD')+'_'+'{{'-invoiceninja-'.$reportTypes[$reportType].'-report'}}');
}
</script>
@stop
</script> @section('onReady')
@stop $('#start_date, #end_date').datepicker({
autoclose: true,
todayHighlight: true,
@section('onReady') keyboardNavigation: false
});
$('#start_date, #end_date').datepicker({
autoclose: true,
todayHighlight: true,
keyboardNavigation: false
});
@stop @stop