diff --git a/lib/data/models/company_model.dart b/lib/data/models/company_model.dart index 174341e677d..64cc3c8b860 100644 --- a/lib/data/models/company_model.dart +++ b/lib/data/models/company_model.dart @@ -1250,11 +1250,16 @@ abstract class RegistrationFieldEntity return _$RegistrationFieldEntity._( key: '', required: false, + visible: false, ); } RegistrationFieldEntity._(); + static const SETTING_HIDDEN = 'hidden'; + static const SETTING_OPTIONAL = 'optional'; + static const SETTING_REQUIRED = 'required'; + @override @memoized int get hashCode; @@ -1263,6 +1268,22 @@ abstract class RegistrationFieldEntity bool get required; + bool get visible; + + String get setting { + if (required) { + return SETTING_REQUIRED; + } else if (visible) { + return SETTING_OPTIONAL; + } else { + return SETTING_HIDDEN; + } + } + + // ignore: unused_element + static void _initializeBuilder(RegistrationFieldEntityBuilder builder) => + builder..visible = false; + static Serializer get serializer => _$registrationFieldEntitySerializer; } diff --git a/lib/data/models/company_model.g.dart b/lib/data/models/company_model.g.dart index ea9adf8135f..98e7f0ae9bc 100644 --- a/lib/data/models/company_model.g.dart +++ b/lib/data/models/company_model.g.dart @@ -1522,6 +1522,9 @@ class _$RegistrationFieldEntitySerializer 'required', serializers.serialize(object.required, specifiedType: const FullType(bool)), + 'visible', + serializers.serialize(object.visible, + specifiedType: const FullType(bool)), ]; return result; @@ -1547,6 +1550,10 @@ class _$RegistrationFieldEntitySerializer result.required = serializers.deserialize(value, specifiedType: const FullType(bool)) as bool; break; + case 'visible': + result.visible = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; } } @@ -4544,16 +4551,21 @@ class _$RegistrationFieldEntity extends RegistrationFieldEntity { final String key; @override final bool required; + @override + final bool visible; factory _$RegistrationFieldEntity( [void Function(RegistrationFieldEntityBuilder) updates]) => (new RegistrationFieldEntityBuilder()..update(updates))._build(); - _$RegistrationFieldEntity._({this.key, this.required}) : super._() { + _$RegistrationFieldEntity._({this.key, this.required, this.visible}) + : super._() { BuiltValueNullFieldError.checkNotNull( key, r'RegistrationFieldEntity', 'key'); BuiltValueNullFieldError.checkNotNull( required, r'RegistrationFieldEntity', 'required'); + BuiltValueNullFieldError.checkNotNull( + visible, r'RegistrationFieldEntity', 'visible'); } @override @@ -4570,7 +4582,8 @@ class _$RegistrationFieldEntity extends RegistrationFieldEntity { if (identical(other, this)) return true; return other is RegistrationFieldEntity && key == other.key && - required == other.required; + required == other.required && + visible == other.visible; } int __hashCode; @@ -4580,6 +4593,7 @@ class _$RegistrationFieldEntity extends RegistrationFieldEntity { var _$hash = 0; _$hash = $jc(_$hash, key.hashCode); _$hash = $jc(_$hash, required.hashCode); + _$hash = $jc(_$hash, visible.hashCode); _$hash = $jf(_$hash); return __hashCode ??= _$hash; } @@ -4588,7 +4602,8 @@ class _$RegistrationFieldEntity extends RegistrationFieldEntity { String toString() { return (newBuiltValueToStringHelper(r'RegistrationFieldEntity') ..add('key', key) - ..add('required', required)) + ..add('required', required) + ..add('visible', visible)) .toString(); } } @@ -4606,13 +4621,20 @@ class RegistrationFieldEntityBuilder bool get required => _$this._required; set required(bool required) => _$this._required = required; - RegistrationFieldEntityBuilder(); + bool _visible; + bool get visible => _$this._visible; + set visible(bool visible) => _$this._visible = visible; + + RegistrationFieldEntityBuilder() { + RegistrationFieldEntity._initializeBuilder(this); + } RegistrationFieldEntityBuilder get _$this { final $v = _$v; if ($v != null) { _key = $v.key; _required = $v.required; + _visible = $v.visible; _$v = null; } return this; @@ -4638,7 +4660,9 @@ class RegistrationFieldEntityBuilder key: BuiltValueNullFieldError.checkNotNull( key, r'RegistrationFieldEntity', 'key'), required: BuiltValueNullFieldError.checkNotNull( - required, r'RegistrationFieldEntity', 'required')); + required, r'RegistrationFieldEntity', 'required'), + visible: BuiltValueNullFieldError.checkNotNull( + visible, r'RegistrationFieldEntity', 'visible')); replace(_$result); return _$result; } diff --git a/lib/ui/settings/client_portal.dart b/lib/ui/settings/client_portal.dart index 209d0f1024a..e19ad36f012 100644 --- a/lib/ui/settings/client_portal.dart +++ b/lib/ui/settings/client_portal.dart @@ -8,6 +8,7 @@ import 'package:flutter/services.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; +import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -511,19 +512,63 @@ class _ClientPortalState extends State ), FormCard( isLast: true, - children: company.clientRegistrationFields - .map((field) => SwitchListTile( - activeColor: Theme.of(context).colorScheme.secondary, - title: Text(localization.lookup(field.key)), - value: field.required, - onChanged: (value) { - final index = - company.clientRegistrationFields.indexOf(field); - viewModel.onCompanyChanged(company.rebuild((b) => b - ..clientRegistrationFields[index] = field.rebuild( - (b) => b..required = !field.required))); - })) - .toList(), + children: company.clientRegistrationFields.map((field) { + return Row( + children: [ + Expanded( + child: Text(localization.lookup(field.key)), + ), + Expanded( + child: AppDropdownButton( + value: field.setting, + onChanged: (dynamic value) { + final index = company.clientRegistrationFields + .indexOf(field); + viewModel.onCompanyChanged(company.rebuild((b) => + b + ..clientRegistrationFields[index] = + field.rebuild((b) => b + ..required = value == + RegistrationFieldEntity + .SETTING_REQUIRED + ..visible = value == + RegistrationFieldEntity + .SETTING_REQUIRED || + value == + RegistrationFieldEntity + .SETTING_OPTIONAL))); + }, + items: [ + DropdownMenuItem( + value: RegistrationFieldEntity.SETTING_HIDDEN, + child: Text(localization.hidden), + ), + DropdownMenuItem( + value: RegistrationFieldEntity.SETTING_OPTIONAL, + child: Text(localization.optional), + ), + DropdownMenuItem( + value: RegistrationFieldEntity.SETTING_REQUIRED, + child: Text(localization.requiredWord), + ), + ], + ), + ), + ], + ); + + return SwitchListTile( + activeColor: Theme.of(context).colorScheme.secondary, + title: Text(localization.lookup(field.key)), + value: field.required, + onChanged: (value) { + final index = + company.clientRegistrationFields.indexOf(field); + viewModel.onCompanyChanged(company.rebuild((b) => b + ..clientRegistrationFields[index] = field.rebuild( + (b) => b..required = !field.required))); + }); + }).toList(), ), ], ), diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 6ab5703287f..3af4399985b 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -16,6 +16,8 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'required': 'Required', + 'hidden': 'Hidden', 'payment_links': 'Payment Links', 'action': 'Action', 'upgrade_to_paid_plan_to_schedule': @@ -96825,6 +96827,14 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]['action'] ?? _localizedValues['en']['action']; + String get hidden => + _localizedValues[localeCode]['hidden'] ?? + _localizedValues['en']['hidden']; + + String get requiredWord => + _localizedValues[localeCode]['required'] ?? + _localizedValues['en']['required']; + // STARTER: lang field - do not remove comment String lookup(String key) {