tag route search input query application (#768)

diff --git a/dubbo-admin-ui/src/components/governance/TagRule.vue b/dubbo-admin-ui/src/components/governance/TagRule.vue
index e15b2c7..5714861 100644
--- a/dubbo-admin-ui/src/components/governance/TagRule.vue
+++ b/dubbo-admin-ui/src/components/governance/TagRule.vue
@@ -21,11 +21,32 @@
       <v-flex lg12>
         <breadcrumb title="tagRule" :items="breads"></breadcrumb>
       </v-flex>
-      <v-flex xs12 >
-        <search id="serviceSearch" v-model="filter" :submit="submit" :label="$t('searchTagRule')"></search>
-      </v-flex>
     </v-layout>
     <v-flex lg12>
+      <v-card flat color="transparent">
+        <v-card-text>
+          <v-form>
+            <v-layout row wrap>
+              <v-combobox
+                id="serviceSearch"
+                :loading="searchLoading"
+                :items="typeAhead"
+                :search-input.sync="input"
+                @keyup.enter="submit"
+                v-model="filter"
+                flat
+                append-icon=""
+                hide-no-data
+                :label="$t('searchTagRule')"
+              ></v-combobox>
+              <v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
+
+            </v-layout>
+          </v-form>
+        </v-card-text>
+      </v-card>
+    </v-flex>
+    <v-flex lg12>
       <v-card>
         <v-toolbar flat color="transparent" class="elevation-0">
           <v-toolbar-title><span class="headline">{{$t('searchResult')}}</span></v-toolbar-title>
@@ -117,6 +138,10 @@
       dialog: false,
       updateId: '',
       application: '',
+      searchLoading: false,
+      typeAhead: [],
+      input: null,
+      timerID: null,
       warn: {
         display: false,
         title: '',
@@ -171,6 +196,22 @@
           }
         ]
       },
+      querySelections (v) {
+        if (this.timerID) {
+          clearTimeout(this.timerID)
+        }
+        // Simulated ajax query
+        this.timerID = setTimeout(() => {
+          if (v && v.length >= 4) {
+            this.searchLoading = true
+            this.typeAhead = this.$store.getters.getAppItems(v)
+            this.searchLoading = false
+            this.timerID = null
+          } else {
+            this.typeAhead = []
+          }
+        }, 500)
+      },
       submit: function () {
         if (!this.filter) {
           this.$notify.error('application is needed')
@@ -340,12 +381,16 @@
       }
     },
     watch: {
+      input (val) {
+        this.querySelections(val)
+      },
       area () {
         this.setHeaders()
       }
     },
     mounted: function () {
       this.setHeaders()
+      this.$store.dispatch('loadAppItems')
       this.ruleText = this.template
       let query = this.$route.query
       let filter = null