Erweiterungen

This commit is contained in:
Sven committed 2024-02-05 12:47:29 +01:00
1 parent ab86295bd5
commit d0892e552e
3 files changed
+133 -150

No files matched your search

+15 -3
View File
@@ -91,6 +91,12 @@ class _MainPageState extends State<MainPage> {
_initMessages(); _initMessages();
} }
@override
void dispose() {
super.dispose();
_exitMessages();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
@@ -205,7 +211,7 @@ class _MainPageState extends State<MainPage> {
getDefaultButton( getDefaultButton(
'Abmelden', 'Abmelden',
image: Image.asset('assets/abmelden.png', width: 30, height: 30), image: Image.asset('assets/abmelden.png', width: 30, height: 30),
() => {}), () async => {showAcceptJobsPopup(context, await MyApp.isarInstance.jobs.filter().stateEqualTo(0).findAll())}),
Expanded( Expanded(
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -255,6 +261,12 @@ class _MainPageState extends State<MainPage> {
}); });
} }
void _exitMessages() {
BroadcastReceiver().unsubscribe<StatusInfoUpdate>(Constants.messageTopicStatusInfoUpdate);
BroadcastReceiver().unsubscribe<StatusInfoUpdate>(Constants.messageTopicJobReceived);
}
void _refreshBadges() async { void _refreshBadges() async {
_assignedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).count(); _assignedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).count();
_acceptedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(1).count(); _acceptedJobsValueNotifier.value = await MyApp.isarInstance.jobs.filter().stateEqualTo(1).count();
@@ -268,7 +280,7 @@ class _MainPageState extends State<MainPage> {
} }
} }
void _showAcceptanceDialog(Job job) { void _showAcceptanceDialog(Job job) async {
showAcceptJobsPopup(context); await showAcceptJobsPopup(context, await MyApp.isarInstance.jobs.filter().stateEqualTo(0).findAll());
} }
} }
+117 -146
View File
@@ -1,8 +1,6 @@
import 'package:expandable/expandable.dart'; import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:isar/isar.dart';
import 'package:kumi_popup_window/kumi_popup_window.dart';
import 'package:stadtbote/main.dart'; import 'package:stadtbote/main.dart';
import 'package:stadtbote/protocoll_messages/accept_job_message.dart'; import 'package:stadtbote/protocoll_messages/accept_job_message.dart';
import 'package:stadtbote/model/job.dart'; import 'package:stadtbote/model/job.dart';
@@ -12,156 +10,129 @@ import 'package:stadtbote/tools/mqtt_core.dart';
import 'package:stadtbote/tools/util.dart'; import 'package:stadtbote/tools/util.dart';
import 'package:badges/badges.dart' as badges; import 'package:badges/badges.dart' as badges;
void showAcceptJobsPopup(BuildContext context) async { Future<void> showAcceptJobsPopup(BuildContext context, List<Job> jobs) async {
await _createListEntries().then((value) => { var jobsSet = jobs.toSet();
showPopupWindow(
context,
//childSize:Size(240, MediaQuery.of(context).size.width * 0.8),
gravity: KumiPopupGravity.center,
//curve: Curves.elasticOut,
bgColor: Colors.grey.withOpacity(0.5),
clickOutDismiss: true,
clickBackDismiss: true,
customAnimation: false,
customPop: false,
customPage: false,
// targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox),
//needSafeDisplay: true,
underStatusBar: false,
underAppBar: false,
//offsetX: -180,
//offsetY: 50,
duration: const Duration(milliseconds: 200),
onShowStart: (pop) {},
onShowFinish: (pop) {},
onDismissStart: (pop) {},
onDismissFinish: (pop) {},
onClickOut: (pop) {},
onClickBack: (pop) {},
childFun: (pop) {
_createListEntries();
return SizedBox( await showDialog<void>(
key: GlobalKey(), context: context,
height: MediaQuery.of(context).size.height * 0.85, builder: (BuildContext context) {
width: MediaQuery.of(context).size.width * 0.85, return AlertDialog(
child: Container( contentPadding: EdgeInsets.zero,
height: 100, shadowColor: Colors.transparent,
decoration: BoxDecoration( backgroundColor: Colors.white,
borderRadius: BorderRadius.circular(10), content: StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
color: Colors.white, if (jobsSet.isEmpty) {
border: Border.all( Navigator.of(context).pop();
color: Colors.grey, }
width: 0.5,
),
),
child: SingleChildScrollView(child: Column(children: value)),
));
},
)
}
);
}
// "Ablehnen" : "Ignorieren"; return SizedBox(
key: GlobalKey(),
height: MediaQuery.of(context).size.height * 1,
width: MediaQuery.of(context).size.width * 1.2,
child: Container(
height: 100,
padding: const EdgeInsets.all(5),
child: ListView.builder(
itemCount: jobsSet.length,
itemBuilder: (_, i) {
var job = jobsSet.toList()[i];
Future<List<Widget>> _createListEntries() async { return ExpandableNotifier(
List<Widget> entries = []; child: ListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
var jobs = await MyApp.isarInstance.jobs.filter().stateEqualTo(0).findAll(); title: Container(
for (var job in jobs) { decoration: BoxDecoration(
entries.add(ExpandableNotifier( borderRadius: BorderRadius.circular(10),
child: ListTile( border: Border.all(
contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), color: Constants.colorPrimary,
title: Container( width: 1,
decoration: BoxDecoration( ),
borderRadius: BorderRadius.circular(10), ),
border: Border.all( child: badges.Badge(
color: Constants.colorPrimary, position: badges.BadgePosition.topEnd(top: -13, end: -5),
width: 1, showBadge: true,
), badgeContent: const Text(
), 'Neu',
child: badges.Badge( style: TextStyle(
position: badges.BadgePosition.topEnd(top: -13, end: -5), color: Colors.white,
showBadge: true, fontSize: 18.0,
badgeContent: const Text( ),
'Neu', ),
style: TextStyle( badgeStyle: badges.BadgeStyle(
color: Colors.white, shape: badges.BadgeShape.square,
fontSize: 18.0, badgeColor: Constants.colorPrimary,
), padding: const EdgeInsets.all(5),
), borderRadius: BorderRadius.circular(5),
badgeStyle: badges.BadgeStyle( borderSide: const BorderSide(color: Constants.colorPrimary, width: 0),
shape: badges.BadgeShape.square, ),
badgeColor: Constants.colorPrimary, child: Padding(
padding: const EdgeInsets.all(5), padding: const EdgeInsets.all(12.0),
borderRadius: BorderRadius.circular(5), child: Column(
borderSide: const BorderSide(color: Constants.colorPrimary, width: 0), children: [
), Text(DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime)).toString(),
child: Padding( textAlign: TextAlign.left),
padding: const EdgeInsets.all(12.0), Text('Auftragsnummer: ${job.id}'),
child: Column( Text(job.tours[0].comp),
children: [ Text(job.tours[0].street),
Text(DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime)).toString(), textAlign: TextAlign.left), Text(job.tours[0].city),
Text('Auftragsnummer: ${job.id}'), const SizedBox(height: 20),
Text(job.tours[0].comp), ScrollOnExpand(
Text(job.tours[0].street), scrollOnExpand: true,
Text(job.tours[0].city), scrollOnCollapse: false,
const SizedBox(height: 20), child: ExpandablePanel(
ScrollOnExpand( theme: const ExpandableThemeData(
scrollOnExpand: true, headerAlignment: ExpandablePanelHeaderAlignment.center,
scrollOnCollapse: false, tapBodyToCollapse: true,
child: ExpandablePanel( ),
theme: const ExpandableThemeData( header: const Padding(
headerAlignment: ExpandablePanelHeaderAlignment.center, padding: EdgeInsets.all(0),
tapBodyToCollapse: true, child: Text(
), "Weitere Infos....",
header: const Padding( style: TextStyle(fontSize: 15, color: Colors.black, fontWeight: FontWeight.bold),
padding: EdgeInsets.all(0), )),
child: Text( collapsed: const SizedBox(),
"Weitere Infos....", expanded: Column(
style: TextStyle(fontSize: 15, color: Colors.black, fontWeight: FontWeight.bold), crossAxisAlignment: CrossAxisAlignment.start,
)), children: <Widget>[
collapsed: const SizedBox(), Container(
expanded: Column( height: 200,
crossAxisAlignment: CrossAxisAlignment.start, decoration: BoxDecoration(
children: <Widget>[ borderRadius: BorderRadius.circular(10),
Container( color: const Color(0xfffff4e4),
height: 200, border: Border.all(
decoration: BoxDecoration( color: Colors.grey,
borderRadius: BorderRadius.circular(10), width: 0.5,
color: const Color(0xfffff4e4), ),
border: Border.all( ),
color: Colors.grey, child: const Text('asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd '),
width: 0.5, ),
],
),
),
),
const SizedBox(height: 20),
Row(children: [
Expanded(
child: getDefaultButton(!job.global ? 'Ablehnen' : 'Ignorieren',
() => {_sendAnswer(job, !job.global ? 2 : 3), jobsSet.remove(job), setState(() {})}),
),
const SizedBox(width: 20),
Expanded(
child: getDefaultButton('Annehmen', () => {_sendAnswer(job, 1), jobsSet.remove(job), setState(() {})}),
)
])
],
),
),
), ),
), ),
child: const Text('asd asd asd asd asd asd asd asd asd asd asd asd asd asd asd '),
), ),
], );
), },
), )),
), );
const SizedBox(height: 20), }));
Row(children: [ });
Expanded(
child: getDefaultButton(!job.global ? 'Ablehnen' : 'Ignorieren', () => {_sendAnswer(job, !job.global ? 2 : 3)}),
),
const SizedBox(width: 20),
Expanded(
child: getDefaultButton('Annehmen', () => {_sendAnswer(job, 1)}),
)
])
],
),
),
),
),
),
));
}
return entries;
} }
_sendAnswer(Job job, int item) { _sendAnswer(Job job, int item) {
+1 -1
View File
@@ -168,7 +168,7 @@ class MqttCore {
break; break;
case 'job_del': case 'job_del':
_jobDeleteReceived(payloadData); //_jobDeleteReceived(payloadData);
break; break;
case 'sync_request': case 'sync_request':