Merge branch 'develop'

This commit is contained in:
Hillel Coren 2023-12-27 15:16:21 +02:00
commit 1e29930051
12 changed files with 331 additions and 133 deletions

View File

@ -44,20 +44,17 @@ PODS:
- DKImagePickerController/PhotoGallery
- Flutter
- Flutter (1.0.0)
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- google_sign_in_ios (0.0.1):
- Flutter
- GoogleSignIn (~> 6.2)
- GoogleSignIn (6.2.4):
- GoogleSignIn (~> 7.0)
- GoogleSignIn (7.0.0):
- AppAuth (~> 1.5)
- GTMAppAuth (~> 1.3)
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
- GTMAppAuth (1.3.1):
- GTMAppAuth (< 3.0, >= 1.3)
- GTMSessionFetcher/Core (< 4.0, >= 1.1)
- GTMAppAuth (2.0.0):
- AppAuth/Core (~> 1.6)
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
- GTMSessionFetcher/Core (2.3.0)
- GTMSessionFetcher/Core (< 4.0, >= 1.5)
- GTMSessionFetcher/Core (3.2.0)
- image_cropper (0.0.4):
- Flutter
- TOCropViewController (~> 2.6.1)
@ -81,16 +78,16 @@ PODS:
- Flutter
- printing (1.0.0):
- Flutter
- SDWebImage (5.18.5):
- SDWebImage/Core (= 5.18.5)
- SDWebImage/Core (5.18.5)
- Sentry/HybridSDK (8.14.2):
- SentryPrivate (= 8.14.2)
- SDWebImage (5.18.7):
- SDWebImage/Core (= 5.18.7)
- SDWebImage/Core (5.18.7)
- Sentry/HybridSDK (8.15.2):
- SentryPrivate (= 8.15.2)
- sentry_flutter (0.0.1):
- Flutter
- FlutterMacOS
- Sentry/HybridSDK (= 8.14.2)
- SentryPrivate (8.14.2)
- Sentry/HybridSDK (= 8.15.2)
- SentryPrivate (8.15.2)
- share_plus (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
@ -100,9 +97,6 @@ PODS:
- Flutter
- smart_auth (0.0.1):
- Flutter
- sqflite (0.0.3):
- Flutter
- FMDB (>= 2.7.5)
- SwiftyGif (5.4.4)
- TOCropViewController (2.6.1)
- url_launcher_ios (0.0.1):
@ -133,7 +127,6 @@ DEPENDENCIES:
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
- smart_auth (from `.symlinks/plugins/smart_auth/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
- widget_kit_plugin (from `.symlinks/plugins/widget_kit_plugin/ios`)
@ -143,7 +136,6 @@ SPEC REPOS:
- AppAuth
- DKImagePickerController
- DKPhotoGallery
- FMDB
- GoogleSignIn
- GTMAppAuth
- GTMSessionFetcher
@ -194,8 +186,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/sign_in_with_apple/ios"
smart_auth:
:path: ".symlinks/plugins/smart_auth/ios"
sqflite:
:path: ".symlinks/plugins/sqflite/ios"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
webview_flutter_wkwebview:
@ -211,11 +201,10 @@ SPEC CHECKSUMS:
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
google_sign_in_ios: 1256ff9d941db546373826966720b0c24804bcdd
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
google_sign_in_ios: 8115e3fbe097e6509beb819ed602d47369d9011f
GoogleSignIn: b232380cf495a429b8095d3178a8d5855b42e842
GTMAppAuth: 99fb010047ba3973b7026e45393f51f27ab965ae
GTMSessionFetcher: 41b9ef0b4c08a6db4b7eb51a21ae5183ec99a2c8
image_cropper: a3291c624a953049bc6a02e1f8c8ceb162a24b25
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43
@ -226,18 +215,17 @@ SPEC CHECKSUMS:
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
printing: 233e1b73bd1f4a05615548e9b5a324c98588640b
SDWebImage: 7ac2b7ddc5e8484c79aa90fc4e30b149d6a2c88f
Sentry: e0ea366f95ebb68f26d6030d8c22d6b2e6d23dd0
sentry_flutter: 9a04c51c373d76ee22167bf1e65bc468c0a91fed
SentryPrivate: 949a21fa59872427edc73b524c3ec8456761d97f
SDWebImage: f9258c58221ed854cfa0e2b80ee4033710b1c6d3
Sentry: 6f5742b4c47c17c9adcf265f6f328cf4a0ed1923
sentry_flutter: 2c309a1d4b45e59d02cfa15795705687f1e2081b
SentryPrivate: b2f7996f37781080f04a946eb4e377ff63c64195
share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
smart_auth: 4bedbc118723912d0e45a07e8ab34039c19e04f2
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b
webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a
widget_kit_plugin: a245a5248f0cd2bde580285ebe6bee5c6f1f6ce1

View File

@ -20,7 +20,7 @@ const String kWhiteLabelUrl =
'https://app.invoiceninja.com/buy_now/?account_key=AsFmBAeLXF0IKf7tmi0eiyZfmWW9hxMT&product_id=3';
const String kPrivacyPolicyURL = 'https://www.invoiceninja.com/privacy-policy';
const String kTermsOfServiceURL = 'https://www.invoiceninja.com/terms';
const String kBankingURL = 'https://invoiceninja.com/banking/';
const String kBankingURL = 'https://invoiceninja.com/banking';
const String kTransifexURL =
'https://www.transifex.com/invoice-ninja/invoice-ninja';
const String kWebhookSiteURL = 'https://requestcatcher.com';
@ -53,6 +53,11 @@ const String kFacebookUrl = 'https://www.facebook.com/invoiceninja';
const String kYouTubeUrl =
'https://www.youtube.com/channel/UCXAHcBvhW05PDtWYIq7WDFA/videos';
const String kYodleeCoverageUrl =
'https://www.yodlee.com/open-banking/data-connections';
const String kNordigenCoverageUrl =
'https://gocardless.com/bank-account-data/coverage';
const String kTaskExtensionUrl =
'https://chromewebstore.google.com/detail/invoice-ninja-tasks/dlfcbfdpemfnjbjlladogijcchfmmaaf';
const String kTaskExtensionYouTubeUrl =

View File

@ -73,11 +73,15 @@ abstract class BankAccountEntity extends Object
disabledUpstream: false,
fromDate: '',
autoSync: false,
integrationType: '',
);
}
BankAccountEntity._();
static const String INTEGRATION_TYPE_YODLEE = 'yodlee';
static const String INTEGRATION_TYPE_NORDIGEN = 'nordigen';
@override
@memoized
int get hashCode;
@ -103,6 +107,9 @@ abstract class BankAccountEntity extends Object
@BuiltValueField(wireName: 'disabled_upstream')
bool get disabledUpstream;
@BuiltValueField(wireName: 'integration_type')
String get integrationType;
double get balance;
String get currency;
@ -203,7 +210,8 @@ abstract class BankAccountEntity extends Object
static void _initializeBuilder(BankAccountEntityBuilder builder) => builder
..fromDate = ''
..disabledUpstream = false
..autoSync = false;
..autoSync = false
..integrationType = '';
static Serializer<BankAccountEntity> get serializer =>
_$bankAccountEntitySerializer;

View File

@ -139,6 +139,9 @@ class _$BankAccountEntitySerializer
'disabled_upstream',
serializers.serialize(object.disabledUpstream,
specifiedType: const FullType(bool)),
'integration_type',
serializers.serialize(object.integrationType,
specifiedType: const FullType(String)),
'balance',
serializers.serialize(object.balance,
specifiedType: const FullType(double)),
@ -229,6 +232,10 @@ class _$BankAccountEntitySerializer
result.disabledUpstream = serializers.deserialize(value,
specifiedType: const FullType(bool))! as bool;
break;
case 'integration_type':
result.integrationType = serializers.deserialize(value,
specifiedType: const FullType(String))! as String;
break;
case 'balance':
result.balance = serializers.deserialize(value,
specifiedType: const FullType(double))! as double;
@ -494,6 +501,8 @@ class _$BankAccountEntity extends BankAccountEntity {
@override
final bool disabledUpstream;
@override
final String integrationType;
@override
final double balance;
@override
final String currency;
@ -526,6 +535,7 @@ class _$BankAccountEntity extends BankAccountEntity {
required this.fromDate,
required this.autoSync,
required this.disabledUpstream,
required this.integrationType,
required this.balance,
required this.currency,
this.isChanged,
@ -549,6 +559,8 @@ class _$BankAccountEntity extends BankAccountEntity {
autoSync, r'BankAccountEntity', 'autoSync');
BuiltValueNullFieldError.checkNotNull(
disabledUpstream, r'BankAccountEntity', 'disabledUpstream');
BuiltValueNullFieldError.checkNotNull(
integrationType, r'BankAccountEntity', 'integrationType');
BuiltValueNullFieldError.checkNotNull(
balance, r'BankAccountEntity', 'balance');
BuiltValueNullFieldError.checkNotNull(
@ -581,6 +593,7 @@ class _$BankAccountEntity extends BankAccountEntity {
fromDate == other.fromDate &&
autoSync == other.autoSync &&
disabledUpstream == other.disabledUpstream &&
integrationType == other.integrationType &&
balance == other.balance &&
currency == other.currency &&
isChanged == other.isChanged &&
@ -605,6 +618,7 @@ class _$BankAccountEntity extends BankAccountEntity {
_$hash = $jc(_$hash, fromDate.hashCode);
_$hash = $jc(_$hash, autoSync.hashCode);
_$hash = $jc(_$hash, disabledUpstream.hashCode);
_$hash = $jc(_$hash, integrationType.hashCode);
_$hash = $jc(_$hash, balance.hashCode);
_$hash = $jc(_$hash, currency.hashCode);
_$hash = $jc(_$hash, isChanged.hashCode);
@ -629,6 +643,7 @@ class _$BankAccountEntity extends BankAccountEntity {
..add('fromDate', fromDate)
..add('autoSync', autoSync)
..add('disabledUpstream', disabledUpstream)
..add('integrationType', integrationType)
..add('balance', balance)
..add('currency', currency)
..add('isChanged', isChanged)
@ -676,6 +691,11 @@ class BankAccountEntityBuilder
set disabledUpstream(bool? disabledUpstream) =>
_$this._disabledUpstream = disabledUpstream;
String? _integrationType;
String? get integrationType => _$this._integrationType;
set integrationType(String? integrationType) =>
_$this._integrationType = integrationType;
double? _balance;
double? get balance => _$this._balance;
set balance(double? balance) => _$this._balance = balance;
@ -732,6 +752,7 @@ class BankAccountEntityBuilder
_fromDate = $v.fromDate;
_autoSync = $v.autoSync;
_disabledUpstream = $v.disabledUpstream;
_integrationType = $v.integrationType;
_balance = $v.balance;
_currency = $v.currency;
_isChanged = $v.isChanged;
@ -778,10 +799,11 @@ class BankAccountEntityBuilder
autoSync, r'BankAccountEntity', 'autoSync'),
disabledUpstream: BuiltValueNullFieldError.checkNotNull(
disabledUpstream, r'BankAccountEntity', 'disabledUpstream'),
integrationType: BuiltValueNullFieldError.checkNotNull(
integrationType, r'BankAccountEntity', 'integrationType'),
balance: BuiltValueNullFieldError.checkNotNull(
balance, r'BankAccountEntity', 'balance'),
currency: BuiltValueNullFieldError.checkNotNull(
currency, r'BankAccountEntity', 'currency'),
currency: BuiltValueNullFieldError.checkNotNull(currency, r'BankAccountEntity', 'currency'),
isChanged: isChanged,
createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, r'BankAccountEntity', 'createdAt'),
updatedAt: BuiltValueNullFieldError.checkNotNull(updatedAt, r'BankAccountEntity', 'updatedAt'),

View File

@ -107,6 +107,8 @@ abstract class TransactionEntity extends Object
categoryId: '',
transactionRuleId: '',
paymentId: '',
participant: '',
participantName: '',
);
}
@ -161,7 +163,11 @@ abstract class TransactionEntity extends Object
@BuiltValueField(wireName: 'bank_transaction_rule_id')
String get transactionRuleId;
@BuiltValueField(serialize: false)
@BuiltValueField(wireName: 'participant_name')
String get participantName;
String get participant;
String? get pendingVendorId;
@BuiltValueField(serialize: false)
@ -383,7 +389,9 @@ abstract class TransactionEntity extends Object
..bankAccountId = ''
..transactionRuleId = ''
..paymentId = ''
..currencyId = '';
..currencyId = ''
..participantName = ''
..participant = '';
static Serializer<TransactionEntity> get serializer =>
_$transactionEntitySerializer;

View File

@ -166,6 +166,12 @@ class _$TransactionEntitySerializer
'bank_transaction_rule_id',
serializers.serialize(object.transactionRuleId,
specifiedType: const FullType(String)),
'participant_name',
serializers.serialize(object.participantName,
specifiedType: const FullType(String)),
'participant',
serializers.serialize(object.participant,
specifiedType: const FullType(String)),
'created_at',
serializers.serialize(object.createdAt,
specifiedType: const FullType(int)),
@ -179,6 +185,13 @@ class _$TransactionEntitySerializer
serializers.serialize(object.id, specifiedType: const FullType(String)),
];
Object? value;
value = object.pendingVendorId;
if (value != null) {
result
..add('pendingVendorId')
..add(serializers.serialize(value,
specifiedType: const FullType(String)));
}
value = object.isChanged;
if (value != null) {
result
@ -282,6 +295,18 @@ class _$TransactionEntitySerializer
result.transactionRuleId = serializers.deserialize(value,
specifiedType: const FullType(String))! as String;
break;
case 'participant_name':
result.participantName = serializers.deserialize(value,
specifiedType: const FullType(String))! as String;
break;
case 'participant':
result.participant = serializers.deserialize(value,
specifiedType: const FullType(String))! as String;
break;
case 'pendingVendorId':
result.pendingVendorId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String?;
break;
case 'isChanged':
result.isChanged = serializers.deserialize(value,
specifiedType: const FullType(bool)) as bool?;
@ -606,6 +631,10 @@ class _$TransactionEntity extends TransactionEntity {
@override
final String transactionRuleId;
@override
final String participantName;
@override
final String participant;
@override
final String? pendingVendorId;
@override
final String? pendingCategoryId;
@ -648,6 +677,8 @@ class _$TransactionEntity extends TransactionEntity {
required this.vendorId,
required this.transactionId,
required this.transactionRuleId,
required this.participantName,
required this.participant,
this.pendingVendorId,
this.pendingCategoryId,
this.pendingExpenseId,
@ -689,6 +720,10 @@ class _$TransactionEntity extends TransactionEntity {
transactionId, r'TransactionEntity', 'transactionId');
BuiltValueNullFieldError.checkNotNull(
transactionRuleId, r'TransactionEntity', 'transactionRuleId');
BuiltValueNullFieldError.checkNotNull(
participantName, r'TransactionEntity', 'participantName');
BuiltValueNullFieldError.checkNotNull(
participant, r'TransactionEntity', 'participant');
BuiltValueNullFieldError.checkNotNull(
createdAt, r'TransactionEntity', 'createdAt');
BuiltValueNullFieldError.checkNotNull(
@ -725,6 +760,8 @@ class _$TransactionEntity extends TransactionEntity {
vendorId == other.vendorId &&
transactionId == other.transactionId &&
transactionRuleId == other.transactionRuleId &&
participantName == other.participantName &&
participant == other.participant &&
pendingVendorId == other.pendingVendorId &&
pendingCategoryId == other.pendingCategoryId &&
pendingExpenseId == other.pendingExpenseId &&
@ -758,6 +795,8 @@ class _$TransactionEntity extends TransactionEntity {
_$hash = $jc(_$hash, vendorId.hashCode);
_$hash = $jc(_$hash, transactionId.hashCode);
_$hash = $jc(_$hash, transactionRuleId.hashCode);
_$hash = $jc(_$hash, participantName.hashCode);
_$hash = $jc(_$hash, participant.hashCode);
_$hash = $jc(_$hash, pendingVendorId.hashCode);
_$hash = $jc(_$hash, pendingCategoryId.hashCode);
_$hash = $jc(_$hash, pendingExpenseId.hashCode);
@ -791,6 +830,8 @@ class _$TransactionEntity extends TransactionEntity {
..add('vendorId', vendorId)
..add('transactionId', transactionId)
..add('transactionRuleId', transactionRuleId)
..add('participantName', participantName)
..add('participant', participant)
..add('pendingVendorId', pendingVendorId)
..add('pendingCategoryId', pendingCategoryId)
..add('pendingExpenseId', pendingExpenseId)
@ -873,6 +914,15 @@ class TransactionEntityBuilder
set transactionRuleId(String? transactionRuleId) =>
_$this._transactionRuleId = transactionRuleId;
String? _participantName;
String? get participantName => _$this._participantName;
set participantName(String? participantName) =>
_$this._participantName = participantName;
String? _participant;
String? get participant => _$this._participant;
set participant(String? participant) => _$this._participant = participant;
String? _pendingVendorId;
String? get pendingVendorId => _$this._pendingVendorId;
set pendingVendorId(String? pendingVendorId) =>
@ -944,6 +994,8 @@ class TransactionEntityBuilder
_vendorId = $v.vendorId;
_transactionId = $v.transactionId;
_transactionRuleId = $v.transactionRuleId;
_participantName = $v.participantName;
_participant = $v.participant;
_pendingVendorId = $v.pendingVendorId;
_pendingCategoryId = $v.pendingCategoryId;
_pendingExpenseId = $v.pendingExpenseId;
@ -1001,6 +1053,8 @@ class TransactionEntityBuilder
vendorId: BuiltValueNullFieldError.checkNotNull(vendorId, r'TransactionEntity', 'vendorId'),
transactionId: BuiltValueNullFieldError.checkNotNull(transactionId, r'TransactionEntity', 'transactionId'),
transactionRuleId: BuiltValueNullFieldError.checkNotNull(transactionRuleId, r'TransactionEntity', 'transactionRuleId'),
participantName: BuiltValueNullFieldError.checkNotNull(participantName, r'TransactionEntity', 'participantName'),
participant: BuiltValueNullFieldError.checkNotNull(participant, r'TransactionEntity', 'participant'),
pendingVendorId: pendingVendorId,
pendingCategoryId: pendingCategoryId,
pendingExpenseId: pendingExpenseId,

View File

@ -6,6 +6,7 @@ import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/icon_text.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
class AppButton extends StatelessWidget {
const AppButton({
@ -38,7 +39,7 @@ class AppButton extends StatelessWidget {
color: Colors.white,
),
),
child: iconData != null
child: iconData != null && isDesktop(context)
? IconText(
icon: iconData,
text: label,

View File

@ -12,11 +12,13 @@ class LearnMoreUrl extends StatelessWidget {
required this.child,
required this.url,
this.label,
this.isVertical = false,
});
final Widget child;
final String url;
final String? label;
final bool isVertical;
@override
Widget build(BuildContext context) {
@ -26,6 +28,22 @@ class LearnMoreUrl extends StatelessWidget {
return child;
}
if (isVertical) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
child,
SizedBox(height: 8),
OutlinedButton(
child: Text(
label ?? localization!.learnMore,
maxLines: 4,
),
onPressed: () => launchUrl(Uri.parse(url)),
),
],
);
} else {
return Row(
children: <Widget>[
Expanded(
@ -47,6 +65,7 @@ class LearnMoreUrl extends StatelessWidget {
],
);
}
}
}
class LearnMoreDialog extends StatelessWidget {

View File

@ -19,6 +19,7 @@ import 'package:invoiceninja_flutter/ui/bank_account/bank_account_presenter.dart
import 'package:invoiceninja_flutter/utils/dialogs.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:url_launcher/url_launcher.dart';
import 'bank_account_screen_vm.dart';
@ -34,6 +35,88 @@ class BankAccountScreen extends StatelessWidget {
final BankAccountScreenVM viewModel;
void connectAccounts(BuildContext context) {
final localization = AppLocalization.of(context)!;
if (isSelfHosted(context)) {
_connectAccounts(context, BankAccountEntity.INTEGRATION_TYPE_NORDIGEN);
} else {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(localization.selectProvider),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: Text(localization.close.toUpperCase()))
],
content: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text('Envestnet - Yodlee'),
Text(localization.yodleeRegions,
style: Theme.of(context).textTheme.bodySmall),
Row(
children: [
Expanded(
child: AppButton(
label: localization.learnMore.toUpperCase(),
onPressed: () =>
launchUrl(Uri.parse(kYodleeCoverageUrl)),
iconData: Icons.info_outline,
),
),
SizedBox(width: kTableColumnGap),
Expanded(
child: AppButton(
label: localization.connect.toUpperCase(),
onPressed: () => _connectAccounts(
context,
BankAccountEntity.INTEGRATION_TYPE_YODLEE,
),
iconData: Icons.link,
),
),
],
),
SizedBox(height: 30),
Text('GoCardless - Nordigen'),
Text(localization.nordigenRegions,
style: Theme.of(context).textTheme.bodySmall),
Row(
children: [
Expanded(
child: AppButton(
label: localization.learnMore.toUpperCase(),
onPressed: () =>
launchUrl(Uri.parse(kNordigenCoverageUrl)),
iconData: Icons.info_outline,
),
),
SizedBox(width: kTableColumnGap),
Expanded(
child: AppButton(
label: localization.connect.toUpperCase(),
onPressed: () => _connectAccounts(
context,
BankAccountEntity.INTEGRATION_TYPE_NORDIGEN,
),
iconData: Icons.link,
),
),
],
),
],
),
),
);
},
);
}
}
void _connectAccounts(BuildContext context, String integrationType) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final webClient = WebClient();
@ -41,16 +124,25 @@ class BankAccountScreen extends StatelessWidget {
final url = '${credentials.url}/one_time_token';
store.dispatch(StartSaving());
webClient
.post(url, credentials.token,
data: jsonEncode({
'context': {'return_url': ''}
'context':
integrationType == BankAccountEntity.INTEGRATION_TYPE_YODLEE
? {'return_url': ''}
: 'nordigen',
}))
.then((dynamic response) {
store.dispatch(StopSaving());
launchUrl(Uri.parse(
'${cleanApiUrl(credentials.url)}/yodlee/onboard/${response['hash']}'));
String connectUrl = cleanApiUrl(credentials.url);
if (integrationType == BankAccountEntity.INTEGRATION_TYPE_YODLEE) {
connectUrl += '/yodlee/onboard/${response['hash']}';
} else {
connectUrl += '/nordigen/connect/${response['hash']}';
}
launchUrl(Uri.parse(connectUrl));
}).catchError((dynamic error) {
store.dispatch(StopSaving());
showErrorDialog(message: '$error');
@ -62,7 +154,7 @@ class BankAccountScreen extends StatelessWidget {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final userCompany = state.userCompany;
final localization = AppLocalization.of(context);
final localization = AppLocalization.of(context)!;
return ListScaffold(
entityType: EntityType.bankAccount,
@ -94,11 +186,10 @@ class BankAccountScreen extends StatelessWidget {
const EdgeInsets.only(left: 16, top: 8, right: 16, bottom: 10),
child: Row(
children: [
if (state.isHosted) ...[
if (state.isEnterprisePlan) ...[
Expanded(
child: AppButton(
label: localization!.connect.toUpperCase(),
label: localization.connect.toUpperCase(),
onPressed: () => connectAccounts(context),
iconData: Icons.link,
),
@ -119,7 +210,7 @@ class BankAccountScreen extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
HelpText(localization!.upgradeToConnectBankAccount),
HelpText(localization.upgradeToConnectBankAccount),
SizedBox(height: 16),
Row(
children: [
@ -145,12 +236,11 @@ class BankAccountScreen extends StatelessWidget {
),
),
SizedBox(width: kGutterWidth),
],
Expanded(
child: AppButton(
label: (state.isHosted
? localization!.rules
: localization!.manageRules)
? localization.rules
: localization.manageRules)
.toUpperCase(),
onPressed: () {
store.dispatch(

View File

@ -711,7 +711,7 @@ class _InvoiceEditItemsDesktopState extends State<InvoiceEditItemsDesktop> {
..notes = item.isTask
? item.notes
: product.notes
..productCost = item.productCost
..productCost = product.cost
..cost = item.isTask && item.cost != 0
? item.cost
: cost

View File

@ -18,6 +18,9 @@ mixin LocalizationsProvider on LocaleCodeAware {
static final Map<String, Map<String, String>> _localizedValues = {
'en': {
// STARTER: lang key - do not remove comment
'yodlee_regions': 'Regions: USA, UK, Australia & India',
'nordigen_regions': 'Regions: Europe & UK',
'select_provider': 'Select Provider',
'payment_type_credit': 'Payment Type Credit',
'payment_type_debit': 'Payment Type Debit',
'send_emails_to': 'Send Emails To',
@ -111466,6 +111469,18 @@ mixin LocalizationsProvider on LocaleCodeAware {
_localizedValues[localeCode]!['send_emails_to'] ??
_localizedValues['en']!['send_emails_to']!;
String get selectProvider =>
_localizedValues[localeCode]!['select_provider'] ??
_localizedValues['en']!['select_provider']!;
String get yodleeRegions =>
_localizedValues[localeCode]!['yodlee_regions'] ??
_localizedValues['en']!['yodlee_regions']!;
String get nordigenRegions =>
_localizedValues[localeCode]!['nordigen_regions'] ??
_localizedValues['en']!['nordigen_regions']!;
// STARTER: lang field - do not remove comment
String lookup(String? key) {

View File

@ -6,9 +6,6 @@ PODS:
- file_selector_macos (0.0.1):
- FlutterMacOS
- FlutterMacOS (1.0.0)
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- in_app_purchase_storekit (0.0.1):
- Flutter
- FlutterMacOS
@ -25,13 +22,13 @@ PODS:
- FlutterMacOS
- screen_retriever (0.0.1):
- FlutterMacOS
- Sentry/HybridSDK (8.14.2):
- SentryPrivate (= 8.14.2)
- Sentry/HybridSDK (8.15.2):
- SentryPrivate (= 8.15.2)
- sentry_flutter (0.0.1):
- Flutter
- FlutterMacOS
- Sentry/HybridSDK (= 8.14.2)
- SentryPrivate (8.14.2)
- Sentry/HybridSDK (= 8.15.2)
- SentryPrivate (8.15.2)
- share_plus (0.0.1):
- FlutterMacOS
- shared_preferences_foundation (0.0.1):
@ -41,9 +38,6 @@ PODS:
- FlutterMacOS
- smart_auth (0.0.1):
- FlutterMacOS
- sqflite (0.0.2):
- FlutterMacOS
- FMDB (>= 2.7.5)
- url_launcher_macos (0.0.1):
- FlutterMacOS
- widget_kit_plugin (0.0.1):
@ -68,14 +62,12 @@ DEPENDENCIES:
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
- sign_in_with_apple (from `Flutter/ephemeral/.symlinks/plugins/sign_in_with_apple/macos`)
- smart_auth (from `Flutter/ephemeral/.symlinks/plugins/smart_auth/macos`)
- sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
- widget_kit_plugin (from `Flutter/ephemeral/.symlinks/plugins/widget_kit_plugin/macos`)
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
SPEC REPOS:
trunk:
- FMDB
- Sentry
- SentryPrivate
@ -112,8 +104,6 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/sign_in_with_apple/macos
smart_auth:
:path: Flutter/ephemeral/.symlinks/plugins/smart_auth/macos
sqflite:
:path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
url_launcher_macos:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
widget_kit_plugin:
@ -126,7 +116,6 @@ SPEC CHECKSUMS:
device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f
file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43
in_app_review: a850789fad746e89bce03d4aeee8078b45a53fd0
package_info: 6eba2fd8d3371dda2d85c8db6fe97488f24b74b2
@ -134,14 +123,13 @@ SPEC CHECKSUMS:
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
printing: 1dd6a1fce2209ec240698e2439a4adbb9b427637
screen_retriever: 59634572a57080243dd1bf715e55b6c54f241a38
Sentry: e0ea366f95ebb68f26d6030d8c22d6b2e6d23dd0
sentry_flutter: 9a04c51c373d76ee22167bf1e65bc468c0a91fed
SentryPrivate: 949a21fa59872427edc73b524c3ec8456761d97f
Sentry: 6f5742b4c47c17c9adcf265f6f328cf4a0ed1923
sentry_flutter: 2c309a1d4b45e59d02cfa15795705687f1e2081b
SentryPrivate: b2f7996f37781080f04a946eb4e377ff63c64195
share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7
shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126
sign_in_with_apple: a9e97e744e8edc36aefc2723111f652102a7a727
smart_auth: b38e3ab4bfe089eacb1e233aca1a2340f96c28e9
sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95
widget_kit_plugin: 9658611f1ba5faaaa9e8221d94fce53733a6911c
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8