Merge pull request #59 from TeslaCN/fixes-54

Support job name input suggestions fo history status page
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java
index 378968d..e8165c9 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/dao/search/JobStatusTraceLogRepository.java
@@ -20,6 +20,20 @@
 import org.apache.shardingsphere.elasticjob.lite.ui.domain.JobStatusTraceLog;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface JobStatusTraceLogRepository extends JpaRepository<JobStatusTraceLog, String>, JpaSpecificationExecutor<JobStatusTraceLog> {
+    
+    /**
+     * Find all job names in job status trace log with specific prefix.
+     *
+     * @param prefix job name prefix
+     * @return matched job names
+     */
+    @SuppressWarnings("SpringDataRepositoryMethodReturnTypeInspection")
+    @Query("select distinct l.jobName from JobStatusTraceLog l where l.jobName like :prefix%")
+    List<String> findJobNameByJobNameLike(@Param("prefix") String prefix);
 }
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java
index 6f804b1..d0e62f3 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/domain/JobStatusTraceLog.java
@@ -23,10 +23,12 @@
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.Table;
 import java.util.Date;
 
 @Data
-@Entity(name = "JOB_STATUS_TRACE_LOG")
+@Table(name = "JOB_STATUS_TRACE_LOG")
+@Entity
 public class JobStatusTraceLog {
     
     @Id
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java
index 2630de8..c880079 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/EventTraceHistoryService.java
@@ -61,4 +61,12 @@
      * @return job status trace events
      */
     Page<JobStatusTraceEvent> findJobStatusTraceEvents(FindJobStatusTraceEventsRequest findJobStatusTraceEventsRequest);
+    
+    /**
+     * Find job names with specific prefix in status trace log.
+     *
+     * @param jobNamePrefix job name prefix
+     * @return matched job names
+     */
+    List<String> findJobNamesInStatusTraceLog(String jobNamePrefix);
 }
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java
index 5c3c234..db55b9d 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/service/impl/EventTraceHistoryServiceImpl.java
@@ -91,6 +91,11 @@
         return new PageImpl<>(page.getContent().stream().map(JobStatusTraceLog::toJobStatusTraceEvent).collect(Collectors.toList()), null, page.getTotalElements());
     }
     
+    @Override
+    public List<String> findJobNamesInStatusTraceLog(final String jobNamePrefix) {
+        return jobStatusTraceLogRepository.findJobNameByJobNameLike(jobNamePrefix);
+    }
+    
     private <T> Pageable getPageable(final BasePageRequest pageRequest, final Class<T> clazz) {
         int page = 0;
         int perPage = BasePageRequest.DEFAULT_PAGE_SIZE;
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java
index 19e5de8..d40c200 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-backend/src/main/java/org/apache/shardingsphere/elasticjob/lite/ui/web/controller/EventTraceHistoryController.java
@@ -98,6 +98,17 @@
         return ResponseResultUtil.build(BasePageResponse.of(jobStatusTraceEvents));
     }
     
+    /**
+     * Find all job names with specific prefix in status trace log.
+     *
+     * @param jobNamePrefix job name prefix
+     * @return matched job names
+     */
+    @GetMapping(value = {"/status/jobNames", "/status/jobNames/{jobNamePrefix}"})
+    public ResponseResult<List<String>> findJobNamesByPrefixInStatusTraceLog(@PathVariable(required = false) final String jobNamePrefix) {
+        return ResponseResultUtil.build(eventTraceHistoryService.findJobNamesInStatusTraceLog(Optional.ofNullable(jobNamePrefix).orElse("")));
+    }
+    
     @ModelAttribute
     private void initDataSource() {
         eventTraceDataSourceConfigurationService.loadActivated().ifPresent(SessionEventTraceDataSourceConfiguration::setDataSourceConfiguration);
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/api.js b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/api.js
index a473778..cb33005 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/api.js
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/api.js
@@ -18,5 +18,6 @@
 import API from '@/utils/api'
 
 export default {
-  loadStatus: (params = {}) => API.post(`/api/event-trace/status`, params)
+  loadStatus: (params = {}) => API.post(`/api/event-trace/status`, params),
+  getStatusJobNameSuggestions: (jobNamePrefix = '') => API.get(`/api/event-trace/status/jobNames/${jobNamePrefix}`)
 }
diff --git a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/module/historyStatus.vue b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/module/historyStatus.vue
index bf4505a..e7a5676 100644
--- a/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/module/historyStatus.vue
+++ b/shardingsphere-elasticjob-lite-ui/shardingsphere-elasticjob-lite-ui-frontend/src/views/history-status/module/historyStatus.vue
@@ -18,11 +18,12 @@
 <template>
   <el-row class="box-card">
     <div class="btn-group" style="">
-      <el-input
+      <el-autocomplete
         :placeholder="$t('historyStatus.searchForm.jobName')"
+        :fetch-suggestions="fetchJobNameSuggestions"
         v-model="searchForm.jobName"
         clearable>
-      </el-input>
+      </el-autocomplete>
       <el-date-picker
         :placeholder="$t('historyStatus.searchForm.startTime')"
         v-model="searchForm.start"
@@ -152,6 +153,13 @@
   },
   methods: {
     ...mapActions(['setRegCenterActivated']),
+    fetchJobNameSuggestions(jobNamePrefix, callback) {
+      API.getStatusJobNameSuggestions(jobNamePrefix).then(res => {
+        const jobNames = res.model
+        const suggestions = jobNames.map(jobName => ({value: jobName}))
+        callback(suggestions)
+      })
+    },
     handleCurrentChange(val) {
       const page = {
         pageSize: this.pageSize,