import 'package:invoiceninja_flutter/redux/dashboard/dashboard_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_vm.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class DashboardPanels extends StatelessWidget { final DashboardVM viewModel; const DashboardPanels({ Key key, @required this.viewModel, }) : super(key: key); void _showDateOptions(BuildContext context) { print('show date options'); } Widget _header(BuildContext context) { return Material( color: Theme.of(context).backgroundColor, child: Row( children: [ Expanded( child: InkWell( child: Padding( padding: const EdgeInsets.all(20.0), child: Row( children: [ Text('Aug 15 - Sep 15', style: Theme.of(context).textTheme.title), ], ), ), onTap: () {}, ), ), SizedBox(width: 18.0), IconButton( icon: Icon(Icons.navigate_before), onPressed: () { print('prev'); }), SizedBox(width: 8.0), IconButton( icon: Icon(Icons.navigate_next), onPressed: () { print('next'); }), SizedBox(width: 8.0), ], ), ); } Widget _invoiceChart(BuildContext context) { final localization = AppLocalization.of(context); final data = chartOutstandingInvoices(viewModel.state.invoiceState.map); final series = [ charts.Series( domainFn: (ChartMoneyData clickData, _) => clickData.date, measureFn: (ChartMoneyData clickData, _) => clickData.amount, colorFn: (ChartMoneyData clickData, _) => charts.MaterialPalette.blue.shadeDefault, id: 'invoices', displayName: localization.invoices, data: data, ), ]; return DashboardChart(series); } @override Widget build(BuildContext context) { return ListView( children: [ _header(context), _invoiceChart(context), ], ); } } class DashboardChart extends StatefulWidget { const DashboardChart(this.series); final List series; @override _DashboardChartState createState() => _DashboardChartState(); } class _DashboardChartState extends State { String _label; String _labelOrig; @override void initState() { super.initState(); } @override void didChangeDependencies() { super.didChangeDependencies(); final data = widget.series[0].data; double total = 0.0; data.forEach((dynamic item) { total += item.amount; }); _label = _labelOrig = formatNumber(total, context); } void _onSelectionChanged(charts.SelectionModel model) { final selectedDatum = model.selectedDatum; DateTime date; final measures = {}; if (selectedDatum.isNotEmpty) { date = selectedDatum.first.datum.date; selectedDatum.forEach((charts.SeriesDatum datumPair) { measures[datumPair.series.displayName] = datumPair.datum.amount; }); } setState(() { _label = date != null ? date.toString() : _labelOrig; }); } @override Widget build(BuildContext context) { final chart = charts.TimeSeriesChart( widget.series, animate: true, selectionModels: [ new charts.SelectionModelConfig( type: charts.SelectionModelType.info, listener: _onSelectionChanged, ) ], behaviors: [ charts.SeriesLegend( outsideJustification: charts.OutsideJustification.endDrawArea, ) ], ); return FormCard( children: [ Padding( padding: EdgeInsets.all(14.0), child: SizedBox( height: 200.0, child: Stack( children: [ chart, Text(_label), ], ), ), ) ], ); } }