import 'package:ambito/src/entity/entities.dart'; import 'package:ambito/src/entity/lists/list_display.dart'; import 'package:ambito/src/entity/lists/list_repository.dart'; import 'package:ambito/src/entity/measure/category/measure_category.dart'; import 'package:ambito/src/entity/measure/complete/measure_complete.dart'; import 'package:ambito/src/entity/measure/measure_grouping.dart'; import 'package:ambito/src/extensions/extensions.dart'; import 'package:ambito/src/packages/ambito_db/base_db.dart'; import 'package:isar/isar.dart'; import '../../consts/consts.dart'; import '../../packages/ambito_notifier/notifier/filter_notifier.dart'; import '../../widgets/form/fields/field_dropdown.dart'; import 'group/measure_group.dart'; class MeasureRepository extends BaseDB { @override IsarCollection collection = isar.measureTypes; putMeasureGroups(MeasureGrouping mg) { isar.write((isar) { isar.measureGroupings.put(mg); }); } MeasureTypes? getTypeByName(String name) { return isar.measureTypes.where().measureTypeEqualTo(name).findFirst(); } Map getTypesCounterByCategory(String category) { final counter = {}; /*final allMeasures = isar.measureGroups.where().findAll(); for (final measure in allMeasures) { if (measure.categories?.isEmpty ?? true || measure.type == null) continue; final typeName = measure.type!.value; if (typeName == null) continue; final hasCategory = measure.categories!.any((cat) => cat.value?.toLowerCase().replaceUmlauts() == category.toLowerCase()); if (hasCategory) { counter[typeName] = (counter[typeName] ?? 0) + 1; } }*/ return counter; } Future getCategoriesGroupsAndTypes() async { final categoriesMap = {}; final groupsMap = {}; final autoIncrementCat = isar.measureCategorys.autoIncrement; final autoIncrementType = isar.measureGroups.autoIncrement; // Fetch all measures final List allMeasures = isar.measureTypes.where().findAll(); for (final MeasureTypes measure in allMeasures) { if (measure.measureCategory == null || measure.measureCategory == null || measure.measureCategory!.isEmpty) { continue; } // Process categories for (final cat in measure.measureCategory!) { final categoryName = cat.value; if (categoryName == null) continue; if (!categoriesMap.containsKey(categoryName)) { categoriesMap[categoryName] = MeasureCategory() ..id = autoIncrementCat() ..name = categoryName ..url = categoryName.toLowerCase().replaceUmlauts() ..image = 'images/measure/category/${categoryName.toLowerCase().replaceUmlauts()}.jpg' ..description = 'Lorem ipsum dolor sit amet.' ..children = 1; } else { categoriesMap[categoryName]!.children++; } categoriesMap[categoryName]!.ids.add(measure.id); } // Process types final groupName = measure.measureGroup!.value; if (groupName == null) continue; if (!groupsMap.containsKey(groupName)) { groupsMap[groupName] = MeasureGroup() ..id = autoIncrementType() ..name = groupName ..url = groupName.toLowerCase().replaceUmlauts() ..description = measure.description ?? '' ..image = 'images/measure/group/${groupName.toLowerCase().replaceUmlauts()}.jpg' // Add the appropriate image URL if available ..children = 1 ..categories = measure.measureCategory! .map((item) => item.value!.toLowerCase().replaceUmlauts().toString()) .toList(); } else { groupsMap[groupName]!.categories.addAll(measure.measureCategory! .map( (item) => item.value!.toLowerCase().replaceUmlauts().toString()) .toList()); groupsMap[groupName]!.children++; } groupsMap[groupName]!.ids.add(measure.id); } isar.write((isar) { isar.measureCategorys.putAll(categoriesMap.values.toList()); isar.measureGroups.putAll(groupsMap.values.toList()); }); return true; } Future buildLists() async { return true; } Future buildMeasureFilters() async { return true; } int getMeasureCount() { return isar.measureTypes.where().count(); } List getByIds(List ids) { return isar.measureTypes.getAll(ids); } List getAllOrdered() { return isar.measureTypes.where().sortByMeasureType().findAll(); } List getAllOrderedByCategory(String category) { final lowerCaseCategory = category.toLowerCase().replaceUmlauts(); final all = isar.measureTypes.where().sortByMeasureType().findAll(); return all.where((mt) { return mt.measureCategory?.any((idcv) => idcv.value?.toLowerCase().replaceUmlauts() == lowerCaseCategory) ?? false; }).toList(); } List getCategories() { return isar.measureCategorys.where().findAll(); } List? getIdsByCategory(String category) { if (category == '') { return isar.measureCategorys .where() .idsProperty() .findAll() .expand((x) => x) .toList(); } return isar.measureCategorys .where() .urlEqualTo(category) .idsProperty() .findFirst(); } List? getIdsByGroup(String group) { if (group == '') { return isar.measureCategorys .where() .idsProperty() .findAll() .expand((x) => x) .toList(); } return isar.measureGroups .where() .urlEqualTo(group) .idsProperty() .findFirst(); } List? getIdsByCategoryAndGroup(String category, String group) { Set byCat = Set.from(getIdsByCategory(category) ?? []); Set byGroup = Set.from(getIdsByGroup(group) ?? []); return byCat.intersection(byGroup).toList(); } List getGroupsByCategory(String category) { return isar.measureGroups .where() .categoriesElementContains(category) .findAll(); } FieldDropdown getGroupDropDownByCategory(String category) { List filterItems = getGroupsByCategory(category); return FieldDropdown( name: 'group', label: 'Maßnahmengruppe', filterValue: ambitoFilterNotifier.activeFilters['group'], onClear: () { ambitoFilterNotifier.removeFilter('group'); ambitoFilterNotifier.removeFilter('type'); }, onSelected: (value) { ambitoFilterNotifier.removeFilter('type'); ambitoFilterNotifier.setFilter( 'group', value ?? '', ); }, entries: filterItems.map((item) => item.name!).toList(), ); } FieldDropdown getTypeDropDownByCategoryAndGroup( String category, String group) { List filterItemsToShow = ListRepository().getTypesToDisplay(category, group); List filterItems = []; for (var filterItem in filterItemsToShow) { int childs = ListRepository() .getMeasuresToDisplay( category, group, filterItem.title!.toLowerCase().replaceUmlauts()) .length; if (childs > 0) { filterItems.add(filterItem); } } return FieldDropdown( name: 'type', label: 'Maßnahmentyp', filterValue: ambitoFilterNotifier.activeFilters['type'], onClear: () { ambitoFilterNotifier.removeFilter('type'); }, onSelected: (value) { ambitoFilterNotifier.setFilter( 'type', value ?? '', ); }, entries: filterItems.map((item) => item.title!).toList(), ); } MeasureComplete? getMeasureCompleteByName(String name) { return isar.measureCompletes.where().nameEqualTo(name).findFirst(); } }