This commit is contained in:
Hillel Coren 2019-11-13 15:30:50 +02:00
parent e498e51e3d
commit 399e1b6f4d
26 changed files with 247 additions and 99 deletions

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponseClients = '''
const dynamic kMockClients = '''
{
"data": [],
"meta": {

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponseDashboard = '''
const dynamic kMockDashboard = '''
{
"data": {
"activities": []

View File

@ -0,0 +1,15 @@
const dynamic kMockExpenses = '''
{
"data": [],
"meta": {
"pagination": {
"total": 0,
"count": 0,
"per_page": 5000,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
}
''';

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponseInvoices = '''
const dynamic kMockInvoices = '''
{
"data": [],
"meta": {

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponseLogin = '''
const dynamic kMockLogin = '''
{
"data": [
{

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponsePayments = '''
const dynamic kMockPayments = '''
{
"data": [],
"meta": {

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponseProducts = '''
const dynamic kMockProducts = '''
{
"data": [],
"meta": {

View File

@ -0,0 +1,15 @@
const dynamic kMockProjects = '''
{
"data": [],
"meta": {
"pagination": {
"total": 0,
"count": 0,
"per_page": 5000,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
}
''';

View File

@ -1,4 +1,4 @@
const dynamic kAPIResponseQuotes = '''
const dynamic kMockQuotes = '''
{
"data": [],
"meta": {

View File

@ -0,0 +1,15 @@
const dynamic kMockTasks = '''
{
"data": [],
"meta": {
"pagination": {
"total": 0,
"count": 0,
"per_page": 5000,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
}
''';

View File

@ -0,0 +1,15 @@
const dynamic kMockVendors = '''
{
"data": [],
"meta": {
"pagination": {
"total": 0,
"count": 0,
"per_page": 5000,
"current_page": 1,
"total_pages": 1,
"links": []
}
}
}
''';

View File

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

View File

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

View File

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

View File

@ -18,7 +18,7 @@ class DashboardRepository {
Future<DashboardEntity> 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',

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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: <Widget>[
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(

View File

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