implemented foreign timetable support for students, teachers, rooms, and classes, including a searchable element picker with favorites support, introduced a capabilities system for feature gating, refactored the timetable UI into a reusable TimetableCalendarView component, and redesigned the chat input field with a unified emoji picker and integrated attachment actions.

This commit is contained in:
2026-05-31 21:29:16 +02:00
parent 6e12da08c0
commit b6d06dd3b4
41 changed files with 2325 additions and 290 deletions
@@ -0,0 +1,49 @@
import 'package:json_annotation/json_annotation.dart';
import '../api/marianumconnect/queries/timetable_get_element_week/timetable_element_type.dart';
part 'timetable_favorites_settings.g.dart';
/// A timetable element the user starred for quick access from the picker.
@JsonSerializable(explicitToJson: true)
class FavoriteTimetableElement {
final TimetableElementType type;
final int id;
final String label;
FavoriteTimetableElement({
required this.type,
required this.id,
required this.label,
});
factory FavoriteTimetableElement.fromJson(Map<String, dynamic> json) =>
_$FavoriteTimetableElementFromJson(json);
Map<String, dynamic> toJson() => _$FavoriteTimetableElementToJson(this);
}
@JsonSerializable(explicitToJson: true)
class TimetableFavoritesSettings {
List<FavoriteTimetableElement> favorites;
TimetableFavoritesSettings({required this.favorites});
bool isFavorite(TimetableElementType type, int id) =>
favorites.any((f) => f.type == type && f.id == id);
/// Adds or removes the element in place. Returns the new favorite state
/// (`true` = now starred). Callers persist via `SettingsCubit.val(write: true)`.
bool toggle(TimetableElementType type, int id, String label) {
final existing = favorites.where((f) => f.type == type && f.id == id);
if (existing.isNotEmpty) {
favorites.removeWhere((f) => f.type == type && f.id == id);
return false;
}
favorites.add(FavoriteTimetableElement(type: type, id: id, label: label));
return true;
}
factory TimetableFavoritesSettings.fromJson(Map<String, dynamic> json) =>
_$TimetableFavoritesSettingsFromJson(json);
Map<String, dynamic> toJson() => _$TimetableFavoritesSettingsToJson(this);
}