If the search input must not be blank, we should notify users (#383)

diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
index cd1b894..8486d3e 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/ConditionRoutesController.java
@@ -82,11 +82,12 @@
                                                 @RequestParam(required = false) String service, @PathVariable String env) {
         ConditionRouteDTO conditionRoute = null;
         List<ConditionRouteDTO> result = new ArrayList<>();
-        if (StringUtils.isNotEmpty(application)) {
+        if (StringUtils.isNotBlank(application)) {
             conditionRoute = routeService.findConditionRoute(application);
-        }
-        if (StringUtils.isNotEmpty(service)) {
+        } else if (StringUtils.isNotBlank(service)) {
             conditionRoute = routeService.findConditionRoute(service);
+        } else {
+            throw new ParamValidationException("Either Service or application is required.");
         }
         if (conditionRoute != null && conditionRoute.getConditions() != null) {
             result.add(conditionRoute);
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
index 82ba032..c50ae01 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
@@ -83,10 +83,12 @@
                                                  @PathVariable String env) {
         DynamicConfigDTO override = null;
         List<DynamicConfigDTO> result = new ArrayList<>();
-        if (StringUtils.isNotEmpty(service)) {
+        if (StringUtils.isNotBlank(service)) {
             override = overrideService.findOverride(service);
-        } else if(StringUtils.isNotEmpty(application)){
+        } else if(StringUtils.isNotBlank(application)){
             override = overrideService.findOverride(application);
+        } else {
+            throw new ParamValidationException("Either Service or application is required.");
         }
         if (override != null) {
             result.add(override);
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/TagRoutesController.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/TagRoutesController.java
index 521c9d2..f3c88ec 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/TagRoutesController.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/controller/TagRoutesController.java
@@ -84,6 +84,9 @@
 
     @RequestMapping(method = RequestMethod.GET)
     public List<TagRouteDTO> searchRoutes(@RequestParam String application, @PathVariable String env) {
+        if (StringUtils.isBlank(application)) {
+            throw new ParamValidationException("application is required.");
+        }
         List<TagRouteDTO> result = new ArrayList<>();
         String version = "2.6";
         try {
@@ -95,10 +98,7 @@
             return result;
         }
 
-        TagRouteDTO tagRoute = null;
-        if (StringUtils.isNotEmpty(application)) {
-            tagRoute = routeService.findTagRoute(application);
-        }
+        TagRouteDTO tagRoute = routeService.findTagRoute(application);
         if (tagRoute != null) {
             result.add(tagRoute);
         }
diff --git a/dubbo-admin-ui/src/components/Management.vue b/dubbo-admin-ui/src/components/Management.vue
index 03522c7..d107b1e 100644
--- a/dubbo-admin-ui/src/components/Management.vue
+++ b/dubbo-admin-ui/src/components/Management.vue
@@ -256,15 +256,19 @@
           }
         },
         submit () {
+          if (!this.filter) {
+            this.$notify.error('application is needed')
+            return
+          }
           this.filter = this.filter.trim()
-          this.search(this.filter)
+          this.search()
         },
-        search (filter) {
-          this.$axios.get('/manage/config/' + filter)
+        search () {
+          this.$axios.get('/manage/config/' + this.filter)
             .then(response => {
               if (response.status === 200) {
                 this.dubboConfig = response.data
-                this.$router.push({path: 'management', query: {key: filter}})
+                this.$router.push({path: 'management', query: {key: this.filter}})
               }
             })
         }
@@ -283,7 +287,7 @@
         } else {
           this.filter = 'global'
         }
-        this.search(this.filter)
+        this.search()
       }
     }
 </script>
diff --git a/dubbo-admin-ui/src/components/governance/AccessControl.vue b/dubbo-admin-ui/src/components/governance/AccessControl.vue
index 7104f11..9b0b74c 100644
--- a/dubbo-admin-ui/src/components/governance/AccessControl.vue
+++ b/dubbo-admin-ui/src/components/governance/AccessControl.vue
@@ -32,7 +32,7 @@
                   :loading="searchLoading"
                   :items="typeAhead"
                   :search-input.sync="input"
-                  @keyup.enter="search"
+                  @keyup.enter="submit"
                   flat
                   append-icon=""
                   hide-no-data
@@ -53,7 +53,7 @@
                     </v-list-tile>
                   </v-list>
                 </v-menu>
-                <v-btn @click="search" color="primary" large>{{$t('search')}}</v-btn>
+                <v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
 
               </v-layout>
             </v-form>
@@ -345,25 +345,29 @@
         }
       }, 500)
     },
-    search () {
+    submit: function () {
+      this.filter = document.querySelector('#serviceSearch').value.trim()
+      this.search(true)
+    },
+    search (rewrite) {
       if (!this.filter) {
-        this.filter = document.querySelector('#serviceSearch').value.trim()
-        if (!this.filter) {
-          return
-        }
+        this.$notify.error('Either service or application is needed')
+        return
       }
       let type = this.items[this.selected].value
       this.loading = true
-      if (this.selected === 0) {
-        this.$router.push({
-          path: 'access',
-          query: {service: this.filter}
-        })
-      } else if (this.selected === 1) {
-        this.$router.push({
-          path: 'access',
-          query: {application: this.filter}
-        })
+      if (rewrite) {
+        if (this.selected === 0) {
+          this.$router.push({
+            path: 'access',
+            query: {service: this.filter}
+          })
+        } else if (this.selected === 1) {
+          this.$router.push({
+            path: 'access',
+            query: {application: this.filter}
+          })
+        }
       }
       let url = '/rules/access/?' + type + '=' + this.filter
       this.$axios.get(url)
@@ -537,7 +541,9 @@
       this.filter = query['application']
       this.selected = 1
     }
-    this.search()
+    if (this.filter !== null) {
+      this.search()
+    }
   },
   components: {
     Breadcrumb,
diff --git a/dubbo-admin-ui/src/components/governance/LoadBalance.vue b/dubbo-admin-ui/src/components/governance/LoadBalance.vue
index a2a5064..7b62e00 100644
--- a/dubbo-admin-ui/src/components/governance/LoadBalance.vue
+++ b/dubbo-admin-ui/src/components/governance/LoadBalance.vue
@@ -319,19 +319,23 @@
       },
       submit: function () {
         this.filter = document.querySelector('#serviceSearch').value.trim()
-        this.search(this.filter, true)
+        this.search(true)
       },
-      search: function (filter, rewrite) {
+      search: function (rewrite) {
+        if (!this.filter) {
+          this.$notify.error('Either service or application is needed')
+          return
+        }
         let type = this.items[this.selected].value
-        let url = '/rules/balancing/?' + type + '=' + filter
+        let url = '/rules/balancing/?' + type + '=' + this.filter
         this.$axios.get(url)
           .then(response => {
             this.loadBalances = response.data
             if (rewrite) {
               if (this.selected === 0) {
-                this.$router.push({path: 'loadbalance', query: {service: filter}})
+                this.$router.push({path: 'loadbalance', query: {service: this.filter}})
               } else if (this.selected === 1) {
-                this.$router.push({path: 'loadbalance', query: {application: filter}})
+                this.$router.push({path: 'loadbalance', query: {application: this.filter}})
               }
             }
           })
@@ -524,7 +528,7 @@
       })
       if (filter !== null) {
         this.filter = filter
-        this.search(filter, false)
+        this.search(false)
       }
     }
 
diff --git a/dubbo-admin-ui/src/components/governance/Overrides.vue b/dubbo-admin-ui/src/components/governance/Overrides.vue
index 71e3e72..fb0cd47 100644
--- a/dubbo-admin-ui/src/components/governance/Overrides.vue
+++ b/dubbo-admin-ui/src/components/governance/Overrides.vue
@@ -274,11 +274,15 @@
       },
       submit: function () {
         this.filter = document.querySelector('#serviceSearch').value.trim()
-        this.search(this.filter, true)
+        this.search(true)
       },
-      search: function (filter, rewrite) {
+      search: function (rewrite) {
+        if (!this.filter) {
+          this.$notify.error('Either service or application is needed')
+          return
+        }
         let type = this.items[this.selected].value
-        let url = '/rules/override/?' + type + '=' + filter
+        let url = '/rules/override/?' + type + '=' + this.filter
         this.$axios.get(url)
           .then(response => {
             if (this.selected === 0) {
@@ -288,9 +292,9 @@
             }
             if (rewrite) {
               if (this.selected === 0) {
-                this.$router.push({path: 'config', query: {service: filter}})
+                this.$router.push({path: 'config', query: {service: this.filter}})
               } else if (this.selected === 1) {
-                this.$router.push({path: 'config', query: {application: filter}})
+                this.$router.push({path: 'config', query: {application: this.filter}})
               }
             }
           })
@@ -511,7 +515,7 @@
       })
       if (filter !== null) {
         this.filter = filter
-        this.search(filter, false)
+        this.search(false)
       }
     }
   }
diff --git a/dubbo-admin-ui/src/components/governance/RoutingRule.vue b/dubbo-admin-ui/src/components/governance/RoutingRule.vue
index a9ea760..41f8193 100644
--- a/dubbo-admin-ui/src/components/governance/RoutingRule.vue
+++ b/dubbo-admin-ui/src/components/governance/RoutingRule.vue
@@ -287,11 +287,15 @@
       },
       submit: function () {
         this.filter = document.querySelector('#serviceSearch').value.trim()
-        this.search(this.filter, true)
+        this.search(true)
       },
-      search: function (filter, rewrite) {
+      search: function (rewrite) {
+        if (!this.filter) {
+          this.$notify.error('Either service or application is needed')
+          return
+        }
         let type = this.items[this.selected].value
-        let url = '/rules/route/condition/?' + type + '=' + filter
+        let url = '/rules/route/condition/?' + type + '=' + this.filter
         this.$axios.get(url)
           .then(response => {
             if (this.selected === 0) {
@@ -301,9 +305,9 @@
             }
             if (rewrite) {
               if (this.selected === 0) {
-                this.$router.push({path: 'routingRule', query: {service: filter}})
+                this.$router.push({path: 'routingRule', query: {service: this.filter}})
               } else if (this.selected === 1) {
-                this.$router.push({path: 'routingRule', query: {application: filter}})
+                this.$router.push({path: 'routingRule', query: {application: this.filter}})
               }
             }
           })
@@ -519,7 +523,7 @@
       })
       if (filter !== null) {
         this.filter = filter
-        this.search(filter, false)
+        this.search(false)
       }
     }
 
diff --git a/dubbo-admin-ui/src/components/governance/TagRule.vue b/dubbo-admin-ui/src/components/governance/TagRule.vue
index 82d4f95..a7d2417 100644
--- a/dubbo-admin-ui/src/components/governance/TagRule.vue
+++ b/dubbo-admin-ui/src/components/governance/TagRule.vue
@@ -172,16 +172,20 @@
         ]
       },
       submit: function () {
+        if (!this.filter) {
+          this.$notify.error('application is needed')
+          return
+        }
         this.filter = this.filter.trim()
-        this.search(this.filter, true)
+        this.search(true)
       },
-      search: function (filter, rewrite) {
-        let url = '/rules/route/tag/?application' + '=' + filter
+      search: function (rewrite) {
+        let url = '/rules/route/tag/?application' + '=' + this.filter
         this.$axios.get(url)
           .then(response => {
             this.tagRoutingRules = response.data
             if (rewrite) {
-              this.$router.push({path: 'tagRule', query: {application: filter}})
+              this.$router.push({path: 'tagRule', query: {application: this.filter}})
             }
           })
       },
@@ -352,7 +356,7 @@
       })
       if (filter !== null) {
         this.filter = filter
-        this.search(filter, false)
+        this.search(false)
       }
     }
 
diff --git a/dubbo-admin-ui/src/components/governance/WeightAdjust.vue b/dubbo-admin-ui/src/components/governance/WeightAdjust.vue
index 0bbe32c..fd3a514 100644
--- a/dubbo-admin-ui/src/components/governance/WeightAdjust.vue
+++ b/dubbo-admin-ui/src/components/governance/WeightAdjust.vue
@@ -305,19 +305,23 @@
       },
       submit: function () {
         this.filter = document.querySelector('#serviceSearch').value.trim()
-        this.search(this.filter, true)
+        this.search(true)
       },
-      search: function (filter, rewrite) {
+      search: function (rewrite) {
+        if (!this.filter) {
+          this.$notify.error('Either service or application is needed')
+          return
+        }
         let type = this.items[this.selected].value
-        let url = '/rules/weight/?' + type + '=' + filter
+        let url = '/rules/weight/?' + type + '=' + this.filter
         this.$axios.get(url)
           .then(response => {
             this.weights = response.data
             if (rewrite) {
               if (this.selected === 0) {
-                this.$router.push({path: 'weight', query: {service: filter}})
+                this.$router.push({path: 'weight', query: {service: this.filter}})
               } else if (this.selected === 1) {
-                this.$router.push({path: 'weight', query: {application: filter}})
+                this.$router.push({path: 'weight', query: {application: this.filter}})
               }
             }
           })
@@ -500,7 +504,7 @@
       })
       if (filter !== null) {
         this.filter = filter
-        this.search(filter, false)
+        this.search(false)
       }
     }
   }
diff --git a/dubbo-admin-ui/src/components/test/ServiceTest.vue b/dubbo-admin-ui/src/components/test/ServiceTest.vue
index 5ac9267..7902526 100644
--- a/dubbo-admin-ui/src/components/test/ServiceTest.vue
+++ b/dubbo-admin-ui/src/components/test/ServiceTest.vue
@@ -129,6 +129,7 @@
           let filter = this.filter.replace('/', '*')
           this.search(filter)
         } else {
+          this.$notify.error('service is needed')
           return false
         }
       },
@@ -237,8 +238,9 @@
       if ('version' in query) {
         this.filter = this.filter + ':' + query['version']
       }
-
-      this.search(this.filter.replace('/', '*'))
+      if (this.filter) {
+        this.search(this.filter.replace('/', '*'))
+      }
     }
   }
 </script>