invoice/lib/ui/client/view/client_view_ledger.dart

163 lines
5.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<ClientViewLedger> {
@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<AppState>(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)),
);
},
);
}
}