This commit is contained in:
unknown 2018-06-10 05:54:18 -07:00
parent 4f19fe77bc
commit 61d6f64d20
9 changed files with 179 additions and 15 deletions

View File

@ -13,7 +13,7 @@ import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/ui/client/client_list.dart'; import 'package:invoiceninja/ui/client/client_list.dart';
import 'package:invoiceninja/redux/app/app_state.dart'; import 'package:invoiceninja/redux/app/app_state.dart';
import 'package:invoiceninja/redux/client/client_actions.dart'; import 'package:invoiceninja/redux/client/client_actions.dart';
import 'package:invoiceninja/ui/client/client_view_vm.dart'; import 'package:invoiceninja/ui/client/view/client_view_vm.dart';
class ClientListBuilder extends StatelessWidget { class ClientListBuilder extends StatelessWidget {
ClientListBuilder({Key key}) : super(key: key); ClientListBuilder({Key key}) : super(key: key);

View File

@ -1,11 +1,12 @@
import 'package:invoiceninja/ui/app/app_search.dart'; import 'package:invoiceninja/ui/app/app_search.dart';
import 'package:invoiceninja/ui/app/app_search_button.dart'; import 'package:invoiceninja/ui/app/app_search_button.dart';
import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/redux/app/app_state.dart'; import 'package:invoiceninja/redux/app/app_state.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/ui/client/client_list_vm.dart'; import 'package:invoiceninja/ui/client/client_list_vm.dart';
import 'package:invoiceninja/ui/client/client_view_vm.dart'; import 'package:invoiceninja/ui/client/view/client_view_vm.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja/redux/client/client_actions.dart'; import 'package:invoiceninja/redux/client/client_actions.dart';
import 'package:invoiceninja/ui/app/app_drawer_vm.dart'; import 'package:invoiceninja/ui/app/app_drawer_vm.dart';
@ -56,7 +57,7 @@ class ClientScreen extends StatelessWidget {
store.dispatch(SelectClientAction(ClientEntity())); store.dispatch(SelectClientAction(ClientEntity()));
Navigator Navigator
.of(context) .of(context)
.push(MaterialPageRoute(builder: (_) => ClientViewBuilder())); .push(MaterialPageRoute(builder: (_) => ClientEditBuilder()));
}, },
child: Icon(Icons.add), child: Icon(Icons.add),
tooltip: localization.newClient, tooltip: localization.newClient,

View File

@ -0,0 +1,35 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/utils/formatting.dart';
import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/utils/platforms.dart';
import 'package:url_launcher/url_launcher.dart';
class ClientEditDetails extends StatefulWidget {
ClientEditDetails({this.client});
final ClientEntity client;
@override
_ClientEditDetailsState createState() => new _ClientEditDetailsState();
}
class _ClientEditDetailsState extends State<ClientEditDetails> {
@override
Widget build(BuildContext context) {
var localization = AppLocalization.of(context);
var client = widget.client;
return Padding(
padding: EdgeInsets.all(12.0),
child: ListView(
),
);
}
}

View File

@ -0,0 +1,81 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja/ui/app/actions_menu_button.dart';
import 'package:invoiceninja/ui/client/edit/client_details.dart';
import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja/ui/client/view/client_details.dart';
import 'package:invoiceninja/ui/client/view/client_overview.dart';
import 'package:invoiceninja/utils/localization.dart';
class ClientEdit extends StatefulWidget {
final ClientEditVM viewModel;
ClientEdit({
Key key,
@required this.viewModel,
}) : super(key: key);
@override
_ClientEditState createState() => new _ClientEditState();
}
class _ClientEditState extends State<ClientEdit>
with SingleTickerProviderStateMixin {
TabController _controller;
@override
void initState() {
super.initState();
_controller = new TabController(vsync: this, length: 1);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
var localization = AppLocalization.of(context);
return Scaffold(
appBar: AppBar(
title: Text(widget.viewModel.client.id == null
? localization.newClient
: widget.viewModel.client
.displayName), // Text(localizations.clientDetails),
bottom: TabBar(
controller: _controller,
isScrollable: true,
tabs: [
Tab(
text: localization.details,
),
],
),
actions: widget.viewModel.client.id == null
? []
: [
IconButton(
icon: Icon(Icons.edit),
onPressed: () {
//
},
),
ActionMenuButton(
entity: widget.viewModel.client,
)
],
),
body: TabBarView(
controller: _controller,
children: <Widget>[
ClientEditDetails(client: widget.viewModel.client),
],
),
);
}
}

View File

@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/redux/app/app_state.dart';
import 'package:invoiceninja/ui/client/edit/client_edit.dart';
import 'package:redux/redux.dart';
class ClientEditBuilder extends StatelessWidget {
ClientEditBuilder({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, ClientEditVM>(
converter: (Store<AppState> store) {
return ClientEditVM.fromStore(store);
},
builder: (context, vm) {
return ClientEdit(
viewModel: vm,
);
},
);
}
}
class ClientEditVM {
final ClientEntity client;
ClientEditVM({
@required this.client,
});
factory ClientEditVM.fromStore(Store<AppState> store) {
final client = store.state.clientState().editing;
return ClientEditVM(
client: client,
);
}
}

View File

@ -8,16 +8,16 @@ import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/utils/platforms.dart'; import 'package:invoiceninja/utils/platforms.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class ClientDetails extends StatefulWidget { class ClientViewDetails extends StatefulWidget {
ClientDetails({this.client}); ClientViewDetails({this.client});
final ClientEntity client; final ClientEntity client;
@override @override
_ClientDetailsState createState() => new _ClientDetailsState(); _ClientViewDetailsState createState() => new _ClientViewDetailsState();
} }
class _ClientDetailsState extends State<ClientDetails> { class _ClientViewDetailsState extends State<ClientViewDetails> {
Future<Null> _launched; Future<Null> _launched;
Future<Null> _launchURL(BuildContext context, String url) async { Future<Null> _launchURL(BuildContext context, String url) async {

View File

@ -1,7 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja/ui/app/actions_menu_button.dart'; import 'package:invoiceninja/ui/app/actions_menu_button.dart';
import 'package:invoiceninja/ui/client/client_view_vm.dart'; import 'package:invoiceninja/ui/client/view/client_view_vm.dart';
import 'package:invoiceninja/ui/client/view/client_details.dart'; import 'package:invoiceninja/ui/client/view/client_details.dart';
import 'package:invoiceninja/ui/client/view/client_overview.dart'; import 'package:invoiceninja/ui/client/view/client_overview.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
@ -41,10 +41,7 @@ class _ClientViewState extends State<ClientView>
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(widget.viewModel.client.id == null title: Text(widget.viewModel.client.displayName), // Text(localizations.clientDetails),
? localization.newClient
: widget.viewModel.client
.displayName), // Text(localizations.clientDetails),
bottom: TabBar( bottom: TabBar(
controller: _controller, controller: _controller,
//isScrollable: true, //isScrollable: true,
@ -63,7 +60,7 @@ class _ClientViewState extends State<ClientView>
IconButton( IconButton(
icon: Icon(Icons.edit), icon: Icon(Icons.edit),
onPressed: () { onPressed: () {
// widget.viewModel.onEditClicked(context);
}, },
), ),
ActionMenuButton( ActionMenuButton(
@ -76,7 +73,7 @@ class _ClientViewState extends State<ClientView>
controller: _controller, controller: _controller,
children: <Widget>[ children: <Widget>[
ClientOverview(client: widget.viewModel.client), ClientOverview(client: widget.viewModel.client),
ClientDetails(client: widget.viewModel.client), ClientViewDetails(client: widget.viewModel.client),
], ],
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(

View File

@ -2,11 +2,12 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import 'package:redux/redux.dart'; import 'package:redux/redux.dart';
import 'package:invoiceninja/redux/client/client_actions.dart'; import 'package:invoiceninja/redux/client/client_actions.dart';
import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/ui/client/client_view.dart'; import 'package:invoiceninja/ui/client/view/client_view.dart';
import 'package:invoiceninja/redux/app/app_state.dart'; import 'package:invoiceninja/redux/app/app_state.dart';
import 'package:invoiceninja/ui/app/snackbar_row.dart'; import 'package:invoiceninja/ui/app/snackbar_row.dart';
@ -34,6 +35,7 @@ class ClientViewVM {
final Function onDelete; final Function onDelete;
final Function(BuildContext, ClientEntity) onSaveClicked; final Function(BuildContext, ClientEntity) onSaveClicked;
final Function(BuildContext, EntityAction) onActionSelected; final Function(BuildContext, EntityAction) onActionSelected;
final Function(BuildContext) onEditClicked;
final bool isLoading; final bool isLoading;
final bool isDirty; final bool isDirty;
@ -42,6 +44,7 @@ class ClientViewVM {
@required this.onDelete, @required this.onDelete,
@required this.onSaveClicked, @required this.onSaveClicked,
@required this.onActionSelected, @required this.onActionSelected,
@required this.onEditClicked,
@required this.isLoading, @required this.isLoading,
@required this.isDirty, @required this.isDirty,
}); });
@ -54,6 +57,11 @@ class ClientViewVM {
isDirty: client.id == null, isDirty: client.id == null,
client: client, client: client,
onDelete: () => false, onDelete: () => false,
onEditClicked: (BuildContext context) {
Navigator
.of(context)
.push(MaterialPageRoute(builder: (_) => ClientEditBuilder()));
},
onSaveClicked: (BuildContext context, ClientEntity client) { onSaveClicked: (BuildContext context, ClientEntity client) {
final Completer<Null> completer = new Completer<Null>(); final Completer<Null> completer = new Completer<Null>();
store.dispatch(SaveClientRequest(completer, client)); store.dispatch(SaveClientRequest(completer, client));

View File

@ -58,6 +58,8 @@ class AppLocalization {
'copied_to_clipboard': 'Copied to clipboard', 'copied_to_clipboard': 'Copied to clipboard',
'error': 'Error', 'error': 'Error',
'could_not_launch': 'Could not aunch', 'could_not_launch': 'Could not aunch',
'contacts': 'Contacts',
'additional': 'Additional',
'product': 'Product', 'product': 'Product',
'products': 'Products', 'products': 'Products',