[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));
-        },
-      ),
-    );
-  }
-}