This commit is contained in:
unknown 2018-06-12 11:18:41 -07:00
parent 1d1f173d8b
commit fde7f54b2c
10 changed files with 172 additions and 159 deletions

23
lib/ui/app/form_card.dart Normal file
View File

@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
class FormCard extends StatelessWidget {
FormCard({this.children});
final List<Widget> children;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(12.0),
child: Card(
elevation: 2.0,
child: Padding(
padding: const EdgeInsets.only(
left: 16.0, right: 16.0, top: 16.0, bottom: 20.0),
child: Column(
children: children,
),
),
),
);
}
}

View File

@ -23,7 +23,7 @@ class ProgressButton extends StatelessWidget {
*/ */
return Padding( return Padding(
padding: EdgeInsets.only(top: 20.0), padding: EdgeInsets.only(left: 14.0, right: 14.0, top: 2.0),
child: this.isLoading child: this.isLoading
? SizedBox( ? SizedBox(
width: 100.0, width: 100.0,

View File

@ -3,6 +3,8 @@ import 'package:invoiceninja/redux/auth/auth_state.dart';
import 'package:invoiceninja/ui/app/progress_button.dart'; import 'package:invoiceninja/ui/app/progress_button.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import '../app/form_card.dart';
class Login extends StatelessWidget { class Login extends StatelessWidget {
final bool isLoading; final bool isLoading;
final bool isDirty; final bool isDirty;
@ -36,81 +38,77 @@ class Login extends StatelessWidget {
return ListView( return ListView(
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.only(left: 12.0, right: 12.0, top: 20.0), children: <Widget>[
children: [
Padding( Padding(
padding: EdgeInsets.only(top: 20.0, bottom: 20.0), padding: EdgeInsets.only(top: 20.0, bottom: 20.0),
child: new Image.asset('assets/images/logo.png', child: new Image.asset('assets/images/logo.png',
width: 100.0, height: 100.0), width: 100.0, height: 100.0),
), ),
Card( Form(
elevation: 2.0, key: _formKey,
margin: EdgeInsets.all(0.0), child: FormCard(
child: Form( children: <Widget>[
key: _formKey, TextFormField(
child: Container( key: _emailKey,
padding: EdgeInsets.all(16.0), initialValue: authState.email,
child: Column( autocorrect: false,
children: <Widget>[ decoration: InputDecoration(
TextFormField( labelText: AppLocalization.of(context).email),
key: _emailKey, keyboardType: TextInputType.emailAddress,
initialValue: authState.email, validator: (val) => val.isEmpty || val.trim().length == 0
autocorrect: false, ? AppLocalization.of(context).pleaseEnterYourEmail
decoration: InputDecoration(labelText: AppLocalization.of(context).email), : null,
keyboardType: TextInputType.emailAddress, ),
validator: (val) => val.isEmpty || val.trim().length == 0 TextFormField(
? AppLocalization.of(context).pleaseEnterYourEmail key: _passwordKey,
: null, initialValue: authState.password,
), autocorrect: false,
TextFormField( decoration: InputDecoration(
key: _passwordKey, labelText: AppLocalization.of(context).password),
initialValue: authState.password, validator: (val) => val.isEmpty || val.trim().length == 0
autocorrect: false, ? AppLocalization.of(context).pleaseEnterYourPassword
decoration: InputDecoration(labelText: AppLocalization.of(context).password), : null,
validator: (val) => val.isEmpty || val.trim().length == 0 obscureText: true,
? AppLocalization.of(context).pleaseEnterYourPassword ),
: null, TextFormField(
obscureText: true, key: _urlKey,
), initialValue: authState.url,
TextFormField( autocorrect: false,
key: _urlKey, decoration:
initialValue: authState.url, InputDecoration(labelText: AppLocalization.of(context).url),
autocorrect: false, validator: (val) => val.isEmpty || val.trim().length == 0
decoration: InputDecoration(labelText: AppLocalization.of(context).url), ? AppLocalization.of(context).pleaseEnterYourUrl
validator: (val) => val.isEmpty || val.trim().length == 0 : null,
? AppLocalization.of(context).pleaseEnterYourUrl keyboardType: TextInputType.url,
: null, ),
keyboardType: TextInputType.url, TextFormField(
), key: _secretKey,
TextFormField( initialValue: authState.secret,
key: _secretKey, autocorrect: false,
initialValue: authState.secret, decoration: InputDecoration(
autocorrect: false, labelText: AppLocalization.of(context).secret),
decoration: InputDecoration(labelText: AppLocalization.of(context).secret), /*
/*
validator: (val) => val.isEmpty || val.trim().length == 0 validator: (val) => val.isEmpty || val.trim().length == 0
? AppLocalization.of(context).pleaseEnterYourPassword ? AppLocalization.of(context).pleaseEnterYourPassword
: null, : null,
*/ */
obscureText: true, obscureText: true,
), ),
authState.error == null authState.error == null
? Container() ? Container()
: Container( : Container(
padding: EdgeInsets.only(top: 26.0, bottom: 4.0), padding: EdgeInsets.only(top: 26.0, bottom: 4.0),
child: Center( child: Center(
child: Text( child: Text(
authState.error, authState.error,
style: TextStyle( style: TextStyle(
color: Colors.red, color: Colors.red,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
),
),
), ),
), ),
], ),
), ),
), ],
), ),
), ),
ProgressButton( ProgressButton(
@ -122,7 +120,8 @@ class Login extends StatelessWidget {
return; return;
} }
this.onLoginClicked(context, this.onLoginClicked(
context,
_emailKey.currentState.value, _emailKey.currentState.value,
_passwordKey.currentState.value, _passwordKey.currentState.value,
_urlKey.currentState.value, _urlKey.currentState.value,

View File

@ -110,7 +110,7 @@ class _ClientEditState extends State<ClientEdit>
), ),
), ),
body: Padding( body: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(16.0),
child: Form( child: Form(
key: _formKey, key: _formKey,
child: TabBarView( child: TabBarView(

View File

@ -39,8 +39,7 @@ class ClientEditBillingAddressState extends State<ClientEditBillingAddress>
Card( Card(
elevation: 2.0, elevation: 2.0,
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.all(16.0),
left: 12.0, right: 12.0, top: 12.0, bottom: 18.0),
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
TextFormField( TextFormField(

View File

@ -75,7 +75,7 @@ class ClientEditContactsState extends State<ClientEditContacts>
} }
items.add(Padding( items.add(Padding(
padding: const EdgeInsets.all(12.0), padding: const EdgeInsets.all(16.0),
child: RaisedButton( child: RaisedButton(
elevation: 4.0, elevation: 4.0,
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
@ -151,7 +151,7 @@ class ContactEditDetailsState extends State<ContactEditDetails> {
child: Card( child: Card(
elevation: 2.0, elevation: 2.0,
child: Padding( child: Padding(
padding: const EdgeInsets.all(12.0), padding: const EdgeInsets.all(16.0),
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
TextFormField( TextFormField(

View File

@ -39,8 +39,7 @@ class ClientEditDetailsState extends State<ClientEditDetails>
Card( Card(
elevation: 2.0, elevation: 2.0,
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.all(16.0),
left: 12.0, right: 12.0, top: 12.0, bottom: 18.0),
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
TextFormField( TextFormField(

View File

@ -38,8 +38,7 @@ class ClientEditShippingAddressState extends State<ClientEditShippingAddress>
Card( Card(
elevation: 2.0, elevation: 2.0,
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.all(16.0),
left: 12.0, right: 12.0, top: 12.0, bottom: 18.0),
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
TextFormField( TextFormField(

View File

@ -66,11 +66,11 @@ class ClientOverview extends StatelessWidget {
return Column( return Column(
children: <Widget>[ children: <Widget>[
Padding( Padding(
padding: EdgeInsets.all(12.0), padding: EdgeInsets.all(16.0),
child: Card( child: Card(
elevation: 2.0, elevation: 2.0,
child: Padding( child: Padding(
padding: EdgeInsets.all(12.0), padding: EdgeInsets.all(16.0),
child: _headerRow(), child: _headerRow(),
), ),
), ),

View File

@ -5,9 +5,9 @@ import 'package:invoiceninja/ui/app/progress_button.dart';
import 'package:invoiceninja/ui/product/product_edit_vm.dart'; import 'package:invoiceninja/ui/product/product_edit_vm.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import '../app/form_card.dart';
class ProductEdit extends StatefulWidget { class ProductEdit extends StatefulWidget {
final ProductEditVM viewModel; final ProductEditVM viewModel;
static final GlobalKey<FormState> formKey = GlobalKey<FormState>(); static final GlobalKey<FormState> formKey = GlobalKey<FormState>();
@ -16,7 +16,6 @@ class ProductEdit extends StatefulWidget {
@required this.viewModel, @required this.viewModel,
}) : super(key: key); }) : super(key: key);
@override @override
_ProductEditState createState() => _ProductEditState(); _ProductEditState createState() => _ProductEditState();
} }
@ -36,90 +35,85 @@ class _ProductEditState extends State<ProductEdit> {
? AppLocalization.of(context).newProduct ? AppLocalization.of(context).newProduct
: viewModel : viewModel
.product.productKey), // Text(localizations.productDetails), .product.productKey), // Text(localizations.productDetails),
actions: viewModel.product.id == null ? [] : [ actions: viewModel.product.id == null
ActionMenuButton( ? []
entity: viewModel.product, : [
onSelected: viewModel.onActionSelected, ActionMenuButton(
)], entity: viewModel.product,
onSelected: viewModel.onActionSelected,
)
],
), ),
body: Padding( body: Form(
padding: EdgeInsets.all(16.0), child: ListView(
child: ListView(children: [ children: <Widget>[
Card( FormCard(
elevation: 2.0, children: <Widget>[
margin: EdgeInsets.all(0.0), TextFormField(
child: Form( autocorrect: false,
key: ProductEdit.formKey, onSaved: (value) {
child: Container( _productKey = value;
padding: EdgeInsets.all(16.0), },
child: Column( initialValue: viewModel.product.productKey,
children: [ decoration: InputDecoration(
TextFormField( //border: InputBorder.none,
autocorrect: false, labelText: AppLocalization.of(context).product,
onSaved: (value) { ),
_productKey = value; validator: (val) => val.isEmpty || val.trim().length == 0
}, ? AppLocalization.of(context).pleaseEnterAProductKey
initialValue: viewModel.product.productKey, : null,
decoration: InputDecoration(
//border: InputBorder.none,
labelText: AppLocalization.of(context).product,
),
validator: (val) => val.isEmpty || val.trim().length == 0
? AppLocalization.of(context).pleaseEnterAProductKey
: null,
),
TextFormField(
initialValue: viewModel.product.notes,
onSaved: (value) {
print('onSaved: setting _notes to: ' + value);
_notes = value;
},
maxLines: 4,
decoration: InputDecoration(
labelText: AppLocalization.of(context).notes,
),
),
TextFormField(
initialValue: viewModel.product.cost == null ||
viewModel.product.cost == 0.0
? null
: viewModel.product.cost.toStringAsFixed(2),
onSaved: (value) {
_cost = double.tryParse(value) ?? 0.0;
},
keyboardType: TextInputType.number,
decoration: InputDecoration(
//border: InputBorder.none,
labelText: AppLocalization.of(context).cost,
),
),
],
), ),
), TextFormField(
initialValue: viewModel.product.notes,
onSaved: (value) {
print('onSaved: setting _notes to: ' + value);
_notes = value;
},
maxLines: 4,
decoration: InputDecoration(
labelText: AppLocalization.of(context).notes,
),
),
TextFormField(
initialValue: viewModel.product.cost == null ||
viewModel.product.cost == 0.0
? null
: viewModel.product.cost.toStringAsFixed(2),
onSaved: (value) {
_cost = double.tryParse(value) ?? 0.0;
},
keyboardType: TextInputType.number,
decoration: InputDecoration(
//border: InputBorder.none,
labelText: AppLocalization.of(context).cost,
),
),
],
), ),
), new Builder(builder: (BuildContext context) {
new Builder(builder: (BuildContext context) { return viewModel.product.isDeleted == true
return viewModel.product.isDeleted == true ? Container()
? Container() : ProgressButton(
: ProgressButton( label: AppLocalization.of(context).save.toUpperCase(),
label: AppLocalization.of(context).save.toUpperCase(), isLoading: viewModel.isLoading,
isLoading: viewModel.isLoading, isDirty: viewModel.isDirty,
isDirty: viewModel.isDirty, onPressed: () {
onPressed: () { if (!ProductEdit.formKey.currentState.validate()) {
if (! ProductEdit.formKey.currentState.validate()) { return;
return; }
} ProductEdit.formKey.currentState.save();
ProductEdit.formKey.currentState.save();
viewModel.onSaveClicked(context, viewModel.onSaveClicked(
viewModel.product.rebuild((b) => b context,
..productKey = _productKey viewModel.product.rebuild((b) => b
..notes = _notes ..productKey = _productKey
..cost = _cost)); ..notes = _notes
}, ..cost = _cost));
); },
}), );
]), }),
],
),
), ),
/* /*
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(