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 {