Skip to content
Snippets Groups Projects
Commit cf1b0a57 authored by Leon Tappe's avatar Leon Tappe :fire:
Browse files

add journal page

parent fb8f10ad
No related branches found
No related tags found
No related merge requests found
import 'dart:async';
import 'package:astaprint_admin/environment_config.dart';
import 'package:blocs_astaprint/auth.dart';
import 'package:blocs_astaprint/journal.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '/util.dart';
import '/widgets/transaction_list_tile.dart';
class JournalListPage extends StatefulWidget {
static const routeName = '/journal';
const JournalListPage({Key key}) : super(key: key);
@override
State<JournalListPage> createState() => _JournalListPageState();
}
class _JournalListPageState extends State<JournalListPage> {
JournalBloc _journalBloc;
StreamSubscription<JournalState> _journalListener;
List<Transaction> _journal = [];
bool _searchEnabled = false;
String _query = '';
ScrollController _scrollController;
int _chunkSize = 500;
List<Transaction> get _filteredJournal => _query.isEmpty
? _journal
: _journal
.where((Transaction e) =>
simple(e.description).contains(_query) ||
simple(creditToString(e.value)).contains(_query) ||
(e.printTransaction?.deviceId?.toString() ?? '').contains(_query) ||
simple(e.printTransaction?.options?.displayName ?? '').contains(_query))
.toList();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Transaktionen'),
actions: [
IconButton(onPressed: _showSettings, icon: Icon(Icons.settings_rounded)),
if (EnvironmentConfig.desktop)
IconButton(onPressed: _onRefresh, icon: Icon(Icons.refresh_rounded)),
],
),
body: Center(
child: SizedBox(
width: 1024.0,
child: RefreshIndicator(
onRefresh: _onRefresh,
child: ListView(
controller: _scrollController,
children: [
ListTile(
title: TextField(
onChanged: (String input) {
setState(() => _query = simple(input));
},
autocorrect: false,
decoration: InputDecoration(
labelText: 'Suchbegriff', suffixIcon: Icon(Icons.search_rounded))),
subtitle: Text('Es werden ${_filteredJournal.length} Transaktionen angezeigt'),
),
..._filteredJournal
.map<Widget>((Transaction e) => TransactionListTile(transaction: e))
.toList(),
],
),
),
),
),
);
}
@override
void didUpdateWidget(covariant JournalListPage oldWidget) {
super.didUpdateWidget(oldWidget);
_scrollController = ScrollController();
}
@override
void dispose() {
super.dispose();
_journalListener?.cancel();
}
@override
void initState() {
super.initState();
_journalBloc = BlocProvider.of<JournalBloc>(context);
_journalListener = _journalBloc.stream
.where((e) => e.isResult)
.listen((e) => setState(() => _journal = e.value));
_onRefresh();
}
Future<void> _onRefresh() async {
_journalBloc.onRefresh(size: _chunkSize);
_journalBloc.stream.skip(1).firstWhere((JournalState e) => e.isResult);
}
void _showSettings() async {
var newSize = _chunkSize;
final result = await showDialog<bool>(
context: context,
builder: (BuildContext context) => SimpleDialog(
title: Text('Listeneinstellungen'),
contentPadding: const EdgeInsets.all(16.0),
children: [
ListTile(
title: Text('Anzahl der geladenen Einträge'),
trailing: SizedBox(
width: 64.0,
child: TextField(
controller: TextEditingController(text: newSize.toString()),
onChanged: (String input) => newSize = int.tryParse(input),
onSubmitted: (_) => Navigator.of(context).pop(true),
),
),
contentPadding: const EdgeInsets.only(bottom: 16.0),
),
Align(
alignment: Alignment.centerRight,
child: ElevatedButton(
child: Text('Speichern'),
onPressed: () => Navigator.of(context).pop(true),
),
)
],
),
);
if (result == null || !result) return;
setState(() => _chunkSize = newSize);
_onRefresh();
}
}
import 'package:astaprint_admin/util.dart';
import 'package:blocs_astaprint/journal.dart';
import 'package:blocs_astaprint/users.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '/util.dart';
import '/widgets/cool_card.dart';
import '/widgets/transaction_list_tile.dart';
import 'journal_dialog.dart';
import 'new_transaction_dialog.dart';
import 'transaction_list_tile.dart';
class JournalCard extends StatelessWidget {
final User user;
......
......@@ -2,7 +2,7 @@ import 'package:blocs_astaprint/users.dart';
import 'package:flutter/material.dart';
import '/util.dart';
import 'transaction_list_tile.dart';
import '/widgets/transaction_list_tile.dart';
class JournalDialog extends StatefulWidget {
final User user;
......
......@@ -3,6 +3,7 @@ import 'package:flutter/widgets.dart';
import 'pages/admin_list/admin_list_page.dart';
import 'pages/dashboard/dashboard_page.dart';
import 'pages/dispatcher_list/dispatcher_list_page.dart';
import 'pages/journal_list/journal_list_page.dart';
import 'pages/printer_details/printer_details_page.dart';
import 'pages/printer_list/printer_list_page.dart';
import 'pages/user_details/user_details_page.dart';
......@@ -12,6 +13,7 @@ export 'pages/admin_details/admin_details_page.dart';
export 'pages/admin_list/admin_list_page.dart';
export 'pages/dashboard/dashboard_page.dart';
export 'pages/dispatcher_list/dispatcher_list_page.dart';
export 'pages/journal_list/journal_list_page.dart';
export 'pages/printer_details/printer_details_page.dart';
export 'pages/printer_list/printer_list_page.dart';
export 'pages/user_details/user_details_page.dart';
......@@ -25,4 +27,5 @@ final routes = {
UserDetailsPage.routeName: (BuildContext context) => UserDetailsPage(),
PrinterDetailsPage.routeName: (BuildContext context) => PrinterDetailsPage(),
AdminListPage.routeName: (BuildContext context) => AdminListPage(),
JournalListPage.routeName: (BuildContext context) => JournalListPage(),
};
......@@ -35,6 +35,11 @@ class MainDrawer extends StatelessWidget {
trailing: Icon(Icons.print_rounded),
onTap: () => _popAndPushNamed(PrinterListPage.routeName),
),
ListTile(
title: Text('Transaktionen'),
trailing: Icon(Icons.history_edu_rounded),
onTap: () => _popAndPushNamed(JournalListPage.routeName),
),
ListTile(
title: Text('Dokumentenverarbeitung'),
trailing: Icon(Icons.task_rounded),
......
......@@ -4,6 +4,26 @@ import 'package:flutter/material.dart';
import '/util.dart';
const boolNames = {true: 'An', false: 'Aus'};
const optionNames = {
'pages': 'Seiten',
'colored': 'Farbseiten',
'score': 'Score',
'device_id': 'Stellplatznummer',
'color': 'Farbdruck',
'duplex': 'Duplex',
'copies': 'Kopien',
'collate': 'Kopien zusammenlegen',
'a3': 'A3',
'range': 'Seitenbereich',
'nup': 'Seiten pro Blatt',
'nuppageorder': 'Sortierung auf Blatt',
'keep': 'Nach Druck behalten',
'bypass': 'Seiteneinzug nutzen',
'displayname': 'Jobname'
};
class TransactionListTile extends StatefulWidget {
final Transaction transaction;
......@@ -23,11 +43,13 @@ class _TransactionListTileState extends State<TransactionListTile> {
@override
Widget build(BuildContext context) {
return ListTile(
leading: IconButton(
tooltip: _expanded ? 'Einklappen' : 'Ausklappen',
onPressed: _onToggleExpand,
icon: Icon(_expanded ? Icons.arrow_drop_up_rounded : Icons.arrow_drop_down_rounded),
),
leading: _print != null
? IconButton(
tooltip: _expanded ? 'Einklappen' : 'Ausklappen',
onPressed: _onToggleExpand,
icon: Icon(_expanded ? Icons.arrow_drop_up_rounded : Icons.arrow_drop_down_rounded),
)
: SizedBox(width: 24.0, height: 24.0),
title: Text(
_print?.options?.displayName != null && _print.options.displayName.isNotEmpty
? _print.options.displayName
......@@ -38,15 +60,38 @@ class _TransactionListTileState extends State<TransactionListTile> {
mainAxisSize: MainAxisSize.min,
children: [
Text(dateTimeFormat.format(widget.transaction.timestamp)),
if (_expanded)
..._print?.toReducedMap?.keys?.map<Widget>((e) => ListTile(
dense: true,
title: Text(e),
trailing: Text(_print.toReducedMap[e].toString()),
)) ??
[
Text('Zu dieser Transaktion sind keine weiteren Informationen vorhanden'),
]
if (_expanded && _print != null)
DataTable(
columns: <DataColumn>[
DataColumn(
label: Text(
'Joboption',
style:
Theme.of(context).textTheme.bodyLarge.copyWith(fontStyle: FontStyle.italic),
),
),
DataColumn(
label: Text(
'Wert',
style:
Theme.of(context).textTheme.bodyLarge.copyWith(fontStyle: FontStyle.italic),
),
),
],
rows: _print.toReducedMap.keys
.map<DataRow>(
(e) => DataRow(cells: [
DataCell(Text(optionNames[e])),
DataCell(Text(
_print.toReducedMap[e] is bool
? boolNames[_print.toReducedMap[e]]
: _print.toReducedMap[e].toString(),
textAlign: TextAlign.end,
)),
]),
)
.toList(),
),
],
),
trailing: AnimatedDefaultTextStyle(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment