From 988c0e4f04468a1dd175c9e4d3168e22cbbcd2ed Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 18 Oct 2020 12:44:44 +0300 Subject: [PATCH] Projects --- lib/data/models/project_model.dart | 25 ++++++++++---- lib/redux/app/app_actions.dart | 11 ++++++- lib/redux/project/project_actions.dart | 42 ++++++++++++++++++++++-- lib/ui/project/view/project_view_vm.dart | 15 +++------ lib/utils/icons.dart | 1 + 5 files changed, 74 insertions(+), 20 deletions(-) diff --git a/lib/data/models/project_model.dart b/lib/data/models/project_model.dart index 0099c359c..79236f484 100644 --- a/lib/data/models/project_model.dart +++ b/lib/data/models/project_model.dart @@ -155,12 +155,25 @@ abstract class ProjectEntity extends Object actions.add(EntityAction.edit); } - if (userCompany.canCreate(EntityType.task) && isActive) { - actions.add(EntityAction.newTask); - } - - if (userCompany.canCreate(EntityType.invoice) && isActive) { - actions.add(EntityAction.newInvoice); + if (isActive && client?.isActive == true) { + if (userCompany.canCreate(EntityType.invoice)) { + actions.add(EntityAction.newInvoice); + } + if (userCompany.canCreate(EntityType.recurringInvoice)) { + actions.add(EntityAction.newRecurringInvoice); + } + if (userCompany.canCreate(EntityType.quote)) { + actions.add(EntityAction.newQuote); + } + if (userCompany.canCreate(EntityType.credit)) { + actions.add(EntityAction.newCredit); + } + if (userCompany.canCreate(EntityType.task)) { + actions.add(EntityAction.newTask); + } + if (userCompany.canCreate(EntityType.expense)) { + actions.add(EntityAction.newInvoice); + } } } diff --git a/lib/redux/app/app_actions.dart b/lib/redux/app/app_actions.dart index 713843f08..1b41687cb 100644 --- a/lib/redux/app/app_actions.dart +++ b/lib/redux/app/app_actions.dart @@ -544,6 +544,10 @@ void createEntityByType( final state = store.state; final navigator = Navigator.of(context); + if (!state.userCompany.canCreate(entityType)) { + return; + } + checkForChanges( store: store, context: context, @@ -712,9 +716,14 @@ void createEntity({ Completer cancelCompleter, }) { final store = StoreProvider.of(context); - final uiState = store.state.uiState; + final state = store.state; + final uiState = state.uiState; final navigator = Navigator.of(context); + if (!state.userCompany.canCreate(entity.entityType)) { + return; + } + checkForChanges( store: store, context: context, diff --git a/lib/redux/project/project_actions.dart b/lib/redux/project/project_actions.dart index 3d7091ac0..07d3a810c 100644 --- a/lib/redux/project/project_actions.dart +++ b/lib/redux/project/project_actions.dart @@ -7,7 +7,6 @@ import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; -import 'package:invoiceninja_flutter/redux/project/project_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -266,6 +265,7 @@ void handleProjectAction( final state = store.state; final project = projects.first as ProjectEntity; final projectIds = projects.map((project) => project.id).toList(); + final client = state.clientState.get(project.clientId); switch (action) { case EntityAction.edit: @@ -279,6 +279,12 @@ void handleProjectAction( ..clientId = project.clientId)); break; case EntityAction.newInvoice: + createEntity( + context: context, + entity: InvoiceEntity(state: state, client: client).rebuild((b) => b + ..projectId = project.id + ..clientId = project.clientId)); + /* final items = convertProjectToInvoiceItem(project: project, context: context); createEntity( @@ -286,7 +292,39 @@ void handleProjectAction( entity: InvoiceEntity(state: state).rebuild((b) => b ..hasTasks = true ..clientId = project.clientId - ..lineItems.addAll(items))); + ..lineItems.addAll(items))); + */ + break; + case EntityAction.newQuote: + createEntity( + context: context, + entity: InvoiceEntity(state: state, client: client).rebuild((b) => b + ..projectId = project.id + ..clientId = project.clientId + ..entityType = EntityType.quote)); + break; + case EntityAction.newCredit: + createEntity( + context: context, + entity: InvoiceEntity(state: state, client: client).rebuild((b) => b + ..projectId = project.id + ..clientId = project.clientId + ..entityType = EntityType.credit)); + break; + case EntityAction.newRecurringInvoice: + createEntity( + context: context, + entity: InvoiceEntity(state: state, client: client).rebuild((b) => b + ..projectId = project.id + ..clientId = project.clientId + ..entityType = EntityType.recurringInvoice)); + break; + case EntityAction.newExpense: + createEntity( + context: context, + entity: ExpenseEntity(state: state).rebuild((b) => b + ..projectId = project.id + ..clientId = project.clientId)); break; case EntityAction.clone: createEntity(context: context, entity: project.clone); diff --git a/lib/ui/project/view/project_view_vm.dart b/lib/ui/project/view/project_view_vm.dart index c4793f919..87a4a07c0 100644 --- a/lib/ui/project/view/project_view_vm.dart +++ b/lib/ui/project/view/project_view_vm.dart @@ -75,20 +75,13 @@ class ProjectViewVM { onRefreshed: (context) => _handleRefresh(context), onEntityPressed: (BuildContext context, EntityType entityType, {bool longPress = false}) { - if (!longPress || !project.isActive || !client.isActive) { + if (longPress && project.isActive && client.isActive) { + handleProjectAction( + context, [project], EntityAction.newEntityType(entityType)); + } else { viewEntitiesByType( context: context, entityType: entityType, filterEntity: project); } - - switch (entityType) { - case EntityType.task: - createEntity( - context: context, - entity: TaskEntity(state: state).rebuild((b) => b - ..projectId = project.id - ..clientId = project.clientId)); - break; - } }, onAddTaskPressed: (context) { createEntity( diff --git a/lib/utils/icons.dart b/lib/utils/icons.dart index 541c5b786..ba312c208 100644 --- a/lib/utils/icons.dart +++ b/lib/utils/icons.dart @@ -47,6 +47,7 @@ IconData getEntityActionIcon(EntityAction entityAction) { case EntityAction.newPayment: case EntityAction.newQuote: case EntityAction.newCredit: + case EntityAction.newRecurringInvoice: return Icons.add_circle_outline; case EntityAction.resume: case EntityAction.start: