This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 0df2ab7836a45697f3b0120a63d22e632a8ebb6b
Author: Qian Xia <lauraxiaq...@gmail.com>
AuthorDate: Fri Apr 14 16:12:13 2023 +0800

    KYLIN-5516 snapshot setting issue
---
 .../setting/SettingAdvanced/SettingAdvanced.vue    | 134 +++++++++++++++------
 .../components/setting/SettingAdvanced/handler.js  |  14 ++-
 .../components/setting/SettingAdvanced/locales.js  |   6 +
 .../studio/StudioModel/ModelEdit/index.vue         |   1 +
 4 files changed, 120 insertions(+), 35 deletions(-)

diff --git 
a/kystudio/src/components/setting/SettingAdvanced/SettingAdvanced.vue 
b/kystudio/src/components/setting/SettingAdvanced/SettingAdvanced.vue
index 0ea34355a8..1c99c32203 100644
--- a/kystudio/src/components/setting/SettingAdvanced/SettingAdvanced.vue
+++ b/kystudio/src/components/setting/SettingAdvanced/SettingAdvanced.vue
@@ -160,40 +160,6 @@
         </div>
       </el-form>
     </EditableBlock>
-    <!-- 分层存储 -->
-    <!-- <EditableBlock
-      :header-content="$t('secondaryStorage')"
-      :is-keep-editing="true"
-      :is-edited="!form.second_storage_enabled&&isFormEdited(form, 
'sec-storage') || (form.second_storage_enabled && new_nodes.length > 0)"
-      :is-reset="false"
-      v-if="isShowSecondStorage"
-      @submit="(scb, ecb) => handleSubmit('sec-storage', scb, ecb)">
-      <div class="setting-item">
-        <span class="setting-label 
font-medium">{{$t('supportSecStorage')}}</span><span class="setting-value fixed 
ksd-fs-12">
-          <el-switch
-            v-model="form.second_storage_enabled"
-            :active-text="$t('kylinLang.common.OFF')"
-            :inactive-text="$t('kylinLang.common.ON')">
-          </el-switch>
-        </span>
-        <div class="setting-desc">{{$t('supportSecStorageDesc')}}</div>
-      </div>
-      <div class="setting-item">
-        <span class="setting-label font-medium">{{$t('storageNode')}}</span>
-        <ul class="sec-nodes" 
v-if="form.second_storage_nodes&&form.second_storage_nodes.length">
-          <li v-for="n in form.second_storage_nodes" :key="n.name">
-            <span class="node-name">{{n.name}}</span>
-            <span class="node-ip">{{n.ip}}:{{n.port}}</span>
-          </li>
-        </ul>
-        <el-select class="setting-desc secondary-storage-nodes" 
value-key="name" multiple v-model="new_nodes" :placeholder="$t('chooseNode')">
-          <el-option v-for="item in nodes" :label="`${item.name} 
${item.ip}:${item.port}`" :key="item.name" :value="item">
-            <span class="node-name">{{item.name}}</span>
-            <span class="node-ip">{{item.ip}}:{{item.port}}</span>
-          </el-option>
-        </el-select>
-      </div>
-    </EditableBlock> -->
     <!-- 多级分区 -->
     <EditableBlock
       :header-content="$t('mulPartitionSettings')"
@@ -228,6 +194,43 @@
         </span>
         <div class="setting-desc">{{$t('snapshotDesc')}}</div>
       </div>
+      <div class="setting-item" v-if="form.snapshot_manual_management_enabled">
+        <span class="setting-label 
font-medium">{{$t('snapshotAutoRefresh')}}</span><span class="setting-value 
fixed ksd-fs-12">
+          <el-switch
+            v-model="form.snapshot_automatic_refresh_enabled"
+            :active-text="$t('kylinLang.common.OFF')"
+            :inactive-text="$t('kylinLang.common.ON')"
+            @input="value => handleSnapshotSwitchAutoRefresh(value)">
+          </el-switch>
+        </span>
+      </div>
+      <div class="setting-item" 
v-if="form.snapshot_manual_management_enabled&&form.snapshot_automatic_refresh_enabled">
+        <span class="setting-label 
font-medium">{{$t('frequency')}}</span><span class="setting-value fixed 
ksd-fs-12">
+          <el-input-number style="width:100px" size="small" 
@change="handleChangeRefreshTimeInterval" 
v-model.trim="form.snapshot_automatic_refresh_time_interval" 
v-number4="form.snapshot_automatic_refresh_time_interval" 
controls-position="right" :min="1" content-align="left">
+          </el-input-number><el-select
+            class="ksd-ml-16"
+            size="small"
+            style="width: 100px;"
+            v-model="form.snapshot_automatic_refresh_time_mode"
+            @change="handleChangeRefreshTimeMode"
+            :placeholder="$t('kylinLang.common.pleaseChoose')">
+            <el-option
+              v-for="frequencyType in frequencyTypes"
+              :key="frequencyType"
+              :label="$t(frequencyType.toLowerCase())"
+              :value="frequencyType">
+            </el-option>
+          </el-select>
+        </span><span v-if="form.snapshot_automatic_refresh_time_mode==='DAY'" 
class="setting-label font-medium ksd-ml-16">{{$t('timed')}}</span><span 
v-if="form.snapshot_automatic_refresh_time_mode==='DAY'" class="setting-value 
fixed ksd-fs-12">
+          <el-time-picker
+            style="width: 136px;"
+            size="small"
+            align="right"
+            @change="handleChangeRefreshTime"
+            v-model="form.snapshot_timed">
+          </el-time-picker>
+        </span>
+      </div>
     </EditableBlock>
     <!-- 可计算列 -->
     <EditableBlock
@@ -325,6 +328,7 @@ import { kylinConfirm } from 'util/business'
 import { apiUrl } from '../../../config'
 import {
   validate,
+  frequencyTypes,
   _getJobAlertSettings,
   _getDefaultDBSettings,
   _getYarnNameSetting,
@@ -402,6 +406,7 @@ export default class SettingAdvanced extends Vue {
   pageSize = pageCount
   convertedProperties = []
   pageRefTags = pageRefTags
+  frequencyTypes = frequencyTypes
   jobNotificationStateTypes=jobNotificationStateTypes
 
   dbList = []
@@ -422,6 +427,10 @@ export default class SettingAdvanced extends Vue {
     fileList: [],
     file: null,
     snapshot_manual_management_enabled: 
this.project.snapshot_manual_management_enabled,
+    snapshot_automatic_refresh_enabled: 
this.project.snapshot_automatic_refresh_enabled,
+    snapshot_automatic_refresh_time_interval: 
this.project.snapshot_automatic_refresh_time_interval || 1,
+    snapshot_automatic_refresh_time_mode: 
this.project.snapshot_automatic_refresh_time_mode || 'DAY',
+    snapshot_timed: new Date(new 
Date().setHours(+this.project.snapshot_automatic_refresh_trigger_hours, 
+this.project.snapshot_automatic_refresh_trigger_minute, 
+this.project.snapshot_automatic_refresh_trigger_second, 0)),
     multi_partition_enabled: this.project.multi_partition_enabled,
     scd2_enabled: this.project.scd2_enabled,
     second_storage_enabled: true,
@@ -554,6 +563,63 @@ export default class SettingAdvanced extends Vue {
       handleError(e)
     }
   }
+  async handleSnapshotSwitchAutoRefresh (value) {
+    const submitData = _getSnapshotSetting(this.project)
+    submitData.snapshot_automatic_refresh_enabled = value
+    try {
+      await this.updateSnapshotConfig(submitData)
+      this.$emit('reload-setting')
+      this.$message({ type: 'success', message: 
this.$t('kylinLang.common.updateSuccess') })
+    } catch (e) {
+      this.form.snapshot_snapshot_automatic_refresh_enabled = !value
+      handleError(e)
+    }
+  }
+  async handleChangeRefreshTimeInterval (value) {
+    const submitData = _getSnapshotSetting(this.project)
+    const oldValue = submitData.snapshot_automatic_refresh_time_interval
+    submitData.snapshot_automatic_refresh_time_interval = value
+    try {
+      await this.updateSnapshotConfig(submitData)
+      this.$emit('reload-setting')
+      this.$message({ type: 'success', message: 
this.$t('kylinLang.common.updateSuccess') })
+    } catch (e) {
+      submitData.snapshot_automatic_refresh_time_interval = oldValue
+      handleError(e)
+    }
+  }
+  async handleChangeRefreshTimeMode (value) {
+    const submitData = _getSnapshotSetting(this.project)
+    const oldValue = submitData.snapshot_automatic_refresh_time_mode
+    submitData.snapshot_automatic_refresh_time_mode = value
+    try {
+      await this.updateSnapshotConfig(submitData)
+      this.$emit('reload-setting')
+      this.$message({ type: 'success', message: 
this.$t('kylinLang.common.updateSuccess') })
+    } catch (e) {
+      submitData.snapshot_automatic_refresh_time_mode = oldValue
+      handleError(e)
+    }
+  }
+  async handleChangeRefreshTime (value) {
+    const submitData = _getSnapshotSetting(this.project)
+    const oldHoures = submitData.snapshot_automatic_refresh_trigger_hours
+    const oldMinute = submitData.snapshot_automatic_refresh_trigger_minute
+    const oldSecond = submitData.snapshot_automatic_refresh_trigger_second
+    submitData.snapshot_automatic_refresh_trigger_hours = new 
Date(value).getHours()
+    submitData.snapshot_automatic_refresh_trigger_minute = new 
Date(value).getMinutes()
+    submitData.snapshot_automatic_refresh_trigger_second = new 
Date(value).getSeconds()
+    try {
+      await this.updateSnapshotConfig(submitData)
+      this.$emit('reload-setting')
+      this.$message({ type: 'success', message: 
this.$t('kylinLang.common.updateSuccess') })
+    } catch (e) {
+      submitData.snapshot_automatic_refresh_trigger_hours = oldHoures
+      submitData.snapshot_automatic_refresh_trigger_minute = oldMinute
+      submitData.snapshot_automatic_refresh_trigger_second = oldSecond
+      handleError(e)
+    }
+  }
   async handleSwitch (value) {
     try {
       const submitData = _getExposeCCSetting(this.project)
diff --git a/kystudio/src/components/setting/SettingAdvanced/handler.js 
b/kystudio/src/components/setting/SettingAdvanced/handler.js
index 3ab1a8c307..f52c177b9f 100644
--- a/kystudio/src/components/setting/SettingAdvanced/handler.js
+++ b/kystudio/src/components/setting/SettingAdvanced/handler.js
@@ -65,10 +65,22 @@ export function _getSecStorageSetting (data) {
   }
 }
 
+export const frequencyTypes = [
+  'DAY',
+  'HOURS',
+  'MINUTE'
+]
+
 export function _getSnapshotSetting (data) {
   return {
     project: data.project,
-    snapshot_manual_management_enabled: data.snapshot_manual_management_enabled
+    snapshot_manual_management_enabled: 
data.snapshot_manual_management_enabled,
+    snapshot_automatic_refresh_enabled: 
data.snapshot_automatic_refresh_enabled,
+    snapshot_automatic_refresh_time_mode: 
data.snapshot_automatic_refresh_time_mode,
+    snapshot_automatic_refresh_time_interval: 
data.snapshot_automatic_refresh_time_interval,
+    snapshot_automatic_refresh_trigger_hours: 
data.snapshot_automatic_refresh_trigger_hours,
+    snapshot_automatic_refresh_trigger_minute: 
data.snapshot_automatic_refresh_trigger_minute,
+    snapshot_automatic_refresh_trigger_second: 
data.snapshot_automatic_refresh_trigger_second
   }
 }
 
diff --git a/kystudio/src/components/setting/SettingAdvanced/locales.js 
b/kystudio/src/components/setting/SettingAdvanced/locales.js
index 0afc2e478e..6c790d3969 100644
--- a/kystudio/src/components/setting/SettingAdvanced/locales.js
+++ b/kystudio/src/components/setting/SettingAdvanced/locales.js
@@ -68,6 +68,12 @@ export default {
     snapshotTitle: 'Snapshot Management',
     snapshotManagment: 'Support Snapshot Management',
     snapshotDesc: 'The snapshot is a read-only static view of a source table. 
Snapshot could reduce costs for building costs in some cases.',
+    snapshotAutoRefresh: 'Auto Refresh',
+    frequency: 'Frequency',
+    timed: 'Timed',
+    minute: 'Minute',
+    hours: 'Hour(s)',
+    day: 'Day(s)',
     openSnapshotTitle: 'Turn On Snapshot Management',
     openManualTips: 'After turning on this option, the system will no longer 
automatically build, refresh, delete snapshots. You could manage them in 
Snapshot page under Studio.<br/>If a snapshot is being built at this time, it 
will show in the snapshot list after the job is completed.<br/>Do you want to 
continue?',
     closeSnapshotTitle: 'Turn Off Snapshot Management',
diff --git a/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue 
b/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue
index 5796b529a1..a88223201a 100644
--- a/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue
+++ b/kystudio/src/components/studio/StudioModel/ModelEdit/index.vue
@@ -3365,6 +3365,7 @@ export default class ModelEdit extends Vue {
     .column-list-box {
       overflow: auto;
       overflow-x: hidden;
+      transform: perspective(10px);
       flex: 1;
       border-radius: 0 0 5px 5px;
       &.ksd-drag-box *[draggable="true"]:not(.is-link):hover {

Reply via email to