From 88f55a1e32968142b43d47aa10b22166a749e5e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Gonz=C3=A1lez?= Date: Mon, 22 Sep 2025 10:42:43 +0200 Subject: [PATCH] feat: add search functionality for formulas by name and tags --- lib/ai/formula_list.dart | 97 +++++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 20 deletions(-) diff --git a/lib/ai/formula_list.dart b/lib/ai/formula_list.dart index 5f04c51..803f667 100644 --- a/lib/ai/formula_list.dart +++ b/lib/ai/formula_list.dart @@ -3,7 +3,7 @@ import 'package:d4rt_formulas/formula_models.dart'; import '../corpus.dart'; import 'formula_screen.dart'; -class FormulaList extends StatelessWidget { +class FormulaList extends StatefulWidget { final Corpus corpus; final List formulas; @@ -13,27 +13,84 @@ class FormulaList extends StatelessWidget { required this.formulas, }); + @override + State createState() => _FormulaListState(); +} + +class _FormulaListState extends State { + final TextEditingController _searchController = TextEditingController(); + String _searchQuery = ''; + + @override + void initState() { + super.initState(); + _searchController.addListener(_onSearchChanged); + } + + void _onSearchChanged() { + setState(() { + _searchQuery = _searchController.text.toLowerCase(); + }); + } + + @override + void dispose() { + _searchController.dispose(); + super.dispose(); + } + + List get _filteredFormulas { + if (_searchQuery.isEmpty) return widget.formulas; + + return widget.formulas.where((formula) { + final nameMatch = formula.name.toLowerCase().contains(_searchQuery); + final tagMatch = formula.tags.any((tag) => tag.toLowerCase().contains(_searchQuery)); + return nameMatch || tagMatch; + }).toList(); + } + @override Widget build(BuildContext context) { - return ListView.builder( - itemCount: formulas.length, - itemBuilder: (context, index) { - final formula = formulas[index]; - return ListTile( - title: Text(formula.name), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FormulaScreen( - formula: formula, - corpus: corpus, - ), - ), - ); - }, - ); - }, + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: TextField( + controller: _searchController, + decoration: const InputDecoration( + labelText: 'Search formulas', + hintText: 'Search by name or tag...', + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder(), + ), + ), + ), + Expanded( + child: ListView.builder( + itemCount: _filteredFormulas.length, + itemBuilder: (context, index) { + final formula = _filteredFormulas[index]; + return ListTile( + title: Text(formula.name), + subtitle: formula.tags.isNotEmpty + ? Text('Tags: ${formula.tags.join(', ')}') + : null, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FormulaScreen( + formula: formula, + corpus: widget.corpus, + ), + ), + ); + }, + ); + }, + ), + ), + ], ); } }