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';
|
|
|
|
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',
|
|
|
|
)
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|