[current results ui] Clicking on a filter term copies it to the input field
Fixes: https://github.com/dart-lang/dart_ci/issues/114
Change-Id: I007c7cd19c1d68c2e2885f89307f2533899b8ea3
Reviewed-on: https://dart-review.googlesource.com/c/dart_ci/+/213361
Reviewed-by: Alexander Thomas <athom@google.com>
Commit-Queue: William Hesse <whesse@google.com>
diff --git a/current_results_ui/lib/filter.dart b/current_results_ui/lib/filter.dart
index e839281..765c982 100644
--- a/current_results_ui/lib/filter.dart
+++ b/current_results_ui/lib/filter.dart
@@ -22,7 +22,20 @@
const ListEquality().equals(terms, other.terms);
}
-class FilterUI extends StatelessWidget {
+class FilterUI extends StatefulWidget {
+ @override
+ State<FilterUI> createState() => _FilterUIState();
+}
+
+class _FilterUIState extends State<FilterUI> {
+ final controller = TextEditingController();
+
+ @override
+ void dispose() {
+ controller.dispose();
+ super.dispose();
+ }
+
@override
Widget build(BuildContext context) {
return Consumer<QueryResults>(
@@ -45,12 +58,15 @@
children: [
for (final term in filter.terms)
InputChip(
- label: Text(term),
- onDeleted: () {
- pushRoute(context,
- terms: filter.terms.where((t) => t != term));
- },
- ),
+ label: Text(term),
+ onDeleted: () {
+ pushRoute(context,
+ terms:
+ filter.terms.where((t) => t != term));
+ },
+ onPressed: () {
+ controller.text = term;
+ }),
],
),
),
@@ -64,7 +80,28 @@
),
Padding(
padding: EdgeInsets.only(left: 12.0),
- child: AddWidget(filter),
+ child: SizedBox(
+ width: 300.0,
+ height: 36.0,
+ child: TextField(
+ controller: controller,
+ decoration: InputDecoration(
+ hintText: 'Test, configuration or experiment prefix'),
+ onSubmitted: (value) {
+ if (value.trim().isEmpty) return;
+ final newTerms = value.split(',').map((s) => s.trim());
+ bool isNotReplacedByNewTerm(String term) =>
+ !newTerms.any((newTerm) =>
+ term.startsWith(newTerm) ||
+ newTerm.startsWith(term));
+ controller.text = '';
+ pushRoute(context,
+ terms: filter.terms
+ .where(isNotReplacedByNewTerm)
+ .followedBy(newTerms));
+ },
+ ),
+ ),
),
],
);
@@ -72,45 +109,3 @@
);
}
}
-
-class AddWidget extends StatefulWidget {
- final Filter filter;
- AddWidget(this.filter);
-
- @override
- _AddWidgetState createState() => _AddWidgetState();
-}
-
-class _AddWidgetState extends State<AddWidget> {
- final controller = TextEditingController();
-
- @override
- void dispose() {
- controller.dispose();
- super.dispose();
- }
-
- @override
- Widget build(BuildContext context) {
- return SizedBox(
- width: 300.0,
- height: 36.0,
- child: TextField(
- controller: controller,
- decoration: InputDecoration(
- hintText: 'Test, configuration or experiment prefix'),
- onSubmitted: (value) {
- if (value.trim().isEmpty) return;
- final newTerms = value.split(',').map((s) => s.trim());
- bool isNotReplacedByNewTerm(String term) => !newTerms.any((newTerm) =>
- term.startsWith(newTerm) || newTerm.startsWith(term));
- controller.text = '';
- pushRoute(context,
- terms: widget.filter.terms
- .where(isNotReplacedByNewTerm)
- .followedBy(newTerms));
- },
- ),
- );
- }
-}