Formatting
This commit is contained in:
parent
c422ebd7bc
commit
758155131a
|
|
@ -424,4 +424,3 @@ const kPageSizes = [
|
||||||
'Letter',
|
'Letter',
|
||||||
'Tabloid',
|
'Tabloid',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,8 +46,7 @@ class ClientRepository {
|
||||||
if (Config.DEMO_MODE) {
|
if (Config.DEMO_MODE) {
|
||||||
response = json.decode(kMockClients);
|
response = json.decode(kMockClients);
|
||||||
} else {
|
} else {
|
||||||
response =
|
response = await webClient.get(url, credentials.token);
|
||||||
await webClient.get(url, credentials.token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final ClientListResponse clientResponse =
|
final ClientListResponse clientResponse =
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,7 @@ class DocumentRepository {
|
||||||
if (Config.DEMO_MODE) {
|
if (Config.DEMO_MODE) {
|
||||||
response = json.decode(kMockDocuments);
|
response = json.decode(kMockDocuments);
|
||||||
} else {
|
} else {
|
||||||
response =
|
response = await webClient.get(url, credentials.token);
|
||||||
await webClient.get(url, credentials.token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final DocumentListResponse documentResponse =
|
final DocumentListResponse documentResponse =
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,7 @@ class InvoiceRepository {
|
||||||
if (Config.DEMO_MODE) {
|
if (Config.DEMO_MODE) {
|
||||||
response = json.decode(kMockInvoices);
|
response = json.decode(kMockInvoices);
|
||||||
} else {
|
} else {
|
||||||
response =
|
response = await webClient.get(url, credentials.token);
|
||||||
await webClient.get(url, credentials.token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final InvoiceListResponse invoiceResponse =
|
final InvoiceListResponse invoiceResponse =
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,7 @@ class PaymentRepository {
|
||||||
if (Config.DEMO_MODE) {
|
if (Config.DEMO_MODE) {
|
||||||
response = json.decode(kMockPayments);
|
response = json.decode(kMockPayments);
|
||||||
} else {
|
} else {
|
||||||
response =
|
response = await webClient.get(url, credentials.token);
|
||||||
await webClient.get(url, credentials.token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final PaymentListResponse paymentResponse =
|
final PaymentListResponse paymentResponse =
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,6 @@ Map<String, String> _getHeaders(String token) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
void _checkResponse(http.Response response) {
|
void _checkResponse(http.Response response) {
|
||||||
|
|
||||||
if (Config.DEMO_MODE) {
|
if (Config.DEMO_MODE) {
|
||||||
throw 'Saving is not supported in the demo';
|
throw 'Saving is not supported in the demo';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -226,8 +226,7 @@ class InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
|
||||||
final state = widget.store.state;
|
final state = widget.store.state;
|
||||||
Intl.defaultLocale = localeSelector(state);
|
Intl.defaultLocale = localeSelector(state);
|
||||||
final localization = AppLocalization(Locale(Intl.defaultLocale));
|
final localization = AppLocalization(Locale(Intl.defaultLocale));
|
||||||
final accentColor =
|
final accentColor = convertHexStringToColor(state.accentColor) ??
|
||||||
convertHexStringToColor(state.accentColor) ??
|
|
||||||
Colors.lightBlueAccent;
|
Colors.lightBlueAccent;
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
supportedLocales: kLanguages
|
supportedLocales: kLanguages
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
|
|
@ -314,15 +314,18 @@ void handleClientAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreClientRequest(
|
store.dispatch(RestoreClientRequest(
|
||||||
snackBarCompleter<Null>(context, localization.restoredClient), clientIds));
|
snackBarCompleter<Null>(context, localization.restoredClient),
|
||||||
|
clientIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveClientRequest(
|
store.dispatch(ArchiveClientRequest(
|
||||||
snackBarCompleter<Null>(context, localization.archivedClient), clientIds));
|
snackBarCompleter<Null>(context, localization.archivedClient),
|
||||||
|
clientIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteClientRequest(
|
store.dispatch(DeleteClientRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedClient), clientIds));
|
snackBarCompleter<Null>(context, localization.deletedClient),
|
||||||
|
clientIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.clientListState.isInMultiselect()) {
|
if (!store.state.clientListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -297,7 +297,8 @@ void handleExpenseAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteExpenseRequest(
|
store.dispatch(DeleteExpenseRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedExpense), expenseIds));
|
snackBarCompleter<Null>(context, localization.deletedExpense),
|
||||||
|
expenseIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.expenseListState.isInMultiselect()) {
|
if (!store.state.expenseListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -111,13 +111,12 @@ List<String> filteredExpensesSelector(
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedExpenseStatsForVendor = memo2((String vendorId,
|
var memoizedExpenseStatsForVendor = memo2(
|
||||||
BuiltMap<String, ExpenseEntity> expenseMap) =>
|
(String vendorId, BuiltMap<String, ExpenseEntity> expenseMap) =>
|
||||||
expenseStatsForVendor(vendorId, expenseMap));
|
expenseStatsForVendor(vendorId, expenseMap));
|
||||||
|
|
||||||
EntityStats expenseStatsForVendor(
|
EntityStats expenseStatsForVendor(
|
||||||
String vendorId,
|
String vendorId, BuiltMap<String, ExpenseEntity> expenseMap) {
|
||||||
BuiltMap<String, ExpenseEntity> expenseMap) {
|
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
expenseMap.forEach((expenseId, expense) {
|
expenseMap.forEach((expenseId, expense) {
|
||||||
|
|
@ -133,13 +132,12 @@ EntityStats expenseStatsForVendor(
|
||||||
return EntityStats(countActive: countActive, countArchived: countArchived);
|
return EntityStats(countActive: countActive, countArchived: countArchived);
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedExpenseStatsForClient = memo2((String clientId,
|
var memoizedExpenseStatsForClient = memo2(
|
||||||
BuiltMap<String, ExpenseEntity> expenseMap) =>
|
(String clientId, BuiltMap<String, ExpenseEntity> expenseMap) =>
|
||||||
expenseStatsForClient(clientId, expenseMap));
|
expenseStatsForClient(clientId, expenseMap));
|
||||||
|
|
||||||
EntityStats expenseStatsForClient(
|
EntityStats expenseStatsForClient(
|
||||||
String clientId,
|
String clientId, BuiltMap<String, ExpenseEntity> expenseMap) {
|
||||||
BuiltMap<String, ExpenseEntity> expenseMap) {
|
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
expenseMap.forEach((expenseId, expense) {
|
expenseMap.forEach((expenseId, expense) {
|
||||||
|
|
|
||||||
|
|
@ -242,7 +242,6 @@ class FilterGroupsByEntity implements PersistUI {
|
||||||
|
|
||||||
void handleGroupAction(
|
void handleGroupAction(
|
||||||
BuildContext context, List<BaseEntity> groups, EntityAction action) {
|
BuildContext context, List<BaseEntity> groups, EntityAction action) {
|
||||||
|
|
||||||
if (groups.isEmpty) {
|
if (groups.isEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -267,15 +266,18 @@ void handleGroupAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreGroupRequest(
|
store.dispatch(RestoreGroupRequest(
|
||||||
snackBarCompleter<Null>(context, localization.restoredGroup), groupIds));
|
snackBarCompleter<Null>(context, localization.restoredGroup),
|
||||||
|
groupIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveGroupRequest(
|
store.dispatch(ArchiveGroupRequest(
|
||||||
snackBarCompleter<Null>(context, localization.archivedGroup), groupIds));
|
snackBarCompleter<Null>(context, localization.archivedGroup),
|
||||||
|
groupIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteGroupRequest(
|
store.dispatch(DeleteGroupRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedGroup), groupIds));
|
snackBarCompleter<Null>(context, localization.deletedGroup),
|
||||||
|
groupIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.groupListState.isInMultiselect()) {
|
if (!store.state.groupListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -67,8 +67,8 @@ var memoizedClientStatsForGroup = memo2(
|
||||||
(BuiltMap<String, ClientEntity> clientMap, String groupId) =>
|
(BuiltMap<String, ClientEntity> clientMap, String groupId) =>
|
||||||
clientStatsForGroup(clientMap, groupId));
|
clientStatsForGroup(clientMap, groupId));
|
||||||
|
|
||||||
EntityStats clientStatsForGroup(BuiltMap<String, ClientEntity> clientMap,
|
EntityStats clientStatsForGroup(
|
||||||
String groupId) {
|
BuiltMap<String, ClientEntity> clientMap, String groupId) {
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
clientMap.forEach((clientId, client) {
|
clientMap.forEach((clientId, client) {
|
||||||
|
|
|
||||||
|
|
@ -381,7 +381,8 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
|
||||||
break;
|
break;
|
||||||
case EntityAction.sendEmail:
|
case EntityAction.sendEmail:
|
||||||
store.dispatch(ShowEmailInvoice(
|
store.dispatch(ShowEmailInvoice(
|
||||||
completer: snackBarCompleter<Null>(context, localization.emailedInvoice),
|
completer:
|
||||||
|
snackBarCompleter<Null>(context, localization.emailedInvoice),
|
||||||
invoice: invoice,
|
invoice: invoice,
|
||||||
context: context));
|
context: context));
|
||||||
break;
|
break;
|
||||||
|
|
@ -408,7 +409,8 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteInvoiceRequest(
|
store.dispatch(DeleteInvoiceRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedInvoice), invoiceIds));
|
snackBarCompleter<Null>(context, localization.deletedInvoice),
|
||||||
|
invoiceIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.invoiceListState.isInMultiselect()) {
|
if (!store.state.invoiceListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,8 @@ EntityUIState invoiceUIReducer(InvoiceUIState state, dynamic action) {
|
||||||
|
|
||||||
final editingItemIndexReducer = combineReducers<int>([
|
final editingItemIndexReducer = combineReducers<int>([
|
||||||
TypedReducer<int, EditInvoice>((index, action) => action.invoiceItemIndex),
|
TypedReducer<int, EditInvoice>((index, action) => action.invoiceItemIndex),
|
||||||
TypedReducer<int, EditInvoiceItem>((index, action) => action.invoiceItemIndex),
|
TypedReducer<int, EditInvoiceItem>(
|
||||||
|
(index, action) => action.invoiceItemIndex),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Reducer<String> dropdownFilterReducer = combineReducers([
|
Reducer<String> dropdownFilterReducer = combineReducers([
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,6 @@ List<String> filteredInvoicesSelector(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!invoice.matchesStates(invoiceListState.stateFilters)) {
|
if (!invoice.matchesStates(invoiceListState.stateFilters)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -102,13 +101,12 @@ List<String> filteredInvoicesSelector(
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedInvoiceStatsForClient = memo2((String clientId,
|
var memoizedInvoiceStatsForClient = memo2(
|
||||||
BuiltMap<String, InvoiceEntity> invoiceMap) =>
|
(String clientId, BuiltMap<String, InvoiceEntity> invoiceMap) =>
|
||||||
invoiceStatsForClient(clientId, invoiceMap));
|
invoiceStatsForClient(clientId, invoiceMap));
|
||||||
|
|
||||||
EntityStats invoiceStatsForClient(
|
EntityStats invoiceStatsForClient(
|
||||||
String clientId,
|
String clientId, BuiltMap<String, InvoiceEntity> invoiceMap) {
|
||||||
BuiltMap<String, InvoiceEntity> invoiceMap) {
|
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
invoiceMap.forEach((invoiceId, invoice) {
|
invoiceMap.forEach((invoiceId, invoice) {
|
||||||
|
|
@ -124,13 +122,12 @@ EntityStats invoiceStatsForClient(
|
||||||
return EntityStats(countActive: countActive, countArchived: countArchived);
|
return EntityStats(countActive: countActive, countArchived: countArchived);
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedInvoiceStatsForUser = memo2((String userId,
|
var memoizedInvoiceStatsForUser = memo2(
|
||||||
BuiltMap<String, InvoiceEntity> invoiceMap) =>
|
(String userId, BuiltMap<String, InvoiceEntity> invoiceMap) =>
|
||||||
invoiceStatsForUser(userId, invoiceMap));
|
invoiceStatsForUser(userId, invoiceMap));
|
||||||
|
|
||||||
EntityStats invoiceStatsForUser(
|
EntityStats invoiceStatsForUser(
|
||||||
String userId,
|
String userId, BuiltMap<String, InvoiceEntity> invoiceMap) {
|
||||||
BuiltMap<String, InvoiceEntity> invoiceMap) {
|
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
invoiceMap.forEach((invoiceId, invoice) {
|
invoiceMap.forEach((invoiceId, invoice) {
|
||||||
|
|
|
||||||
|
|
@ -278,7 +278,8 @@ void handlePaymentAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.sendEmail:
|
case EntityAction.sendEmail:
|
||||||
store.dispatch(EmailPaymentRequest(
|
store.dispatch(EmailPaymentRequest(
|
||||||
snackBarCompleter<Null>(context, localization.emailedPayment), payment));
|
snackBarCompleter<Null>(context, localization.emailedPayment),
|
||||||
|
payment));
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestorePaymentRequest(
|
store.dispatch(RestorePaymentRequest(
|
||||||
|
|
@ -292,7 +293,8 @@ void handlePaymentAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeletePaymentRequest(
|
store.dispatch(DeletePaymentRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedPayment), paymentIds));
|
snackBarCompleter<Null>(context, localization.deletedPayment),
|
||||||
|
paymentIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.paymentListState.isInMultiselect()) {
|
if (!store.state.paymentListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,8 @@ void handleProductAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteProductRequest(
|
store.dispatch(DeleteProductRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedProduct), productIds));
|
snackBarCompleter<Null>(context, localization.deletedProduct),
|
||||||
|
productIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.productListState.isInMultiselect()) {
|
if (!store.state.productListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -131,13 +131,12 @@ Duration taskDurationForProject(
|
||||||
return Duration(seconds: total);
|
return Duration(seconds: total);
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedProjectStatsForClient = memo2((String clientId,
|
var memoizedProjectStatsForClient = memo2(
|
||||||
BuiltMap<String, ProjectEntity> projectMap) =>
|
(String clientId, BuiltMap<String, ProjectEntity> projectMap) =>
|
||||||
projectStatsForClient(clientId, projectMap));
|
projectStatsForClient(clientId, projectMap));
|
||||||
|
|
||||||
EntityStats projectStatsForClient(
|
EntityStats projectStatsForClient(
|
||||||
String clientId,
|
String clientId, BuiltMap<String, ProjectEntity> projectMap) {
|
||||||
BuiltMap<String, ProjectEntity> projectMap) {
|
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
projectMap.forEach((projectId, project) {
|
projectMap.forEach((projectId, project) {
|
||||||
|
|
|
||||||
|
|
@ -409,7 +409,8 @@ Future handleQuoteAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.sendEmail:
|
case EntityAction.sendEmail:
|
||||||
store.dispatch(ShowEmailQuote(
|
store.dispatch(ShowEmailQuote(
|
||||||
completer: snackBarCompleter<Null>(context, localization.emailedQuote),
|
completer:
|
||||||
|
snackBarCompleter<Null>(context, localization.emailedQuote),
|
||||||
quote: quote,
|
quote: quote,
|
||||||
context: context));
|
context: context));
|
||||||
break;
|
break;
|
||||||
|
|
@ -422,15 +423,18 @@ Future handleQuoteAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreQuoteRequest(
|
store.dispatch(RestoreQuoteRequest(
|
||||||
snackBarCompleter<Null>(context, localization.restoredQuote), quoteIds));
|
snackBarCompleter<Null>(context, localization.restoredQuote),
|
||||||
|
quoteIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveQuoteRequest(
|
store.dispatch(ArchiveQuoteRequest(
|
||||||
snackBarCompleter<Null>(context, localization.archivedQuote), quoteIds));
|
snackBarCompleter<Null>(context, localization.archivedQuote),
|
||||||
|
quoteIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteQuoteRequest(
|
store.dispatch(DeleteQuoteRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedQuote), quoteIds));
|
snackBarCompleter<Null>(context, localization.deletedQuote),
|
||||||
|
quoteIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.quoteListState.isInMultiselect()) {
|
if (!store.state.quoteListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ List<String> filteredQuotesSelector(
|
||||||
final client =
|
final client =
|
||||||
clientMap[quote.clientId] ?? ClientEntity(id: quote.clientId);
|
clientMap[quote.clientId] ?? ClientEntity(id: quote.clientId);
|
||||||
|
|
||||||
|
|
||||||
if (quoteListState.filterEntityType == EntityType.client) {
|
if (quoteListState.filterEntityType == EntityType.client) {
|
||||||
if (!quoteListState.entityMatchesFilter(client)) {
|
if (!quoteListState.entityMatchesFilter(client)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -70,13 +69,12 @@ List<String> filteredQuotesSelector(
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedQuoteStatsForClient = memo2((String clientId,
|
var memoizedQuoteStatsForClient = memo2(
|
||||||
BuiltMap<String, InvoiceEntity> quoteMap) =>
|
(String clientId, BuiltMap<String, InvoiceEntity> quoteMap) =>
|
||||||
quoteStatsForClient(clientId, quoteMap));
|
quoteStatsForClient(clientId, quoteMap));
|
||||||
|
|
||||||
EntityStats quoteStatsForClient(
|
EntityStats quoteStatsForClient(
|
||||||
String clientId,
|
String clientId, BuiltMap<String, InvoiceEntity> quoteMap) {
|
||||||
BuiltMap<String, InvoiceEntity> quoteMap) {
|
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
quoteMap.forEach((quoteId, quote) {
|
quoteMap.forEach((quoteId, quote) {
|
||||||
|
|
@ -92,13 +90,14 @@ EntityStats quoteStatsForClient(
|
||||||
return EntityStats(countActive: countActive, countArchived: countArchived);
|
return EntityStats(countActive: countActive, countArchived: countArchived);
|
||||||
}
|
}
|
||||||
|
|
||||||
var memoizedQuoteStatsForUser = memo2((String userId,
|
var memoizedQuoteStatsForUser = memo2(
|
||||||
BuiltMap<String, InvoiceEntity> quoteMap) =>
|
(String userId, BuiltMap<String, InvoiceEntity> quoteMap) =>
|
||||||
quoteStatsForUser(userId, quoteMap));
|
quoteStatsForUser(userId, quoteMap));
|
||||||
|
|
||||||
EntityStats quoteStatsForUser(
|
EntityStats quoteStatsForUser(
|
||||||
String userId,
|
String userId,
|
||||||
BuiltMap<String, InvoiceEntity> quoteMap,) {
|
BuiltMap<String, InvoiceEntity> quoteMap,
|
||||||
|
) {
|
||||||
int countActive = 0;
|
int countActive = 0;
|
||||||
int countArchived = 0;
|
int countArchived = 0;
|
||||||
quoteMap.forEach((quoteId, quote) {
|
quoteMap.forEach((quoteId, quote) {
|
||||||
|
|
|
||||||
|
|
@ -345,11 +345,13 @@ void handleTaskAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreTaskRequest(
|
store.dispatch(RestoreTaskRequest(
|
||||||
snackBarCompleter<Null>(context, localization.restoredTask), taskIds));
|
snackBarCompleter<Null>(context, localization.restoredTask),
|
||||||
|
taskIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveTaskRequest(
|
store.dispatch(ArchiveTaskRequest(
|
||||||
snackBarCompleter<Null>(context, localization.archivedTask), taskIds));
|
snackBarCompleter<Null>(context, localization.archivedTask),
|
||||||
|
taskIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteTaskRequest(
|
store.dispatch(DeleteTaskRequest(
|
||||||
|
|
|
||||||
|
|
@ -273,7 +273,8 @@ void handleTaxRateAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteTaxRateRequest(
|
store.dispatch(DeleteTaxRateRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedTaxRate), taxRateIds));
|
snackBarCompleter<Null>(context, localization.deletedTaxRate),
|
||||||
|
taxRateIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.taxRateListState.isInMultiselect()) {
|
if (!store.state.taxRateListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,4 @@ abstract class UIState implements Built<UIState, UIStateBuilder> {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get isEditing => currentRoute.endsWith('edit');
|
bool get isEditing => currentRoute.endsWith('edit');
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,6 @@ class FilterUsersByEntity implements PersistUI {
|
||||||
|
|
||||||
void handleUserAction(
|
void handleUserAction(
|
||||||
BuildContext context, List<BaseEntity> users, EntityAction action) {
|
BuildContext context, List<BaseEntity> users, EntityAction action) {
|
||||||
|
|
||||||
if (users.isEmpty) {
|
if (users.isEmpty) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -261,11 +260,13 @@ void handleUserAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreUserRequest(
|
store.dispatch(RestoreUserRequest(
|
||||||
snackBarCompleter<Null>(context, localization.restoredUser), userIds));
|
snackBarCompleter<Null>(context, localization.restoredUser),
|
||||||
|
userIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveUserRequest(
|
store.dispatch(ArchiveUserRequest(
|
||||||
snackBarCompleter<Null>(context, localization.archivedUser), userIds));
|
snackBarCompleter<Null>(context, localization.archivedUser),
|
||||||
|
userIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteUserRequest(
|
store.dispatch(DeleteUserRequest(
|
||||||
|
|
|
||||||
|
|
@ -300,15 +300,18 @@ void handleVendorAction(
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreVendorRequest(
|
store.dispatch(RestoreVendorRequest(
|
||||||
snackBarCompleter<Null>(context, localization.restoredVendor), vendorIds));
|
snackBarCompleter<Null>(context, localization.restoredVendor),
|
||||||
|
vendorIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveVendorRequest(
|
store.dispatch(ArchiveVendorRequest(
|
||||||
snackBarCompleter<Null>(context, localization.archivedVendor), vendorIds));
|
snackBarCompleter<Null>(context, localization.archivedVendor),
|
||||||
|
vendorIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteVendorRequest(
|
store.dispatch(DeleteVendorRequest(
|
||||||
snackBarCompleter<Null>(context, localization.deletedVendor), vendorIds));
|
snackBarCompleter<Null>(context, localization.deletedVendor),
|
||||||
|
vendorIds));
|
||||||
break;
|
break;
|
||||||
case EntityAction.toggleMultiselect:
|
case EntityAction.toggleMultiselect:
|
||||||
if (!store.state.vendorListState.isInMultiselect()) {
|
if (!store.state.vendorListState.isInMultiselect()) {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,9 @@ class FormCard extends StatelessWidget {
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
left: 16.0, top: 16.0, right: 16.0, bottom: 20.0),
|
left: 16.0, top: 16.0, right: 16.0, bottom: 20.0),
|
||||||
child: child != null ? child : Container(
|
child: child != null
|
||||||
|
? child
|
||||||
|
: Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.max,
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
|
|
||||||
|
|
@ -97,10 +97,12 @@ class ListScaffold extends StatelessWidget {
|
||||||
builder: (context) => IconButton(
|
builder: (context) => IconButton(
|
||||||
icon: Icon(Icons.menu),
|
icon: Icon(Icons.menu),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (isMobile(context) || state.prefState.isHistoryFloated) {
|
if (isMobile(context) ||
|
||||||
|
state.prefState.isHistoryFloated) {
|
||||||
Scaffold.of(context).openEndDrawer();
|
Scaffold.of(context).openEndDrawer();
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(UserSettingsChanged(sidebar: AppSidebar.history));
|
store.dispatch(
|
||||||
|
UserSettingsChanged(sidebar: AppSidebar.history));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,9 @@ class ClientList extends StatelessWidget {
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
viewModel.onClientTap(context, client),
|
viewModel.onClientTap(context, client),
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection = store.state.prefState
|
final longPressIsSelection = store
|
||||||
|
.state
|
||||||
|
.prefState
|
||||||
.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
|
|
|
||||||
|
|
@ -90,9 +90,7 @@ class ClientScreen extends StatelessWidget {
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
await showEntityActionsDialog(
|
await showEntityActionsDialog(
|
||||||
entities: clients,
|
entities: clients, context: context, multiselect: true);
|
||||||
context: context,
|
|
||||||
multiselect: true);
|
|
||||||
store.dispatch(ClearClientMultiselect(context: context));
|
store.dispatch(ClearClientMultiselect(context: context));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -103,10 +103,10 @@ class ClientEditNotesState extends State<ClientEditNotes> {
|
||||||
labelText: localization.size,
|
labelText: localization.size,
|
||||||
items: memoizedSizeList(state.staticState.sizeMap)
|
items: memoizedSizeList(state.staticState.sizeMap)
|
||||||
.map((sizeId) => DropdownMenuItem(
|
.map((sizeId) => DropdownMenuItem(
|
||||||
child: Text(
|
child: Text(state.staticState.sizeMap[sizeId].name),
|
||||||
state.staticState.sizeMap[sizeId].name),
|
|
||||||
value: sizeId,
|
value: sizeId,
|
||||||
)).toList(),
|
))
|
||||||
|
.toList(),
|
||||||
onChanged: (dynamic sizeId) => viewModel.onChanged(
|
onChanged: (dynamic sizeId) => viewModel.onChanged(
|
||||||
client.rebuild((b) => b..sizeId = sizeId),
|
client.rebuild((b) => b..sizeId = sizeId),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -118,8 +118,8 @@ class ClientEditVM {
|
||||||
Navigator.of(context).pop(savedClient);
|
Navigator.of(context).pop(savedClient);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(
|
store.dispatch(ViewClient(
|
||||||
ViewClient(context: context, clientId: savedClient.id, force: true));
|
context: context, clientId: savedClient.id, force: true));
|
||||||
}
|
}
|
||||||
}).catchError((Object error) {
|
}).catchError((Object error) {
|
||||||
showDialog<ErrorDialog>(
|
showDialog<ErrorDialog>(
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,7 @@ class ClientOverview extends StatelessWidget {
|
||||||
final localization = AppLocalization.of(context);
|
final localization = AppLocalization.of(context);
|
||||||
final client = viewModel.client;
|
final client = viewModel.client;
|
||||||
final company = viewModel.company;
|
final company = viewModel.company;
|
||||||
final state = StoreProvider
|
final state = StoreProvider.of<AppState>(context).state;
|
||||||
.of<AppState>(context)
|
|
||||||
.state;
|
|
||||||
final statics = state.staticState;
|
final statics = state.staticState;
|
||||||
final fields = <String, String>{};
|
final fields = <String, String>{};
|
||||||
final group = client.hasGroup ? state.groupState.map[client.groupId] : null;
|
final group = client.hasGroup ? state.groupState.map[client.groupId] : null;
|
||||||
|
|
@ -73,9 +71,7 @@ class ClientOverview extends StatelessWidget {
|
||||||
: Container(),
|
: Container(),
|
||||||
if (client.hasGroup) ...[
|
if (client.hasGroup) ...[
|
||||||
Material(
|
Material(
|
||||||
color: Theme
|
color: Theme.of(context).canvasColor,
|
||||||
.of(context)
|
|
||||||
.canvasColor,
|
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
title: EntityStateTitle(entity: group),
|
title: EntityStateTitle(entity: group),
|
||||||
leading: Icon(getEntityIcon(EntityType.group), size: 18.0),
|
leading: Icon(getEntityIcon(EntityType.group), size: 18.0),
|
||||||
|
|
@ -167,7 +163,8 @@ class ClientOverview extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class EntityListTile extends StatelessWidget {
|
class EntityListTile extends StatelessWidget {
|
||||||
const EntityListTile({this.icon,
|
const EntityListTile(
|
||||||
|
{this.icon,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
this.onLongPress,
|
this.onLongPress,
|
||||||
this.title,
|
this.title,
|
||||||
|
|
@ -186,9 +183,7 @@ class EntityListTile extends StatelessWidget {
|
||||||
return Column(
|
return Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Material(
|
Material(
|
||||||
color: Theme
|
color: Theme.of(context).canvasColor,
|
||||||
.of(context)
|
|
||||||
.canvasColor,
|
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
title: Text(title),
|
title: Text(title),
|
||||||
subtitle: Text(subtitle),
|
subtitle: Text(subtitle),
|
||||||
|
|
|
||||||
|
|
@ -110,8 +110,7 @@ class ClientViewVM {
|
||||||
if (longPress && client.isActive) {
|
if (longPress && client.isActive) {
|
||||||
store.dispatch(EditQuote(
|
store.dispatch(EditQuote(
|
||||||
context: context,
|
context: context,
|
||||||
quote: InvoiceEntity(
|
quote: InvoiceEntity(company: state.company, isQuote: true)));
|
||||||
company: state.company, isQuote: true)));
|
|
||||||
store.dispatch(UpdateQuoteClient(client: client));
|
store.dispatch(UpdateQuoteClient(client: client));
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(FilterQuotesByEntity(
|
store.dispatch(FilterQuotesByEntity(
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,9 @@ class CompanyGatewayListItem extends StatelessWidget {
|
||||||
? () => onEntityAction(EntityAction.toggleMultiselect)
|
? () => onEntityAction(EntityAction.toggleMultiselect)
|
||||||
: onTap,
|
: onTap,
|
||||||
onLongPress: onLongPress,
|
onLongPress: onLongPress,
|
||||||
trailing: onRemovePressed == null ? null : FlatButton(
|
trailing: onRemovePressed == null
|
||||||
|
? null
|
||||||
|
: FlatButton(
|
||||||
child: Text(AppLocalization.of(context).remove),
|
child: Text(AppLocalization.of(context).remove),
|
||||||
onPressed: onRemovePressed,
|
onPressed: onRemovePressed,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -184,12 +184,8 @@ class DashboardPanels extends StatelessWidget {
|
||||||
final isLoaded = viewModel.state.invoiceState.isLoaded;
|
final isLoaded = viewModel.state.invoiceState.isLoaded;
|
||||||
final settings = viewModel.dashboardUIState;
|
final settings = viewModel.dashboardUIState;
|
||||||
final state = viewModel.state;
|
final state = viewModel.state;
|
||||||
final currentData = memoizedChartInvoices(
|
final currentData = memoizedChartInvoices(state.staticState.currencyMap,
|
||||||
state.staticState.currencyMap,
|
state.company, settings, state.invoiceState.map, state.clientState.map);
|
||||||
state.company,
|
|
||||||
settings,
|
|
||||||
state.invoiceState.map,
|
|
||||||
state.clientState.map);
|
|
||||||
|
|
||||||
List<ChartDataGroup> previousData;
|
List<ChartDataGroup> previousData;
|
||||||
if (settings.enableComparison) {
|
if (settings.enableComparison) {
|
||||||
|
|
@ -244,12 +240,8 @@ class DashboardPanels extends StatelessWidget {
|
||||||
final settings = viewModel.dashboardUIState;
|
final settings = viewModel.dashboardUIState;
|
||||||
final state = viewModel.state;
|
final state = viewModel.state;
|
||||||
final isLoaded = state.quoteState.isLoaded;
|
final isLoaded = state.quoteState.isLoaded;
|
||||||
final currentData = memoizedChartQuotes(
|
final currentData = memoizedChartQuotes(state.staticState.currencyMap,
|
||||||
state.staticState.currencyMap,
|
state.company, settings, state.quoteState.map, state.clientState.map);
|
||||||
state.company,
|
|
||||||
settings,
|
|
||||||
state.quoteState.map,
|
|
||||||
state.clientState.map);
|
|
||||||
|
|
||||||
List<ChartDataGroup> previousData;
|
List<ChartDataGroup> previousData;
|
||||||
if (settings.enableComparison) {
|
if (settings.enableComparison) {
|
||||||
|
|
|
||||||
|
|
@ -70,8 +70,8 @@ class _DashboardScreenState extends State<DashboardScreen>
|
||||||
? null
|
? null
|
||||||
: IconButton(
|
: IconButton(
|
||||||
icon: Icon(Icons.menu),
|
icon: Icon(Icons.menu),
|
||||||
onPressed: () =>
|
onPressed: () => store
|
||||||
store.dispatch(UserSettingsChanged(sidebar: AppSidebar.menu)),
|
.dispatch(UserSettingsChanged(sidebar: AppSidebar.menu)),
|
||||||
),
|
),
|
||||||
title: ListFilter(
|
title: ListFilter(
|
||||||
title: AppLocalization.of(context).dashboard,
|
title: AppLocalization.of(context).dashboard,
|
||||||
|
|
@ -96,7 +96,8 @@ class _DashboardScreenState extends State<DashboardScreen>
|
||||||
if (isMobile(context) || state.prefState.isHistoryFloated) {
|
if (isMobile(context) || state.prefState.isHistoryFloated) {
|
||||||
Scaffold.of(context).openEndDrawer();
|
Scaffold.of(context).openEndDrawer();
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(UserSettingsChanged(sidebar: AppSidebar.history));
|
store.dispatch(
|
||||||
|
UserSettingsChanged(sidebar: AppSidebar.history));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,7 @@ class DashboardVM {
|
||||||
onCurrencyChanged: (currencyId) =>
|
onCurrencyChanged: (currencyId) =>
|
||||||
store.dispatch(UpdateDashboardSettings(currencyId: currencyId)),
|
store.dispatch(UpdateDashboardSettings(currencyId: currencyId)),
|
||||||
filter: filter,
|
filter: filter,
|
||||||
filteredList:
|
filteredList: memoizedFilteredSelector(filter, state.userCompanyState),
|
||||||
memoizedFilteredSelector(filter, state.userCompanyState),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,9 @@ class DocumentList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection = store.state.prefState
|
final longPressIsSelection = store
|
||||||
|
.state
|
||||||
|
.prefState
|
||||||
.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,8 @@ class DocumentEditVM {
|
||||||
Navigator.of(context).pop(savedDocument);
|
Navigator.of(context).pop(savedDocument);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(ViewDocument(context: context, documentId: savedDocument.id, force: true));
|
store.dispatch(ViewDocument(
|
||||||
|
context: context, documentId: savedDocument.id, force: true));
|
||||||
}
|
}
|
||||||
}).catchError((Object error) {
|
}).catchError((Object error) {
|
||||||
showDialog<ErrorDialog>(
|
showDialog<ErrorDialog>(
|
||||||
|
|
|
||||||
|
|
@ -86,8 +86,8 @@ class GroupEditVM {
|
||||||
Navigator.of(context).pop(savedGroup);
|
Navigator.of(context).pop(savedGroup);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(
|
store.dispatch(ViewGroup(
|
||||||
ViewGroup(context: context, groupId: savedGroup.id, force: true));
|
context: context, groupId: savedGroup.id, force: true));
|
||||||
}
|
}
|
||||||
}).catchError((Object error) {
|
}).catchError((Object error) {
|
||||||
showDialog<ErrorDialog>(
|
showDialog<ErrorDialog>(
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,9 @@ class GroupList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection = store.state.prefState
|
final longPressIsSelection = store
|
||||||
|
.state
|
||||||
|
.prefState
|
||||||
.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
|
|
|
||||||
|
|
@ -93,9 +93,7 @@ class GroupSettingsScreen extends StatelessWidget {
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
await showEntityActionsDialog(
|
await showEntityActionsDialog(
|
||||||
entities: groups,
|
entities: groups, context: context, multiselect: true);
|
||||||
context: context,
|
|
||||||
multiselect: true);
|
|
||||||
store.dispatch(ClearGroupMultiselect(context: context));
|
store.dispatch(ClearGroupMultiselect(context: context));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -281,10 +281,8 @@ class SettingsViewer extends StatelessWidget {
|
||||||
settings.requireInvoiceSignature?.toString(),
|
settings.requireInvoiceSignature?.toString(),
|
||||||
localization.requireQuoteSignature:
|
localization.requireQuoteSignature:
|
||||||
settings.requireQuoteSignature?.toString(),
|
settings.requireQuoteSignature?.toString(),
|
||||||
localization.allPagesHeader:
|
localization.allPagesHeader: settings.allPagesHeader?.toString(),
|
||||||
settings.allPagesHeader?.toString(),
|
localization.allPagesFooter: settings.allPagesFooter?.toString(),
|
||||||
localization.allPagesFooter:
|
|
||||||
settings.allPagesFooter?.toString(),
|
|
||||||
//localization.enableReminder1: settings.enableReminder1,
|
//localization.enableReminder1: settings.enableReminder1,
|
||||||
//localization.enableReminder2: settings.enableReminder2,
|
//localization.enableReminder2: settings.enableReminder2,
|
||||||
//localization.enableReminder3: settings.enableReminder3,
|
//localization.enableReminder3: settings.enableReminder3,
|
||||||
|
|
|
||||||
|
|
@ -166,8 +166,8 @@ class InvoiceEditDetailsState extends State<InvoiceEditDetails> {
|
||||||
),
|
),
|
||||||
UserPicker(
|
UserPicker(
|
||||||
userId: invoice.assignedUserId,
|
userId: invoice.assignedUserId,
|
||||||
onChanged: (userId) => viewModel
|
onChanged: (userId) => viewModel.onChanged(
|
||||||
.onChanged(invoice.rebuild((b) => b..assignedUserId = userId)),
|
invoice.rebuild((b) => b..assignedUserId = userId)),
|
||||||
),
|
),
|
||||||
DatePicker(
|
DatePicker(
|
||||||
validator: (String val) => val.trim().isEmpty
|
validator: (String val) => val.trim().isEmpty
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,8 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector>
|
||||||
items.add(
|
items.add(
|
||||||
convertProductToInvoiceItem(product: product, context: context));
|
convertProductToInvoiceItem(product: product, context: context));
|
||||||
} else {
|
} else {
|
||||||
items.add(InvoiceItemEntity(productKey: product.productKey, quantity: 1));
|
items.add(
|
||||||
|
InvoiceItemEntity(productKey: product.productKey, quantity: 1));
|
||||||
}
|
}
|
||||||
} else if (entity.entityType == EntityType.task) {
|
} else if (entity.entityType == EntityType.task) {
|
||||||
final task = entity as TaskEntity;
|
final task = entity as TaskEntity;
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,8 @@ class InvoiceList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection =
|
final longPressIsSelection = state.prefState
|
||||||
state.prefState.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
handleInvoiceAction(context, [invoice],
|
handleInvoiceAction(context, [invoice],
|
||||||
|
|
|
||||||
|
|
@ -160,7 +160,8 @@ class InvoiceOverview extends StatelessWidget {
|
||||||
invoice: invoice,
|
invoice: invoice,
|
||||||
invoiceItem: invoiceItem,
|
invoiceItem: invoiceItem,
|
||||||
onTap: () => userCompany.canEditEntity(invoice)
|
onTap: () => userCompany.canEditEntity(invoice)
|
||||||
? viewModel.onEditPressed(context, invoice.lineItems.indexOf(invoiceItem))
|
? viewModel.onEditPressed(
|
||||||
|
context, invoice.lineItems.indexOf(invoiceItem))
|
||||||
: null,
|
: null,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -76,8 +76,8 @@ class PaymentList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection =
|
final longPressIsSelection = state.prefState
|
||||||
state.prefState.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
handlePaymentAction(context, [payment],
|
handlePaymentAction(context, [payment],
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,9 @@ class ProjectList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection = store.state.prefState
|
final longPressIsSelection = store
|
||||||
|
.state
|
||||||
|
.prefState
|
||||||
.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,8 @@ class ProjectViewVM {
|
||||||
if (longPress) {
|
if (longPress) {
|
||||||
showEntityActionsDialog(
|
showEntityActionsDialog(
|
||||||
context: context,
|
context: context,
|
||||||
entities: [client],);
|
entities: [client],
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(ViewClient(clientId: client.id, context: context));
|
store.dispatch(ViewClient(clientId: client.id, context: context));
|
||||||
}
|
}
|
||||||
|
|
@ -103,8 +104,8 @@ class ProjectViewVM {
|
||||||
},
|
},
|
||||||
onAddTaskPressed: (context) => store.dispatch(EditTask(
|
onAddTaskPressed: (context) => store.dispatch(EditTask(
|
||||||
context: context,
|
context: context,
|
||||||
task:
|
task: TaskEntity(isRunning: state.prefState.autoStartTasks)
|
||||||
TaskEntity(isRunning: state.prefState.autoStartTasks).rebuild((b) => b
|
.rebuild((b) => b
|
||||||
..projectId = project.id
|
..projectId = project.id
|
||||||
..clientId = project.clientId),
|
..clientId = project.clientId),
|
||||||
force: true,
|
force: true,
|
||||||
|
|
|
||||||
|
|
@ -126,8 +126,8 @@ class _ClientPortalState extends State<ClientPortal>
|
||||||
AppDropdownButton(
|
AppDropdownButton(
|
||||||
labelText: localization.portalMode,
|
labelText: localization.portalMode,
|
||||||
value: viewModel.company.portalMode,
|
value: viewModel.company.portalMode,
|
||||||
onChanged: (dynamic value) => viewModel.onCompanyChanged(viewModel
|
onChanged: (dynamic value) => viewModel.onCompanyChanged(
|
||||||
.company
|
viewModel.company
|
||||||
.rebuild((b) => b..portalMode = value)),
|
.rebuild((b) => b..portalMode = value)),
|
||||||
items: [
|
items: [
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
|
|
|
||||||
|
|
@ -292,7 +292,8 @@ class _CompanyDetailsState extends State<CompanyDetails>
|
||||||
child: Text(
|
child: Text(
|
||||||
state.staticState.sizeMap[sizeId].name),
|
state.staticState.sizeMap[sizeId].name),
|
||||||
value: sizeId,
|
value: sizeId,
|
||||||
)).toList(),
|
))
|
||||||
|
.toList(),
|
||||||
onChanged: (dynamic sizeId) => viewModel.onCompanyChanged(
|
onChanged: (dynamic sizeId) => viewModel.onCompanyChanged(
|
||||||
company.rebuild((b) => b..sizeId = sizeId),
|
company.rebuild((b) => b..sizeId = sizeId),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,8 @@ class _EmailSettingsState extends State<EmailSettings>
|
||||||
label: localization.enableMarkup,
|
label: localization.enableMarkup,
|
||||||
helpLabel: localization.enableMarkupHelp,
|
helpLabel: localization.enableMarkupHelp,
|
||||||
value: settings.enableEmailMarkup,
|
value: settings.enableEmailMarkup,
|
||||||
iconData: kIsWeb ? Icons.email : FontAwesomeIcons.solidEnvelope,
|
iconData:
|
||||||
|
kIsWeb ? Icons.email : FontAwesomeIcons.solidEnvelope,
|
||||||
onChanged: (value) => viewModel.onSettingsChanged(
|
onChanged: (value) => viewModel.onSettingsChanged(
|
||||||
settings.rebuild((b) => b..enableEmailMarkup = value)),
|
settings.rebuild((b) => b..enableEmailMarkup = value)),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -158,8 +158,9 @@ class _GeneratedNumbersState extends State<GeneratedNumbers>
|
||||||
AppDropdownButton(
|
AppDropdownButton(
|
||||||
labelText: localization.resetCounter,
|
labelText: localization.resetCounter,
|
||||||
value: settings.resetCounterFrequencyId,
|
value: settings.resetCounterFrequencyId,
|
||||||
onChanged: (dynamic value) => viewModel.onSettingsChanged(settings
|
onChanged: (dynamic value) => viewModel.onSettingsChanged(
|
||||||
.rebuild((b) => b..resetCounterFrequencyId = value)),
|
settings.rebuild(
|
||||||
|
(b) => b..resetCounterFrequencyId = value)),
|
||||||
items: [
|
items: [
|
||||||
DropdownMenuItem<String>(
|
DropdownMenuItem<String>(
|
||||||
child: Text(localization.never),
|
child: Text(localization.never),
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,8 @@ class _InvoiceDesignState extends State<InvoiceDesign>
|
||||||
AppDropdownButton(
|
AppDropdownButton(
|
||||||
labelText: localization.invoiceDesign,
|
labelText: localization.invoiceDesign,
|
||||||
value: settings.defaultInvoiceDesignId,
|
value: settings.defaultInvoiceDesignId,
|
||||||
onChanged: (dynamic value) => viewModel.onSettingsChanged(settings
|
onChanged: (dynamic value) => viewModel.onSettingsChanged(
|
||||||
|
settings
|
||||||
.rebuild((b) => b..defaultInvoiceDesignId = value)),
|
.rebuild((b) => b..defaultInvoiceDesignId = value)),
|
||||||
items: designs
|
items: designs
|
||||||
.map((designId) => DropdownMenuItem<String>(
|
.map((designId) => DropdownMenuItem<String>(
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,7 @@ class SettingsScreenBuilder extends StatelessWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SettingsScreenVM {
|
class SettingsScreenVM {
|
||||||
SettingsScreenVM({
|
SettingsScreenVM({@required this.state});
|
||||||
@required this.state
|
|
||||||
});
|
|
||||||
|
|
||||||
final AppState state;
|
final AppState state;
|
||||||
static SettingsScreenVM fromStore(Store<AppState> store) {
|
static SettingsScreenVM fromStore(Store<AppState> store) {
|
||||||
|
|
|
||||||
|
|
@ -315,8 +315,8 @@ class _TemplatesAndRemindersState extends State<TemplatesAndReminders>
|
||||||
AppDropdownButton(
|
AppDropdownButton(
|
||||||
labelText: localization.frequency,
|
labelText: localization.frequency,
|
||||||
value: settings.endlessReminderFrequencyId,
|
value: settings.endlessReminderFrequencyId,
|
||||||
onChanged: (dynamic value) => viewModel.onSettingsChanged(
|
onChanged: (dynamic value) =>
|
||||||
settings.rebuild(
|
viewModel.onSettingsChanged(settings.rebuild(
|
||||||
(b) => b..endlessReminderFrequencyId = value)),
|
(b) => b..endlessReminderFrequencyId = value)),
|
||||||
items: kFrequencies
|
items: kFrequencies
|
||||||
.map((id, frequency) =>
|
.map((id, frequency) =>
|
||||||
|
|
|
||||||
|
|
@ -75,8 +75,8 @@ class TaskList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection =
|
final longPressIsSelection = state.prefState
|
||||||
state.prefState.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
handleTaskAction(context, [task],
|
handleTaskAction(context, [task],
|
||||||
|
|
|
||||||
|
|
@ -90,9 +90,7 @@ class TaskScreen extends StatelessWidget {
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
await showEntityActionsDialog(
|
await showEntityActionsDialog(
|
||||||
entities: tasks,
|
entities: tasks, context: context, multiselect: true);
|
||||||
context: context,
|
|
||||||
multiselect: true);
|
|
||||||
store.dispatch(ClearTaskMultiselect(context: context));
|
store.dispatch(ClearTaskMultiselect(context: context));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,9 @@ class TaxRateList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection = store.state.prefState
|
final longPressIsSelection = store
|
||||||
|
.state
|
||||||
|
.prefState
|
||||||
.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
|
|
|
||||||
|
|
@ -94,9 +94,7 @@ class UserScreen extends StatelessWidget {
|
||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
await showEntityActionsDialog(
|
await showEntityActionsDialog(
|
||||||
entities: users,
|
entities: users, context: context, multiselect: true);
|
||||||
context: context,
|
|
||||||
multiselect: true);
|
|
||||||
store.dispatch(ClearUserMultiselect(context: context));
|
store.dispatch(ClearUserMultiselect(context: context));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -109,8 +109,7 @@ class UserViewVM {
|
||||||
if (longPress && user.isActive) {
|
if (longPress && user.isActive) {
|
||||||
store.dispatch(EditQuote(
|
store.dispatch(EditQuote(
|
||||||
context: context,
|
context: context,
|
||||||
quote: InvoiceEntity(
|
quote: InvoiceEntity(company: state.company, isQuote: true)));
|
||||||
company: state.company, isQuote: true)));
|
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(FilterQuotesByEntity(
|
store.dispatch(FilterQuotesByEntity(
|
||||||
entityId: user.id, entityType: EntityType.user));
|
entityId: user.id, entityType: EntityType.user));
|
||||||
|
|
|
||||||
|
|
@ -100,8 +100,8 @@ class VendorEditVM {
|
||||||
Navigator.of(context).pop(savedVendor);
|
Navigator.of(context).pop(savedVendor);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(
|
store.dispatch(ViewVendor(
|
||||||
ViewVendor(context: context, vendorId: savedVendor.id, force: true));
|
context: context, vendorId: savedVendor.id, force: true));
|
||||||
}
|
}
|
||||||
}).catchError((Object error) {
|
}).catchError((Object error) {
|
||||||
showDialog<ErrorDialog>(
|
showDialog<ErrorDialog>(
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,9 @@ class VendorList extends StatelessWidget {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () async {
|
onLongPress: () async {
|
||||||
final longPressIsSelection = store.state.prefState
|
final longPressIsSelection = store
|
||||||
|
.state
|
||||||
|
.prefState
|
||||||
.longPressSelectionIsDefault ??
|
.longPressSelectionIsDefault ??
|
||||||
true;
|
true;
|
||||||
if (longPressIsSelection && !isInMultiselect) {
|
if (longPressIsSelection && !isInMultiselect) {
|
||||||
|
|
|
||||||
|
|
@ -95,8 +95,8 @@ class VendorViewVM {
|
||||||
if (longPress && vendor.isActive) {
|
if (longPress && vendor.isActive) {
|
||||||
store.dispatch(EditExpense(
|
store.dispatch(EditExpense(
|
||||||
context: context,
|
context: context,
|
||||||
expense: ExpenseEntity(
|
expense:
|
||||||
company: state.company, vendor: vendor)));
|
ExpenseEntity(company: state.company, vendor: vendor)));
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(FilterExpensesByEntity(
|
store.dispatch(FilterExpensesByEntity(
|
||||||
entityId: vendor.id, entityType: EntityType.vendor));
|
entityId: vendor.id, entityType: EntityType.vendor));
|
||||||
|
|
|
||||||
|
|
@ -64,8 +64,7 @@ String formatNumber(
|
||||||
|
|
||||||
final state = StoreProvider.of<AppState>(context).state;
|
final state = StoreProvider.of<AppState>(context).state;
|
||||||
final CompanyEntity company = state.company;
|
final CompanyEntity company = state.company;
|
||||||
final ClientEntity client =
|
final ClientEntity client = state.userCompanyState.clientState.map[clientId];
|
||||||
state.userCompanyState.clientState.map[clientId];
|
|
||||||
|
|
||||||
String countryId;
|
String countryId;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,6 @@ IconData getEntityIcon(EntityType entityType) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (entityType) {
|
switch (entityType) {
|
||||||
case EntityType.product:
|
case EntityType.product:
|
||||||
return FontAwesomeIcons.cube;
|
return FontAwesomeIcons.cube;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue