import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class ClientViewLedger extends StatefulWidget { const ClientViewLedger({Key key, this.viewModel}) : super(key: key); final ClientViewVM viewModel; @override _ClientViewLedgerState createState() => _ClientViewLedgerState(); } class _ClientViewLedgerState extends State { @override void didChangeDependencies() { if (widget.viewModel.client.isStale) { widget.viewModel.onRefreshed(context); } super.didChangeDependencies(); } @override Widget build(BuildContext context) { final client = widget.viewModel.client; final ledgers = client.ledger.where((ledger) => ledger.adjustment != 0).toList(); if (client.isStale) { return LoadingIndicator(); } return ListView.separated( shrinkWrap: true, padding: const EdgeInsets.symmetric(vertical: 16), itemCount: ledgers.length + 1, separatorBuilder: (context, index) => ListDivider(), itemBuilder: (BuildContext context, index) { final store = StoreProvider.of(context); final localization = AppLocalization.of(context); final state = store.state; if (index == ledgers.length) { return ListTile( leading: Icon(getEntityIcon(EntityType.client)), title: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible(child: Text(localization.clientCreated)), Padding( padding: const EdgeInsets.only(right: 2), child: Text( formatNumber( 0, context, clientId: client.id, ), textAlign: TextAlign.end, ), ), ]), subtitle: Text( formatDate( convertTimestampToDateString(client.createdAt), context, showTime: true, ), ), ); } final ledger = ledgers[index]; final entity = state.getEntityMap(ledger.entityType)[ledger.entityId]; if (entity == null) { print( 'Error: unable to find entity ${ledger.entityType}-${ledger.entityId}'); return SizedBox(); } return ListTile( onTap: () => viewEntity(context: context, entity: entity), onLongPress: () => showEntityActionsDialog(context: context, entities: [entity]), title: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible( child: Text( '${localization.lookup('${ledger.entityType}')} › ${entity.listDisplayName}', ), ), Padding( padding: const EdgeInsets.only(right: 2), child: Text( formatNumber( ledger.balance, context, clientId: client.id, ), textAlign: TextAlign.end, ), ), ], ), subtitle: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible( child: Text( formatDate( convertTimestampToDateString(ledger.createdAt), context, showTime: true, ), ), ), Padding( padding: const EdgeInsets.only(top: 4), child: DecoratedBox( decoration: BoxDecoration( color: ledger.adjustment <= 0 ? state.prefState.colorThemeModel.colorSuccess : state.prefState.colorThemeModel.colorDanger, borderRadius: BorderRadius.all(Radius.circular(5)), ), child: Padding( padding: const EdgeInsets.all(4), child: Text( (ledger.adjustment > 0 ? '+' : '') + formatNumber( ledger.adjustment, context, clientId: client.id, ), style: TextStyle(color: Colors.white), textAlign: TextAlign.end, ), ), ), ), ], ), leading: Icon(getEntityIcon(ledger.entityType)), ); }, ); } }