initial commit v3

This commit is contained in:
reinjens 2024-09-24 15:29:01 +02:00
parent 4d9b76feb0
commit 901d43cd01
17 changed files with 677 additions and 613 deletions

View file

@ -1,7 +1,7 @@
import 'package:ambito/src/domain/entity/baumarten/baumarten.dart'; import 'package:ambito/src/domain/entity/baumarten/baumarten.dart';
import 'package:ambito/src/domain/entity/massnahme/massnahme.dart'; import 'package:ambito/src/domain/entity/massnahme/massnahme.dart';
import 'package:ambito/src/packages/ambito_api/base.dart'; import 'package:ambito/src/packages/ambito_api/base.dart';
import 'package:ambito/src/pages/actions/actions_page.dart'; import 'package:ambito/src/pages/start/start_page.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:flutter_i18n/flutter_i18n.dart';
@ -9,7 +9,7 @@ import 'package:get/get_navigation/src/root/get_material_app.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
final String AmbitoToken = 'TFxO7vzBLVRCu9I3VMoHmTuCvSu8aCDi'; const String ambitoToken = 'TFxO7vzBLVRCu9I3VMoHmTuCvSu8aCDi';
final Logger logger = Logger( final Logger logger = Logger(
printer: PrettyPrinter(), printer: PrettyPrinter(),
@ -20,11 +20,6 @@ late Isar isar;
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
/*Isar.open(
schemas: [BaumartenSchema, IdValueColorSchema, IdValueSchema],
directory: '',
);*/
await Isar.initialize(); await Isar.initialize();
const dir = Isar.sqliteInMemory; const dir = Isar.sqliteInMemory;
const engine = kIsWeb ? IsarEngine.sqlite : IsarEngine.isar; const engine = kIsWeb ? IsarEngine.sqlite : IsarEngine.isar;
@ -59,7 +54,9 @@ class Ambito extends StatelessWidget {
basePath: 'i18n', basePath: 'i18n',
), ),
missingTranslationHandler: (key, locale) { missingTranslationHandler: (key, locale) {
print("--- Missing Key: $key, languageCode: $locale"); if (kDebugMode) {
print("--- Missing Key: $key, languageCode: $locale");
}
}, },
), ),
], ],
@ -70,88 +67,7 @@ class Ambito extends StatelessWidget {
scaffoldBackgroundColor: Colors.white, scaffoldBackgroundColor: Colors.white,
useMaterial3: true, useMaterial3: true,
), ),
home: const MyHomePage(), home: const StartPage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String activeLink = '';
@override
void initState() {
activeLink = 'start';
super.initState();
}
@override
Widget build(BuildContext context) {
double fontSize = 16;
return Scaffold(
body: Column(
children: [
SizedBox(height: 50),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
LinkButton('start'),
LinkButton('database'),
LinkButton('designer'),
Image.asset(
'images/logo.png',
scale: 1.3,
),
LinkButton('service'),
LinkButton('network'),
LinkButton('contact'),
],
),
SizedBox(height: 50),
Expanded(
child: getContent(),
),
],
));
}
Widget getContent() {
if (activeLink == 'database') {
return ActionsPage();
}
return Text(activeLink);
}
Widget LinkButton(String link) {
double fontSize = 16;
return TextButton(
style: ButtonStyle(
overlayColor: MaterialStateProperty.resolveWith<Color>(
(Set<MaterialState> states) {
return Colors.white;
}),
),
onPressed: () {
setState(() {
activeLink = link;
});
},
child: Text(
context.translate('page.start.links.$link.title'),
style: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: (activeLink == link)
? Colors.grey.shade400
: Colors.grey.shade800,
),
),
); );
} }
} }

View file

@ -45,13 +45,20 @@ class Baumarten extends BaseEntity {
String? waterlevel; String? waterlevel;
@JsonKey(name: 'Bodenfeuchte') @JsonKey(name: 'Bodenfeuchte')
List<IdValueColor>? humidity; List<IdValueColor>? humidity;
String? Lichtzahl; @JsonKey(name: 'Lichtzahl')
String? Temperaturzahl; String? valueLight;
String? Feuchtezahl; @JsonKey(name: 'Temperaturzahl')
String? Reaktionszahl; String? valueTemperature;
String? Stickstoffzahl; @JsonKey(name: 'Feuchtezahl')
List<IdValueColor>? Region; String? valueHumidity;
String? Anmerkung; @JsonKey(name: 'Reaktionszahl')
String? valueReaction;
@JsonKey(name: 'Stickstoffzahl')
String? valueNitrogen;
@JsonKey(name: 'Region')
List<IdValueColor>? region;
@JsonKey(name: 'Anmerkung')
String? note;
@JsonKey(name: "Wild/Kulturart") @JsonKey(name: "Wild/Kulturart")
String? typeOfCulture; String? typeOfCulture;
@JsonKey(name: 'Gebiet 1') @JsonKey(name: 'Gebiet 1')

File diff suppressed because it is too large Load diff

View file

@ -11,14 +11,20 @@ class FilePart {
String? url; String? url;
Thumbnails? thumbnails; Thumbnails? thumbnails;
String? visible_name; @JsonKey(name: 'visible_name')
String? visibleName;
String? name; String? name;
int? size; int? size;
String? mime_type; @JsonKey(name: 'mime_type')
bool? is_image; String? mimeType;
int? image_width; @JsonKey(name: 'is_image')
int? image_height; bool? isImage;
String? uploaded_at; @JsonKey(name: 'image_width')
int? imageWidth;
@JsonKey(name: 'image_height')
int? imageHeight;
@JsonKey(name: 'uploaded_at')
String? uploadedAt;
factory FilePart.fromJson(Map<String, dynamic> json) => factory FilePart.fromJson(Map<String, dynamic> json) =>
_$FilePartFromJson(json); _$FilePartFromJson(json);

View file

@ -25,7 +25,7 @@ const FilePartSchema = IsarGeneratedSchema(
target: 'Thumbnails', target: 'Thumbnails',
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'visible_name', name: 'visibleName',
type: IsarType.string, type: IsarType.string,
), ),
IsarPropertySchema( IsarPropertySchema(
@ -37,23 +37,23 @@ const FilePartSchema = IsarGeneratedSchema(
type: IsarType.long, type: IsarType.long,
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'mime_type', name: 'mimeType',
type: IsarType.string, type: IsarType.string,
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'is_image', name: 'isImage',
type: IsarType.bool, type: IsarType.bool,
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'image_width', name: 'imageWidth',
type: IsarType.long, type: IsarType.long,
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'image_height', name: 'imageHeight',
type: IsarType.long, type: IsarType.long,
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'uploaded_at', name: 'uploadedAt',
type: IsarType.string, type: IsarType.string,
), ),
], ],
@ -86,7 +86,7 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
} }
} }
{ {
final value = object.visible_name; final value = object.visibleName;
if (value == null) { if (value == null) {
IsarCore.writeNull(writer, 3); IsarCore.writeNull(writer, 3);
} else { } else {
@ -103,7 +103,7 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
} }
IsarCore.writeLong(writer, 5, object.size ?? -9223372036854775808); IsarCore.writeLong(writer, 5, object.size ?? -9223372036854775808);
{ {
final value = object.mime_type; final value = object.mimeType;
if (value == null) { if (value == null) {
IsarCore.writeNull(writer, 6); IsarCore.writeNull(writer, 6);
} else { } else {
@ -111,17 +111,17 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
} }
} }
{ {
final value = object.is_image; final value = object.isImage;
if (value == null) { if (value == null) {
IsarCore.writeNull(writer, 7); IsarCore.writeNull(writer, 7);
} else { } else {
IsarCore.writeBool(writer, 7, value); IsarCore.writeBool(writer, 7, value);
} }
} }
IsarCore.writeLong(writer, 8, object.image_width ?? -9223372036854775808); IsarCore.writeLong(writer, 8, object.imageWidth ?? -9223372036854775808);
IsarCore.writeLong(writer, 9, object.image_height ?? -9223372036854775808); IsarCore.writeLong(writer, 9, object.imageHeight ?? -9223372036854775808);
{ {
final value = object.uploaded_at; final value = object.uploadedAt;
if (value == null) { if (value == null) {
IsarCore.writeNull(writer, 10); IsarCore.writeNull(writer, 10);
} else { } else {
@ -145,7 +145,7 @@ FilePart deserializeFilePart(IsarReader reader) {
object.thumbnails = embedded; object.thumbnails = embedded;
} }
} }
object.visible_name = IsarCore.readString(reader, 3); object.visibleName = IsarCore.readString(reader, 3);
object.name = IsarCore.readString(reader, 4); object.name = IsarCore.readString(reader, 4);
{ {
final value = IsarCore.readLong(reader, 5); final value = IsarCore.readLong(reader, 5);
@ -155,31 +155,31 @@ FilePart deserializeFilePart(IsarReader reader) {
object.size = value; object.size = value;
} }
} }
object.mime_type = IsarCore.readString(reader, 6); object.mimeType = IsarCore.readString(reader, 6);
{ {
if (IsarCore.readNull(reader, 7)) { if (IsarCore.readNull(reader, 7)) {
object.is_image = null; object.isImage = null;
} else { } else {
object.is_image = IsarCore.readBool(reader, 7); object.isImage = IsarCore.readBool(reader, 7);
} }
} }
{ {
final value = IsarCore.readLong(reader, 8); final value = IsarCore.readLong(reader, 8);
if (value == -9223372036854775808) { if (value == -9223372036854775808) {
object.image_width = null; object.imageWidth = null;
} else { } else {
object.image_width = value; object.imageWidth = value;
} }
} }
{ {
final value = IsarCore.readLong(reader, 9); final value = IsarCore.readLong(reader, 9);
if (value == -9223372036854775808) { if (value == -9223372036854775808) {
object.image_height = null; object.imageHeight = null;
} else { } else {
object.image_height = value; object.imageHeight = value;
} }
} }
object.uploaded_at = IsarCore.readString(reader, 10); object.uploadedAt = IsarCore.readString(reader, 10);
return object; return object;
} }
@ -383,20 +383,20 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameIsNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 3)); return query.addFilterCondition(const IsNullCondition(property: 3));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameIsNotNull() { visibleNameIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 3)); return query.addFilterCondition(const IsNullCondition(property: 3));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameEqualTo( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -412,7 +412,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameGreaterThan( visibleNameGreaterThan(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -428,7 +428,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameGreaterThanOrEqualTo( visibleNameGreaterThanOrEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -443,7 +443,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameLessThan( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameLessThan(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -459,7 +459,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameLessThanOrEqualTo( visibleNameLessThanOrEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -474,7 +474,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameBetween( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameBetween(
String? lower, String? lower,
String? upper, { String? upper, {
bool caseSensitive = true, bool caseSensitive = true,
@ -491,8 +491,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameStartsWith(
visible_nameStartsWith(
String value, { String value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -507,7 +506,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameEndsWith( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameEndsWith(
String value, { String value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -522,7 +521,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameContains( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameContains(
String value, String value,
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -536,7 +535,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameMatches( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameMatches(
String pattern, String pattern,
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -550,8 +549,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameIsEmpty() {
visible_nameIsEmpty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(
const EqualCondition( const EqualCondition(
@ -563,7 +561,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
visible_nameIsNotEmpty() { visibleNameIsNotEmpty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(
const GreaterCondition( const GreaterCondition(
@ -852,19 +850,19 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 6)); return query.addFilterCondition(const IsNullCondition(property: 6));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsNotNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 6)); return query.addFilterCondition(const IsNullCondition(property: 6));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeEqualTo( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -879,7 +877,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeGreaterThan( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeGreaterThan(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -895,7 +893,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
mime_typeGreaterThanOrEqualTo( mimeTypeGreaterThanOrEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -910,7 +908,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeLessThan( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeLessThan(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -926,7 +924,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
mime_typeLessThanOrEqualTo( mimeTypeLessThanOrEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -941,7 +939,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeBetween( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeBetween(
String? lower, String? lower,
String? upper, { String? upper, {
bool caseSensitive = true, bool caseSensitive = true,
@ -958,7 +956,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeStartsWith( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeStartsWith(
String value, { String value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -973,7 +971,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeEndsWith( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeEndsWith(
String value, { String value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -988,7 +986,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeContains( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeContains(
String value, String value,
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1002,7 +1000,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeMatches( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeMatches(
String pattern, String pattern,
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1016,7 +1014,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsEmpty() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsEmpty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(
const EqualCondition( const EqualCondition(
@ -1027,8 +1025,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNotEmpty() {
mime_typeIsNotEmpty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(
const GreaterCondition( const GreaterCondition(
@ -1039,19 +1036,19 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageIsNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 7)); return query.addFilterCondition(const IsNullCondition(property: 7));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageIsNotNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 7)); return query.addFilterCondition(const IsNullCondition(property: 7));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageEqualTo( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageEqualTo(
bool? value, bool? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1064,20 +1061,20 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthIsNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 8)); return query.addFilterCondition(const IsNullCondition(property: 8));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthIsNotNull() { imageWidthIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 8)); return query.addFilterCondition(const IsNullCondition(property: 8));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthEqualTo( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthEqualTo(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1090,8 +1087,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthGreaterThan(
image_widthGreaterThan(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1105,7 +1101,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthGreaterThanOrEqualTo( imageWidthGreaterThanOrEqualTo(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1118,7 +1114,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthLessThan( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthLessThan(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1132,7 +1128,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_widthLessThanOrEqualTo( imageWidthLessThanOrEqualTo(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1145,7 +1141,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthBetween( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthBetween(
int? lower, int? lower,
int? upper, int? upper,
) { ) {
@ -1160,20 +1156,20 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightIsNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 9)); return query.addFilterCondition(const IsNullCondition(property: 9));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightIsNotNull() { imageHeightIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 9)); return query.addFilterCondition(const IsNullCondition(property: 9));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightEqualTo( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightEqualTo(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1187,7 +1183,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightGreaterThan( imageHeightGreaterThan(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1201,7 +1197,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightGreaterThanOrEqualTo( imageHeightGreaterThanOrEqualTo(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1214,7 +1210,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightLessThan( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightLessThan(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1228,7 +1224,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
image_heightLessThanOrEqualTo( imageHeightLessThanOrEqualTo(
int? value, int? value,
) { ) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1241,7 +1237,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightBetween( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightBetween(
int? lower, int? lower,
int? upper, int? upper,
) { ) {
@ -1256,20 +1252,20 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atIsNull() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 10)); return query.addFilterCondition(const IsNullCondition(property: 10));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atIsNotNull() { uploadedAtIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 10)); return query.addFilterCondition(const IsNullCondition(property: 10));
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atEqualTo( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1284,8 +1280,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtGreaterThan(
uploaded_atGreaterThan(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1301,7 +1296,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atGreaterThanOrEqualTo( uploadedAtGreaterThanOrEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1316,7 +1311,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atLessThan( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtLessThan(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1332,7 +1327,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atLessThanOrEqualTo( uploadedAtLessThanOrEqualTo(
String? value, { String? value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1347,7 +1342,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atBetween( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtBetween(
String? lower, String? lower,
String? upper, { String? upper, {
bool caseSensitive = true, bool caseSensitive = true,
@ -1364,7 +1359,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atStartsWith( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtStartsWith(
String value, { String value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1379,7 +1374,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atEndsWith( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtEndsWith(
String value, { String value, {
bool caseSensitive = true, bool caseSensitive = true,
}) { }) {
@ -1394,7 +1389,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atContains( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtContains(
String value, String value,
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1408,7 +1403,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atMatches( QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtMatches(
String pattern, String pattern,
{bool caseSensitive = true}) { {bool caseSensitive = true}) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
@ -1422,7 +1417,7 @@ extension FilePartQueryFilter
}); });
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atIsEmpty() { QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtIsEmpty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(
const EqualCondition( const EqualCondition(
@ -1434,7 +1429,7 @@ extension FilePartQueryFilter
} }
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
uploaded_atIsNotEmpty() { uploadedAtIsNotEmpty() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition( return query.addFilterCondition(
const GreaterCondition( const GreaterCondition(
@ -1465,24 +1460,24 @@ FilePart _$FilePartFromJson(Map<String, dynamic> json) => FilePart()
..thumbnails = json['thumbnails'] == null ..thumbnails = json['thumbnails'] == null
? null ? null
: Thumbnails.fromJson(json['thumbnails'] as Map<String, dynamic>) : Thumbnails.fromJson(json['thumbnails'] as Map<String, dynamic>)
..visible_name = json['visible_name'] as String? ..visibleName = json['visible_name'] as String?
..name = json['name'] as String? ..name = json['name'] as String?
..size = (json['size'] as num?)?.toInt() ..size = (json['size'] as num?)?.toInt()
..mime_type = json['mime_type'] as String? ..mimeType = json['mime_type'] as String?
..is_image = json['is_image'] as bool? ..isImage = json['is_image'] as bool?
..image_width = (json['image_width'] as num?)?.toInt() ..imageWidth = (json['image_width'] as num?)?.toInt()
..image_height = (json['image_height'] as num?)?.toInt() ..imageHeight = (json['image_height'] as num?)?.toInt()
..uploaded_at = json['uploaded_at'] as String?; ..uploadedAt = json['uploaded_at'] as String?;
Map<String, dynamic> _$FilePartToJson(FilePart instance) => <String, dynamic>{ Map<String, dynamic> _$FilePartToJson(FilePart instance) => <String, dynamic>{
'url': instance.url, 'url': instance.url,
'thumbnails': instance.thumbnails?.toJson(), 'thumbnails': instance.thumbnails?.toJson(),
'visible_name': instance.visible_name, 'visible_name': instance.visibleName,
'name': instance.name, 'name': instance.name,
'size': instance.size, 'size': instance.size,
'mime_type': instance.mime_type, 'mime_type': instance.mimeType,
'is_image': instance.is_image, 'is_image': instance.isImage,
'image_width': instance.image_width, 'image_width': instance.imageWidth,
'image_height': instance.image_height, 'image_height': instance.imageHeight,
'uploaded_at': instance.uploaded_at, 'uploaded_at': instance.uploadedAt,
}; };

View file

@ -11,7 +11,8 @@ class Thumbnails {
Thumbnail? tiny; Thumbnail? tiny;
Thumbnail? small; Thumbnail? small;
Thumbnail? card_cover; @JsonKey(name: 'card_cover')
Thumbnail? cardCover;
factory Thumbnails.fromJson(Map<String, dynamic> json) => factory Thumbnails.fromJson(Map<String, dynamic> json) =>
_$ThumbnailsFromJson(json); _$ThumbnailsFromJson(json);

View file

@ -26,7 +26,7 @@ const ThumbnailsSchema = IsarGeneratedSchema(
target: 'Thumbnail', target: 'Thumbnail',
), ),
IsarPropertySchema( IsarPropertySchema(
name: 'card_cover', name: 'cardCover',
type: IsarType.object, type: IsarType.object,
target: 'Thumbnail', target: 'Thumbnail',
), ),
@ -62,7 +62,7 @@ int serializeThumbnails(IsarWriter writer, Thumbnails object) {
} }
} }
{ {
final value = object.card_cover; final value = object.cardCover;
if (value == null) { if (value == null) {
IsarCore.writeNull(writer, 3); IsarCore.writeNull(writer, 3);
} else { } else {
@ -100,11 +100,11 @@ Thumbnails deserializeThumbnails(IsarReader reader) {
{ {
final objectReader = IsarCore.readObject(reader, 3); final objectReader = IsarCore.readObject(reader, 3);
if (objectReader.isNull) { if (objectReader.isNull) {
object.card_cover = null; object.cardCover = null;
} else { } else {
final embedded = deserializeThumbnail(objectReader); final embedded = deserializeThumbnail(objectReader);
IsarCore.freeReader(objectReader); IsarCore.freeReader(objectReader);
object.card_cover = embedded; object.cardCover = embedded;
} }
} }
return object; return object;
@ -137,14 +137,14 @@ extension ThumbnailsQueryFilter
} }
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition> QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition>
card_coverIsNull() { cardCoverIsNull() {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.addFilterCondition(const IsNullCondition(property: 3)); return query.addFilterCondition(const IsNullCondition(property: 3));
}); });
} }
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition> QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition>
card_coverIsNotNull() { cardCoverIsNotNull() {
return QueryBuilder.apply(not(), (query) { return QueryBuilder.apply(not(), (query) {
return query.addFilterCondition(const IsNullCondition(property: 3)); return query.addFilterCondition(const IsNullCondition(property: 3));
}); });
@ -167,7 +167,7 @@ extension ThumbnailsQueryObject
}); });
} }
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition> card_cover( QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition> cardCover(
FilterQuery<Thumbnail> q) { FilterQuery<Thumbnail> q) {
return QueryBuilder.apply(this, (query) { return QueryBuilder.apply(this, (query) {
return query.object(q, 3); return query.object(q, 3);
@ -186,7 +186,7 @@ Thumbnails _$ThumbnailsFromJson(Map<String, dynamic> json) => Thumbnails()
..small = json['small'] == null ..small = json['small'] == null
? null ? null
: Thumbnail.fromJson(json['small'] as Map<String, dynamic>) : Thumbnail.fromJson(json['small'] as Map<String, dynamic>)
..card_cover = json['card_cover'] == null ..cardCover = json['card_cover'] == null
? null ? null
: Thumbnail.fromJson(json['card_cover'] as Map<String, dynamic>); : Thumbnail.fromJson(json['card_cover'] as Map<String, dynamic>);
@ -194,5 +194,5 @@ Map<String, dynamic> _$ThumbnailsToJson(Thumbnails instance) =>
<String, dynamic>{ <String, dynamic>{
'tiny': instance.tiny?.toJson(), 'tiny': instance.tiny?.toJson(),
'small': instance.small?.toJson(), 'small': instance.small?.toJson(),
'card_cover': instance.card_cover?.toJson(), 'card_cover': instance.cardCover?.toJson(),
}; };

View file

@ -1,6 +1,8 @@
import 'package:ambito/src/domain/entity/base_entity.dart'; import 'package:ambito/src/domain/entity/base_entity.dart';
import 'package:ambito/src/domain/entity/id_value/id_value.dart'; import 'package:ambito/src/domain/entity/id_value/id_value.dart';
import 'package:ambito/src/domain/entity/id_value_color/id_value_color.dart'; import 'package:ambito/src/domain/entity/id_value_color/id_value_color.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
@ -150,3 +152,21 @@ class Massnahme extends BaseEntity {
Map<String, dynamic> toJson() => _$MassnahmeToJson(this); Map<String, dynamic> toJson() => _$MassnahmeToJson(this);
} }
extension MassnahmenExtension on Massnahme {
CachedNetworkImage? getThumbnail() {
CachedNetworkImage? image;
if (files != null && files!.isNotEmpty) {
if (files![0].thumbnails?.cardCover?.url != null) {
image = CachedNetworkImage(
imageUrl:files![0].thumbnails!.cardCover!.url!,
placeholder: (context, url) => const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
);
}
}
return image;
}
}

View file

@ -46,6 +46,7 @@ class BaseApi {
break; break;
case 'massnahmen': case 'massnahmen':
for (var massnahme in json['results']) { for (var massnahme in json['results']) {
logger.d(massnahme);
BaseDB.put(Massnahme.fromJson(massnahme)); BaseDB.put(Massnahme.fromJson(massnahme));
isar.write((isar) { isar.write((isar) {
isar.massnahmes.put(Massnahme.fromJson(massnahme)); isar.massnahmes.put(Massnahme.fromJson(massnahme));

View file

@ -19,7 +19,7 @@ class RestClient {
var headers = { var headers = {
"Content-Type": contentType, "Content-Type": contentType,
"Accept": accept, "Accept": accept,
"Authorization": "Token $AmbitoToken", "Authorization": "Token $ambitoToken",
}; };
return headers; return headers;
} }

View file

@ -6,7 +6,7 @@ import '../../../main.dart';
class BaseDB { class BaseDB {
static put(var entity) { static put(var entity) {
switch (entity.runtimeType) { switch (entity.runtimeType.toString()) {
case 'Baumarten': case 'Baumarten':
isar.write((isar) { isar.write((isar) {
isar.baumartens.put(entity); isar.baumartens.put(entity);

View file

@ -1,5 +1,6 @@
import 'package:ambito/src/domain/entity/massnahme/massnahme.dart'; import 'package:ambito/src/domain/entity/massnahme/massnahme.dart';
import 'package:ambito/src/packages/ambito_db/base_db.dart'; import 'package:ambito/src/packages/ambito_db/base_db.dart';
import 'package:ambito/src/widgets/form/dropdown_menu.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:expandable_text/expandable_text.dart'; import 'package:expandable_text/expandable_text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -7,84 +8,94 @@ import 'package:flutter/material.dart';
import '../../../main.dart'; import '../../../main.dart';
class ActionsPage extends StatefulWidget { class ActionsPage extends StatefulWidget {
const ActionsPage({super.key});
@override @override
State<StatefulWidget> createState() => ActionsPageState(); State<StatefulWidget> createState() => ActionsPageState();
} }
class ActionsPageState extends State<ActionsPage> { class ActionsPageState extends State<ActionsPage> {
final GlobalKey<FormFieldState> _keyType = GlobalKey<FormFieldState>(); final GlobalKey<FormFieldState> _keyType = GlobalKey<FormFieldState>();
final TextEditingController _controllerType = TextEditingController();
final GlobalKey<FormFieldState> _keyAreaType = GlobalKey<FormFieldState>(); final GlobalKey<FormFieldState> _keyAreaType = GlobalKey<FormFieldState>();
final TextEditingController _controllerAreaType = TextEditingController();
final GlobalKey<FormFieldState> _keySupport = GlobalKey<FormFieldState>();
final TextEditingController _controllerSupport = TextEditingController();
Map<int, bool> visible = {}; Map<int, bool> visible = {};
List<String> effort = []; List<String> effort = [];
List<String> effect = []; List<String> effect = [];
List<String> type = []; Set<String> type = {};
String? filterType; String? filterType;
List<String> areaType = []; Set<String> areaType = {};
String? filterAreaType; String? filterAreaType;
List<String> region = []; List<String> region = [];
List<String> support = []; String? filterSupport;
Set<String> support = {};
@override @override
void initState() { void initState() {
super.initState();
effort = []; effort = [];
effect = []; effect = [];
type = []; type = {};
areaType = []; areaType = {};
region = []; region = [];
support = []; support = {};
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Massnahme> massnahmen = BaseDB.getAll('Maßnahme'); List<Massnahme> massnahmen = BaseDB.getAll('Maßnahme');
Set<String> updatedTypes = {};
Set<String> updatedAreaTypes = {};
Set<String> updatedSupports = {};
List<Widget> actionCards = [];
for (var massnahme in massnahmen) { for (var massnahme in massnahmen) {
//logger.d(massnahme.toJson()); if (massnahme.actionGroup != null) {
if (massnahme.actionGroup != null && updatedTypes.add(massnahme.actionGroup!.value!);
!type.contains(massnahme.actionGroup!.value)) {
setState(() {
type.add(massnahme.actionGroup!.value!);
});
} }
if (massnahme.factsheetAreaType != null) { if (massnahme.factsheetAreaType != null) {
for (var aType in massnahme.factsheetAreaType!) { for (var aType in massnahme.factsheetAreaType!) {
if (!areaType.contains(aType.value)) { updatedAreaTypes.add(aType.value!);
setState(() { }
areaType.add(aType.value!); }
}); if (massnahme.fundingPrograms != null) {
} for (var aType in massnahme.fundingPrograms!) {
updatedSupports.add(aType.value!);
} }
} }
} }
for (var massnahme in massnahmen) { setState(() {
bool myVisibility = true; type.addAll(updatedTypes);
if (filterType != null) { areaType.addAll(updatedAreaTypes);
if (massnahme.actionGroup == null || support.addAll(updatedSupports);
massnahme.actionGroup!.value != filterType) { });
myVisibility = false;
} List<Widget> actionCards = massnahmen.map((massnahme) {
} bool typeMatches = filterType == null ||
if (filterAreaType != null) { (massnahme.actionGroup != null &&
if (massnahme.factsheetAreaType != null) { massnahme.actionGroup!.value == filterType);
myVisibility = false;
for (var aType in massnahme.factsheetAreaType!) { bool areaTypeMatches = filterAreaType == null ||
if (aType.value == filterAreaType) { (massnahme.factsheetAreaType
myVisibility = true; ?.any((aType) => aType.value == filterAreaType) ??
} false);
}
} bool supportMatches = filterSupport == null ||
} (massnahme.fundingPrograms
?.any((aType) => aType.value == filterSupport) ??
false);
// Update visibility based on the matches
setState(() { setState(() {
visible[massnahme.id] = myVisibility; visible[massnahme.id] =
typeMatches && areaTypeMatches && supportMatches;
}); });
actionCards.add(getCard(context, massnahme));
}
logger.d(visible); return getCard(context, massnahme);
//logger.d(areaType); }).toList();
return Padding( return Padding(
padding: const EdgeInsets.only(left: 32, right: 32), padding: const EdgeInsets.only(left: 32, right: 32),
@ -123,98 +134,80 @@ class ActionsPageState extends State<ActionsPage> {
Widget getFilter(BuildContext context) { Widget getFilter(BuildContext context) {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
DropdownMenu( DropdownMenuWidget(
key: _keyAreaType, formKey: _keyAreaType,
initialSelection: filterAreaType, label: 'Ort der Maßnahme',
leadingIcon: (filterAreaType != null) controller: _controllerAreaType,
? IconButton( filterValue: filterAreaType,
onPressed: () { onClear: () {
_keyAreaType.currentState!.didChange(null); setState(() {
_keyAreaType.currentState!.reset(); filterAreaType = null;
setState(() { });
filterAreaType = null; _controllerAreaType.clear();
}); },
},
icon: const Icon(Icons.delete),
)
: null,
onSelected: (String? selection) { onSelected: (String? selection) {
setState(() { setState(() {
filterAreaType = selection; filterAreaType = selection;
}); });
}, },
dropdownMenuEntries: entries: areaType.toList(),
areaType.map<DropdownMenuEntry<String>>((String entry) {
return DropdownMenuEntry<String>(
value: entry,
label: entry,
);
}).toList(),
), ),
DropdownMenu( DropdownMenuWidget(
key: _keyType, formKey: _keyType,
leadingIcon: (filterType != null) label: 'Art der Maßnahme',
? IconButton( controller: _controllerType,
onPressed: () { filterValue: filterType,
setState(() { onClear: () {
filterType = null; setState(() {
}); filterType = null;
_keyType.currentState!.reset(); });
}, _controllerType.clear();
icon: const Icon(Icons.delete), },
)
: null,
onSelected: (String? selection) { onSelected: (String? selection) {
setState(() { setState(() {
filterType = selection; filterType = selection;
}); });
}, },
dropdownMenuEntries: entries: type.toList(),
type.map<DropdownMenuEntry<String>>((String entry) { ),
return DropdownMenuEntry<String>( DropdownMenuWidget(
value: entry, formKey: _keySupport,
label: entry, label: 'Förderprogramm',
); controller: _controllerSupport,
}).toList(), filterValue: filterSupport,
onClear: () {
setState(() {
filterSupport = null;
});
_controllerSupport.clear();
},
onSelected: (String? selection) {
setState(() {
filterSupport = selection;
});
},
entries: support.toList(),
), ),
], ],
); );
} }
Widget getCard(BuildContext context, Massnahme massnahme) { Widget getCard(BuildContext context, Massnahme massnahme) {
Color background = Colors.white; final Map<String, Color> actionGroupColors = {
switch (massnahme.actionGroup?.value) { 'Baulelemente': const Color(0xffFFD269),
case 'Baulelemente': 'Begrünung': const Color(0xff40DD74),
background = const Color(0xffFFD269); 'Bewirtschaftung': const Color(0xffBF72ED),
break; 'Nisthilfe': const Color(0xffDAE3FD),
case 'Begrünung': 'Pflanzung': const Color(0xff40D6E9),
background = const Color(0xff40DD74); 'Sondermaßnahmen': const Color(0xff689EF1),
break; };
case 'Bewirtschaftung':
background = const Color(0xffBF72ED);
break;
case 'Nisthilfe':
background = const Color(0xffDAE3FD);
break;
case 'Pflanzung':
background = const Color(0xff40D6E9);
break;
case 'Sondermaßnahmen':
background = const Color(0xff689EF1);
break;
}
var image; Color background =
if (massnahme.files != null && massnahme.files!.isNotEmpty) { actionGroupColors[massnahme.actionGroup?.value] ?? Colors.white;
if (massnahme.files![0].thumbnails?.card_cover?.url != null) {
image = CachedNetworkImage( CachedNetworkImage? image = massnahme.getThumbnail();
imageUrl: massnahme.files![0].thumbnails!.card_cover!.url!,
placeholder: (context, url) => const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
);
}
}
return Visibility( return Visibility(
visible: visible[massnahme.id] ?? false, visible: visible[massnahme.id] ?? false,

View file

@ -0,0 +1,85 @@
import 'package:ambito/main.dart';
import 'package:flutter/material.dart';
import '../actions/actions_page.dart';
class StartPage extends StatefulWidget {
const StartPage({super.key});
@override
State<StartPage> createState() => StartPageState();
}
class StartPageState extends State<StartPage> {
String activeLink = '';
@override
void initState() {
activeLink = 'start';
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 50),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
_linkButton('start'),
_linkButton('database'),
_linkButton('designer'),
Image.asset(
'images/logo.png',
scale: 1.3,
),
_linkButton('service'),
_linkButton('network'),
_linkButton('contact'),
],
),
const SizedBox(height: 50),
Expanded(
child: getContent(),
),
],
));
}
Widget getContent() {
if (activeLink == 'database') {
return const ActionsPage();
}
return Text(activeLink);
}
Widget _linkButton(String link) {
double fontSize = 16;
return TextButton(
style: ButtonStyle(
overlayColor:
WidgetStateProperty.resolveWith<Color>((Set<WidgetState> states) {
return Colors.white;
}),
),
onPressed: () {
setState(() {
activeLink = link;
});
},
child: Text(
context.translate('page.start.links.$link.title'),
style: TextStyle(
fontSize: fontSize,
fontWeight: FontWeight.bold,
color: (activeLink == link)
? Colors.grey.shade400
: Colors.grey.shade800,
),
),
);
}
}

View file

@ -0,0 +1 @@

View file

@ -0,0 +1,49 @@
import 'package:flutter/material.dart';
class DropdownMenuWidget extends StatelessWidget {
final Key formKey;
final String label;
final TextEditingController controller;
final String? filterValue;
final VoidCallback onClear;
final void Function(String?) onSelected;
final List<String> entries;
const DropdownMenuWidget({
super.key,
required this.formKey,
required this.label,
required this.controller,
required this.filterValue,
required this.onClear,
required this.onSelected,
required this.entries,
});
@override
Widget build(BuildContext context) {
return DropdownMenu(
key: formKey,
label: Text(label),
controller: controller,
initialSelection: filterValue,
leadingIcon: (filterValue != null)
? IconButton(
onPressed: onClear,
icon: const Icon(Icons.cancel_outlined),
)
: const Icon(
Icons.cancel_outlined,
color: Colors.transparent,
),
onSelected: onSelected,
dropdownMenuEntries:
entries.map<DropdownMenuEntry<String>>((String entry) {
return DropdownMenuEntry<String>(
value: entry,
label: entry,
);
}).toList(),
);
}
}

View file

@ -5,23 +5,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "72.0.0" version: "67.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.2"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.7.0" version: "6.4.1"
args: args:
dependency: transitive dependency: transitive
description: description:
@ -90,18 +85,18 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04 sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.12" version: "2.4.11"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:
name: build_runner_core name: build_runner_core
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.3.2" version: "7.3.1"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
@ -226,10 +221,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_style name: dart_style
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.7" version: "2.3.6"
dio: dio:
dependency: transitive dependency: transitive
description: description:
@ -459,7 +454,7 @@ packages:
source: hosted source: hosted
version: "2.3.2" version: "2.3.2"
http: http:
dependency: transitive dependency: "direct main"
description: description:
name: http name: http
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
@ -566,18 +561,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.5" version: "10.0.4"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.5" version: "3.0.3"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
@ -618,14 +613,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
macros:
dependency: transitive
description:
name: macros
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
url: "https://pub.dev"
source: hosted
version: "0.1.2-main.4"
maps_toolkit: maps_toolkit:
dependency: "direct main" dependency: "direct main"
description: description:
@ -646,18 +633,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.11.1" version: "0.8.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.15.0" version: "1.12.0"
mgrs_dart: mgrs_dart:
dependency: transitive dependency: transitive
description: description:
@ -939,10 +926,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
sha256: "4058172e418eb7e7f2058dcb7657d451a8fc264afa0dea4dbd0f304a57131611" sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.4+3" version: "2.5.4"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -979,10 +966,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: synchronized name: synchronized
sha256: "51b08572b9f091f8c3eb4d9d4be253f196ff0075d5ec9b10a884026d5b55d7bc" sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.0+2" version: "3.1.0+1"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
@ -995,10 +982,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.2" version: "0.7.0"
timing: timing:
dependency: transitive dependency: transitive
description: description:
@ -1051,10 +1038,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.2.1"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:
@ -1128,5 +1115,5 @@ packages:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.5.0 <4.0.0" dart: ">=3.4.4 <4.0.0"
flutter: ">=3.22.0" flutter: ">=3.22.0"

View file

@ -36,6 +36,7 @@ dependencies:
expandable_text: ^2.3.0 expandable_text: ^2.3.0
path_provider: ^2.1.4 path_provider: ^2.1.4
cached_network_image: ^3.4.1 cached_network_image: ^3.4.1
http: ^1.2.2
dev_dependencies: dev_dependencies: