This is an automated email from the ASF dual-hosted git repository.
benjobs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
The following commit(s) were added to refs/heads/dev by this push:
new 83e61a1ca [Fix]: No event triggered when changing execmode (#2608)
83e61a1ca is described below
commit 83e61a1ca827a0e95895760cf84cdb32cef27de8
Author: WSZ <[email protected]>
AuthorDate: Wed Apr 12 23:06:50 2023 +0800
[Fix]: No event triggered when changing execmode (#2608)
* [Fix]: No event triggered when changing execmode
* [Fix]: setInterval not cleaned
* [Fix]: Change the role permission judgment method
* [Improve]: login select team modal
---
.../src/locales/lang/en/sys.ts | 1 +
.../src/locales/lang/zh-CN/sys.ts | 1 +
.../src/views/base/login/teamModal.vue | 7 ++-
.../src/views/base/login/useTeamModal.tsx | 60 ----------------------
.../flink/app/hooks/useCreateAndEditSchema.ts | 47 ++++++++++++++++-
.../src/views/flink/app/hooks/useCreateSchema.ts | 41 +--------------
.../views/flink/app/hooks/useEditFlinkSchema.ts | 12 +----
.../src/views/flink/app/hooks/useEditStreamPark.ts | 12 +----
.../src/views/setting/FlinkCluster/index.vue | 26 ++++++++--
.../views/system/role/components/RoleDrawer.vue | 9 ++--
10 files changed, 86 insertions(+), 130 deletions(-)
diff --git
a/streampark-console/streampark-console-webapp/src/locales/lang/en/sys.ts
b/streampark-console/streampark-console-webapp/src/locales/lang/en/sys.ts
index e231cebca..f41e40c3e 100644
--- a/streampark-console/streampark-console-webapp/src/locales/lang/en/sys.ts
+++ b/streampark-console/streampark-console-webapp/src/locales/lang/en/sys.ts
@@ -124,6 +124,7 @@ export default {
diffPwd: 'The two passwords are inconsistent',
userName: 'Username',
password: 'Password',
+ selectTeam: 'Please select a team',
oldPassword: 'Old password',
newPassword: 'New password',
confirmPassword: 'Confirm password',
diff --git
a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/sys.ts
b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/sys.ts
index f59735142..00f3fbefa 100644
--- a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/sys.ts
+++ b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/sys.ts
@@ -118,6 +118,7 @@ export default {
userName: '账号',
password: '密码',
+ selectTeam: '请选择一个团队',
oldPassword: '当前密码',
newPassword: '新密码',
confirmPassword: '确认密码',
diff --git
a/streampark-console/streampark-console-webapp/src/views/base/login/teamModal.vue
b/streampark-console/streampark-console-webapp/src/views/base/login/teamModal.vue
index abda47728..ec5408101 100644
---
a/streampark-console/streampark-console-webapp/src/views/base/login/teamModal.vue
+++
b/streampark-console/streampark-console-webapp/src/views/base/login/teamModal.vue
@@ -21,6 +21,7 @@
import { computed, ref } from 'vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { Icon } from '/@/components/Icon';
+ import { useI18n } from '/@/hooks/web/useI18n';
const emit = defineEmits(['success', 'update:visible']);
const props = defineProps({
@@ -36,18 +37,19 @@
const loading = ref(false);
const { createMessage } = useMessage();
+ const { t } = useI18n();
const userStore = useUserStore();
const formSchema = computed((): FormSchema[] => {
return [
{
- label: 'Please select a team',
+ label: t('sys.login.selectTeam'),
field: 'teamId',
component: 'Select',
componentProps: {
options: userStore.getTeamList,
// getPopupContainer: (triggerNode) => triggerNode.parentNode,
- placeholder: 'Please select a team',
+ placeholder: t('sys.login.selectTeam'),
},
required: true,
},
@@ -81,6 +83,7 @@
<template>
<Modal
:visible="props.visible"
+ centered
@cancel="emit('update:visible', false)"
@ok="handleUserTeamSubmit"
>
diff --git
a/streampark-console/streampark-console-webapp/src/views/base/login/useTeamModal.tsx
b/streampark-console/streampark-console-webapp/src/views/base/login/useTeamModal.tsx
deleted file mode 100644
index 79f68e973..000000000
---
a/streampark-console/streampark-console-webapp/src/views/base/login/useTeamModal.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import { Select } from 'ant-design-vue';
-import { ref } from 'vue';
-import Icon from '/@/components/Icon';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { useUserStore } from '/@/store/modules/user';
-export const useTeamModal = (handleTeamSelect: Fn) => {
- const teamId = ref('');
- const { createConfirm, createMessage } = useMessage();
- const userStore = useUserStore();
- async function createTeamModal() {
- createConfirm({
- iconType: 'warning',
- title: () => {
- return (
- <div>
- <Icon icon="ant-design:setting-outlined" />
- <span>Select Team</span>
- </div>
- );
- },
- content: () => {
- return (
- <div>
- <span>Team</span>
- <Select
- value={teamId}
- onChange={(value: string) => (teamId.value = value)}
- options={userStore.getTeamList}
- ></Select>
- </div>
- );
- },
- onOk: async () => {
- if (!teamId.value) {
- createMessage.warning('please select a team');
- return Promise.reject();
- }
- await handleTeamSelect(teamId.value);
- return Promise.resolve();
- },
- });
- }
- return { createTeamModal };
-};
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts
index aad20a46d..8d4b7dc1c 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts
@@ -16,7 +16,7 @@
*/
import { FormSchema } from '/@/components/Table';
import { computed, ref, unref, h, Ref, onMounted, reactive } from 'vue';
-import { k8sRestExposedType, resolveOrder } from '../data';
+import { executionModes, k8sRestExposedType, resolveOrder } from '../data';
import optionData from '../data/option';
import {
getAlertSvgIcon,
@@ -52,6 +52,7 @@ import { FlinkCluster } from
'/@/api/flink/setting/types/flinkCluster.type';
import { ClusterStateEnum, ExecModeEnum, JobTypeEnum } from
'/@/enums/flinkEnum';
import { isK8sExecMode } from '../utils';
import { useI18n } from '/@/hooks/web/useI18n';
+import { fetchCheckHadoop } from '/@/api/flink/setting';
const { t } = useI18n();
export interface HistoryRecord {
k8sNamespace: Array<string>;
@@ -536,7 +537,48 @@ export const useCreateAndEditSchema = (
},
];
});
-
+ const getExecutionModeSchema = computed((): FormSchema[] => {
+ return [
+ {
+ field: 'executionMode',
+ label: t('flink.app.executionMode'),
+ component: 'Select',
+ itemProps: {
+ autoLink: false, //Resolve multiple trigger validators with null
value ·
+ },
+ componentProps: {
+ placeholder: t('flink.app.addAppTips.executionModePlaceholder'),
+ options: executionModes,
+ },
+ rules: [
+ {
+ required: true,
+ validator: async (_rule, value) => {
+ if (value === null || value === undefined || value === '') {
+ return
Promise.reject(t('flink.app.addAppTips.executionModeIsRequiredMessage'));
+ } else {
+ if (
+ [
+ ExecModeEnum.YARN_PER_JOB,
+ ExecModeEnum.YARN_SESSION,
+ ExecModeEnum.YARN_APPLICATION,
+ ].includes(value)
+ ) {
+ const res = await fetchCheckHadoop();
+ if (res) {
+ return Promise.resolve();
+ } else {
+ return
Promise.reject(t('flink.app.addAppTips.hadoopEnvInitMessage'));
+ }
+ }
+ return Promise.resolve();
+ }
+ },
+ },
+ ],
+ },
+ ];
+ });
onMounted(async () => {
/* Get project data */
fetchSelect({}).then((res) => {
@@ -587,6 +629,7 @@ export const useCreateAndEditSchema = (
getFlinkClusterSchemas,
getFlinkFormOtherSchemas,
getFlinkTypeSchema,
+ getExecutionModeSchema,
openConfDrawer,
};
};
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts
index 91fc2e943..72b11762f 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts
@@ -16,8 +16,6 @@
*/
import { FormSchema } from '/@/components/Table';
import { computed, h, Ref, ref, unref } from 'vue';
-import { executionModes } from '../data';
-import { fetchCheckHadoop } from '/@/api/flink/setting';
import { AppTypeEnum, ConfigTypeEnum, ExecModeEnum } from '/@/enums/flinkEnum';
import Icon, { SvgIcon } from '/@/components/Icon';
@@ -60,6 +58,7 @@ export const useCreateSchema = (dependencyRef: Ref) => {
projectList,
getFlinkSqlSchema,
getFlinkClusterSchemas,
+ getExecutionModeSchema,
getFlinkFormOtherSchemas,
suggestions,
} = useCreateAndEditSchema(dependencyRef);
@@ -108,43 +107,7 @@ export const useCreateSchema = (dependencyRef: Ref) => {
{ required: true, message:
t('flink.app.addAppTips.developmentModeIsRequiredMessage') },
],
},
- {
- field: 'executionMode',
- label: t('flink.app.executionMode'),
- component: 'Select',
- componentProps: {
- placeholder: t('flink.app.addAppTips.executionModePlaceholder'),
- options: executionModes,
- },
- dynamicRules: () => {
- return [
- {
- required: true,
- validator: async (_rule, value) => {
- if (value === null || value === undefined || value === '') {
- return
Promise.reject(t('flink.app.addAppTips.executionModeIsRequiredMessage'));
- } else {
- if (
- [
- ExecModeEnum.YARN_PER_JOB,
- ExecModeEnum.YARN_SESSION,
- ExecModeEnum.YARN_APPLICATION,
- ].includes(value)
- ) {
- const res = await fetchCheckHadoop();
- if (res) {
- return Promise.resolve();
- } else {
- return
Promise.reject(t('flink.app.addAppTips.hadoopEnvInitMessage'));
- }
- }
- return Promise.resolve();
- }
- },
- },
- ];
- },
- },
+ ...getExecutionModeSchema.value,
...getFlinkClusterSchemas.value,
...getFlinkSqlSchema.value,
{
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditFlinkSchema.ts
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditFlinkSchema.ts
index 38fbe688c..aef6f6f81 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditFlinkSchema.ts
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditFlinkSchema.ts
@@ -16,7 +16,6 @@
*/
import { FormSchema } from '/@/components/Table';
import { computed, h, Ref, ref, unref } from 'vue';
-import { executionModes } from '../data';
import { useCreateAndEditSchema } from './useCreateAndEditSchema';
import { getAlertSvgIcon } from './useFlinkRender';
@@ -35,21 +34,14 @@ export const useEditFlinkSchema = (jars: Ref) => {
getFlinkClusterSchemas,
getFlinkFormOtherSchemas,
getFlinkTypeSchema,
+ getExecutionModeSchema,
suggestions,
} = useCreateAndEditSchema(null, { appId: route.query.appId as string, mode:
'streampark' });
const getEditFlinkFormSchema = computed((): FormSchema[] => {
return [
...getFlinkTypeSchema.value,
- {
- field: 'executionMode',
- label: 'Execution Mode',
- component: 'Select',
- componentProps: {
- placeholder: 'Execution Mode',
- options: executionModes,
- },
- },
+ ...getExecutionModeSchema.value,
{
field: 'resourceFrom',
label: 'Resource From',
diff --git
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
index 4820b2500..a4bb6c15f 100644
---
a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
+++
b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useEditStreamPark.ts
@@ -16,7 +16,6 @@
*/
import { FormSchema } from '/@/components/Table';
import { computed, h, Ref, ref, unref } from 'vue';
-import { executionModes } from '../data';
import { ExecModeEnum, JobTypeEnum, UseStrategyEnum } from
'/@/enums/flinkEnum';
import { useCreateAndEditSchema } from './useCreateAndEditSchema';
import { renderSqlHistory } from './useFlinkRender';
@@ -46,6 +45,7 @@ export const useEditStreamParkSchema = (
getFlinkClusterSchemas,
getFlinkFormOtherSchemas,
getFlinkTypeSchema,
+ getExecutionModeSchema,
suggestions,
} = useCreateAndEditSchema(dependencyRef, {
appId: route.query.appId as string,
@@ -116,15 +116,7 @@ export const useEditStreamParkSchema = (
const getEditStreamParkFormSchema = computed((): FormSchema[] => {
return [
...getFlinkTypeSchema.value,
- {
- field: 'executionMode',
- label: t('flink.app.executionMode'),
- component: 'Select',
- componentProps: {
- placeholder: t('flink.app.executionMode'),
- options: executionModes,
- },
- },
+ ...getExecutionModeSchema.value,
...getFlinkClusterSchemas.value,
{
field: 'flinkSqlHistory',
diff --git
a/streampark-console/streampark-console-webapp/src/views/setting/FlinkCluster/index.vue
b/streampark-console/streampark-console-webapp/src/views/setting/FlinkCluster/index.vue
index 8c6947163..8cd7b8dfa 100644
---
a/streampark-console/streampark-console-webapp/src/views/setting/FlinkCluster/index.vue
+++
b/streampark-console/streampark-console-webapp/src/views/setting/FlinkCluster/index.vue
@@ -16,6 +16,8 @@
-->
<script lang="ts">
import { defineComponent } from 'vue';
+ import { useTimeoutFn } from '@vueuse/core';
+ import { onUnmounted } from 'vue';
export default defineComponent({
name: 'FlinkClusterSetting',
@@ -54,7 +56,7 @@
const { t } = useI18n();
const { Swal, createMessage } = useMessage();
const clusters = ref<FlinkCluster[]>([]);
-
+ const loading = ref(false);
function handleIsStart(item) {
return item.clusterState === ClusterStateEnum.STARTED;
}
@@ -103,13 +105,29 @@
}
async function getFlinkCluster() {
- const clusterList = await fetchFlinkCluster();
- clusters.value = clusterList;
+ try {
+ loading.value = true;
+ const clusterList = await fetchFlinkCluster();
+ clusters.value = clusterList;
+ } catch (error) {
+ console.error(error);
+ } finally {
+ loading.value = false;
+ }
}
+ const { start, stop } = useTimeoutFn(() => {
+ // Prevent another request from being initiated while the previous request
is pending
+ if (!loading.value) {
+ getFlinkCluster();
+ }
+ start();
+ }, 1000 * 3);
onMounted(() => {
getFlinkCluster();
- setInterval(() => getFlinkCluster(), 1000 * 3);
+ });
+ onUnmounted(() => {
+ stop();
});
</script>
<template>
diff --git
a/streampark-console/streampark-console-webapp/src/views/system/role/components/RoleDrawer.vue
b/streampark-console/streampark-console-webapp/src/views/system/role/components/RoleDrawer.vue
index 5f1efe67d..753b59b48 100644
---
a/streampark-console/streampark-console-webapp/src/views/system/role/components/RoleDrawer.vue
+++
b/streampark-console/streampark-console-webapp/src/views/system/role/components/RoleDrawer.vue
@@ -55,13 +55,15 @@
import { FormTypeEnum } from '/@/enums/formEnum';
import { useMessage } from '/@/hooks/web/useMessage';
import { useI18n } from '/@/hooks/web/useI18n';
-
+ const treeDataMap = new Map<string, string>();
const handleTreeIcon = (treeData: TreeItem[]): TreeItem[] => {
if (!treeData?.length) {
return [];
}
treeData.forEach((v) => {
v.icon = v.icon && !v.icon.includes('ant-design:') ?
`ant-design:${v.icon}-outlined` : v.icon;
+ const mapKey = v.permission || v.path;
+ if (!treeDataMap.get(mapKey)) treeDataMap.set(mapKey, v.id);
v.children && handleTreeIcon(v.children);
});
return treeData;
@@ -162,8 +164,9 @@
async function handleSubmit() {
try {
const values = await validate();
- // First, a simple judgment, does not contain app:view (home) this
permission, the error is reported
- if (selectedKeysAndHalfCheckedKeys.value.indexOf('100067') < 0) {
+ // does not contain app:view (home) this permission, the error is
reported
+ const appViewId = treeDataMap.get('app:view');
+ if (appViewId &&
selectedKeysAndHalfCheckedKeys.value.indexOf(appViewId) < 0) {
createMessage.warning(t('system.role.form.noViewPermission'));
return;
}