initial commit v3
This commit is contained in:
parent
d5e6b853b3
commit
93be864bd3
17 changed files with 677 additions and 613 deletions
|
@ -1,7 +1,7 @@
|
|||
import 'package:ambito/src/domain/entity/baumarten/baumarten.dart';
|
||||
import 'package:ambito/src/domain/entity/massnahme/massnahme.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/material.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:logger/logger.dart';
|
||||
|
||||
final String AmbitoToken = 'TFxO7vzBLVRCu9I3VMoHmTuCvSu8aCDi';
|
||||
const String ambitoToken = 'TFxO7vzBLVRCu9I3VMoHmTuCvSu8aCDi';
|
||||
|
||||
final Logger logger = Logger(
|
||||
printer: PrettyPrinter(),
|
||||
|
@ -20,11 +20,6 @@ late Isar isar;
|
|||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
/*Isar.open(
|
||||
schemas: [BaumartenSchema, IdValueColorSchema, IdValueSchema],
|
||||
directory: '',
|
||||
);*/
|
||||
|
||||
await Isar.initialize();
|
||||
const dir = Isar.sqliteInMemory;
|
||||
const engine = kIsWeb ? IsarEngine.sqlite : IsarEngine.isar;
|
||||
|
@ -59,7 +54,9 @@ class Ambito extends StatelessWidget {
|
|||
basePath: 'i18n',
|
||||
),
|
||||
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,
|
||||
useMaterial3: true,
|
||||
),
|
||||
home: const MyHomePage(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
),
|
||||
),
|
||||
home: const StartPage(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,13 +45,20 @@ class Baumarten extends BaseEntity {
|
|||
String? waterlevel;
|
||||
@JsonKey(name: 'Bodenfeuchte')
|
||||
List<IdValueColor>? humidity;
|
||||
String? Lichtzahl;
|
||||
String? Temperaturzahl;
|
||||
String? Feuchtezahl;
|
||||
String? Reaktionszahl;
|
||||
String? Stickstoffzahl;
|
||||
List<IdValueColor>? Region;
|
||||
String? Anmerkung;
|
||||
@JsonKey(name: 'Lichtzahl')
|
||||
String? valueLight;
|
||||
@JsonKey(name: 'Temperaturzahl')
|
||||
String? valueTemperature;
|
||||
@JsonKey(name: 'Feuchtezahl')
|
||||
String? valueHumidity;
|
||||
@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")
|
||||
String? typeOfCulture;
|
||||
@JsonKey(name: 'Gebiet 1')
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -11,14 +11,20 @@ class FilePart {
|
|||
|
||||
String? url;
|
||||
Thumbnails? thumbnails;
|
||||
String? visible_name;
|
||||
@JsonKey(name: 'visible_name')
|
||||
String? visibleName;
|
||||
String? name;
|
||||
int? size;
|
||||
String? mime_type;
|
||||
bool? is_image;
|
||||
int? image_width;
|
||||
int? image_height;
|
||||
String? uploaded_at;
|
||||
@JsonKey(name: 'mime_type')
|
||||
String? mimeType;
|
||||
@JsonKey(name: 'is_image')
|
||||
bool? isImage;
|
||||
@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) =>
|
||||
_$FilePartFromJson(json);
|
||||
|
|
|
@ -25,7 +25,7 @@ const FilePartSchema = IsarGeneratedSchema(
|
|||
target: 'Thumbnails',
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'visible_name',
|
||||
name: 'visibleName',
|
||||
type: IsarType.string,
|
||||
),
|
||||
IsarPropertySchema(
|
||||
|
@ -37,23 +37,23 @@ const FilePartSchema = IsarGeneratedSchema(
|
|||
type: IsarType.long,
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'mime_type',
|
||||
name: 'mimeType',
|
||||
type: IsarType.string,
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'is_image',
|
||||
name: 'isImage',
|
||||
type: IsarType.bool,
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'image_width',
|
||||
name: 'imageWidth',
|
||||
type: IsarType.long,
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'image_height',
|
||||
name: 'imageHeight',
|
||||
type: IsarType.long,
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'uploaded_at',
|
||||
name: 'uploadedAt',
|
||||
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) {
|
||||
IsarCore.writeNull(writer, 3);
|
||||
} else {
|
||||
|
@ -103,7 +103,7 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
|
|||
}
|
||||
IsarCore.writeLong(writer, 5, object.size ?? -9223372036854775808);
|
||||
{
|
||||
final value = object.mime_type;
|
||||
final value = object.mimeType;
|
||||
if (value == null) {
|
||||
IsarCore.writeNull(writer, 6);
|
||||
} else {
|
||||
|
@ -111,17 +111,17 @@ int serializeFilePart(IsarWriter writer, FilePart object) {
|
|||
}
|
||||
}
|
||||
{
|
||||
final value = object.is_image;
|
||||
final value = object.isImage;
|
||||
if (value == null) {
|
||||
IsarCore.writeNull(writer, 7);
|
||||
} else {
|
||||
IsarCore.writeBool(writer, 7, value);
|
||||
}
|
||||
}
|
||||
IsarCore.writeLong(writer, 8, object.image_width ?? -9223372036854775808);
|
||||
IsarCore.writeLong(writer, 9, object.image_height ?? -9223372036854775808);
|
||||
IsarCore.writeLong(writer, 8, object.imageWidth ?? -9223372036854775808);
|
||||
IsarCore.writeLong(writer, 9, object.imageHeight ?? -9223372036854775808);
|
||||
{
|
||||
final value = object.uploaded_at;
|
||||
final value = object.uploadedAt;
|
||||
if (value == null) {
|
||||
IsarCore.writeNull(writer, 10);
|
||||
} else {
|
||||
|
@ -145,7 +145,7 @@ FilePart deserializeFilePart(IsarReader reader) {
|
|||
object.thumbnails = embedded;
|
||||
}
|
||||
}
|
||||
object.visible_name = IsarCore.readString(reader, 3);
|
||||
object.visibleName = IsarCore.readString(reader, 3);
|
||||
object.name = IsarCore.readString(reader, 4);
|
||||
{
|
||||
final value = IsarCore.readLong(reader, 5);
|
||||
|
@ -155,31 +155,31 @@ FilePart deserializeFilePart(IsarReader reader) {
|
|||
object.size = value;
|
||||
}
|
||||
}
|
||||
object.mime_type = IsarCore.readString(reader, 6);
|
||||
object.mimeType = IsarCore.readString(reader, 6);
|
||||
{
|
||||
if (IsarCore.readNull(reader, 7)) {
|
||||
object.is_image = null;
|
||||
object.isImage = null;
|
||||
} else {
|
||||
object.is_image = IsarCore.readBool(reader, 7);
|
||||
object.isImage = IsarCore.readBool(reader, 7);
|
||||
}
|
||||
}
|
||||
{
|
||||
final value = IsarCore.readLong(reader, 8);
|
||||
if (value == -9223372036854775808) {
|
||||
object.image_width = null;
|
||||
object.imageWidth = null;
|
||||
} else {
|
||||
object.image_width = value;
|
||||
object.imageWidth = value;
|
||||
}
|
||||
}
|
||||
{
|
||||
final value = IsarCore.readLong(reader, 9);
|
||||
if (value == -9223372036854775808) {
|
||||
object.image_height = null;
|
||||
object.imageHeight = null;
|
||||
} else {
|
||||
object.image_height = value;
|
||||
object.imageHeight = value;
|
||||
}
|
||||
}
|
||||
object.uploaded_at = IsarCore.readString(reader, 10);
|
||||
object.uploadedAt = IsarCore.readString(reader, 10);
|
||||
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 query.addFilterCondition(const IsNullCondition(property: 3));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameIsNotNull() {
|
||||
visibleNameIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 3));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameEqualTo(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -412,7 +412,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameGreaterThan(
|
||||
visibleNameGreaterThan(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -428,7 +428,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameGreaterThanOrEqualTo(
|
||||
visibleNameGreaterThanOrEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -443,7 +443,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameLessThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameLessThan(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -459,7 +459,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameLessThanOrEqualTo(
|
||||
visibleNameLessThanOrEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -474,7 +474,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameBetween(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameBetween(
|
||||
String? lower,
|
||||
String? upper, {
|
||||
bool caseSensitive = true,
|
||||
|
@ -491,8 +491,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameStartsWith(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -507,7 +506,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameEndsWith(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -522,7 +521,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameContains(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameContains(
|
||||
String value,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -536,7 +535,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visible_nameMatches(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameMatches(
|
||||
String pattern,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -550,8 +549,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameIsEmpty() {
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> visibleNameIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
const EqualCondition(
|
||||
|
@ -563,7 +561,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
visible_nameIsNotEmpty() {
|
||||
visibleNameIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
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 query.addFilterCondition(const IsNullCondition(property: 6));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeIsNotNull() {
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 6));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeEqualTo(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -879,7 +877,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeGreaterThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeGreaterThan(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -895,7 +893,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
mime_typeGreaterThanOrEqualTo(
|
||||
mimeTypeGreaterThanOrEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -910,7 +908,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeLessThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeLessThan(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -926,7 +924,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
mime_typeLessThanOrEqualTo(
|
||||
mimeTypeLessThanOrEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -941,7 +939,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeBetween(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeBetween(
|
||||
String? lower,
|
||||
String? upper, {
|
||||
bool caseSensitive = true,
|
||||
|
@ -958,7 +956,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeStartsWith(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -973,7 +971,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeEndsWith(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -988,7 +986,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeContains(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeContains(
|
||||
String value,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1002,7 +1000,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mime_typeMatches(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeMatches(
|
||||
String pattern,
|
||||
{bool caseSensitive = true}) {
|
||||
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 query.addFilterCondition(
|
||||
const EqualCondition(
|
||||
|
@ -1027,8 +1025,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
mime_typeIsNotEmpty() {
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> mimeTypeIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
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 query.addFilterCondition(const IsNullCondition(property: 7));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageIsNotNull() {
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 7));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> is_imageEqualTo(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> isImageEqualTo(
|
||||
bool? value,
|
||||
) {
|
||||
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 query.addFilterCondition(const IsNullCondition(property: 8));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_widthIsNotNull() {
|
||||
imageWidthIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 8));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthEqualTo(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1090,8 +1087,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_widthGreaterThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthGreaterThan(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1105,7 +1101,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_widthGreaterThanOrEqualTo(
|
||||
imageWidthGreaterThanOrEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1118,7 +1114,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_widthLessThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageWidthLessThan(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1132,7 +1128,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_widthLessThanOrEqualTo(
|
||||
imageWidthLessThanOrEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
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? upper,
|
||||
) {
|
||||
|
@ -1160,20 +1156,20 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightIsNull() {
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 9));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_heightIsNotNull() {
|
||||
imageHeightIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 9));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightEqualTo(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1187,7 +1183,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_heightGreaterThan(
|
||||
imageHeightGreaterThan(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1201,7 +1197,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_heightGreaterThanOrEqualTo(
|
||||
imageHeightGreaterThanOrEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1214,7 +1210,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> image_heightLessThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> imageHeightLessThan(
|
||||
int? value,
|
||||
) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1228,7 +1224,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
image_heightLessThanOrEqualTo(
|
||||
imageHeightLessThanOrEqualTo(
|
||||
int? value,
|
||||
) {
|
||||
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? upper,
|
||||
) {
|
||||
|
@ -1256,20 +1252,20 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atIsNull() {
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 10));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
uploaded_atIsNotNull() {
|
||||
uploadedAtIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 10));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atEqualTo(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1284,8 +1280,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
uploaded_atGreaterThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtGreaterThan(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1301,7 +1296,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
uploaded_atGreaterThanOrEqualTo(
|
||||
uploadedAtGreaterThanOrEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1316,7 +1311,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atLessThan(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtLessThan(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1332,7 +1327,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
uploaded_atLessThanOrEqualTo(
|
||||
uploadedAtLessThanOrEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1347,7 +1342,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atBetween(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtBetween(
|
||||
String? lower,
|
||||
String? upper, {
|
||||
bool caseSensitive = true,
|
||||
|
@ -1364,7 +1359,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atStartsWith(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1379,7 +1374,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atEndsWith(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
|
@ -1394,7 +1389,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atContains(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtContains(
|
||||
String value,
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1408,7 +1403,7 @@ extension FilePartQueryFilter
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploaded_atMatches(
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition> uploadedAtMatches(
|
||||
String pattern,
|
||||
{bool caseSensitive = true}) {
|
||||
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 query.addFilterCondition(
|
||||
const EqualCondition(
|
||||
|
@ -1434,7 +1429,7 @@ extension FilePartQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<FilePart, FilePart, QAfterFilterCondition>
|
||||
uploaded_atIsNotEmpty() {
|
||||
uploadedAtIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(
|
||||
const GreaterCondition(
|
||||
|
@ -1465,24 +1460,24 @@ FilePart _$FilePartFromJson(Map<String, dynamic> json) => FilePart()
|
|||
..thumbnails = json['thumbnails'] == null
|
||||
? null
|
||||
: 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?
|
||||
..size = (json['size'] as num?)?.toInt()
|
||||
..mime_type = json['mime_type'] as String?
|
||||
..is_image = json['is_image'] as bool?
|
||||
..image_width = (json['image_width'] as num?)?.toInt()
|
||||
..image_height = (json['image_height'] as num?)?.toInt()
|
||||
..uploaded_at = json['uploaded_at'] as String?;
|
||||
..mimeType = json['mime_type'] as String?
|
||||
..isImage = json['is_image'] as bool?
|
||||
..imageWidth = (json['image_width'] as num?)?.toInt()
|
||||
..imageHeight = (json['image_height'] as num?)?.toInt()
|
||||
..uploadedAt = json['uploaded_at'] as String?;
|
||||
|
||||
Map<String, dynamic> _$FilePartToJson(FilePart instance) => <String, dynamic>{
|
||||
'url': instance.url,
|
||||
'thumbnails': instance.thumbnails?.toJson(),
|
||||
'visible_name': instance.visible_name,
|
||||
'visible_name': instance.visibleName,
|
||||
'name': instance.name,
|
||||
'size': instance.size,
|
||||
'mime_type': instance.mime_type,
|
||||
'is_image': instance.is_image,
|
||||
'image_width': instance.image_width,
|
||||
'image_height': instance.image_height,
|
||||
'uploaded_at': instance.uploaded_at,
|
||||
'mime_type': instance.mimeType,
|
||||
'is_image': instance.isImage,
|
||||
'image_width': instance.imageWidth,
|
||||
'image_height': instance.imageHeight,
|
||||
'uploaded_at': instance.uploadedAt,
|
||||
};
|
||||
|
|
|
@ -11,7 +11,8 @@ class Thumbnails {
|
|||
|
||||
Thumbnail? tiny;
|
||||
Thumbnail? small;
|
||||
Thumbnail? card_cover;
|
||||
@JsonKey(name: 'card_cover')
|
||||
Thumbnail? cardCover;
|
||||
|
||||
factory Thumbnails.fromJson(Map<String, dynamic> json) =>
|
||||
_$ThumbnailsFromJson(json);
|
||||
|
|
|
@ -26,7 +26,7 @@ const ThumbnailsSchema = IsarGeneratedSchema(
|
|||
target: 'Thumbnail',
|
||||
),
|
||||
IsarPropertySchema(
|
||||
name: 'card_cover',
|
||||
name: 'cardCover',
|
||||
type: IsarType.object,
|
||||
target: 'Thumbnail',
|
||||
),
|
||||
|
@ -62,7 +62,7 @@ int serializeThumbnails(IsarWriter writer, Thumbnails object) {
|
|||
}
|
||||
}
|
||||
{
|
||||
final value = object.card_cover;
|
||||
final value = object.cardCover;
|
||||
if (value == null) {
|
||||
IsarCore.writeNull(writer, 3);
|
||||
} else {
|
||||
|
@ -100,11 +100,11 @@ Thumbnails deserializeThumbnails(IsarReader reader) {
|
|||
{
|
||||
final objectReader = IsarCore.readObject(reader, 3);
|
||||
if (objectReader.isNull) {
|
||||
object.card_cover = null;
|
||||
object.cardCover = null;
|
||||
} else {
|
||||
final embedded = deserializeThumbnail(objectReader);
|
||||
IsarCore.freeReader(objectReader);
|
||||
object.card_cover = embedded;
|
||||
object.cardCover = embedded;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
|
@ -137,14 +137,14 @@ extension ThumbnailsQueryFilter
|
|||
}
|
||||
|
||||
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition>
|
||||
card_coverIsNull() {
|
||||
cardCoverIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const IsNullCondition(property: 3));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<Thumbnails, Thumbnails, QAfterFilterCondition>
|
||||
card_coverIsNotNull() {
|
||||
cardCoverIsNotNull() {
|
||||
return QueryBuilder.apply(not(), (query) {
|
||||
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) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.object(q, 3);
|
||||
|
@ -186,7 +186,7 @@ Thumbnails _$ThumbnailsFromJson(Map<String, dynamic> json) => Thumbnails()
|
|||
..small = json['small'] == null
|
||||
? null
|
||||
: Thumbnail.fromJson(json['small'] as Map<String, dynamic>)
|
||||
..card_cover = json['card_cover'] == null
|
||||
..cardCover = json['card_cover'] == null
|
||||
? null
|
||||
: Thumbnail.fromJson(json['card_cover'] as Map<String, dynamic>);
|
||||
|
||||
|
@ -194,5 +194,5 @@ Map<String, dynamic> _$ThumbnailsToJson(Thumbnails instance) =>
|
|||
<String, dynamic>{
|
||||
'tiny': instance.tiny?.toJson(),
|
||||
'small': instance.small?.toJson(),
|
||||
'card_cover': instance.card_cover?.toJson(),
|
||||
'card_cover': instance.cardCover?.toJson(),
|
||||
};
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
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_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:json_annotation/json_annotation.dart';
|
||||
|
||||
|
@ -150,3 +152,21 @@ class Massnahme extends BaseEntity {
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -46,6 +46,7 @@ class BaseApi {
|
|||
break;
|
||||
case 'massnahmen':
|
||||
for (var massnahme in json['results']) {
|
||||
logger.d(massnahme);
|
||||
BaseDB.put(Massnahme.fromJson(massnahme));
|
||||
isar.write((isar) {
|
||||
isar.massnahmes.put(Massnahme.fromJson(massnahme));
|
||||
|
|
|
@ -19,7 +19,7 @@ class RestClient {
|
|||
var headers = {
|
||||
"Content-Type": contentType,
|
||||
"Accept": accept,
|
||||
"Authorization": "Token $AmbitoToken",
|
||||
"Authorization": "Token $ambitoToken",
|
||||
};
|
||||
return headers;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ import '../../../main.dart';
|
|||
|
||||
class BaseDB {
|
||||
static put(var entity) {
|
||||
switch (entity.runtimeType) {
|
||||
switch (entity.runtimeType.toString()) {
|
||||
case 'Baumarten':
|
||||
isar.write((isar) {
|
||||
isar.baumartens.put(entity);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:ambito/src/domain/entity/massnahme/massnahme.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:expandable_text/expandable_text.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -7,84 +8,94 @@ import 'package:flutter/material.dart';
|
|||
import '../../../main.dart';
|
||||
|
||||
class ActionsPage extends StatefulWidget {
|
||||
const ActionsPage({super.key});
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => ActionsPageState();
|
||||
}
|
||||
|
||||
class ActionsPageState extends State<ActionsPage> {
|
||||
final GlobalKey<FormFieldState> _keyType = GlobalKey<FormFieldState>();
|
||||
final TextEditingController _controllerType = TextEditingController();
|
||||
final GlobalKey<FormFieldState> _keyAreaType = GlobalKey<FormFieldState>();
|
||||
final TextEditingController _controllerAreaType = TextEditingController();
|
||||
final GlobalKey<FormFieldState> _keySupport = GlobalKey<FormFieldState>();
|
||||
final TextEditingController _controllerSupport = TextEditingController();
|
||||
|
||||
Map<int, bool> visible = {};
|
||||
List<String> effort = [];
|
||||
List<String> effect = [];
|
||||
List<String> type = [];
|
||||
Set<String> type = {};
|
||||
String? filterType;
|
||||
List<String> areaType = [];
|
||||
Set<String> areaType = {};
|
||||
String? filterAreaType;
|
||||
List<String> region = [];
|
||||
List<String> support = [];
|
||||
String? filterSupport;
|
||||
Set<String> support = {};
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
effort = [];
|
||||
effect = [];
|
||||
type = [];
|
||||
areaType = [];
|
||||
type = {};
|
||||
areaType = {};
|
||||
region = [];
|
||||
support = [];
|
||||
support = {};
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<Massnahme> massnahmen = BaseDB.getAll('Maßnahme');
|
||||
Set<String> updatedTypes = {};
|
||||
Set<String> updatedAreaTypes = {};
|
||||
Set<String> updatedSupports = {};
|
||||
|
||||
List<Widget> actionCards = [];
|
||||
for (var massnahme in massnahmen) {
|
||||
//logger.d(massnahme.toJson());
|
||||
if (massnahme.actionGroup != null &&
|
||||
!type.contains(massnahme.actionGroup!.value)) {
|
||||
setState(() {
|
||||
type.add(massnahme.actionGroup!.value!);
|
||||
});
|
||||
if (massnahme.actionGroup != null) {
|
||||
updatedTypes.add(massnahme.actionGroup!.value!);
|
||||
}
|
||||
if (massnahme.factsheetAreaType != null) {
|
||||
for (var aType in massnahme.factsheetAreaType!) {
|
||||
if (!areaType.contains(aType.value)) {
|
||||
setState(() {
|
||||
areaType.add(aType.value!);
|
||||
});
|
||||
}
|
||||
updatedAreaTypes.add(aType.value!);
|
||||
}
|
||||
}
|
||||
if (massnahme.fundingPrograms != null) {
|
||||
for (var aType in massnahme.fundingPrograms!) {
|
||||
updatedSupports.add(aType.value!);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var massnahme in massnahmen) {
|
||||
bool myVisibility = true;
|
||||
if (filterType != null) {
|
||||
if (massnahme.actionGroup == null ||
|
||||
massnahme.actionGroup!.value != filterType) {
|
||||
myVisibility = false;
|
||||
}
|
||||
}
|
||||
if (filterAreaType != null) {
|
||||
if (massnahme.factsheetAreaType != null) {
|
||||
myVisibility = false;
|
||||
for (var aType in massnahme.factsheetAreaType!) {
|
||||
if (aType.value == filterAreaType) {
|
||||
myVisibility = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
setState(() {
|
||||
type.addAll(updatedTypes);
|
||||
areaType.addAll(updatedAreaTypes);
|
||||
support.addAll(updatedSupports);
|
||||
});
|
||||
|
||||
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
|
||||
setState(() {
|
||||
visible[massnahme.id] = myVisibility;
|
||||
visible[massnahme.id] =
|
||||
typeMatches && areaTypeMatches && supportMatches;
|
||||
});
|
||||
actionCards.add(getCard(context, massnahme));
|
||||
}
|
||||
|
||||
logger.d(visible);
|
||||
//logger.d(areaType);
|
||||
return getCard(context, massnahme);
|
||||
}).toList();
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 32, right: 32),
|
||||
|
@ -123,98 +134,80 @@ class ActionsPageState extends State<ActionsPage> {
|
|||
|
||||
Widget getFilter(BuildContext context) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
DropdownMenu(
|
||||
key: _keyAreaType,
|
||||
initialSelection: filterAreaType,
|
||||
leadingIcon: (filterAreaType != null)
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
_keyAreaType.currentState!.didChange(null);
|
||||
_keyAreaType.currentState!.reset();
|
||||
setState(() {
|
||||
filterAreaType = null;
|
||||
});
|
||||
},
|
||||
icon: const Icon(Icons.delete),
|
||||
)
|
||||
: null,
|
||||
DropdownMenuWidget(
|
||||
formKey: _keyAreaType,
|
||||
label: 'Ort der Maßnahme',
|
||||
controller: _controllerAreaType,
|
||||
filterValue: filterAreaType,
|
||||
onClear: () {
|
||||
setState(() {
|
||||
filterAreaType = null;
|
||||
});
|
||||
_controllerAreaType.clear();
|
||||
},
|
||||
onSelected: (String? selection) {
|
||||
setState(() {
|
||||
filterAreaType = selection;
|
||||
});
|
||||
},
|
||||
dropdownMenuEntries:
|
||||
areaType.map<DropdownMenuEntry<String>>((String entry) {
|
||||
return DropdownMenuEntry<String>(
|
||||
value: entry,
|
||||
label: entry,
|
||||
);
|
||||
}).toList(),
|
||||
entries: areaType.toList(),
|
||||
),
|
||||
DropdownMenu(
|
||||
key: _keyType,
|
||||
leadingIcon: (filterType != null)
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
filterType = null;
|
||||
});
|
||||
_keyType.currentState!.reset();
|
||||
},
|
||||
icon: const Icon(Icons.delete),
|
||||
)
|
||||
: null,
|
||||
DropdownMenuWidget(
|
||||
formKey: _keyType,
|
||||
label: 'Art der Maßnahme',
|
||||
controller: _controllerType,
|
||||
filterValue: filterType,
|
||||
onClear: () {
|
||||
setState(() {
|
||||
filterType = null;
|
||||
});
|
||||
_controllerType.clear();
|
||||
},
|
||||
onSelected: (String? selection) {
|
||||
setState(() {
|
||||
filterType = selection;
|
||||
});
|
||||
},
|
||||
dropdownMenuEntries:
|
||||
type.map<DropdownMenuEntry<String>>((String entry) {
|
||||
return DropdownMenuEntry<String>(
|
||||
value: entry,
|
||||
label: entry,
|
||||
);
|
||||
}).toList(),
|
||||
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(),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget getCard(BuildContext context, Massnahme massnahme) {
|
||||
Color background = Colors.white;
|
||||
switch (massnahme.actionGroup?.value) {
|
||||
case 'Baulelemente':
|
||||
background = const Color(0xffFFD269);
|
||||
break;
|
||||
case 'Begrünung':
|
||||
background = const Color(0xff40DD74);
|
||||
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;
|
||||
}
|
||||
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),
|
||||
};
|
||||
|
||||
var image;
|
||||
if (massnahme.files != null && massnahme.files!.isNotEmpty) {
|
||||
if (massnahme.files![0].thumbnails?.card_cover?.url != null) {
|
||||
image = CachedNetworkImage(
|
||||
imageUrl: massnahme.files![0].thumbnails!.card_cover!.url!,
|
||||
placeholder: (context, url) => const CircularProgressIndicator(),
|
||||
errorWidget: (context, url, error) => const Icon(Icons.error),
|
||||
);
|
||||
}
|
||||
}
|
||||
Color background =
|
||||
actionGroupColors[massnahme.actionGroup?.value] ?? Colors.white;
|
||||
|
||||
CachedNetworkImage? image = massnahme.getThumbnail();
|
||||
|
||||
return Visibility(
|
||||
visible: visible[massnahme.id] ?? false,
|
||||
|
|
85
lib/src/pages/start/start_page.dart
Normal file
85
lib/src/pages/start/start_page.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
1
lib/src/widgets/cards/card_massnahmen_list.dart
Normal file
1
lib/src/widgets/cards/card_massnahmen_list.dart
Normal file
|
@ -0,0 +1 @@
|
|||
|
49
lib/src/widgets/form/dropdown_menu.dart
Normal file
49
lib/src/widgets/form/dropdown_menu.dart
Normal 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(),
|
||||
);
|
||||
}
|
||||
}
|
69
pubspec.lock
69
pubspec.lock
|
@ -5,23 +5,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
|
||||
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "72.0.0"
|
||||
_macros:
|
||||
dependency: transitive
|
||||
description: dart
|
||||
source: sdk
|
||||
version: "0.3.2"
|
||||
version: "67.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
|
||||
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.7.0"
|
||||
version: "6.4.1"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -90,18 +85,18 @@ packages:
|
|||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04
|
||||
sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.12"
|
||||
version: "2.4.11"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
|
||||
sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.3.2"
|
||||
version: "7.3.1"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -226,10 +221,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab"
|
||||
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.7"
|
||||
version: "2.3.6"
|
||||
dio:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -459,7 +454,7 @@ packages:
|
|||
source: hosted
|
||||
version: "2.3.2"
|
||||
http:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: http
|
||||
sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010
|
||||
|
@ -566,18 +561,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
||||
sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.5"
|
||||
version: "10.0.4"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
||||
sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.3"
|
||||
leak_tracker_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -618,14 +613,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
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:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -646,18 +633,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
||||
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.11.1"
|
||||
version: "0.8.0"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
||||
sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
version: "1.12.0"
|
||||
mgrs_dart:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -939,10 +926,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_common
|
||||
sha256: "4058172e418eb7e7f2058dcb7657d451a8fc264afa0dea4dbd0f304a57131611"
|
||||
sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.4+3"
|
||||
version: "2.5.4"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -979,10 +966,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: synchronized
|
||||
sha256: "51b08572b9f091f8c3eb4d9d4be253f196ff0075d5ec9b10a884026d5b55d7bc"
|
||||
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.0+2"
|
||||
version: "3.1.0+1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -995,10 +982,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
||||
sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.2"
|
||||
version: "0.7.0"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1051,10 +1038,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
||||
sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.2.5"
|
||||
version: "14.2.1"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1128,5 +1115,5 @@ packages:
|
|||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.5.0 <4.0.0"
|
||||
dart: ">=3.4.4 <4.0.0"
|
||||
flutter: ">=3.22.0"
|
||||
|
|
|
@ -36,6 +36,7 @@ dependencies:
|
|||
expandable_text: ^2.3.0
|
||||
path_provider: ^2.1.4
|
||||
cached_network_image: ^3.4.1
|
||||
http: ^1.2.2
|
||||
|
||||
|
||||
dev_dependencies:
|
||||
|
|
Loading…
Reference in a new issue