diff --git a/images/spacer.png b/images/spacer.png new file mode 100644 index 0000000..dd77464 Binary files /dev/null and b/images/spacer.png differ diff --git a/lib/main.dart b/lib/main.dart index 212a117..3109f44 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,8 +4,9 @@ import 'package:ambito/src/packages/ambito_api/base_api.dart'; import 'package:ambito/src/packages/ambito_db/base_db.dart'; import 'package:ambito/src/packages/ambito_notifier/notifier/theme_manager.dart'; import 'package:ambito/src/packages/ambito_sharedprefs/ambito_sharedprefs.dart'; +import 'package:ambito/src/pages/actions/actions_categories_page.dart'; import 'package:ambito/src/pages/actions/actions_page.dart'; -import 'package:ambito/src/pages/actions/actions_pre_page.dart'; +import 'package:ambito/src/pages/actions/actions_types_page.dart'; import 'package:ambito/src/pages/actions/create/action_create_page.dart'; import 'package:ambito/src/pages/actions/detail/action_detail_page.dart'; import 'package:ambito/src/pages/calendar/calendar_page.dart'; @@ -38,6 +39,7 @@ void main() async { //BaseApi().getContent('material'), //BaseApi().getContent('source'), ]); + await MeasureRepository().getCategoriesAndTypes(); await MeasureRepository().buildMeasureFilters(); //await MeasureRepository().downloadImages(); runApp(const Ambito()); @@ -83,7 +85,7 @@ class Ambito extends StatelessWidget { getPages: [ GetPage( name: '/', - page: () => const ActionsPrePage(), + page: () => const ActionsCategoriesPage(), ), GetPage( name: '/kalender', @@ -95,15 +97,15 @@ class Ambito extends StatelessWidget { ), GetPage( name: '/massnahmen', - page: () => const ActionsPrePage(), + page: () => const ActionsCategoriesPage(), ), GetPage( name: '/massnahmendatenbank', - page: () => const ActionsPage(), + page: () => const ActionsCategoriesPage(), ), GetPage( name: '/massnahmendatenbank/:kategorie', - page: () => const ActionsPage(), + page: () => const ActionsTypesPage(), ), GetPage( name: '/massnahmendatenbank/:kategorie/:typ', diff --git a/lib/src/entity/measure/measure_category.dart b/lib/src/entity/measure/measure_category.dart new file mode 100644 index 0000000..fbdd894 --- /dev/null +++ b/lib/src/entity/measure/measure_category.dart @@ -0,0 +1,20 @@ +import 'package:ambito/src/entity/base_entity.dart'; +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'measure_category.g.dart'; + +@collection +@JsonSerializable(explicitToJson: true) +class MeasureCategory extends BaseEntity with EntityWithIdAndName { + MeasureCategory(); + + String? image; + String? description; + int children = 0; + + factory MeasureCategory.fromJson(Map json) => + _$MeasureCategoryFromJson(json); + + Map toJson() => _$MeasureCategoryToJson(this); +} diff --git a/lib/src/entity/measure/measure_category.g.dart b/lib/src/entity/measure/measure_category.g.dart new file mode 100644 index 0000000..1536dc4 --- /dev/null +++ b/lib/src/entity/measure/measure_category.g.dart @@ -0,0 +1,1344 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'measure_category.dart'; + +// ************************************************************************** +// _IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, invalid_use_of_protected_member, lines_longer_than_80_chars, constant_identifier_names, avoid_js_rounded_ints, no_leading_underscores_for_local_identifiers, require_trailing_commas, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_in_if_null_operators, library_private_types_in_public_api, prefer_const_constructors +// ignore_for_file: type=lint + +extension GetMeasureCategoryCollection on Isar { + IsarCollection get measureCategorys => + this.collection(); +} + +const MeasureCategorySchema = IsarGeneratedSchema( + schema: IsarSchema( + name: 'MeasureCategory', + idName: 'id', + embedded: false, + properties: [ + IsarPropertySchema( + name: 'image', + type: IsarType.string, + ), + IsarPropertySchema( + name: 'description', + type: IsarType.string, + ), + IsarPropertySchema( + name: 'children', + type: IsarType.long, + ), + IsarPropertySchema( + name: 'name', + type: IsarType.string, + ), + ], + indexes: [ + IsarIndexSchema( + name: 'name', + properties: [ + "name", + ], + unique: true, + hash: true, + ), + ], + ), + converter: IsarObjectConverter( + serialize: serializeMeasureCategory, + deserialize: deserializeMeasureCategory, + deserializeProperty: deserializeMeasureCategoryProp, + ), + embeddedSchemas: [], +); + +@isarProtected +int serializeMeasureCategory(IsarWriter writer, MeasureCategory object) { + { + final value = object.image; + if (value == null) { + IsarCore.writeNull(writer, 1); + } else { + IsarCore.writeString(writer, 1, value); + } + } + { + final value = object.description; + if (value == null) { + IsarCore.writeNull(writer, 2); + } else { + IsarCore.writeString(writer, 2, value); + } + } + IsarCore.writeLong(writer, 3, object.children); + { + final value = object.name; + if (value == null) { + IsarCore.writeNull(writer, 4); + } else { + IsarCore.writeString(writer, 4, value); + } + } + return object.id; +} + +@isarProtected +MeasureCategory deserializeMeasureCategory(IsarReader reader) { + final object = MeasureCategory(); + object.image = IsarCore.readString(reader, 1); + object.description = IsarCore.readString(reader, 2); + object.children = IsarCore.readLong(reader, 3); + object.id = IsarCore.readId(reader); + object.name = IsarCore.readString(reader, 4); + return object; +} + +@isarProtected +dynamic deserializeMeasureCategoryProp(IsarReader reader, int property) { + switch (property) { + case 1: + return IsarCore.readString(reader, 1); + case 2: + return IsarCore.readString(reader, 2); + case 3: + return IsarCore.readLong(reader, 3); + case 0: + return IsarCore.readId(reader); + case 4: + return IsarCore.readString(reader, 4); + default: + throw ArgumentError('Unknown property: $property'); + } +} + +sealed class _MeasureCategoryUpdate { + bool call({ + required int id, + String? image, + String? description, + int? children, + String? name, + }); +} + +class _MeasureCategoryUpdateImpl implements _MeasureCategoryUpdate { + const _MeasureCategoryUpdateImpl(this.collection); + + final IsarCollection collection; + + @override + bool call({ + required int id, + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + return collection.updateProperties([ + id + ], { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }) > + 0; + } +} + +sealed class _MeasureCategoryUpdateAll { + int call({ + required List id, + String? image, + String? description, + int? children, + String? name, + }); +} + +class _MeasureCategoryUpdateAllImpl implements _MeasureCategoryUpdateAll { + const _MeasureCategoryUpdateAllImpl(this.collection); + + final IsarCollection collection; + + @override + int call({ + required List id, + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + return collection.updateProperties(id, { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }); + } +} + +extension MeasureCategoryUpdate on IsarCollection { + _MeasureCategoryUpdate get update => _MeasureCategoryUpdateImpl(this); + + _MeasureCategoryUpdateAll get updateAll => + _MeasureCategoryUpdateAllImpl(this); +} + +sealed class _MeasureCategoryQueryUpdate { + int call({ + String? image, + String? description, + int? children, + String? name, + }); +} + +class _MeasureCategoryQueryUpdateImpl implements _MeasureCategoryQueryUpdate { + const _MeasureCategoryQueryUpdateImpl(this.query, {this.limit}); + + final IsarQuery query; + final int? limit; + + @override + int call({ + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + return query.updateProperties(limit: limit, { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }); + } +} + +extension MeasureCategoryQueryUpdate on IsarQuery { + _MeasureCategoryQueryUpdate get updateFirst => + _MeasureCategoryQueryUpdateImpl(this, limit: 1); + + _MeasureCategoryQueryUpdate get updateAll => + _MeasureCategoryQueryUpdateImpl(this); +} + +class _MeasureCategoryQueryBuilderUpdateImpl + implements _MeasureCategoryQueryUpdate { + const _MeasureCategoryQueryBuilderUpdateImpl(this.query, {this.limit}); + + final QueryBuilder query; + final int? limit; + + @override + int call({ + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + final q = query.build(); + try { + return q.updateProperties(limit: limit, { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }); + } finally { + q.close(); + } + } +} + +extension MeasureCategoryQueryBuilderUpdate + on QueryBuilder { + _MeasureCategoryQueryUpdate get updateFirst => + _MeasureCategoryQueryBuilderUpdateImpl(this, limit: 1); + + _MeasureCategoryQueryUpdate get updateAll => + _MeasureCategoryQueryBuilderUpdateImpl(this); +} + +extension MeasureCategoryQueryFilter + on QueryBuilder { + QueryBuilder + imageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); + }); + } + + QueryBuilder + imageIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); + }); + } + + QueryBuilder + imageEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageBetween( + String? lower, + String? upper, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 1, + lower: lower, + upper: upper, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 1, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 1, + value: '', + ), + ); + }); + } + + QueryBuilder + imageIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 1, + value: '', + ), + ); + }); + } + + QueryBuilder + descriptionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 2)); + }); + } + + QueryBuilder + descriptionIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 2)); + }); + } + + QueryBuilder + descriptionEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionBetween( + String? lower, + String? upper, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 2, + lower: lower, + upper: upper, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 2, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 2, + value: '', + ), + ); + }); + } + + QueryBuilder + descriptionIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 2, + value: '', + ), + ); + }); + } + + QueryBuilder + childrenEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenGreaterThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenGreaterThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenLessThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenLessThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenBetween( + int lower, + int upper, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 3, + lower: lower, + upper: upper, + ), + ); + }); + } + + QueryBuilder + idEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idLessThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idLessThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idBetween( + int lower, + int upper, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 0, + lower: lower, + upper: upper, + ), + ); + }); + } + + QueryBuilder + nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 4)); + }); + } + + QueryBuilder + nameIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 4)); + }); + } + + QueryBuilder + nameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameBetween( + String? lower, + String? upper, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 4, + lower: lower, + upper: upper, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 4, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 4, + value: '', + ), + ); + }); + } + + QueryBuilder + nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 4, + value: '', + ), + ); + }); + } +} + +extension MeasureCategoryQueryObject + on QueryBuilder {} + +extension MeasureCategoryQuerySortBy + on QueryBuilder { + QueryBuilder sortByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 1, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByImageDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 1, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder + sortByDescription({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 2, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder + sortByDescriptionDesc({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 2, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder + sortByChildren() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3); + }); + } + + QueryBuilder + sortByChildrenDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3, sort: Sort.desc); + }); + } + + QueryBuilder sortById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder sortByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } + + QueryBuilder sortByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 4, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByNameDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 4, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } +} + +extension MeasureCategoryQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(1, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByImageDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } + + QueryBuilder + thenByDescription({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(2, caseSensitive: caseSensitive); + }); + } + + QueryBuilder + thenByDescriptionDesc({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(2, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } + + QueryBuilder + thenByChildren() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3); + }); + } + + QueryBuilder + thenByChildrenDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3, sort: Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } + + QueryBuilder thenByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(4, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByNameDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } +} + +extension MeasureCategoryQueryWhereDistinct + on QueryBuilder { + QueryBuilder + distinctByImage({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(1, caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByDescription({bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(2, caseSensitive: caseSensitive); + }); + } + + QueryBuilder + distinctByChildren() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(3); + }); + } + + QueryBuilder distinctByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(4, caseSensitive: caseSensitive); + }); + } +} + +extension MeasureCategoryQueryProperty1 + on QueryBuilder { + QueryBuilder imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder childrenProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(4); + }); + } +} + +extension MeasureCategoryQueryProperty2 + on QueryBuilder { + QueryBuilder imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder + descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder childrenProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(4); + }); + } +} + +extension MeasureCategoryQueryProperty3 + on QueryBuilder { + QueryBuilder + imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder + descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder childrenProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(4); + }); + } +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +MeasureCategory _$MeasureCategoryFromJson(Map json) => + MeasureCategory() + ..id = (json['id'] as num).toInt() + ..name = json['Name'] as String? + ..image = json['image'] as String? + ..description = json['description'] as String? + ..children = (json['children'] as num).toInt(); + +Map _$MeasureCategoryToJson(MeasureCategory instance) => + { + 'id': instance.id, + 'Name': instance.name, + 'image': instance.image, + 'description': instance.description, + 'children': instance.children, + }; diff --git a/lib/src/entity/measure/measure_repository.dart b/lib/src/entity/measure/measure_repository.dart index 70dbe6c..7815b75 100644 --- a/lib/src/entity/measure/measure_repository.dart +++ b/lib/src/entity/measure/measure_repository.dart @@ -1,5 +1,7 @@ import 'package:ambito/src/entity/_general/filter/item_filter_repository.dart'; import 'package:ambito/src/entity/entities.dart'; +import 'package:ambito/src/entity/measure/measure_category.dart'; +import 'package:ambito/src/entity/measure/measure_type.dart'; import 'package:ambito/src/extensions/extensions.dart'; import 'package:ambito/src/packages/ambito_db/base_db.dart'; import 'package:isar/isar.dart'; @@ -10,6 +12,67 @@ class MeasureRepository extends BaseDB { @override IsarCollection collection = isar.measures; + Future getCategoriesAndTypes() async { + final categoriesMap = {}; + final typesMap = {}; + + final autoIncrementCat = isar.measureCategorys.autoIncrement; + final autoIncrementType = isar.measureTypes.autoIncrement; + + // Fetch all measures + final allMeasures = await isar.measures.where().findAll(); + + for (final measure in allMeasures) { + if (measure.actionGroup == null || + measure.factsheetAreaType == null || + measure.factsheetAreaType!.isEmpty) { + continue; + } + + // Process categories + for (final cat in measure.factsheetAreaType!) { + final categoryName = cat.value; + if (categoryName == null) continue; + + if (!categoriesMap.containsKey(categoryName)) { + categoriesMap[categoryName] = MeasureCategory() + ..id = autoIncrementCat() + ..name = categoryName + ..image = + 'images/actions/areatype/${categoryName.toLowerCase().replaceUmlauts()}.jpg' + ..description = 'Lorem ipsum dolor sit amet.' + ..children = 1; + } else { + categoriesMap[categoryName]!.children++; + } + } + + // Process types + final actionGroupName = measure.actionGroup!.value; + if (actionGroupName == null) continue; + + if (!typesMap.containsKey(actionGroupName)) { + typesMap[actionGroupName] = MeasureType() + ..id = autoIncrementType() + ..name = actionGroupName + ..description = measure.factsheetDefinition + ..image = (measure.files != null && measure.files!.isNotEmpty) + ? measure.files![0].url + : 'images/spacer.png' // Add the appropriate image URL if available + ..children = 1; + } else { + typesMap[actionGroupName]!.children++; + } + } + + // Convert maps to lists + isar.write((isar) { + isar.measureCategorys.putAll(categoriesMap.values.toList()); + isar.measureTypes.putAll(typesMap.values.toList()); + }); + return true; + } + Future buildLists() async { var measures = getAll(); Map>> lists = {}; @@ -147,4 +210,12 @@ class MeasureRepository extends BaseDB { } return true; } + + List getCategories() { + return isar.measureCategorys.where().findAll(); + } + + List getTypes() { + return isar.measureTypes.where().findAll(); + } } diff --git a/lib/src/entity/measure/measure_type.dart b/lib/src/entity/measure/measure_type.dart new file mode 100644 index 0000000..040add7 --- /dev/null +++ b/lib/src/entity/measure/measure_type.dart @@ -0,0 +1,20 @@ +import 'package:ambito/src/entity/base_entity.dart'; +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'measure_type.g.dart'; + +@collection +@JsonSerializable(explicitToJson: true) +class MeasureType extends BaseEntity with EntityWithIdAndName { + MeasureType(); + + String? image; + String? description; + int children = 0; + + factory MeasureType.fromJson(Map json) => + _$MeasureTypeFromJson(json); + + Map toJson() => _$MeasureTypeToJson(this); +} diff --git a/lib/src/entity/measure/measure_type.g.dart b/lib/src/entity/measure/measure_type.g.dart new file mode 100644 index 0000000..698e30d --- /dev/null +++ b/lib/src/entity/measure/measure_type.g.dart @@ -0,0 +1,1316 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'measure_type.dart'; + +// ************************************************************************** +// _IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, invalid_use_of_protected_member, lines_longer_than_80_chars, constant_identifier_names, avoid_js_rounded_ints, no_leading_underscores_for_local_identifiers, require_trailing_commas, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_in_if_null_operators, library_private_types_in_public_api, prefer_const_constructors +// ignore_for_file: type=lint + +extension GetMeasureTypeCollection on Isar { + IsarCollection get measureTypes => this.collection(); +} + +const MeasureTypeSchema = IsarGeneratedSchema( + schema: IsarSchema( + name: 'MeasureType', + idName: 'id', + embedded: false, + properties: [ + IsarPropertySchema( + name: 'image', + type: IsarType.string, + ), + IsarPropertySchema( + name: 'description', + type: IsarType.string, + ), + IsarPropertySchema( + name: 'children', + type: IsarType.long, + ), + IsarPropertySchema( + name: 'name', + type: IsarType.string, + ), + ], + indexes: [ + IsarIndexSchema( + name: 'name', + properties: [ + "name", + ], + unique: true, + hash: true, + ), + ], + ), + converter: IsarObjectConverter( + serialize: serializeMeasureType, + deserialize: deserializeMeasureType, + deserializeProperty: deserializeMeasureTypeProp, + ), + embeddedSchemas: [], +); + +@isarProtected +int serializeMeasureType(IsarWriter writer, MeasureType object) { + { + final value = object.image; + if (value == null) { + IsarCore.writeNull(writer, 1); + } else { + IsarCore.writeString(writer, 1, value); + } + } + { + final value = object.description; + if (value == null) { + IsarCore.writeNull(writer, 2); + } else { + IsarCore.writeString(writer, 2, value); + } + } + IsarCore.writeLong(writer, 3, object.children); + { + final value = object.name; + if (value == null) { + IsarCore.writeNull(writer, 4); + } else { + IsarCore.writeString(writer, 4, value); + } + } + return object.id; +} + +@isarProtected +MeasureType deserializeMeasureType(IsarReader reader) { + final object = MeasureType(); + object.image = IsarCore.readString(reader, 1); + object.description = IsarCore.readString(reader, 2); + object.children = IsarCore.readLong(reader, 3); + object.id = IsarCore.readId(reader); + object.name = IsarCore.readString(reader, 4); + return object; +} + +@isarProtected +dynamic deserializeMeasureTypeProp(IsarReader reader, int property) { + switch (property) { + case 1: + return IsarCore.readString(reader, 1); + case 2: + return IsarCore.readString(reader, 2); + case 3: + return IsarCore.readLong(reader, 3); + case 0: + return IsarCore.readId(reader); + case 4: + return IsarCore.readString(reader, 4); + default: + throw ArgumentError('Unknown property: $property'); + } +} + +sealed class _MeasureTypeUpdate { + bool call({ + required int id, + String? image, + String? description, + int? children, + String? name, + }); +} + +class _MeasureTypeUpdateImpl implements _MeasureTypeUpdate { + const _MeasureTypeUpdateImpl(this.collection); + + final IsarCollection collection; + + @override + bool call({ + required int id, + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + return collection.updateProperties([ + id + ], { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }) > + 0; + } +} + +sealed class _MeasureTypeUpdateAll { + int call({ + required List id, + String? image, + String? description, + int? children, + String? name, + }); +} + +class _MeasureTypeUpdateAllImpl implements _MeasureTypeUpdateAll { + const _MeasureTypeUpdateAllImpl(this.collection); + + final IsarCollection collection; + + @override + int call({ + required List id, + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + return collection.updateProperties(id, { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }); + } +} + +extension MeasureTypeUpdate on IsarCollection { + _MeasureTypeUpdate get update => _MeasureTypeUpdateImpl(this); + + _MeasureTypeUpdateAll get updateAll => _MeasureTypeUpdateAllImpl(this); +} + +sealed class _MeasureTypeQueryUpdate { + int call({ + String? image, + String? description, + int? children, + String? name, + }); +} + +class _MeasureTypeQueryUpdateImpl implements _MeasureTypeQueryUpdate { + const _MeasureTypeQueryUpdateImpl(this.query, {this.limit}); + + final IsarQuery query; + final int? limit; + + @override + int call({ + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + return query.updateProperties(limit: limit, { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }); + } +} + +extension MeasureTypeQueryUpdate on IsarQuery { + _MeasureTypeQueryUpdate get updateFirst => + _MeasureTypeQueryUpdateImpl(this, limit: 1); + + _MeasureTypeQueryUpdate get updateAll => _MeasureTypeQueryUpdateImpl(this); +} + +class _MeasureTypeQueryBuilderUpdateImpl implements _MeasureTypeQueryUpdate { + const _MeasureTypeQueryBuilderUpdateImpl(this.query, {this.limit}); + + final QueryBuilder query; + final int? limit; + + @override + int call({ + Object? image = ignore, + Object? description = ignore, + Object? children = ignore, + Object? name = ignore, + }) { + final q = query.build(); + try { + return q.updateProperties(limit: limit, { + if (image != ignore) 1: image as String?, + if (description != ignore) 2: description as String?, + if (children != ignore) 3: children as int?, + if (name != ignore) 4: name as String?, + }); + } finally { + q.close(); + } + } +} + +extension MeasureTypeQueryBuilderUpdate + on QueryBuilder { + _MeasureTypeQueryUpdate get updateFirst => + _MeasureTypeQueryBuilderUpdateImpl(this, limit: 1); + + _MeasureTypeQueryUpdate get updateAll => + _MeasureTypeQueryBuilderUpdateImpl(this); +} + +extension MeasureTypeQueryFilter + on QueryBuilder { + QueryBuilder imageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); + }); + } + + QueryBuilder + imageIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 1)); + }); + } + + QueryBuilder imageEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + imageLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageBetween( + String? lower, + String? upper, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 1, + lower: lower, + upper: upper, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 1, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 1, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder imageIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 1, + value: '', + ), + ); + }); + } + + QueryBuilder + imageIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 1, + value: '', + ), + ); + }); + } + + QueryBuilder + descriptionIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 2)); + }); + } + + QueryBuilder + descriptionIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 2)); + }); + } + + QueryBuilder + descriptionEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionBetween( + String? lower, + String? upper, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 2, + lower: lower, + upper: upper, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 2, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 2, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + descriptionIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 2, + value: '', + ), + ); + }); + } + + QueryBuilder + descriptionIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 2, + value: '', + ), + ); + }); + } + + QueryBuilder childrenEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenGreaterThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenGreaterThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenLessThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder + childrenLessThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 3, + value: value, + ), + ); + }); + } + + QueryBuilder childrenBetween( + int lower, + int upper, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 3, + lower: lower, + upper: upper, + ), + ); + }); + } + + QueryBuilder idEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder idGreaterThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idGreaterThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder idLessThan( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder + idLessThanOrEqualTo( + int value, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 0, + value: value, + ), + ); + }); + } + + QueryBuilder idBetween( + int lower, + int upper, + ) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 0, + lower: lower, + upper: upper, + ), + ); + }); + } + + QueryBuilder nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const IsNullCondition(property: 4)); + }); + } + + QueryBuilder + nameIsNotNull() { + return QueryBuilder.apply(not(), (query) { + return query.addFilterCondition(const IsNullCondition(property: 4)); + }); + } + + QueryBuilder nameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EqualCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameGreaterThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameGreaterThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + GreaterOrEqualCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameLessThan( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder + nameLessThanOrEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + LessOrEqualCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameBetween( + String? lower, + String? upper, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + BetweenCondition( + property: 4, + lower: lower, + upper: upper, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + StartsWithCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + EndsWithCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + ContainsCondition( + property: 4, + value: value, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + MatchesCondition( + property: 4, + wildcard: pattern, + caseSensitive: caseSensitive, + ), + ); + }); + } + + QueryBuilder nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const EqualCondition( + property: 4, + value: '', + ), + ); + }); + } + + QueryBuilder + nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition( + const GreaterCondition( + property: 4, + value: '', + ), + ); + }); + } +} + +extension MeasureTypeQueryObject + on QueryBuilder {} + +extension MeasureTypeQuerySortBy + on QueryBuilder { + QueryBuilder sortByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 1, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByImageDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 1, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByDescription( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 2, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByDescriptionDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 2, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByChildren() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3); + }); + } + + QueryBuilder sortByChildrenDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3, sort: Sort.desc); + }); + } + + QueryBuilder sortById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder sortByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } + + QueryBuilder sortByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 4, + caseSensitive: caseSensitive, + ); + }); + } + + QueryBuilder sortByNameDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + 4, + sort: Sort.desc, + caseSensitive: caseSensitive, + ); + }); + } +} + +extension MeasureTypeQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(1, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByImageDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(1, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByDescription( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(2, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByDescriptionDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(2, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByChildren() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3); + }); + } + + QueryBuilder thenByChildrenDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(3, sort: Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(0, sort: Sort.desc); + }); + } + + QueryBuilder thenByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(4, caseSensitive: caseSensitive); + }); + } + + QueryBuilder thenByNameDesc( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(4, sort: Sort.desc, caseSensitive: caseSensitive); + }); + } +} + +extension MeasureTypeQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByImage( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(1, caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByDescription( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(2, caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByChildren() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(3); + }); + } + + QueryBuilder distinctByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(4, caseSensitive: caseSensitive); + }); + } +} + +extension MeasureTypeQueryProperty1 + on QueryBuilder { + QueryBuilder imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder childrenProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(4); + }); + } +} + +extension MeasureTypeQueryProperty2 + on QueryBuilder { + QueryBuilder imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder + descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder childrenProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(4); + }); + } +} + +extension MeasureTypeQueryProperty3 + on QueryBuilder { + QueryBuilder imageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(1); + }); + } + + QueryBuilder + descriptionProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(2); + }); + } + + QueryBuilder childrenProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(3); + }); + } + + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(0); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(4); + }); + } +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +MeasureType _$MeasureTypeFromJson(Map json) => MeasureType() + ..id = (json['id'] as num).toInt() + ..name = json['Name'] as String? + ..image = json['image'] as String? + ..description = json['description'] as String? + ..children = (json['children'] as num).toInt(); + +Map _$MeasureTypeToJson(MeasureType instance) => + { + 'id': instance.id, + 'Name': instance.name, + 'image': instance.image, + 'description': instance.description, + 'children': instance.children, + }; diff --git a/lib/src/packages/ambito_db/base_db.dart b/lib/src/packages/ambito_db/base_db.dart index 88093a0..b22d6fb 100644 --- a/lib/src/packages/ambito_db/base_db.dart +++ b/lib/src/packages/ambito_db/base_db.dart @@ -1,4 +1,6 @@ import 'package:ambito/src/entity/entities.dart'; +import 'package:ambito/src/entity/measure/measure_category.dart'; +import 'package:ambito/src/entity/measure/measure_type.dart'; import 'package:flutter/foundation.dart'; import 'package:isar/isar.dart'; import 'package:path_provider/path_provider.dart'; @@ -25,6 +27,8 @@ class AmbitoIsarDB { MaterialSchema, MeasureSchema, MeasureCombinationSchema, + MeasureCategorySchema, + MeasureTypeSchema, NumberFactsheetSchema, OrganismSchema, ReferenceImplementationSchema, diff --git a/lib/src/packages/ambito_theme/ambito_theme.dart b/lib/src/packages/ambito_theme/ambito_theme.dart index 2ad4c9c..b350463 100644 --- a/lib/src/packages/ambito_theme/ambito_theme.dart +++ b/lib/src/packages/ambito_theme/ambito_theme.dart @@ -28,26 +28,26 @@ final greenColors = { }; final actionGroupColors = { - 'Bauelemente': const Color(0xffFFD269).withOpacity(.4), - 'Begrünung': const Color(0xff40DD74).withOpacity(.4), - 'Bewirtschaftung': const Color(0xffBF72ED).withOpacity(.4), - 'Nisthilfe': const Color(0xffDAE3FD).withOpacity(.4), - 'Pflanzung': const Color(0xff40D6E9).withOpacity(.4), - 'Sondermaßnahmen': const Color(0xff689EF1).withOpacity(.4), + 'Bauelemente': const Color(0xffFFD269).withOpacity(.3), + 'Begrünung': const Color(0xff40DD74).withOpacity(.3), + 'Bewirtschaftung': const Color(0xffBF72ED).withOpacity(.3), + 'Nisthilfe': const Color(0xffDAE3FD).withOpacity(.3), + 'Pflanzung': const Color(0xff40D6E9).withOpacity(.3), + 'Sondermaßnahmen': const Color(0xff689EF1).withOpacity(.3), }; final actionAreaColors = { - 'Landschaft': const Color(0xffeebb4b).withOpacity(.3), - 'Weinberg': const Color(0xff88a44e).withOpacity(.3), - 'Betriebsfläche': const Color(0xff96172f).withOpacity(.3), - 'Betriebsstätte': const Color(0xffCCCDCC).withOpacity(.6), + 'Landschaft': const Color(0xffeebb4b).withOpacity(.1), + 'Weinberg': const Color(0xff88a44e).withOpacity(.1), + 'Betriebsfläche': const Color(0xff96172f).withOpacity(.1), + 'Betriebsstätte': const Color(0xffCCCDCC).withOpacity(.1), }; final actionAreaFGColors = { - 'Landschaft': const Color(0xffec863a), - 'Weinberg': const Color(0xff3d693f), - 'Betriebsfläche': const Color(0xff883443), - 'Betriebsstätte': const Color(0xff999999), + 'Landschaft': const Color(0xffeebb4b), + 'Weinberg': const Color(0xff88a44e), + 'Betriebsfläche': const Color(0xff96172f), + 'Betriebsstätte': const Color(0xff666666), }; AmbitoTheme getTheme(BuildContext context) { @@ -56,7 +56,7 @@ AmbitoTheme getTheme(BuildContext context) { ThemeManager().setTheme(largeTheme); return largeTheme; } - if (breakpoint >= myBreakpoints.sm) { + if (breakpoint > myBreakpoints.sm) { ThemeManager().setTheme(mediumTheme); return mediumTheme; } diff --git a/lib/src/packages/ambito_theme/ambito_theme_large.dart b/lib/src/packages/ambito_theme/ambito_theme_large.dart index 6be6f8f..d6efe17 100644 --- a/lib/src/packages/ambito_theme/ambito_theme_large.dart +++ b/lib/src/packages/ambito_theme/ambito_theme_large.dart @@ -35,7 +35,7 @@ class AmbitoThemeLarge extends AmbitoTheme { letterSpacing: 0, ), headlineSmall: GoogleFonts.openSans( - fontSize: 32, + fontSize: 24, height: 1.33, fontWeight: FontWeight.w400, letterSpacing: 0, @@ -47,25 +47,25 @@ class AmbitoThemeLarge extends AmbitoTheme { letterSpacing: 0, ), titleMedium: GoogleFonts.openSans( - fontSize: 16, + fontSize: 32, height: 1.5, fontWeight: FontWeight.w500, letterSpacing: 0.15, ), titleSmall: GoogleFonts.openSans( - fontSize: 14, + fontSize: 20, height: 1.42, fontWeight: FontWeight.w500, letterSpacing: 0.1, ), labelLarge: GoogleFonts.openSans( - fontSize: 28, + fontSize: 32, height: 1.42, fontWeight: FontWeight.w500, letterSpacing: 0.1, ), labelMedium: GoogleFonts.openSans( - fontSize: 20, + fontSize: 24, height: 1.33, fontWeight: FontWeight.w500, letterSpacing: 0.15, @@ -77,13 +77,13 @@ class AmbitoThemeLarge extends AmbitoTheme { letterSpacing: 0.1, ), bodyLarge: GoogleFonts.openSans( - fontSize: 16, + fontSize: 20, height: 1.5, fontWeight: FontWeight.w400, letterSpacing: 0.5, ), bodyMedium: GoogleFonts.openSans( - fontSize: 14, + fontSize: 18, height: 1.42, fontWeight: FontWeight.w400, letterSpacing: 0.25, diff --git a/lib/src/packages/ambito_theme/ambito_theme_small.dart b/lib/src/packages/ambito_theme/ambito_theme_small.dart index 013bdf9..7425c6e 100644 --- a/lib/src/packages/ambito_theme/ambito_theme_small.dart +++ b/lib/src/packages/ambito_theme/ambito_theme_small.dart @@ -65,7 +65,7 @@ class AmbitoThemeSmall extends AmbitoTheme { letterSpacing: 0.1, ), labelMedium: GoogleFonts.openSans( - fontSize: 24, + fontSize: 12, height: 1.33, fontWeight: FontWeight.w500, letterSpacing: 0.15, diff --git a/lib/src/pages/actions/actions_categories_page.dart b/lib/src/pages/actions/actions_categories_page.dart new file mode 100644 index 0000000..16dbec5 --- /dev/null +++ b/lib/src/pages/actions/actions_categories_page.dart @@ -0,0 +1,250 @@ +import 'package:ambito/src/config/config.dart'; +import 'package:ambito/src/entity/measure/measure_category.dart'; +import 'package:ambito/src/entity/measure/measure_repository.dart'; +import 'package:ambito/src/extensions/extensions.dart'; +import 'package:ambito/src/pages/ambito_page.dart'; +import 'package:ambito/src/widgets/page/base_page.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:screen_breakpoints/screen_breakpoints.dart'; + +import '../../consts/consts.dart'; +import '../../packages/ambito_theme/ambito_theme.dart'; + +class ActionsCategoriesPage extends AmbitoPage { + const ActionsCategoriesPage({super.key}); + + @override + final String path = 'massnahmen'; + @override + final String title = 'Maßnamen'; + + @override + State createState() => ActionsPrePageState(); +} + +class ActionsPrePageState extends State { + Set cards = {}; + Map counter = {}; + Map ids = {}; + int counterComplete = 0; + List? categories; + + @override + void initState() { + cards = {}; + categories = MeasureRepository().getCategories(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + final AmbitoTheme theme = getTheme(context); + + setState(() { + cards = {}; + }); + + for (MeasureCategory category in categories!) { + setState(() { + cards.add(_buildCard(context, category)); + }); + } + + return BasePage().getPage( + context, + BreakpointBuilder(builder: ( + context, + breakpoint, + configuration, + ) { + return SingleChildScrollView( + child: Center( + child: SizedBox( + width: Breakpoint.fromContext(context).width, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(breakpoint.toString()), + theme.verticalSpacerMax, + Text( + context.translate('page.general.links.massnahmen.title'), + textAlign: TextAlign.start, + style: theme.headlineMedium.copyWith( + color: theme.currentColorScheme.onSurface, + ), + ), + theme.verticalSpacerMax, + Wrap( + alignment: WrapAlignment.start, + spacing: 40, + runSpacing: 40, + children: cards.toList(), + ), + theme.verticalSpacerMax, + InkWell( + onHover: (hovered) {}, + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + onTap: () async { + await prefs.setString('selected_areaType', ''); + await Get.toNamed('/massnahmendatenbank'); + }, + child: Container( + decoration: BoxDecoration( + borderRadius: + const BorderRadius.all(Radius.circular(8)), + color: + theme.currentColorScheme.onSurface.withOpacity(.1), + ), + width: Breakpoint.fromContext(context).width, + child: Padding( + padding: const EdgeInsets.all(20), + child: Text( + 'Alle Maßnahmen anzeigen', + style: theme.titleMedium.copyWith( + color: theme.currentColorScheme.outline, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + ), + ), + ); + }), + ); + } + + Widget _buildCard(BuildContext context, MeasureCategory category) { + return InkWell( + onTap: () { + prefs.setString('selected_areaType', category.name!).then((value) { + Get.toNamed( + '/massnahmendatenbank/${category.name!.toLowerCase().replaceUmlauts()}'); + }); + }, + onHover: (hovered) {}, + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + child: context.breakpoint.breakpoint == myBreakpoints.sm!.breakpoint + ? _smallCard(category) + : _normalCard(category), + ); + } + + Widget _smallCard(MeasureCategory category) { + final AmbitoTheme theme = getTheme(context); + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: actionAreaColors[category.name!], + ), + child: Column( + children: [ + Container( + height: 128, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + image: DecorationImage( + image: AssetImage(category.image!), + fit: BoxFit.cover, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + theme.verticalSpacerSmall, + Text( + category.name!, + style: theme.labelMedium.copyWith( + color: actionAreaFGColors[category.name!]!, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'Anzahl: ${category.children}', + style: theme.labelMedium.copyWith( + color: actionAreaFGColors[category.name], + ), + ), + theme.verticalSpacerSmall, + ], + ), + ], + ), + ), + ); + } + + Widget _normalCard(MeasureCategory category) { + final AmbitoTheme theme = getTheme(context); + return SizedBox( + width: 357, + height: 606, + child: Card( + elevation: 0, + color: actionAreaColors[category.name!], + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.asset( + category.image!, + ), + ), + largeTheme.verticalSpacer, + Padding( + padding: const EdgeInsets.only(left: 20, right: 20), + child: Text( + category.name!, + textAlign: TextAlign.start, + style: theme.titleMedium.copyWith( + color: actionAreaFGColors[category.name!], + fontWeight: FontWeight.bold, + ), + ), + ), + largeTheme.verticalSpacer, + Padding( + padding: const EdgeInsets.only(left: 16, right: 16), + child: Text( + 'Letter of Marque transom booty hail-shot rigging wherry tender Yellow Jack hang the jib piracy. Reef sails man-of-war spyglass doubloon log handsomely overhaul Arr rigging bucko. Ballast Buccaneer warp parrel fire ship bounty skysail square-rigged chase keelhaul.', + textAlign: TextAlign.justify, + style: theme.bodyMedium.copyWith( + color: theme.currentColorScheme.onSurface, + ), + ), + ), + const Spacer(), + Padding( + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), + child: Text( + 'Anzahl: ${category.children}', + style: theme.titleMedium.copyWith( + color: actionAreaFGColors[category.name!], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/src/pages/actions/actions_pre_page.dart b/lib/src/pages/actions/actions_types_page.dart similarity index 76% rename from lib/src/pages/actions/actions_pre_page.dart rename to lib/src/pages/actions/actions_types_page.dart index 067baf0..2e65b30 100644 --- a/lib/src/pages/actions/actions_pre_page.dart +++ b/lib/src/pages/actions/actions_types_page.dart @@ -1,10 +1,10 @@ import 'package:ambito/src/config/config.dart'; -import 'package:ambito/src/entity/_general/filter/item_filter_repository.dart'; -import 'package:ambito/src/entity/entities.dart'; import 'package:ambito/src/entity/measure/measure_repository.dart'; +import 'package:ambito/src/entity/measure/measure_type.dart'; import 'package:ambito/src/extensions/extensions.dart'; import 'package:ambito/src/pages/ambito_page.dart'; import 'package:ambito/src/widgets/page/base_page.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:screen_breakpoints/screen_breakpoints.dart'; @@ -12,8 +12,8 @@ import 'package:screen_breakpoints/screen_breakpoints.dart'; import '../../consts/consts.dart'; import '../../packages/ambito_theme/ambito_theme.dart'; -class ActionsPrePage extends AmbitoPage { - const ActionsPrePage({super.key}); +class ActionsTypesPage extends AmbitoPage { + const ActionsTypesPage({super.key}); @override final String path = 'massnahmen'; @@ -24,18 +24,17 @@ class ActionsPrePage extends AmbitoPage { State createState() => ActionsPrePageState(); } -class ActionsPrePageState extends State { +class ActionsPrePageState extends State { Set cards = {}; Map counter = {}; Map ids = {}; int counterComplete = 0; - Set? filters; + List? categories; @override void initState() { cards = {}; - filters = ItemFilterRepository().getByType('areaType'); - counterComplete = MeasureRepository().getMeasureCount(); + categories = MeasureRepository().getTypes(); super.initState(); } @@ -47,9 +46,9 @@ class ActionsPrePageState extends State { cards = {}; }); - for (ItemFilter filter in filters!) { + for (MeasureType category in categories!) { setState(() { - cards.add(_buildCard(context, filter)); + cards.add(_buildCard(context, category)); }); } @@ -82,8 +81,9 @@ class ActionsPrePageState extends State { Align( alignment: Alignment.center, child: Wrap( - alignment: WrapAlignment.center, + alignment: WrapAlignment.start, spacing: 32, + runSpacing: 32, children: cards.toList(), ), ), @@ -127,11 +127,12 @@ class ActionsPrePageState extends State { ); } - Widget _buildCard(BuildContext context, ItemFilter filter) { + Widget _buildCard(BuildContext context, MeasureType category) { return InkWell( onTap: () { - prefs.setString('selected_areaType', filter.name!).then((value) { - Get.toNamed('/massnahmendatenbank/${filter.name}'); + prefs.setString('selected_areaType', category.name!).then((value) { + Get.toNamed( + '/massnahmendatenbank/${category.name!.toLowerCase().replaceUmlauts()}'); }); }, onHover: (hovered) {}, @@ -140,22 +141,25 @@ class ActionsPrePageState extends State { focusColor: Colors.transparent, hoverColor: Colors.transparent, child: context.breakpoint.breakpoint == myBreakpoints.sm!.breakpoint - ? _smallCard(filter) - : _normalCard(filter), + ? _smallCard(category) + : _normalCard(category), ); } - Widget _smallCard(ItemFilter filter) { + Widget _smallCard(MeasureType category) { + logger.d(category.image); final AmbitoTheme theme = getTheme(context); return Padding( - padding: EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 10), child: Container( height: 180, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), image: DecorationImage( - image: AssetImage(filter.image!), + image: (category.image == 'images/logo_trans.png') + ? AssetImage(category.image!) + : CachedNetworkImageProvider(category.image!), fit: BoxFit.cover, ), ), @@ -165,7 +169,7 @@ class ActionsPrePageState extends State { Container( height: 80, decoration: BoxDecoration( - color: actionAreaFGColors[filter.name!]!.withOpacity(.6), + color: actionGroupColors[category.name!]!, borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)), @@ -177,14 +181,14 @@ class ActionsPrePageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - filter.name!, + category.name!, style: theme.labelMedium.copyWith( color: theme.currentColorScheme.onPrimary, fontWeight: FontWeight.bold, ), ), Text( - 'Anzahl: ${filter.ids!.length}', + 'Anzahl: ${category.children}', style: theme.titleMedium.copyWith( color: theme.currentColorScheme.onPrimary, fontWeight: FontWeight.bold, @@ -199,29 +203,36 @@ class ActionsPrePageState extends State { ); } - Widget _normalCard(ItemFilter filter) { + Widget _normalCard(MeasureType category) { final AmbitoTheme theme = getTheme(context); return SizedBox( width: 262, height: 380, child: Card( elevation: 0, - color: actionAreaColors[filter.name!], + color: actionGroupColors[category.name!], child: Column( children: [ - ClipRRect( - borderRadius: BorderRadius.circular(8.0), - child: Image.asset( - filter.image!, + Container( + height: 180, + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + image: DecorationImage( + image: (category.image == 'images/logo_trans.png') + ? AssetImage(category.image!) + : CachedNetworkImageProvider(category.image!), + fit: BoxFit.cover, + ), ), ), largeTheme.verticalSpacer, Padding( padding: const EdgeInsets.only(left: 16, right: 16), child: Text( - filter.name!, + category.name!, style: theme.labelMedium.copyWith( - color: actionAreaFGColors[filter.name!], + color: actionAreaFGColors[category.name!], fontWeight: FontWeight.bold, ), ), @@ -230,7 +241,7 @@ class ActionsPrePageState extends State { Padding( padding: const EdgeInsets.only(left: 16, right: 16), child: Text( - filter.description!, + category.description!, style: theme.bodyMedium.copyWith( color: theme.currentColorScheme.onSurface, ), @@ -240,9 +251,9 @@ class ActionsPrePageState extends State { Padding( padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), child: Text( - 'Anzahl: ${filter.ids!.length}', + 'Anzahl: ${category.children}', style: theme.titleMedium.copyWith( - color: actionAreaFGColors[filter.name!], + color: actionAreaFGColors[category.name!], fontWeight: FontWeight.bold, ), ), diff --git a/lib/src/pages/cart/cart_page.dart b/lib/src/pages/cart/cart_page.dart index 2d433c8..f7a80e1 100644 --- a/lib/src/pages/cart/cart_page.dart +++ b/lib/src/pages/cart/cart_page.dart @@ -31,7 +31,7 @@ class CalendarPageState extends State { } initDataSource() { - monthFilter = ItemFilterRepository().getByType('month'); + monthFilter = ItemFilterRepository().getByType('month')?.toList(); for (String month in months) { DateTime now = DateTime.now(); int monthInt = months.indexOf(month) + 1; diff --git a/pubspec.lock b/pubspec.lock index e19a467..217aa02 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -290,10 +290,10 @@ packages: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.7" expandable_text: dependency: "direct main" description: @@ -662,18 +662,18 @@ packages: dependency: transitive description: name: jovial_misc - sha256: f6e64f789ee311025bb367be9c9afe9759f76dd8209070b7f38e735b5f529eb1 + sha256: "4b10a4cac4f492d9692e97699bff775efa84abdba29909124cbccf3126e31cea" url: "https://pub.dev" source: hosted - version: "0.8.5" + version: "0.9.0" jovial_svg: dependency: transitive description: name: jovial_svg - sha256: adbc985f89a9e9c601d29aebb9fc17dd0a5db05b67af7e6c21da91eeb13dacb7 + sha256: ca14d42956b9949c36333065c9141f100e930c918f57f4bd8dd59d35581bd3fc url: "https://pub.dev" source: hosted - version: "1.1.23" + version: "1.1.24" js: dependency: transitive description: @@ -694,10 +694,10 @@ packages: dependency: "direct main" description: name: json_serializable - sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c url: "https://pub.dev" source: hosted - version: "6.8.0" + version: "6.9.0" latlong2: dependency: "direct main" description: @@ -918,10 +918,10 @@ packages: dependency: "direct main" description: name: percent_indicator - sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c + sha256: "0d77d5c6fa9b7f60202cedf748b568ba9ba38d3f30405d6ceae4da76f5185462" url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" permission_handler: dependency: "direct main" description: @@ -950,10 +950,10 @@ packages: dependency: transitive description: name: permission_handler_html - sha256: "6b9cb54b7135073841a35513fba39e598b421702d5f4d92319992fd6eb5532a9" + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+4" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: @@ -994,14 +994,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" - url: "https://pub.dev" - source: hosted - version: "3.9.1" polylabel: dependency: transitive description: @@ -1134,10 +1126,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" sky_engine: dependency: transitive description: flutter @@ -1195,10 +1187,10 @@ packages: dependency: transitive description: name: sqflite_common - sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490" + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" url: "https://pub.dev" source: hosted - version: "2.5.4+5" + version: "2.5.4+6" sqflite_darwin: dependency: transitive description: @@ -1259,34 +1251,34 @@ packages: dependency: "direct main" description: name: syncfusion_flutter_calendar - sha256: "00703dd2e154ad534e7e898958f1e4c1573b15a19448c0b183365f4b9779f054" + sha256: "0f049bbc7ea1f86a22db7c9090d967c71dc1c72f36b83393c66090141c37f819" url: "https://pub.dev" source: hosted - version: "27.2.2" + version: "27.2.3" syncfusion_flutter_core: dependency: transitive description: name: syncfusion_flutter_core - sha256: "225b1cc135549bb4eef096d63b7323c30ee61c4b095c7e8a14bf9333e243d84b" + sha256: a39ddfb22b30c7cba620fec7dc682e46f151998febd25bca5519c17431084951 url: "https://pub.dev" source: hosted - version: "27.2.2" + version: "27.2.3" syncfusion_flutter_datepicker: dependency: "direct main" description: name: syncfusion_flutter_datepicker - sha256: e2e2a97b033390f0791316c6019743991aa598563d09f603ba13230cd50b8905 + sha256: "5af3301119607fe834ca0d222013102884e6644fc8324430a8ff56f73442e3d5" url: "https://pub.dev" source: hosted - version: "27.2.2" + version: "27.2.3" syncfusion_localizations: dependency: "direct main" description: name: syncfusion_localizations - sha256: c821c64ce38126ce1f5e5a36bc433157d49a03f04c19b45878cb82cca6267fde + sha256: d6123f30f100a3e5e1dc235c6195194f5b82ca51fa8ce94718812b8b05120b60 url: "https://pub.dev" source: hosted - version: "27.2.2" + version: "27.2.3" synchronized: dependency: transitive description: