diff --git a/lib/view/pages/marianum_message/marianum_message_list_view.dart b/lib/view/pages/marianum_message/marianum_message_list_view.dart index f49b2a4..733db5d 100644 --- a/lib/view/pages/marianum_message/marianum_message_list_view.dart +++ b/lib/view/pages/marianum_message/marianum_message_list_view.dart @@ -6,6 +6,7 @@ import '../../../state/app/infrastructure/loadable_state/view/loadable_state_con import '../../../state/app/infrastructure/utility_widgets/bloc_module.dart'; import '../../../state/app/modules/marianum_message/bloc/marianum_message_bloc.dart'; import '../../../state/app/modules/marianum_message/bloc/marianum_message_state.dart'; +import 'search_marianum_messages.dart'; class MarianumMessageListView extends StatelessWidget { const MarianumMessageListView({super.key}); @@ -16,7 +17,25 @@ class MarianumMessageListView extends StatelessWidget { ) => BlocModule>( create: (context) => MarianumMessageBloc(), child: (context, bloc, state) => Scaffold( - appBar: AppBar(title: const Text('Marianum Message')), + appBar: AppBar( + title: const Text('Marianum Message'), + actions: [ + IconButton( + icon: const Icon(Icons.search), + onPressed: () { + final list = bloc.state.data?.messageList; + if (list == null) return; + showSearch( + context: context, + delegate: SearchMarianumMessages( + base: list.base, + messages: list.messages, + ), + ); + }, + ), + ], + ), body: LoadableStateConsumer( child: (state, loading) => ListView.builder( itemCount: state.messageList.messages.length, diff --git a/lib/view/pages/marianum_message/search_marianum_messages.dart b/lib/view/pages/marianum_message/search_marianum_messages.dart new file mode 100644 index 0000000..effba1c --- /dev/null +++ b/lib/view/pages/marianum_message/search_marianum_messages.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import '../../../routing/app_routes.dart'; +import '../../../state/app/modules/marianum_message/bloc/marianum_message_state.dart'; +import '../../../widget/placeholder_view.dart'; + +class SearchMarianumMessages extends SearchDelegate { + final String base; + final List messages; + + SearchMarianumMessages({required this.base, required this.messages}); + + List _matches() { + final q = query.trim().toLowerCase(); + if (q.isEmpty) return messages; + return messages.where((m) { + return m.name.toLowerCase().contains(q) || + m.date.toLowerCase().contains(q); + }).toList(); + } + + @override + List? buildActions(BuildContext context) => [ + if (query.isNotEmpty) + IconButton(onPressed: () => query = '', icon: const Icon(Icons.delete)), + ]; + + @override + Widget? buildLeading(BuildContext context) => IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => close(context, null), + ); + + @override + Widget buildResults(BuildContext context) { + final matches = _matches(); + if (matches.isEmpty) { + return const PlaceholderView( + icon: Icons.search_off_outlined, + text: 'Keine Treffer', + ); + } + return ListView.builder( + itemCount: matches.length, + itemBuilder: (_, i) { + final message = matches[i]; + return ListTile( + leading: const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [Icon(Icons.newspaper)], + ), + title: Text(message.name, overflow: TextOverflow.ellipsis), + subtitle: Text('vom ${message.date}'), + trailing: const Icon(Icons.arrow_right), + onTap: () { + close(context, message); + AppRoutes.openMarianumMessage(context, base, message); + }, + ); + }, + ); + } + + @override + Widget buildSuggestions(BuildContext context) => buildResults(context); +}