This commit is contained in:
Hillel Coren 2018-12-17 13:18:54 +02:00
parent bbc3c8f9c0
commit dcc49b9168
2 changed files with 33 additions and 12 deletions

View File

@ -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<ProjectEdit> {
final _hoursController = TextEditingController();
final _taskRateController = TextEditingController();
final _privateNotesController = TextEditingController();
final _custom1Controller = TextEditingController();
final _custom2Controller = TextEditingController();
List<TextEditingController> _controllers = [];
@ -42,6 +45,8 @@ class _ProjectEditState extends State<ProjectEdit> {
_hoursController,
_taskRateController,
_privateNotesController,
_custom1Controller,
_custom2Controller,
];
_controllers.forEach((controller) => controller.removeListener(_onChanged));
@ -54,6 +59,8 @@ class _ProjectEditState extends State<ProjectEdit> {
_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<ProjectEdit> {
}
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<ProjectEdit> {
final localization = AppLocalization.of(context);
final state = viewModel.state;
final project = viewModel.project;
final company = viewModel.company;
return WillPopScope(
onWillPop: () async {
@ -133,10 +142,7 @@ class _ProjectEditState extends State<ProjectEdit> {
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<ProjectEdit> {
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<ProjectEdit> {
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),
),
],
),
],

View File

@ -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;