diff --git a/lib/data/mock/mock_clients.dart b/lib/data/mock/mock_clients.dart index 6f4ca1c26..1f53be354 100644 --- a/lib/data/mock/mock_clients.dart +++ b/lib/data/mock/mock_clients.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponseClients = ''' +const dynamic kMockClients = ''' { "data": [], "meta": { diff --git a/lib/data/mock/mock_dashboard.dart b/lib/data/mock/mock_dashboard.dart index c43aa8a4d..8eeb1abe6 100644 --- a/lib/data/mock/mock_dashboard.dart +++ b/lib/data/mock/mock_dashboard.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponseDashboard = ''' +const dynamic kMockDashboard = ''' { "data": { "activities": [] diff --git a/lib/data/mock/mock_expenses.dart b/lib/data/mock/mock_expenses.dart new file mode 100644 index 000000000..b3b058528 --- /dev/null +++ b/lib/data/mock/mock_expenses.dart @@ -0,0 +1,15 @@ +const dynamic kMockExpenses = ''' +{ + "data": [], + "meta": { + "pagination": { + "total": 0, + "count": 0, + "per_page": 5000, + "current_page": 1, + "total_pages": 1, + "links": [] + } + } +} +'''; \ No newline at end of file diff --git a/lib/data/mock/mock_invoices.dart b/lib/data/mock/mock_invoices.dart index 2653a6e43..0b4e459fc 100644 --- a/lib/data/mock/mock_invoices.dart +++ b/lib/data/mock/mock_invoices.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponseInvoices = ''' +const dynamic kMockInvoices = ''' { "data": [], "meta": { diff --git a/lib/data/mock/mock_login.dart b/lib/data/mock/mock_login.dart index ec5ab4af7..9fde87061 100644 --- a/lib/data/mock/mock_login.dart +++ b/lib/data/mock/mock_login.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponseLogin = ''' +const dynamic kMockLogin = ''' { "data": [ { diff --git a/lib/data/mock/mock_payments.dart b/lib/data/mock/mock_payments.dart index d2dd326eb..f3d45be89 100644 --- a/lib/data/mock/mock_payments.dart +++ b/lib/data/mock/mock_payments.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponsePayments = ''' +const dynamic kMockPayments = ''' { "data": [], "meta": { diff --git a/lib/data/mock/mock_products.dart b/lib/data/mock/mock_products.dart index f1a521ac3..ee88dd515 100644 --- a/lib/data/mock/mock_products.dart +++ b/lib/data/mock/mock_products.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponseProducts = ''' +const dynamic kMockProducts = ''' { "data": [], "meta": { diff --git a/lib/data/mock/mock_projects.dart b/lib/data/mock/mock_projects.dart new file mode 100644 index 000000000..729f1d523 --- /dev/null +++ b/lib/data/mock/mock_projects.dart @@ -0,0 +1,15 @@ +const dynamic kMockProjects = ''' +{ + "data": [], + "meta": { + "pagination": { + "total": 0, + "count": 0, + "per_page": 5000, + "current_page": 1, + "total_pages": 1, + "links": [] + } + } +} +'''; \ No newline at end of file diff --git a/lib/data/mock/mock_quotes.dart b/lib/data/mock/mock_quotes.dart index 809d8ffc4..6d4d731bb 100644 --- a/lib/data/mock/mock_quotes.dart +++ b/lib/data/mock/mock_quotes.dart @@ -1,4 +1,4 @@ -const dynamic kAPIResponseQuotes = ''' +const dynamic kMockQuotes = ''' { "data": [], "meta": { diff --git a/lib/data/mock/mock_tasks.dart b/lib/data/mock/mock_tasks.dart new file mode 100644 index 000000000..821c2e3f9 --- /dev/null +++ b/lib/data/mock/mock_tasks.dart @@ -0,0 +1,15 @@ +const dynamic kMockTasks = ''' +{ + "data": [], + "meta": { + "pagination": { + "total": 0, + "count": 0, + "per_page": 5000, + "current_page": 1, + "total_pages": 1, + "links": [] + } + } +} +'''; \ No newline at end of file diff --git a/lib/data/mock/mock_vendors.dart b/lib/data/mock/mock_vendors.dart new file mode 100644 index 000000000..3fcf5b626 --- /dev/null +++ b/lib/data/mock/mock_vendors.dart @@ -0,0 +1,15 @@ +const dynamic kMockVendors = ''' +{ + "data": [], + "meta": { + "pagination": { + "total": 0, + "count": 0, + "per_page": 5000, + "current_page": 1, + "total_pages": 1, + "links": [] + } + } +} +'''; \ No newline at end of file diff --git a/lib/data/models/company_model.dart b/lib/data/models/company_model.dart index 3de952f0d..1ad07f74b 100644 --- a/lib/data/models/company_model.dart +++ b/lib/data/models/company_model.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/data/models/group_model.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/task_model.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/.env.dart'; part 'company_model.g.dart'; @@ -244,6 +245,20 @@ abstract class CompanyEntity extends Object bool get isEnterprisePlan => isSelfHost || plan == kPlanEnterprise; bool isModuleEnabled(EntityType entityType) { + if (Config.DEMO_MODE) { + if ([ + //EntityType.recurringInvoice, + //EntityType.credit, + EntityType.project, + EntityType.task, + EntityType.expense, + EntityType.vendor, + ].contains(entityType)) { + return true; + } + } + + // TODO remove this if ([ EntityType.recurringInvoice, diff --git a/lib/data/repositories/auth_repository.dart b/lib/data/repositories/auth_repository.dart index 3b40e038e..1403bf53c 100644 --- a/lib/data/repositories/auth_repository.dart +++ b/lib/data/repositories/auth_repository.dart @@ -98,7 +98,7 @@ class AuthRepository { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponseLogin); + response = json.decode(kMockLogin); } else { response = await webClient.post(url, token ?? '', data: json.encode(data)); diff --git a/lib/data/repositories/client_repository.dart b/lib/data/repositories/client_repository.dart index 4d1889718..b2ad76a4e 100644 --- a/lib/data/repositories/client_repository.dart +++ b/lib/data/repositories/client_repository.dart @@ -44,7 +44,7 @@ class ClientRepository { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponseClients); + response = json.decode(kMockClients); } else { response = await webClient.get(url, credentials.token); diff --git a/lib/data/repositories/dashboard_repository.dart b/lib/data/repositories/dashboard_repository.dart index e601a15a9..25ca6a5c7 100644 --- a/lib/data/repositories/dashboard_repository.dart +++ b/lib/data/repositories/dashboard_repository.dart @@ -18,7 +18,7 @@ class DashboardRepository { Future loadItem(Credentials connectionInfo) async { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponseDashboard); + response = json.decode(kMockDashboard); } else { response = await webClient.get( connectionInfo.url + '/dashboard?only_activity=true', diff --git a/lib/data/repositories/expense_repository.dart b/lib/data/repositories/expense_repository.dart index 7d4d069af..860a831c3 100644 --- a/lib/data/repositories/expense_repository.dart +++ b/lib/data/repositories/expense_repository.dart @@ -1,8 +1,10 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; +import 'package:invoiceninja_flutter/.env.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/data/mock/mock_expenses.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -34,7 +36,13 @@ class ExpenseRepository { url += '&updated_at=${updatedAt - kUpdatedAtBufferSeconds}'; } - final dynamic response = await webClient.get(url, credentials.token); + dynamic response; + + if (Config.DEMO_MODE) { + response = json.decode(kMockExpenses); + } else { + response = await webClient.get(url, credentials.token); + } final ExpenseListResponse expenseResponse = serializers.deserializeWith(ExpenseListResponse.serializer, response); diff --git a/lib/data/repositories/invoice_repository.dart b/lib/data/repositories/invoice_repository.dart index 21d830866..9ac35b42f 100644 --- a/lib/data/repositories/invoice_repository.dart +++ b/lib/data/repositories/invoice_repository.dart @@ -41,7 +41,7 @@ class InvoiceRepository { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponseInvoices); + response = json.decode(kMockInvoices); } else { response = await webClient.get(url, credentials.token); diff --git a/lib/data/repositories/payment_repository.dart b/lib/data/repositories/payment_repository.dart index c33d2e385..5acd186f6 100644 --- a/lib/data/repositories/payment_repository.dart +++ b/lib/data/repositories/payment_repository.dart @@ -28,7 +28,7 @@ class PaymentRepository { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponsePayments); + response = json.decode(kMockPayments); } else { response = await webClient.get(url, credentials.token); diff --git a/lib/data/repositories/product_repository.dart b/lib/data/repositories/product_repository.dart index fafd4f315..de3d8522a 100644 --- a/lib/data/repositories/product_repository.dart +++ b/lib/data/repositories/product_repository.dart @@ -28,7 +28,7 @@ class ProductRepository { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponseProducts); + response = json.decode(kMockProducts); } else { response = await webClient.get(url, credentials.token); } diff --git a/lib/data/repositories/project_repository.dart b/lib/data/repositories/project_repository.dart index c5f53ad48..610207655 100644 --- a/lib/data/repositories/project_repository.dart +++ b/lib/data/repositories/project_repository.dart @@ -1,8 +1,10 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; +import 'package:invoiceninja_flutter/.env.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/data/mock/mock_projects.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -34,7 +36,13 @@ class ProjectRepository { url += '&updated_at=${updatedAt - kUpdatedAtBufferSeconds}'; } - final dynamic response = await webClient.get(url, credentials.token); + dynamic response; + + if (Config.DEMO_MODE) { + response = json.decode(kMockProjects); + } else { + response = await webClient.get(url, credentials.token); + } final ProjectListResponse projectResponse = serializers.deserializeWith(ProjectListResponse.serializer, response); diff --git a/lib/data/repositories/quote_repository.dart b/lib/data/repositories/quote_repository.dart index 07ff0db5a..f5b9d2998 100644 --- a/lib/data/repositories/quote_repository.dart +++ b/lib/data/repositories/quote_repository.dart @@ -41,7 +41,7 @@ class QuoteRepository { dynamic response; if (Config.DEMO_MODE) { - response = json.decode(kAPIResponseQuotes); + response = json.decode(kMockQuotes); } else { response = await webClient.get(url, credentials.token); } diff --git a/lib/data/repositories/task_repository.dart b/lib/data/repositories/task_repository.dart index b2a688940..476a6808b 100644 --- a/lib/data/repositories/task_repository.dart +++ b/lib/data/repositories/task_repository.dart @@ -1,8 +1,10 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; +import 'package:invoiceninja_flutter/.env.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/data/mock/mock_tasks.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -33,7 +35,13 @@ class TaskRepository { url += '&updated_at=${updatedAt - kUpdatedAtBufferSeconds}'; } - final dynamic response = await webClient.get(url, credentials.token); + dynamic response; + + if (Config.DEMO_MODE) { + response = json.decode(kMockTasks); + } else { + response = await webClient.get(url, credentials.token); + } final TaskListResponse taskResponse = serializers.deserializeWith(TaskListResponse.serializer, response); diff --git a/lib/data/repositories/vendor_repository.dart b/lib/data/repositories/vendor_repository.dart index e9a909992..4e223de38 100644 --- a/lib/data/repositories/vendor_repository.dart +++ b/lib/data/repositories/vendor_repository.dart @@ -1,8 +1,10 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; +import 'package:invoiceninja_flutter/.env.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/constants.dart'; +import 'package:invoiceninja_flutter/data/mock/mock_vendors.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -34,7 +36,13 @@ class VendorRepository { url += '&updated_at=${updatedAt - kUpdatedAtBufferSeconds}'; } - final dynamic response = await webClient.get(url, credentials.token); + dynamic response; + + if (Config.DEMO_MODE) { + response = json.decode(kMockVendors); + } else { + response = await webClient.get(url, credentials.token); + } final VendorListResponse vendorResponse = serializers.deserializeWith(VendorListResponse.serializer, response); diff --git a/lib/ui/app/main_screen.dart b/lib/ui/app/main_screen.dart index b80e49341..417a2b3b4 100644 --- a/lib/ui/app/main_screen.dart +++ b/lib/ui/app/main_screen.dart @@ -69,6 +69,39 @@ class MainScreen extends StatelessWidget { editWidget: QuoteEditScreen(), ); break; + case ProjectScreen.route: + screen = EntityScreens( + entityType: EntityType.project, + listWidget: ProjectScreenBuilder(), + viewWidget: ProjectViewScreen(), + editWidget: ProjectEditScreen(), + ); + break; + case TaskScreen.route: + screen = EntityScreens( + entityType: EntityType.task, + listWidget: TaskScreenBuilder(), + viewWidget: TaskViewScreen(), + editWidget: TaskEditScreen(), + ); + break; + case VendorScreen.route: + screen = EntityScreens( + entityType: EntityType.vendor, + listWidget: VendorScreenBuilder(), + viewWidget: VendorViewScreen(), + editWidget: VendorEditScreen(), + ); + break; + case ExpenseScreen.route: + screen = EntityScreens( + entityType: EntityType.expense, + listWidget: ExpenseScreenBuilder(), + viewWidget: ExpenseViewScreen(), + editWidget: ExpenseEditScreen(), + ); + break; + case SettingsScreen.route: screen = SettingsScreens(); break; diff --git a/lib/ui/app/menu_drawer.dart b/lib/ui/app/menu_drawer.dart index 3b2fe8ae3..3fb404e07 100644 --- a/lib/ui/app/menu_drawer.dart +++ b/lib/ui/app/menu_drawer.dart @@ -1,10 +1,15 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart'; +import 'package:invoiceninja_flutter/redux/project/project_actions.dart'; +import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; +import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart'; import 'package:invoiceninja_flutter/ui/app/debug/state_inspector.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/resources/cached_image.dart'; import 'package:redux/redux.dart'; +import 'package:invoiceninja_flutter/.env.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -166,7 +171,9 @@ class MenuDrawer extends StatelessWidget { children: [ DrawerTile( company: company, - icon: kIsWeb ? Icons.dashboard : FontAwesomeIcons.tachometerAlt, + icon: kIsWeb + ? Icons.dashboard + : FontAwesomeIcons.tachometerAlt, title: localization.dashboard, onTap: () => store.dispatch(ViewDashboard(context: context)), @@ -250,86 +257,86 @@ class MenuDrawer extends StatelessWidget { context: context)); }, ), - /* - DrawerTile( - company: company, - entityType: EntityType.project, - icon: getEntityIcon(EntityType.project), - title: localization.projects, - onTap: () => - store.dispatch(ViewProjectList(context: context)), - onCreateTap: () { - if (isMobile(context)) { - navigator.pop(); - } - store.dispatch(EditProject( - project: ProjectEntity(), context: context)); - }, - ), - DrawerTile( - company: company, - entityType: EntityType.task, - icon: getEntityIcon(EntityType.task), - title: localization.tasks, - onTap: () => - store.dispatch(ViewTaskList(context: context)), - onCreateTap: () { - if (isMobile(context)) { - navigator.pop(); - } - store.dispatch(EditTask( - task: TaskEntity( - isRunning: state.uiState.autoStartTasks), - context: context)); - }, - ), - DrawerTile( - company: company, - entityType: EntityType.vendor, - icon: getEntityIcon(EntityType.vendor), - title: localization.vendors, - onTap: () => - store.dispatch(ViewVendorList(context: context)), - onCreateTap: () { - if (isMobile(context)) { - navigator.pop(); - } - store.dispatch(EditVendor( - vendor: VendorEntity(), context: context)); - }, - ), - DrawerTile( - company: company, - entityType: EntityType.expense, - icon: getEntityIcon(EntityType.expense), - title: localization.expenses, - onTap: () => - store.dispatch(ViewExpenseList(context: context)), - onCreateTap: () { - if (isMobile(context)) { - navigator.pop(); - } - store.dispatch(EditExpense( - expense: ExpenseEntity( - company: company, uiState: state.uiState), - context: context)); - }, - ), - */ - // STARTER: menu - do not remove comment - DrawerTile( - company: company, - icon: kIsWeb ? Icons.settings : FontAwesomeIcons.cog, - title: localization.settings, - onTap: () { - if (isMobile(context)) { - navigator.pop(); - } - store.dispatch(ViewSettings( - context: context, - userCompany: state.userCompany)); - }, - ), + if (Config.DEMO_MODE) ...[ + DrawerTile( + company: company, + entityType: EntityType.project, + icon: getEntityIcon(EntityType.project), + title: localization.projects, + onTap: () => + store.dispatch(ViewProjectList(context: context)), + onCreateTap: () { + if (isMobile(context)) { + navigator.pop(); + } + store.dispatch(EditProject( + project: ProjectEntity(), context: context)); + }, + ), + DrawerTile( + company: company, + entityType: EntityType.task, + icon: getEntityIcon(EntityType.task), + title: localization.tasks, + onTap: () => + store.dispatch(ViewTaskList(context: context)), + onCreateTap: () { + if (isMobile(context)) { + navigator.pop(); + } + store.dispatch(EditTask( + task: TaskEntity( + isRunning: state.uiState.autoStartTasks), + context: context)); + }, + ), + DrawerTile( + company: company, + entityType: EntityType.vendor, + icon: getEntityIcon(EntityType.vendor), + title: localization.vendors, + onTap: () => + store.dispatch(ViewVendorList(context: context)), + onCreateTap: () { + if (isMobile(context)) { + navigator.pop(); + } + store.dispatch(EditVendor( + vendor: VendorEntity(), context: context)); + }, + ), + DrawerTile( + company: company, + entityType: EntityType.expense, + icon: getEntityIcon(EntityType.expense), + title: localization.expenses, + onTap: () => + store.dispatch(ViewExpenseList(context: context)), + onCreateTap: () { + if (isMobile(context)) { + navigator.pop(); + } + store.dispatch(EditExpense( + expense: ExpenseEntity( + company: company, uiState: state.uiState), + context: context)); + }, + ), + // STARTER: menu - do not remove comment + DrawerTile( + company: company, + icon: kIsWeb ? Icons.settings : FontAwesomeIcons.cog, + title: localization.settings, + onTap: () { + if (isMobile(context)) { + navigator.pop(); + } + store.dispatch(ViewSettings( + context: context, + userCompany: state.userCompany)); + }, + ), + ] ], )), Align( diff --git a/stubs/data/repositories/stub_repository b/stubs/data/repositories/stub_repository index 95c733c95..e56d8a2d4 100644 --- a/stubs/data/repositories/stub_repository +++ b/stubs/data/repositories/stub_repository @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:core'; +import 'package:invoiceninja_flutter/.env.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/serializers.dart';