ambito/lib/src/pages/actions/actions_page.dart

345 lines
9.2 KiB
Dart
Raw Normal View History

2024-09-27 15:30:39 +02:00
import 'package:ambito/src/domain/entity/id_value_color/id_value_color.dart';
2024-09-18 15:07:08 +02:00
import 'package:ambito/src/domain/entity/massnahme/massnahme.dart';
2024-10-07 11:01:02 +02:00
import 'package:ambito/src/extensions/extensions.dart';
2024-09-18 15:07:08 +02:00
import 'package:ambito/src/packages/ambito_db/base_db.dart';
2024-09-27 15:30:39 +02:00
import 'package:ambito/src/widgets/form/fields/field_dropdown.dart';
2024-09-27 15:40:55 +02:00
import 'package:ambito/src/widgets/form/fields/field_monthsrangepicker.dart';
2024-09-27 15:30:39 +02:00
import 'package:ambito/src/widgets/form/form_widget.dart';
import 'package:ambito/src/widgets/form/form_widget_type.dart';
2024-09-18 15:07:08 +02:00
import 'package:cached_network_image/cached_network_image.dart';
import 'package:expandable_text/expandable_text.dart';
import 'package:flutter/material.dart';
import '../../../main.dart';
class ActionsPage extends StatefulWidget {
2024-09-24 15:29:01 +02:00
const ActionsPage({super.key});
2024-09-18 15:07:08 +02:00
@override
State<StatefulWidget> createState() => ActionsPageState();
}
class ActionsPageState extends State<ActionsPage> {
Map<int, bool> visible = {};
List<String> effort = [];
List<String> effect = [];
2024-09-24 15:29:01 +02:00
Set<String> type = {};
2024-09-18 15:07:08 +02:00
String? filterType;
2024-09-24 15:29:01 +02:00
Set<String> areaType = {};
2024-09-18 15:07:08 +02:00
String? filterAreaType;
List<String> region = [];
2024-09-24 15:29:01 +02:00
String? filterSupport;
Set<String> support = {};
2024-09-27 15:30:39 +02:00
String? filterMonths;
Set<String> months = {};
2024-09-18 15:07:08 +02:00
@override
void initState() {
2024-09-24 15:29:01 +02:00
super.initState();
2024-09-18 15:07:08 +02:00
effort = [];
effect = [];
2024-09-24 15:29:01 +02:00
type = {};
areaType = {};
2024-09-18 15:07:08 +02:00
region = [];
2024-09-24 15:29:01 +02:00
support = {};
2024-09-18 15:07:08 +02:00
}
@override
Widget build(BuildContext context) {
List<Massnahme> massnahmen = BaseDB.getAll('Maßnahme');
2024-09-24 15:29:01 +02:00
Set<String> updatedTypes = {};
Set<String> updatedAreaTypes = {};
Set<String> updatedSupports = {};
2024-09-27 15:30:39 +02:00
Set<String> updatedMonths = {};
2024-09-18 15:07:08 +02:00
for (var massnahme in massnahmen) {
2024-09-24 15:29:01 +02:00
if (massnahme.actionGroup != null) {
updatedTypes.add(massnahme.actionGroup!.value!);
2024-09-18 15:07:08 +02:00
}
if (massnahme.factsheetAreaType != null) {
2024-09-27 15:30:39 +02:00
for (IdValueColor aType in massnahme.factsheetAreaType!) {
2024-09-24 15:29:01 +02:00
updatedAreaTypes.add(aType.value!);
2024-09-18 15:07:08 +02:00
}
}
2024-09-24 15:29:01 +02:00
if (massnahme.fundingPrograms != null) {
2024-09-27 15:30:39 +02:00
for (IdValueColor aType in massnahme.fundingPrograms!) {
2024-09-24 15:29:01 +02:00
updatedSupports.add(aType.value!);
2024-09-18 15:07:08 +02:00
}
}
2024-09-27 15:30:39 +02:00
if (massnahme.timeFrame != null) {
for (IdValueColor tfType in massnahme.timeFrame!) {
updatedMonths.add(tfType.value!);
}
}
2024-09-24 15:29:01 +02:00
}
setState(() {
type.addAll(updatedTypes);
areaType.addAll(updatedAreaTypes);
support.addAll(updatedSupports);
2024-09-27 15:30:39 +02:00
months.addAll(updatedMonths.toList());
2024-09-24 15:29:01 +02:00
});
List<Widget> actionCards = massnahmen.map((massnahme) {
bool typeMatches = filterType == null ||
(massnahme.actionGroup != null &&
massnahme.actionGroup!.value == filterType);
bool areaTypeMatches = filterAreaType == null ||
(massnahme.factsheetAreaType
?.any((aType) => aType.value == filterAreaType) ??
false);
bool supportMatches = filterSupport == null ||
(massnahme.fundingPrograms
?.any((aType) => aType.value == filterSupport) ??
false);
// Update visibility based on the matches
2024-09-18 15:07:08 +02:00
setState(() {
2024-09-24 15:29:01 +02:00
visible[massnahme.id] =
typeMatches && areaTypeMatches && supportMatches;
2024-09-18 15:07:08 +02:00
});
2024-09-24 15:29:01 +02:00
return getCard(context, massnahme);
}).toList();
2024-09-18 15:07:08 +02:00
return Padding(
padding: const EdgeInsets.only(left: 32, right: 32),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
context.translate('page.actions.title'),
style: Theme.of(context).textTheme.headlineLarge,
),
getSpacer(),
Text(
context.translate('page.actions.intro'),
style: Theme.of(context).textTheme.titleLarge,
),
getSpacer(),
getFilter(context),
getSpacer(),
Expanded(
child: SingleChildScrollView(
child: Wrap(
children: actionCards,
),
),
),
],
),
);
}
Widget getSpacer() {
return const SizedBox(
height: 8,
);
}
Widget getFilter(BuildContext context) {
2024-09-27 15:30:39 +02:00
List<FormWidgetField> fields = [];
fields.add(
FieldDropdown(
name: 'ort',
label: 'Ort der Maßnahme',
filterValue: filterAreaType,
onClear: () {
setState(() {
filterAreaType = null;
});
},
onSelected: ((String? value) {
setState(() {
filterAreaType = value;
});
}),
entries: areaType.toList(),
),
);
fields.add(
FieldDropdown(
name: 'art',
label: 'Art der Maßnahme',
filterValue: filterType,
onClear: () {
setState(() {
filterType = null;
});
},
onSelected: ((String? value) {
setState(() {
filterType = value;
});
}),
entries: type.toList(),
),
);
fields.add(
FieldDropdown(
name: 'support',
label: 'Förderprogramm',
filterValue: filterSupport,
onClear: () {
setState(() {
filterSupport = null;
});
},
onSelected: ((String? value) {
setState(() {
filterSupport = value;
});
}),
entries: support.toList(),
),
);
var monthsSorted = months.toList();
monthsSorted.sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase()));
/*fields.add(
FieldDropdown(
name: 'months',
label: 'Beginn der Maßnahme',
filterValue: filterMonths,
onClear: () {
setState(() {
filterMonths = null;
});
},
onSelected: ((String? value) {
setState(() {
filterMonths = value;
});
}),
entries: monthsSorted,
),
);*/
fields.add(
2024-09-27 15:40:55 +02:00
FieldMonthsRangepicker(
2024-09-27 15:30:39 +02:00
name: 'months',
label: 'Beginn der Maßnahme',
filterValue: filterMonths,
onClear: () {},
onSelected: (String? value) {},
entries: months.toList(),
),
);
return FormWidget(type: FormWidgetType.vertical, fields: fields);
/*return Row(
2024-09-24 15:29:01 +02:00
mainAxisAlignment: MainAxisAlignment.start,
2024-09-18 15:07:08 +02:00
children: [
2024-09-24 15:29:01 +02:00
DropdownMenuWidget(
formKey: _keyAreaType,
label: 'Ort der Maßnahme',
controller: _controllerAreaType,
filterValue: filterAreaType,
onClear: () {
setState(() {
filterAreaType = null;
});
_controllerAreaType.clear();
},
2024-09-18 15:07:08 +02:00
onSelected: (String? selection) {
setState(() {
filterAreaType = selection;
});
},
2024-09-24 15:29:01 +02:00
entries: areaType.toList(),
2024-09-18 15:07:08 +02:00
),
2024-09-24 15:29:01 +02:00
DropdownMenuWidget(
formKey: _keyType,
label: 'Art der Maßnahme',
controller: _controllerType,
filterValue: filterType,
onClear: () {
setState(() {
filterType = null;
});
_controllerType.clear();
},
2024-09-18 15:07:08 +02:00
onSelected: (String? selection) {
setState(() {
filterType = selection;
});
},
2024-09-24 15:29:01 +02:00
entries: type.toList(),
),
DropdownMenuWidget(
formKey: _keySupport,
label: 'Förderprogramm',
controller: _controllerSupport,
filterValue: filterSupport,
onClear: () {
setState(() {
filterSupport = null;
});
_controllerSupport.clear();
},
onSelected: (String? selection) {
setState(() {
filterSupport = selection;
});
},
entries: support.toList(),
2024-09-18 15:07:08 +02:00
),
],
2024-09-27 15:30:39 +02:00
);*/
2024-09-18 15:07:08 +02:00
}
Widget getCard(BuildContext context, Massnahme massnahme) {
2024-09-24 15:29:01 +02:00
final Map<String, Color> actionGroupColors = {
'Baulelemente': const Color(0xffFFD269),
'Begrünung': const Color(0xff40DD74),
'Bewirtschaftung': const Color(0xffBF72ED),
'Nisthilfe': const Color(0xffDAE3FD),
'Pflanzung': const Color(0xff40D6E9),
'Sondermaßnahmen': const Color(0xff689EF1),
};
2024-09-18 15:07:08 +02:00
2024-09-24 15:29:01 +02:00
Color background =
actionGroupColors[massnahme.actionGroup?.value] ?? Colors.white;
CachedNetworkImage? image = massnahme.getThumbnail();
2024-09-18 15:07:08 +02:00
return Visibility(
visible: visible[massnahme.id] ?? false,
child: SizedBox(
width: 400,
child: Card(
color: background,
child: Padding(
padding: const EdgeInsets.all(32),
child: Column(
children: [
if (image != null) image,
const SizedBox(
height: 8,
),
Text(massnahme.name!,
style: Theme.of(context).textTheme.headlineSmall),
const SizedBox(
height: 8,
),
ExpandableText(
massnahme.factsheetDefinition ?? '',
maxLines: 3,
expandText: 'mehr',
collapseText: 'weniger',
)
],
),
),
),
),
);
}
}