Client activity

This commit is contained in:
unknown 2018-08-03 11:28:31 +03:00
parent 968b560533
commit a5208884cb
6 changed files with 109 additions and 99 deletions

View File

@ -0,0 +1,83 @@
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class ActivityListTile extends StatelessWidget {
const ActivityListTile({
Key key,
@required this.activity,
}) : super(key: key);
final ActivityEntity activity;
IconData getIconData(EntityType entityType) {
switch (entityType) {
case EntityType.client:
return FontAwesomeIcons.users;
case EntityType.invoice:
return FontAwesomeIcons.filePdfO;
case EntityType.payment:
return FontAwesomeIcons.creditCard;
case EntityType.credit:
return FontAwesomeIcons.creditCard;
case EntityType.quote:
return FontAwesomeIcons.fileAltO;
case EntityType.vendor:
return FontAwesomeIcons.building;
case EntityType.expense:
return FontAwesomeIcons.fileImageO;
case EntityType.task:
return FontAwesomeIcons.clockO;
default:
return null;
}
}
@override
Widget build(BuildContext context) {
final localization = AppLocalization.of(context);
final store = StoreProvider.of<AppState>(context);
final state = store.state;
String title = localization.lookup('activity_${activity.activityTypeId}');
title = activity.getDescription(
title,
user: state.selectedCompany.userMap[activity.userId],
client: state.clientState.map[activity.clientId],
invoice: state.invoiceState.map[activity.invoiceId],
);
return ListTile(
leading: Icon(getIconData(activity.entityType)),
title: Text(title),
onTap: () {
switch (activity.entityType) {
case EntityType.client:
store.dispatch(
ViewClient(clientId: activity.clientId, context: context));
break;
case EntityType.invoice:
store.dispatch(
ViewInvoice(invoiceId: activity.invoiceId, context: context));
break;
}
},
trailing: Icon(Icons.navigate_next),
subtitle: Row(
children: <Widget>[
Text(formatDate(
convertTimestampToSqlDate(activity.updatedAt), context,
showTime: true)),
SizedBox(width: 10.0),
(activity.isSystem ?? false) ? Icon(FontAwesomeIcons.server) : Container(),
],
),
);
}
}

View File

@ -53,7 +53,9 @@ class _ClientViewState extends State<ClientView>
return true;
},
child: Scaffold(
backgroundColor: Theme.of(context).backgroundColor,
backgroundColor: Theme
.of(context)
.backgroundColor,
appBar: _CustomAppBar(
viewModel: viewModel,
controller: _controller,
@ -63,7 +65,9 @@ class _ClientViewState extends State<ClientView>
controller: _controller,
),
floatingActionButton: FloatingActionButton(
backgroundColor: Theme.of(context).primaryColorDark,
backgroundColor: Theme
.of(context)
.primaryColorDark,
onPressed: () {
showDialog<SimpleDialog>(
context: context,
@ -148,7 +152,9 @@ class _CustomTabBarViewState extends State<CustomTabBarView> {
void _onTabChange() {
final viewModel = widget.viewModel;
if (widget.controller.index == 2 && viewModel.client.activities.isEmpty) {
if (widget.controller.index == 2 && viewModel.client.activities.isEmpty &&
!viewModel.isLoading) {
viewModel.onRefreshed(context);
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/data/models/client_model.dart';
import 'package:invoiceninja_flutter/ui/app/lists/activity_list_tile.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
class ClientViewActivity extends StatelessWidget {
@ -20,8 +21,7 @@ class ClientViewActivity extends StatelessWidget {
itemCount: activities.length,
itemBuilder: (BuildContext context, index) {
final activity = activities[index];
return Text(activity.key);
//return ActivityListTile(activity: activity);
return ActivityListTile(activity: activity);
},
);

View File

@ -42,6 +42,7 @@ class ClientViewVM {
final Function(BuildContext) onInvoicesPressed;
final Function(BuildContext) onRefreshed;
final bool isSaving;
final bool isLoading;
final bool isDirty;
ClientViewVM({
@ -52,6 +53,7 @@ class ClientViewVM {
@required this.onInvoicesPressed,
@required this.onBackPressed,
@required this.isSaving,
@required this.isLoading,
@required this.isDirty,
@required this.onRefreshed,
});
@ -73,6 +75,7 @@ class ClientViewVM {
return ClientViewVM(
isSaving: state.isSaving,
isLoading: state.isLoading,
isDirty: client.isNew,
client: client,
company: state.selectedCompany,

View File

@ -1,15 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/ui/app/lists/activity_list_tile.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/dashboard/dashboard_vm.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class DashboardActivity extends StatelessWidget {
const DashboardActivity({
@ -37,76 +29,3 @@ class DashboardActivity extends StatelessWidget {
}
}
class ActivityListTile extends StatelessWidget {
const ActivityListTile({
Key key,
@required this.activity,
}) : super(key: key);
final ActivityEntity activity;
IconData getIconData(EntityType entityType) {
switch (entityType) {
case EntityType.client:
return FontAwesomeIcons.users;
case EntityType.invoice:
return FontAwesomeIcons.filePdfO;
case EntityType.payment:
return FontAwesomeIcons.creditCard;
case EntityType.credit:
return FontAwesomeIcons.creditCard;
case EntityType.quote:
return FontAwesomeIcons.fileAltO;
case EntityType.vendor:
return FontAwesomeIcons.building;
case EntityType.expense:
return FontAwesomeIcons.fileImageO;
case EntityType.task:
return FontAwesomeIcons.clockO;
default:
return null;
}
}
@override
Widget build(BuildContext context) {
final localization = AppLocalization.of(context);
final store = StoreProvider.of<AppState>(context);
final state = store.state;
String title = localization.lookup('activity_${activity.activityTypeId}');
title = activity.getDescription(
title,
user: state.selectedCompany.userMap[activity.userId],
client: state.clientState.map[activity.clientId],
invoice: state.invoiceState.map[activity.invoiceId],
);
return ListTile(
leading: Icon(getIconData(activity.entityType)),
title: Text(title),
onTap: () {
switch (activity.entityType) {
case EntityType.client:
store.dispatch(
ViewClient(clientId: activity.clientId, context: context));
break;
case EntityType.invoice:
store.dispatch(
ViewInvoice(invoiceId: activity.invoiceId, context: context));
break;
}
},
trailing: Icon(Icons.navigate_next),
subtitle: Row(
children: <Widget>[
Text(formatDate(
convertTimestampToSqlDate(activity.updatedAt), context,
showTime: true)),
SizedBox(width: 10.0),
(activity.isSystem ?? false) ? Icon(FontAwesomeIcons.server) : Container(),
],
),
);
}
}

View File

@ -191,7 +191,6 @@ String formatDate(String value, BuildContext context, {bool showTime = false}) {
? company.datetimeFormatId
: kDefaultDateTimeFormat;
final formatter = DateFormat(dateTimeFormats[dateTimeFormatId].format);
print(DateTime.tryParse(value).timeZoneName);
return formatter.format(DateTime.tryParse(value).toLocal());
} else {
final dateFormats = state.staticState.dateFormatMap;