Change to dropdown with copy/open/reactivate
This commit is contained in:
parent
0d7b1f3b2c
commit
d7713a9c68
|
|
@ -8,10 +8,12 @@ import 'package:flutter_styled_toast/flutter_styled_toast.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/help_text.dart';
|
import 'package:invoiceninja_flutter/ui/app/help_text.dart';
|
||||||
|
import 'package:invoiceninja_flutter/ui/app/icon_text.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
|
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart';
|
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/formatting.dart';
|
import 'package:invoiceninja_flutter/utils/formatting.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
class InvoiceEditContacts extends StatelessWidget {
|
class InvoiceEditContacts extends StatelessWidget {
|
||||||
const InvoiceEditContacts({
|
const InvoiceEditContacts({
|
||||||
|
|
@ -61,6 +63,7 @@ class InvoiceEditContacts extends StatelessWidget {
|
||||||
return _ContactListTile(
|
return _ContactListTile(
|
||||||
fullName: contact.fullName,
|
fullName: contact.fullName,
|
||||||
email: contact.email,
|
email: contact.email,
|
||||||
|
hash: '',
|
||||||
invoice: invoice,
|
invoice: invoice,
|
||||||
invitation: invitation,
|
invitation: invitation,
|
||||||
onTap: () => invitation == null
|
onTap: () => invitation == null
|
||||||
|
|
@ -97,6 +100,7 @@ class InvoiceEditContacts extends StatelessWidget {
|
||||||
return _ContactListTile(
|
return _ContactListTile(
|
||||||
fullName: contact.fullName,
|
fullName: contact.fullName,
|
||||||
email: contact.email,
|
email: contact.email,
|
||||||
|
hash: client?.clientHash ?? '',
|
||||||
invoice: invoice,
|
invoice: invoice,
|
||||||
invitation: invitation,
|
invitation: invitation,
|
||||||
onTap: () => invitation == null
|
onTap: () => invitation == null
|
||||||
|
|
@ -114,12 +118,14 @@ class _ContactListTile extends StatelessWidget {
|
||||||
required this.fullName,
|
required this.fullName,
|
||||||
required this.email,
|
required this.email,
|
||||||
required this.invoice,
|
required this.invoice,
|
||||||
|
required this.hash,
|
||||||
this.invitation,
|
this.invitation,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String fullName;
|
final String fullName;
|
||||||
final String email;
|
final String email;
|
||||||
|
final String hash;
|
||||||
final InvoiceEntity invoice;
|
final InvoiceEntity invoice;
|
||||||
final InvitationEntity? invitation;
|
final InvitationEntity? invitation;
|
||||||
final Function? onTap;
|
final Function? onTap;
|
||||||
|
|
@ -128,6 +134,8 @@ class _ContactListTile extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final localization = AppLocalization.of(context)!;
|
final localization = AppLocalization.of(context)!;
|
||||||
final store = StoreProvider.of<AppState>(context);
|
final store = StoreProvider.of<AppState>(context);
|
||||||
|
|
||||||
|
/*
|
||||||
final invitationButton = (invitation?.link ?? '').isNotEmpty
|
final invitationButton = (invitation?.link ?? '').isNotEmpty
|
||||||
? IconButton(
|
? IconButton(
|
||||||
tooltip: localization.copyLink,
|
tooltip: localization.copyLink,
|
||||||
|
|
@ -139,6 +147,55 @@ class _ContactListTile extends StatelessWidget {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
: SizedBox();
|
: SizedBox();
|
||||||
|
*/
|
||||||
|
|
||||||
|
final invitationButton = (invitation?.link ?? '').isNotEmpty
|
||||||
|
? PopupMenuButton<String>(
|
||||||
|
icon: Icon(Icons.more_vert),
|
||||||
|
itemBuilder: (BuildContext context) {
|
||||||
|
return [
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
child: IconText(
|
||||||
|
text: localization.viewPortal,
|
||||||
|
icon: Icons.open_in_new,
|
||||||
|
),
|
||||||
|
value: localization.viewPortal,
|
||||||
|
),
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
child: IconText(
|
||||||
|
text: localization.copyLink,
|
||||||
|
icon: Icons.copy,
|
||||||
|
),
|
||||||
|
value: localization.copyLink,
|
||||||
|
),
|
||||||
|
PopupMenuItem<String>(
|
||||||
|
child: IconText(
|
||||||
|
text: localization.reactivateEmail,
|
||||||
|
icon: Icons.check_circle,
|
||||||
|
),
|
||||||
|
value: localization.reactivateEmail,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
},
|
||||||
|
onSelected: (String action) {
|
||||||
|
var viewLinkWithHash = invitation!.silentLink;
|
||||||
|
if (!viewLinkWithHash.contains('?')) {
|
||||||
|
viewLinkWithHash += '?';
|
||||||
|
}
|
||||||
|
viewLinkWithHash += '&client_hash=$hash';
|
||||||
|
|
||||||
|
if (action == localization.viewPortal) {
|
||||||
|
launchUrl(Uri.parse(viewLinkWithHash));
|
||||||
|
} else if (action == localization.copyLink) {
|
||||||
|
Clipboard.setData(ClipboardData(text: invitation!.link));
|
||||||
|
showToast(
|
||||||
|
localization.copiedToClipboard.replaceFirst(':value ', ''));
|
||||||
|
} else if (action == localization.reactivateEmail) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
: SizedBox();
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
static final Map<String, Map<String, String>> _localizedValues = {
|
static final Map<String, Map<String, String>> _localizedValues = {
|
||||||
'en': {
|
'en': {
|
||||||
// STARTER: lang key - do not remove comment
|
// STARTER: lang key - do not remove comment
|
||||||
|
'reactivate_email': 'Reactivate Email',
|
||||||
'template_help': 'Enable using the design as a template',
|
'template_help': 'Enable using the design as a template',
|
||||||
'delivery_note_design': 'Delivery Note Design',
|
'delivery_note_design': 'Delivery Note Design',
|
||||||
'statement_design': 'Statement Design',
|
'statement_design': 'Statement Design',
|
||||||
|
|
@ -109970,6 +109971,10 @@ mixin LocalizationsProvider on LocaleCodeAware {
|
||||||
_localizedValues[localeCode]!['template_help'] ??
|
_localizedValues[localeCode]!['template_help'] ??
|
||||||
_localizedValues['en']!['template_help']!;
|
_localizedValues['en']!['template_help']!;
|
||||||
|
|
||||||
|
String get reactivateEmail =>
|
||||||
|
_localizedValues[localeCode]!['reactivate_email'] ??
|
||||||
|
_localizedValues['en']!['reactivate_email']!;
|
||||||
|
|
||||||
// STARTER: lang field - do not remove comment
|
// STARTER: lang field - do not remove comment
|
||||||
|
|
||||||
String lookup(String? key) {
|
String lookup(String? key) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue