Projects
This commit is contained in:
parent
bbc3c8f9c0
commit
dcc49b9168
|
|
@ -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/redux/client/client_selectors.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entity_dropdown.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/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/app/forms/date_picker.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/project/edit/project_edit_vm.dart';
|
import 'package:invoiceninja_flutter/ui/project/edit/project_edit_vm.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/buttons/refresh_icon_button.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 _hoursController = TextEditingController();
|
||||||
final _taskRateController = TextEditingController();
|
final _taskRateController = TextEditingController();
|
||||||
final _privateNotesController = TextEditingController();
|
final _privateNotesController = TextEditingController();
|
||||||
|
final _custom1Controller = TextEditingController();
|
||||||
|
final _custom2Controller = TextEditingController();
|
||||||
|
|
||||||
List<TextEditingController> _controllers = [];
|
List<TextEditingController> _controllers = [];
|
||||||
|
|
||||||
|
|
@ -42,6 +45,8 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
_hoursController,
|
_hoursController,
|
||||||
_taskRateController,
|
_taskRateController,
|
||||||
_privateNotesController,
|
_privateNotesController,
|
||||||
|
_custom1Controller,
|
||||||
|
_custom2Controller,
|
||||||
];
|
];
|
||||||
|
|
||||||
_controllers.forEach((controller) => controller.removeListener(_onChanged));
|
_controllers.forEach((controller) => controller.removeListener(_onChanged));
|
||||||
|
|
@ -54,6 +59,8 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
_taskRateController.text = formatNumber(project.taskRate, context,
|
_taskRateController.text = formatNumber(project.taskRate, context,
|
||||||
formatNumberType: FormatNumberType.input);
|
formatNumberType: FormatNumberType.input);
|
||||||
_privateNotesController.text = project.privateNotes;
|
_privateNotesController.text = project.privateNotes;
|
||||||
|
_custom1Controller.text = project.customValue1;
|
||||||
|
_custom2Controller.text = project.customValue2;
|
||||||
|
|
||||||
_controllers.forEach((controller) => controller.addListener(_onChanged));
|
_controllers.forEach((controller) => controller.addListener(_onChanged));
|
||||||
|
|
||||||
|
|
@ -71,12 +78,13 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onChanged() {
|
void _onChanged() {
|
||||||
final project = widget.viewModel.project.rebuild((b) =>
|
final project = widget.viewModel.project.rebuild((b) => b
|
||||||
b
|
|
||||||
..name = _nameController.text.trim()
|
..name = _nameController.text.trim()
|
||||||
..budgetedHours = parseDouble(_hoursController.text)
|
..budgetedHours = parseDouble(_hoursController.text)
|
||||||
..taskRate = parseDouble(_taskRateController.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) {
|
if (project != widget.viewModel.project) {
|
||||||
widget.viewModel.onChanged(project);
|
widget.viewModel.onChanged(project);
|
||||||
}
|
}
|
||||||
|
|
@ -88,6 +96,7 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
final localization = AppLocalization.of(context);
|
final localization = AppLocalization.of(context);
|
||||||
final state = viewModel.state;
|
final state = viewModel.state;
|
||||||
final project = viewModel.project;
|
final project = viewModel.project;
|
||||||
|
final company = viewModel.company;
|
||||||
|
|
||||||
return WillPopScope(
|
return WillPopScope(
|
||||||
onWillPop: () async {
|
onWillPop: () async {
|
||||||
|
|
@ -128,15 +137,12 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
entityType: EntityType.client,
|
entityType: EntityType.client,
|
||||||
labelText: localization.client,
|
labelText: localization.client,
|
||||||
initialValue: (state.clientState.map[project.clientId] ??
|
initialValue: (state.clientState.map[project.clientId] ??
|
||||||
ClientEntity())
|
ClientEntity())
|
||||||
.displayName,
|
.displayName,
|
||||||
entityMap: state.clientState.map,
|
entityMap: state.clientState.map,
|
||||||
entityList: memoizedDropdownClientList(
|
entityList: memoizedDropdownClientList(
|
||||||
state.clientState.map, state.clientState.list),
|
state.clientState.map, state.clientState.list),
|
||||||
validator: (String val) =>
|
validator: (String val) => val.trim().isEmpty
|
||||||
val
|
|
||||||
.trim()
|
|
||||||
.isEmpty
|
|
||||||
? localization.pleaseSelectAClient
|
? localization.pleaseSelectAClient
|
||||||
: null,
|
: null,
|
||||||
onSelected: (clientId) {
|
onSelected: (clientId) {
|
||||||
|
|
@ -150,10 +156,7 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
TextFormField(
|
TextFormField(
|
||||||
autocorrect: false,
|
autocorrect: false,
|
||||||
controller: _nameController,
|
controller: _nameController,
|
||||||
validator: (String val) =>
|
validator: (String val) => val.trim().isEmpty
|
||||||
val
|
|
||||||
.trim()
|
|
||||||
.isEmpty
|
|
||||||
? localization.pleaseEnterAName
|
? localization.pleaseEnterAName
|
||||||
: null,
|
: null,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
|
|
@ -190,6 +193,20 @@ class _ProjectEditState extends State<ProjectEdit> {
|
||||||
labelText: localization.privateNotes,
|
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),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ 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_flutter/data/models/client_model.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/data/models/entities.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
|
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||||
|
|
@ -40,6 +41,7 @@ class ProjectEditScreen extends StatelessWidget {
|
||||||
class ProjectEditVM {
|
class ProjectEditVM {
|
||||||
ProjectEditVM({
|
ProjectEditVM({
|
||||||
@required this.state,
|
@required this.state,
|
||||||
|
@required this.company,
|
||||||
@required this.project,
|
@required this.project,
|
||||||
@required this.onChanged,
|
@required this.onChanged,
|
||||||
@required this.onAddClientPressed,
|
@required this.onAddClientPressed,
|
||||||
|
|
@ -57,6 +59,7 @@ class ProjectEditVM {
|
||||||
return ProjectEditVM(
|
return ProjectEditVM(
|
||||||
isLoading: state.isLoading,
|
isLoading: state.isLoading,
|
||||||
isSaving: state.isSaving,
|
isSaving: state.isSaving,
|
||||||
|
company: state.selectedCompany,
|
||||||
project: project,
|
project: project,
|
||||||
state: state,
|
state: state,
|
||||||
origProject: state.projectState.map[project.id],
|
origProject: state.projectState.map[project.id],
|
||||||
|
|
@ -103,6 +106,7 @@ class ProjectEditVM {
|
||||||
}
|
}
|
||||||
|
|
||||||
final ProjectEntity project;
|
final ProjectEntity project;
|
||||||
|
final CompanyEntity company;
|
||||||
final Function(ProjectEntity) onChanged;
|
final Function(ProjectEntity) onChanged;
|
||||||
final Function(BuildContext) onSavePressed;
|
final Function(BuildContext) onSavePressed;
|
||||||
final bool isSaving;
|
final bool isSaving;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue