diff --git a/lib/ui/client/view/client_view.dart b/lib/ui/client/view/client_view.dart index e09858e54..f1fefa54c 100644 --- a/lib/ui/client/view/client_view.dart +++ b/lib/ui/client/view/client_view.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/ui/client/view/client_view_activity.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_details.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_documents.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_ledger.dart'; +import 'package:invoiceninja_flutter/ui/client/view/client_view_system_logs.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_overview.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -36,7 +37,7 @@ class _ClientViewState extends State @override void initState() { super.initState(); - _controller = TabController(vsync: this, length: 5); + _controller = TabController(vsync: this, length: 6); } @override @@ -78,6 +79,9 @@ class _ClientViewState extends State Tab( text: localization.activity, ), + Tab( + text: localization.systemLogs, + ), ], ), body: Builder(builder: (context) { @@ -119,6 +123,13 @@ class _ClientViewState extends State key: ValueKey(viewModel.client.id), ), ), + RefreshIndicator( + onRefresh: () => viewModel.onRefreshed(context), + child: ClientViewSystemLogs( + viewModel: viewModel, + key: ValueKey(viewModel.client.id), + ), + ), ], ), ), diff --git a/lib/ui/client/view/client_view_system_logs.dart b/lib/ui/client/view/client_view_system_logs.dart new file mode 100644 index 000000000..12a72e43c --- /dev/null +++ b/lib/ui/client/view/client_view_system_logs.dart @@ -0,0 +1,60 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; +import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; + +class ClientViewSystemLogs extends StatefulWidget { + const ClientViewSystemLogs({Key key, this.viewModel}) : super(key: key); + + final ClientViewVM viewModel; + + @override + _ClientViewSystemLogsState createState() => _ClientViewSystemLogsState(); +} + +class _ClientViewSystemLogsState extends State { + + Map _isExpanded = {}; + + @override + void didChangeDependencies() { + if (widget.viewModel.client.isStale) { + widget.viewModel.onRefreshed(context); + } + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + final client = widget.viewModel.client; + + if (client.isStale) { + return LoadingIndicator(); + } + + return ListView( + children: [ + ExpansionPanelList( + expansionCallback: (int index, bool isExpanded) { + print('## expansionCallback - inde: $index, isExpanded: $isExpanded'); + setState(() { + final systemLog = client.systemLogs[index]; + _isExpanded[systemLog.id] = !isExpanded; + }); + }, + children: client.systemLogs.map((systemLog) { + return ExpansionPanel( + headerBuilder: (BuildContext context, bool isExpanded) { + return Text(systemLog.userId); + }, + isExpanded: _isExpanded[systemLog.id] == true, + body: Container( + child: Text(systemLog.log), + ), + ); + }).toList(), + ), + ], + ); + } +} diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 5b2152fa6..9c5a51d3e 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -15,6 +15,7 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'system_logs': 'System Logs', 'view_portal': 'View Portal', 'copy_link': 'Copy Link', 'token_billing': 'Token Billing', @@ -4419,6 +4420,9 @@ mixin LocalizationsProvider on LocaleCodeAware { String get viewPortal => _localizedValues[localeCode]['view_portal'] ?? ''; + String get systemLogs => _localizedValues[localeCode]['system_logs'] ?? ''; + + String lookup(String key) { final lookupKey = toSnakeCase(key);