From dcc49b9168491a7b6d08fd3c202999c7de72d96e Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Mon, 17 Dec 2018 13:18:54 +0200 Subject: [PATCH] Projects --- lib/ui/project/edit/project_edit.dart | 41 +++++++++++++++++------- lib/ui/project/edit/project_edit_vm.dart | 4 +++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/lib/ui/project/edit/project_edit.dart b/lib/ui/project/edit/project_edit.dart index 23ec496b9..2d3f4a33c 100644 --- a/lib/ui/project/edit/project_edit.dart +++ b/lib/ui/project/edit/project_edit.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/client/client_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; +import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/project/edit/project_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/refresh_icon_button.dart'; @@ -31,6 +32,8 @@ class _ProjectEditState extends State { final _hoursController = TextEditingController(); final _taskRateController = TextEditingController(); final _privateNotesController = TextEditingController(); + final _custom1Controller = TextEditingController(); + final _custom2Controller = TextEditingController(); List _controllers = []; @@ -42,6 +45,8 @@ class _ProjectEditState extends State { _hoursController, _taskRateController, _privateNotesController, + _custom1Controller, + _custom2Controller, ]; _controllers.forEach((controller) => controller.removeListener(_onChanged)); @@ -54,6 +59,8 @@ class _ProjectEditState extends State { _taskRateController.text = formatNumber(project.taskRate, context, formatNumberType: FormatNumberType.input); _privateNotesController.text = project.privateNotes; + _custom1Controller.text = project.customValue1; + _custom2Controller.text = project.customValue2; _controllers.forEach((controller) => controller.addListener(_onChanged)); @@ -71,12 +78,13 @@ class _ProjectEditState extends State { } void _onChanged() { - final project = widget.viewModel.project.rebuild((b) => - b + final project = widget.viewModel.project.rebuild((b) => b ..name = _nameController.text.trim() ..budgetedHours = parseDouble(_hoursController.text) ..taskRate = parseDouble(_taskRateController.text) - ..privateNotes = _privateNotesController.text.trim()); + ..privateNotes = _privateNotesController.text.trim() + ..customValue1 = _custom1Controller.text.trim() + ..customValue2 = _custom2Controller.text.trim()); if (project != widget.viewModel.project) { widget.viewModel.onChanged(project); } @@ -88,6 +96,7 @@ class _ProjectEditState extends State { final localization = AppLocalization.of(context); final state = viewModel.state; final project = viewModel.project; + final company = viewModel.company; return WillPopScope( onWillPop: () async { @@ -128,15 +137,12 @@ class _ProjectEditState extends State { entityType: EntityType.client, labelText: localization.client, initialValue: (state.clientState.map[project.clientId] ?? - ClientEntity()) + ClientEntity()) .displayName, entityMap: state.clientState.map, entityList: memoizedDropdownClientList( state.clientState.map, state.clientState.list), - validator: (String val) => - val - .trim() - .isEmpty + validator: (String val) => val.trim().isEmpty ? localization.pleaseSelectAClient : null, onSelected: (clientId) { @@ -150,10 +156,7 @@ class _ProjectEditState extends State { TextFormField( autocorrect: false, controller: _nameController, - validator: (String val) => - val - .trim() - .isEmpty + validator: (String val) => val.trim().isEmpty ? localization.pleaseEnterAName : null, decoration: InputDecoration( @@ -190,6 +193,20 @@ class _ProjectEditState extends State { labelText: localization.privateNotes, ), ), + CustomField( + controller: _custom1Controller, + labelText: + company.getCustomFieldLabel(CustomFieldType.project1), + options: company + .getCustomFieldValues(CustomFieldType.project1), + ), + CustomField( + controller: _custom2Controller, + labelText: + company.getCustomFieldLabel(CustomFieldType.project2), + options: company + .getCustomFieldValues(CustomFieldType.project2), + ), ], ), ], diff --git a/lib/ui/project/edit/project_edit_vm.dart b/lib/ui/project/edit/project_edit_vm.dart index 616f7810f..454bd3634 100644 --- a/lib/ui/project/edit/project_edit_vm.dart +++ b/lib/ui/project/edit/project_edit_vm.dart @@ -3,6 +3,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/client_model.dart'; +import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; @@ -40,6 +41,7 @@ class ProjectEditScreen extends StatelessWidget { class ProjectEditVM { ProjectEditVM({ @required this.state, + @required this.company, @required this.project, @required this.onChanged, @required this.onAddClientPressed, @@ -57,6 +59,7 @@ class ProjectEditVM { return ProjectEditVM( isLoading: state.isLoading, isSaving: state.isSaving, + company: state.selectedCompany, project: project, state: state, origProject: state.projectState.map[project.id], @@ -103,6 +106,7 @@ class ProjectEditVM { } final ProjectEntity project; + final CompanyEntity company; final Function(ProjectEntity) onChanged; final Function(BuildContext) onSavePressed; final bool isSaving;