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 6ee7823d3 [Improve]: spark edit mode & fix create error (#4064)
6ee7823d3 is described below

commit 6ee7823d3a0349594eb8e20c6ec1aa7613e7b808
Author: Kriszu <[email protected]>
AuthorDate: Sat Sep 14 23:00:40 2024 +0800

    [Improve]: spark edit mode & fix create error (#4064)
---
 .../src/api/spark/conf.ts                          |   2 +-
 .../src/enums/sparkEnum.ts                         |  12 +--
 .../src/locales/lang/en/spark/app.ts               |  14 +--
 .../src/locales/lang/zh-CN/spark/app.ts            |  32 +++---
 .../src/views/spark/app/components/DetailTab.vue   |   6 +-
 .../src/views/spark/app/components/State.tsx       |  61 ++++++-----
 .../src/views/spark/app/create.vue                 |   2 +-
 .../src/views/spark/app/data/detail.data.ts        |  16 +--
 .../src/views/spark/app/detail.vue                 | 110 +++++++++----------
 .../src/views/spark/app/edit.vue                   |  15 +--
 .../src/views/spark/app/hooks/useAppFormSchema.tsx | 116 ++++++++++++---------
 .../src/views/spark/app/hooks/useSparkColumns.ts   |   2 +-
 .../src/views/spark/app/hooks/useSparkRender.tsx   |  33 +++++-
 .../views/spark/app/hooks/useSparkTableAction.ts   |  16 +--
 .../src/views/spark/app/index.vue                  |   6 +-
 .../src/views/spark/app/utils/index.ts             |   6 +-
 16 files changed, 249 insertions(+), 200 deletions(-)

diff --git a/streampark-console/streampark-console-webapp/src/api/spark/conf.ts 
b/streampark-console/streampark-console-webapp/src/api/spark/conf.ts
index 6df880b3c..8e005c9be 100644
--- a/streampark-console/streampark-console-webapp/src/api/spark/conf.ts
+++ b/streampark-console/streampark-console-webapp/src/api/spark/conf.ts
@@ -18,7 +18,7 @@ import type { SparkApplication } from './app.type';
 import type { SparkApplicationConfig } from './conf.type';
 import { defHttp } from '/@/utils/http/axios';
 
-const apiPrefix = '/flink/conf';
+const apiPrefix = '/spark/conf';
 
 export function fetchGetSparkConf(data: { id: string }) {
   return defHttp.post<SparkApplicationConfig>({ url: `${apiPrefix}/get`, data 
});
diff --git 
a/streampark-console/streampark-console-webapp/src/enums/sparkEnum.ts 
b/streampark-console/streampark-console-webapp/src/enums/sparkEnum.ts
index cf40d222e..f7f94d6d2 100644
--- a/streampark-console/streampark-console-webapp/src/enums/sparkEnum.ts
+++ b/streampark-console/streampark-console-webapp/src/enums/sparkEnum.ts
@@ -63,22 +63,22 @@ export enum AppStateEnum {
   STARTING = 3,
 
   /** (From Yarn)Application which has been submitted. */
-  SUBMITTE = 4,
+  SUBMITTED = 4,
 
   /** (From Yarn)Application has been accepted by the scheduler. */
-  ACCEPTE = 5,
+  ACCEPTED = 5,
 
   /** The job has failed and is currently waiting for the cleanup to complete. 
*/
-  RUNNIN = 6,
+  RUNNING = 6,
 
   /** (From Yarn)Application which finished successfully. */
-  FINISHE = 7,
+  FINISHED = 7,
 
   /** (From Yarn)Application which failed. */
-  FAILE = 8,
+  FAILED = 8,
 
   /** Loss of mapping. */
-  LOS = 9,
+  LOST = 9,
 
   /** Mapping. */
   MAPPING = 10,
diff --git 
a/streampark-console/streampark-console-webapp/src/locales/lang/en/spark/app.ts 
b/streampark-console/streampark-console-webapp/src/locales/lang/en/spark/app.ts
index 612747b3e..910169e1c 100644
--- 
a/streampark-console/streampark-console-webapp/src/locales/lang/en/spark/app.ts
+++ 
b/streampark-console/streampark-console-webapp/src/locales/lang/en/spark/app.ts
@@ -25,21 +25,22 @@ export default {
     VCore: 'Total VCores Used',
   },
   runState: {
-    added: 'New Applications',
+    added: 'Added',
+    new: 'New',
     saving: 'Saving',
-    created: 'Creating',
     starting: 'Starting',
     submitted: 'Submitted',
     accept: 'Accepted',
     running: 'Running',
-    finished: 'Completed',
+    finished: 'Finished',
     failed: 'Job Failed',
     lost: 'Job Lost',
     mapping: 'Mapping',
     other: 'Other',
     revoked: 'Revoked',
     stopping: 'Stopping',
-    killed: 'Terminated',
+    success: 'Succeeded',
+    killed: 'Killed',
   },
   releaseState: {
     releasing: 'Releasing',
@@ -62,7 +63,7 @@ export default {
   developmentMode: 'development Mode',
   executionMode: 'Execution Mode',
   historyVersion: 'History Version',
-  resource: 'Resource',
+  resource: 'Spark App',
   resourcePlaceHolder: 'Select Resource',
   selectAppPlaceHolder: 'Select Applications',
   dependency: 'Job Dependency',
@@ -208,7 +209,7 @@ export default {
     release: 'Release Job',
     releaseDetail: 'Release Details',
     start: 'Start Job',
-    cancel: 'Cancel Job',
+    cancel: 'Stop Job',
     detail: 'Job Details',
     startLog: 'View Flink Start Log',
     abort: 'Terminate Job',
@@ -293,6 +294,7 @@ export default {
     dynamicPropertiesPlaceholder:
       '$key=$value; if there are multiple parameters, you can input them on 
separate lines (-D <arg>)',
     sqlCheck: 'SQL Check Error',
+    sparkAppRequire: 'Spark App is required',
   },
 
   noteInfo: {
diff --git 
a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/spark/app.ts
 
b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/spark/app.ts
index 86301812c..feb904442 100644
--- 
a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/spark/app.ts
+++ 
b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/spark/app.ts
@@ -25,21 +25,22 @@ export default {
     VCore: '占用的总VCores',
   },
   runState: {
-    added: '新增应用',
-    saving: '保存中',
-    created: '创建中',
-    starting: '启动中',
-    submitted: '已提交',
-    accept: '已接受',
-    running: '运行中',
-    finished: '已完成',
-    failed: '作业失败',
-    lost: '作业失联',
-    mapping: '映射中',
-    other: '其他',
-    revoked: '回滚',
-    stopping: '停止中',
-    killed: '终止',
+    added: 'Added',
+    new: 'New',
+    saving: 'Saving',
+    starting: 'Starting',
+    submitted: 'Submitted',
+    accept: 'Accepted',
+    running: 'Running',
+    finished: 'Finished',
+    failed: 'Job Failed',
+    lost: 'Job Lost',
+    mapping: 'Mapping',
+    other: 'Other',
+    revoked: 'Revoked',
+    stopping: 'Stopping',
+    success: 'Succeeded',
+    killed: 'Killed',
   },
   releaseState: {
     releasing: '发布中',
@@ -285,6 +286,7 @@ export default {
     hadoopXmlConfigFileTips: '从系统环境参数自动复制配置文件',
     dynamicPropertiesPlaceholder: '$key=$value,如果有多个参数,可以换行输入(-D <arg>)',
     sqlCheck: 'SQL 检查错误',
+    sparkAppRequire: 'Spark App 为必填项',
   },
 
   noteInfo: {
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/components/DetailTab.vue
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/components/DetailTab.vue
index 1fbee7f63..efba63368 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/components/DetailTab.vue
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/components/DetailTab.vue
@@ -363,7 +363,11 @@
           </template>
         </BasicTable>
       </TabPane>
-      <TabPane key="2" 
:tab="t('spark.app.detail.detailTab.detailTabName.option')">
+      <TabPane
+        key="2"
+        :tab="t('spark.app.detail.detailTab.detailTabName.option')"
+        v-if="app.options"
+      >
         <Descriptions bordered size="middle" layout="vertical">
           <DescriptionItem v-for="(v, k) in JSON.parse(app.options || '{}')" 
:key="k" :label="k">
             {{ v }}
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/components/State.tsx
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/components/State.tsx
index 5a56faafc..ad6fdf2af 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/components/State.tsx
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/components/State.tsx
@@ -25,88 +25,93 @@ const { t } = useI18n();
 
 /*  state map*/
 export const stateMap = {
-  [AppStateEnum.ADDED]: { color: '#2f54eb', title: 
t('flink.app.runState.added') },
+  [AppStateEnum.ADDED]: { color: '#2f54eb', title: 
t('spark.app.runState.added') },
   [AppStateEnum.NEW_SAVING]: {
     color: '#738df8',
-    title: t('flink.app.runState.saving'),
+    title: t('spark.app.runState.saving'),
     class: 'status-processing-initializing',
   },
-  [AppStateEnum.NEW]: { color: '#2f54eb', title: 
t('flink.app.runState.created') },
+  [AppStateEnum.NEW]: { color: '#2f54eb', title: t('spark.app.runState.new') },
   [AppStateEnum.STARTING]: {
     color: '#1AB58E',
-    title: t('flink.app.runState.starting'),
+    title: t('spark.app.runState.starting'),
     class: 'status-processing-starting',
   },
-  [AppStateEnum.SUBMITTE]: {
+  [AppStateEnum.SUBMITTED]: {
     color: '#13c2c2',
-    title: t('flink.app.runState.submitted'),
+    title: t('spark.app.runState.submitted'),
     class: 'status-processing-restarting',
   },
-  [AppStateEnum.ACCEPTE]: {
+  [AppStateEnum.ACCEPTED]: {
     color: '#52c41a',
-    title: t('flink.app.runState.accept'),
+    title: t('spark.app.runState.accept'),
     class: 'status-processing-running',
   },
-  [AppStateEnum.RUNNIN]: {
+  [AppStateEnum.SUCCEEDED]: {
+    color: '#52c41a',
+    title: t('spark.app.runState.success'),
+    class: 'status-processing-success',
+  },
+  [AppStateEnum.RUNNING]: {
     color: '#fa541c',
-    title: t('flink.app.runState.running'),
+    title: t('spark.app.runState.running'),
     class: 'status-processing-failing',
   },
-  [AppStateEnum.FINISHE]: { color: '#1890ff', title: 
t('flink.app.runState.finished') },
-  [AppStateEnum.FAILE]: { color: '#f5222d', title: 
t('flink.app.runState.failed') },
-  [AppStateEnum.LOS]: { color: '#333333', title: t('flink.app.runState.lost') 
},
+  [AppStateEnum.FINISHED]: { color: '#1890ff', title: 
t('spark.app.runState.finished') },
+  [AppStateEnum.FAILED]: { color: '#f5222d', title: 
t('spark.app.runState.failed') },
+  [AppStateEnum.LOST]: { color: '#333333', title: t('spark.app.runState.lost') 
},
   [AppStateEnum.MAPPING]: {
     color: '#13c2c2',
-    title: t('flink.app.runState.mapping'),
+    title: t('spark.app.runState.mapping'),
     class: 'status-processing-restarting',
   },
-  [AppStateEnum.OTHER]: { color: '#722ed1', title: 
t('flink.app.runState.other') },
+  [AppStateEnum.OTHER]: { color: '#722ed1', title: 
t('spark.app.runState.other') },
   [AppStateEnum.REVOKED]: {
     color: '#eb2f96',
-    title: t('flink.app.runState.revoked'),
+    title: t('spark.app.runState.revoked'),
     class: 'status-processing-reconciling',
   },
 
   [AppStateEnum.STOPPING]: {
     color: '#738df8',
-    title: t('flink.app.runState.stopping'),
+    title: t('spark.app.runState.stopping'),
     class: 'status-processing-initializing',
   },
-  [AppStateEnum.KILLED]: { color: '#8E50FF', title: 
t('flink.app.runState.killed') },
+  [AppStateEnum.KILLED]: { color: '#8E50FF', title: 
t('spark.app.runState.killed') },
 };
 /*  option state map*/
 export const optionStateMap = {
   [OptionStateEnum.RELEASING]: {
     color: '#1ABBDC',
-    title: t('flink.app.releaseState.releasing'),
+    title: t('spark.app.releaseState.releasing'),
     class: 'status-processing-deploying',
   },
   [OptionStateEnum.STOPPING]: {
     color: '#faad14',
-    title: t('flink.app.runState.cancelling'),
+    title: t('spark.app.runState.cancelling'),
     class: 'status-processing-cancelling',
   },
   [OptionStateEnum.STARTING]: {
     color: '#1AB58E',
-    title: t('flink.app.runState.starting'),
+    title: t('spark.app.runState.starting'),
     class: 'status-processing-starting',
   },
 };
 
 /* release state map*/
 export const releaseStateMap = {
-  [ReleaseStateEnum.FAILED]: { color: '#f5222d', title: 
t('flink.app.releaseState.failed') },
-  [ReleaseStateEnum.DONE]: { color: '#52c41a', title: 
t('flink.app.releaseState.success') },
-  [ReleaseStateEnum.NEED_RELEASE]: { color: '#fa8c16', title: 
t('flink.app.releaseState.waiting') },
+  [ReleaseStateEnum.FAILED]: { color: '#f5222d', title: 
t('spark.app.releaseState.failed') },
+  [ReleaseStateEnum.DONE]: { color: '#52c41a', title: 
t('spark.app.releaseState.success') },
+  [ReleaseStateEnum.NEED_RELEASE]: { color: '#fa8c16', title: 
t('spark.app.releaseState.waiting') },
   [ReleaseStateEnum.RELEASING]: {
     color: '#52c41a',
-    title: t('flink.app.releaseState.releasing'),
+    title: t('spark.app.releaseState.releasing'),
     class: 'status-processing-deploying',
   },
-  [ReleaseStateEnum.NEED_RESTART]: { color: '#fa8c16', title: 
t('flink.app.releaseState.pending') },
+  [ReleaseStateEnum.NEED_RESTART]: { color: '#fa8c16', title: 
t('spark.app.releaseState.pending') },
   [ReleaseStateEnum.NEED_ROLLBACK]: {
     color: '#fa8c16',
-    title: t('flink.app.releaseState.waiting'),
+    title: t('spark.app.releaseState.waiting'),
   },
 };
 
@@ -206,7 +211,7 @@ export default defineComponent({
       });
     }
     const renderOtherOption = () => {
-      if ([AppStateEnum.RUNNIN, 
AppStateEnum.FAILE].includes(unref(data)?.state)) {
+      if ([AppStateEnum.RUNNING, 
AppStateEnum.FAILED].includes(unref(data)?.state)) {
         return (
           <div class="bold-tag">
             {unref(data).totalTask && (
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/create.vue 
b/streampark-console/streampark-console-webapp/src/views/spark/app/create.vue
index 043ba8690..9030436ff 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/create.vue
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/create.vue
@@ -63,7 +63,7 @@
       appType: AppTypeEnum.APACHE_SPARK,
       versionId: values.versionId,
       sparkSql: null,
-      jar: values.teamResource,
+      jar: values.jar,
       mainClass: values.mainClass,
       appName: values.appName,
       tags: values.tags,
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/data/detail.data.ts
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/data/detail.data.ts
index c7921cd14..97413d76b 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/data/detail.data.ts
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/data/detail.data.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 import { BasicColumn } from '/@/components/Table/src/types/table';
-import { Tag, TypographyParagraph } from 'ant-design-vue';
+import { TypographyParagraph } from 'ant-design-vue';
 import { DescItem } from '/@/components/Description';
 import { h } from 'vue';
 import State from '../components/State';
@@ -23,6 +23,7 @@ import Icon from '/@/components/Icon';
 import { dateToDuration } from '/@/utils/dateUtil';
 import { JobTypeEnum } from '/@/enums/sparkEnum';
 import { useI18n } from '/@/hooks/web/useI18n';
+import { sparkJobTypeMap } from '../hooks/useSparkRender';
 
 const { t } = useI18n();
 export const getDescSchema = (): DescItem[] => {
@@ -37,18 +38,11 @@ export const getDescSchema = (): DescItem[] => {
     {
       field: 'jobType',
       label: t('spark.app.developmentMode'),
-      render: (curVal) =>
-        h(
-          'div',
-          { class: 'bold-tag' },
-          h(Tag, { color: curVal === 1 ? '#545454' : '#0C7EF2', class: 
'mr-8px' }, () =>
-            curVal === 1 ? 'Custom Code' : 'Spark SQL',
-          ),
-        ),
+      render: (curVal) => sparkJobTypeMap[+curVal]?.label || '-',
     },
     {
-      field: 'module',
-      label: t('spark.app.module'),
+      field: 'jar',
+      label: t('spark.app.resource'),
       show: (data) => data.jobType != JobTypeEnum.SQL,
     },
     {
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/detail.vue 
b/streampark-console/streampark-console-webapp/src/views/spark/app/detail.vue
index 004bf65c5..455476f70 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/detail.vue
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/detail.vue
@@ -15,25 +15,25 @@
   limitations under the License.
 -->
 <script setup lang="ts">
-  import { onUnmounted, reactive, h, unref, ref, onMounted, computed } from 
'vue';
+  import { onUnmounted, reactive, unref, ref, onMounted, computed } from 'vue';
   import { AppStateEnum, ExecModeEnum } from '/@/enums/sparkEnum';
   import { useI18n } from '/@/hooks/web/useI18n';
-  import { fetchAppExternalLink } from '/@/api/setting/externalLink';
+  // import { fetchAppExternalLink } from '/@/api/setting/externalLink';
   import { ExternalLink } from '/@/api/setting/types/externalLink.type';
-  import { useModal } from '/@/components/Modal';
+  // import { useModal } from '/@/components/Modal';
   import { PageWrapper } from '/@/components/Page';
   import { Description, useDescription } from '/@/components/Description';
   import { Icon } from '/@/components/Icon';
   import { useRoute, useRouter } from 'vue-router';
   import { useIntervalFn } from '@vueuse/core';
-  import { Tooltip, Divider, Space } from 'ant-design-vue';
+  import { Divider, Space } from 'ant-design-vue';
   import { handleView } from './utils';
-  import { Button } from '/@/components/Button';
+  // import { Button } from '/@/components/Button';
   import { getDescSchema } from './data/detail.data';
   import { fetchSparkConfList } from '/@/api/spark/conf';
   import Mergely from './components/Mergely.vue';
   import DetailTab from './components/DetailTab.vue';
-  import RequestModal from '/@/views/flink/app/components/RequestModal';
+  // import RequestModal from '/@/views/flink/app/components/RequestModal';
   import { createDetailProviderContext } from './hooks/useDetailContext';
   import { useDrawer } from '/@/components/Drawer';
   import { LinkBadge } from '/@/components/LinkBadge';
@@ -69,47 +69,47 @@
   const [registerDescription] = useDescription({
     schema: [
       ...(getDescSchema() as any),
-      {
-        field: 'resetApi',
-        span: 2,
-        label: h('div', null, [
-          t('spark.app.detail.resetApi'),
-          h(Tooltip, { title: t('spark.app.detail.resetApiToolTip'), 
placement: 'top' }, () =>
-            h(Icon, { icon: 'ant-design:question-circle-outlined', class: 
'pl-5px', color: 'red' }),
-          ),
-        ]),
-        render: () => [
-          h(
-            Button,
-            {
-              type: 'primary',
-              size: 'small',
-              class: 'mx-3px px-5px',
-              onClick: () =>
-                openApiModal(true, {
-                  name: 'flinkStart',
-                  app,
-                }),
-            },
-            () => [t('spark.app.detail.copyStartcURL')],
-          ),
-          h(
-            Button,
-            {
-              type: 'primary',
-              size: 'small',
-              class: 'mx-3px px-5px',
-              onClick: () => {
-                openApiModal(true, {
-                  name: 'flinkCancel',
-                  app,
-                });
-              },
-            },
-            () => [t('spark.app.detail.copyCancelcURL')],
-          ),
-        ],
-      },
+      // {
+      //   field: 'resetApi',
+      //   span: 2,
+      //   label: h('div', null, [
+      //     t('spark.app.detail.resetApi'),
+      //     h(Tooltip, { title: t('spark.app.detail.resetApiToolTip'), 
placement: 'top' }, () =>
+      //       h(Icon, { icon: 'ant-design:question-circle-outlined', class: 
'pl-5px', color: 'red' }),
+      //     ),
+      //   ]),
+      //   render: () => [
+      //     h(
+      //       Button,
+      //       {
+      //         type: 'primary',
+      //         size: 'small',
+      //         class: 'mx-3px px-5px',
+      //         onClick: () =>
+      //           openApiModal(true, {
+      //             name: 'flinkStart',
+      //             app,
+      //           }),
+      //       },
+      //       () => [t('spark.app.detail.copyStartcURL')],
+      //     ),
+      //     h(
+      //       Button,
+      //       {
+      //         type: 'primary',
+      //         size: 'small',
+      //         class: 'mx-3px px-5px',
+      //         onClick: () => {
+      //           openApiModal(true, {
+      //             name: 'flinkCancel',
+      //             app,
+      //           });
+      //         },
+      //       },
+      //       () => [t('spark.app.detail.copyCancelcURL')],
+      //     ),
+      //   ],
+      // },
     ],
     data: app,
     layout: 'vertical',
@@ -117,7 +117,7 @@
   });
 
   const [registerConfDrawer] = useDrawer();
-  const [registerOpenApi, { openModal: openApiModal }] = useModal();
+  // const [registerOpenApi, { openModal: openApiModal }] = useModal();
 
   /* Flink Web UI */
   function handleFlinkView() {
@@ -171,20 +171,20 @@
     yarn.value = await fetchSparkYarn();
   }
 
-  async function getExternalLinks() {
-    const { data: links } = await fetchAppExternalLink({ appId: 
route.query.appId as string });
-    externalLinks.value = links.data;
-  }
+  // async function getExternalLinks() {
+  //   const { data: links } = await fetchAppExternalLink({ appId: 
route.query.appId as string });
+  //   externalLinks.value = links.data;
+  // }
 
   onMounted(() => {
-    getExternalLinks();
+    // getExternalLinks();
   });
 
   onUnmounted(() => {
     pause();
   });
 
-  const appNotRunning = computed(() => app.state !== AppStateEnum.RUNNIN || 
yarn.value === null);
+  const appNotRunning = computed(() => app.state !== AppStateEnum.RUNNING || 
yarn.value === null);
 </script>
 <template>
   <PageWrapper content-full-height content-background contentClass="p-24px">
@@ -218,7 +218,7 @@
     <Divider class="mt-20px -mb-17px" />
     <DetailTab :app="app" :tabConf="detailTabs" />
     <Mergely @register="registerConfDrawer" :readOnly="true" />
-    <RequestModal @register="registerOpenApi" />
+    <!-- <RequestModal @register="registerOpenApi" /> -->
   </PageWrapper>
 </template>
 <style lang="less">
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/edit.vue 
b/streampark-console/streampark-console-webapp/src/views/spark/app/edit.vue
index 743a8ae92..baf967252 100644
--- a/streampark-console/streampark-console-webapp/src/views/spark/app/edit.vue
+++ b/streampark-console/streampark-console-webapp/src/views/spark/app/edit.vue
@@ -56,12 +56,12 @@
   /* custom mode */
   async function handleCustomJobMode(values: Recordable) {
     const params = {
-      jobType: JobTypeEnum.SQL,
+      jobType: JobTypeEnum.JAR,
       executionMode: values.executionMode,
       appType: AppTypeEnum.APACHE_SPARK,
       versionId: values.versionId,
       sparkSql: null,
-      jar: values.teamResource,
+      jar: values.jar,
       mainClass: values.mainClass,
       appName: values.appName,
       tags: values.tags,
@@ -121,17 +121,20 @@
   }
   /* send create request */
   async function handleUpdateAction(params: Recordable) {
-    const param: SparkApplication = {};
+    const fetchParams: SparkApplication = {};
     for (const k in params) {
       const v = params[k];
       if (v != null && v !== undefined) {
-        param[k] = v;
+        fetchParams[k] = v;
       }
     }
     const socketId = buildUUID();
     ls.set('DOWN_SOCKET_ID', socketId);
-    Object.assign(param, { socketId });
-    const updated = await fetchUpdateSparkApp(params);
+    Object.assign(fetchParams, {
+      socketId,
+      id: route.query.appId,
+    });
+    const updated = await fetchUpdateSparkApp(fetchParams);
     if (updated) {
       createMessage.success(t('spark.app.success'));
       go('/spark/app');
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useAppFormSchema.tsx
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useAppFormSchema.tsx
index 5a707b41a..e0e1a677f 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useAppFormSchema.tsx
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useAppFormSchema.tsx
@@ -14,24 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { computed, h, onMounted, ref, unref, type Ref } from 'vue';
+import { computed, onMounted, ref, unref, type Ref } from 'vue';
 import type { FormSchema } from '/@/components/Form';
 import { useI18n } from '/@/hooks/web/useI18n';
 import { AppExistsStateEnum, JobTypeEnum } from '/@/enums/sparkEnum';
 import { ResourceFromEnum } from '/@/enums/flinkEnum';
-import { SvgIcon } from '/@/components/Icon';
 import type { SparkEnv } from '/@/api/spark/home.type';
 import type { RuleObject } from 'ant-design-vue/lib/form';
 import type { StoreValue } from 'ant-design-vue/lib/form/interface';
-import { renderIsSetConfig, renderStreamParkResource, renderYarnQueue } from 
'./useSparkRender';
+import {
+  renderIsSetConfig,
+  renderStreamParkResource,
+  renderYarnQueue,
+  sparkJobTypeMap,
+} from './useSparkRender';
 import { executionModes } from '../data';
 import { useDrawer } from '/@/components/Drawer';
 import { fetchVariableAll } from '/@/api/resource/variable';
 import { fetchTeamResource } from '/@/api/resource/upload';
 import { fetchCheckSparkName } from '/@/api/spark/app';
+import { useRoute } from 'vue-router';
+import { Alert } from 'ant-design-vue';
 
 export function useSparkSchema(sparkEnvs: Ref<SparkEnv[]>) {
   const { t } = useI18n();
+  const route = useRoute();
   const teamResource = ref<Array<any>>([]);
   const suggestions = ref<Array<{ text: string; description: string; value: 
string }>>([]);
 
@@ -42,9 +49,9 @@ export function useSparkSchema(sparkEnvs: Ref<SparkEnv[]>) {
       return 
Promise.reject(t('spark.app.addAppTips.appNameIsRequiredMessage'));
     }
     const params = { appName: value };
-    // if (edit?.appId) {
-    //   Object.assign(params, { id: edit.appId });
-    // }
+    if (route.query?.appId) {
+      Object.assign(params, { id: route.query?.appId });
+    }
     const res = await fetchCheckSparkName(params);
     switch (parseInt(res)) {
       case AppExistsStateEnum.NO:
@@ -60,53 +67,61 @@ export function useSparkSchema(sparkEnvs: Ref<SparkEnv[]>) {
     }
   }
   const getJobTypeOptions = () => {
-    return [
-      {
-        label: h('div', {}, [
-          h(SvgIcon, { name: 'code', color: '#108ee9' }, ''),
-          h('span', { class: 'pl-10px' }, 'Spark Jar'),
-        ]),
-        value: String(JobTypeEnum.JAR),
-      },
-      {
-        label: h('div', {}, [
-          h(SvgIcon, { name: 'fql', color: '#108ee9' }, ''),
-          h('span', { class: 'pl-10px' }, 'Spark SQL'),
-        ]),
-        value: String(JobTypeEnum.SQL),
-      },
-      {
-        label: h('div', {}, [
-          h(SvgIcon, { name: 'py', color: '#108ee9' }, ''),
-          h('span', { class: 'pl-10px' }, 'PySpark'),
-        ]),
-        value: String(JobTypeEnum.PYSPARK),
-      },
-    ];
+    return Object.values(sparkJobTypeMap);
   };
 
-  const formSchema = computed((): FormSchema[] => {
-    return [
-      {
-        field: 'jobType',
-        label: t('spark.app.developmentMode'),
-        component: 'Select',
-        componentProps: ({ formModel }) => {
-          return {
-            placeholder: t('spark.app.addAppTips.developmentModePlaceholder'),
-            options: getJobTypeOptions(),
-            onChange: (value) => {
-              if (value != JobTypeEnum.SQL) {
-                formModel.resourceFrom = String(ResourceFromEnum.PROJECT);
-              }
+  const getJobTypeSchema = computed((): FormSchema[] => {
+    if (route.query.appId) {
+      return [
+        {
+          field: 'jobType',
+          label: t('spark.app.developmentMode'),
+          component: 'Input',
+          render: ({ model }) => {
+            const jobOptions = getJobTypeOptions();
+            return (
+              <Alert
+                type="info"
+                v-slots={{
+                  message: () => jobOptions.find((v) => v.value == 
model.jobType)?.label ?? '',
+                }}
+              ></Alert>
+            );
+          },
+        },
+      ];
+    } else {
+      return [
+        {
+          field: 'jobType',
+          label: t('spark.app.developmentMode'),
+          component: 'Select',
+          componentProps: ({ formModel }) => {
+            return {
+              placeholder: 
t('spark.app.addAppTips.developmentModePlaceholder'),
+              options: getJobTypeOptions(),
+              onChange: (value) => {
+                if (value != JobTypeEnum.SQL) {
+                  formModel.resourceFrom = String(ResourceFromEnum.PROJECT);
+                }
+              },
+            };
+          },
+          defaultValue: JobTypeEnum.SQL,
+          rules: [
+            {
+              required: true,
+              message: 
t('spark.app.addAppTips.developmentModeIsRequiredMessage'),
+              type: 'number',
             },
-          };
+          ],
         },
-        defaultValue: String(JobTypeEnum.SQL),
-        rules: [
-          { required: true, message: 
t('spark.app.addAppTips.developmentModeIsRequiredMessage') },
-        ],
-      },
+      ];
+    }
+  });
+  const formSchema = computed((): FormSchema[] => {
+    return [
+      ...getJobTypeSchema.value,
       {
         field: 'executionMode',
         label: t('spark.app.executionMode'),
@@ -153,11 +168,12 @@ export function useSparkSchema(sparkEnvs: 
Ref<SparkEnv[]>) {
         rules: [{ required: true, message: 
t('spark.app.addAppTips.sparkSqlIsRequiredMessage') }],
       },
       {
-        field: 'teamResource',
+        field: 'jar',
         label: t('spark.app.resource'),
         component: 'Select',
         render: ({ model }) => renderStreamParkResource({ model, resources: 
unref(teamResource) }),
         ifShow: ({ values }) => values.jobType == JobTypeEnum.JAR,
+        rules: [{ required: true, message: 
t('spark.app.addAppTips.sparkAppRequire') }],
       },
       {
         field: 'mainClass',
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkColumns.ts
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkColumns.ts
index 97739fcd3..faa980af6 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkColumns.ts
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkColumns.ts
@@ -55,7 +55,7 @@ export const useSparkColumns = () => {
     },
     {
       title: t('spark.app.sparkVersion'),
-      dataIndex: 'sparkVersion  ',
+      dataIndex: 'sparkVersion',
       width: unref(tableColumnWidth).sparkVersion,
     },
     {
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkRender.tsx
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkRender.tsx
index 2f76021c6..b3b2acb29 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkRender.tsx
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkRender.tsx
@@ -20,7 +20,7 @@ import { Icon, SvgIcon } from '/@/components/Icon';
 import Mergely from '../components/Mergely.vue';
 import { Alert, Dropdown, Input, Menu, Select, Switch, Tag } from 
'ant-design-vue';
 import { SettingTwoTone } from '@ant-design/icons-vue';
-import { unref } from 'vue';
+import { h, unref } from 'vue';
 import { decodeByBase64 } from '/@/utils/cipher';
 import { SelectValue } from 'ant-design-vue/lib/select';
 import { useI18n } from '/@/hooks/web/useI18n';
@@ -28,6 +28,7 @@ import { fetchYarnQueueList } from '/@/api/setting/yarnQueue';
 import { ApiSelect } from '/@/components/Form';
 import { ResourceTypeEnum } from '/@/views/resource/upload/upload.data';
 import { fetchSparkConfTemplate } from '/@/api/spark/conf';
+import { JobTypeEnum } from '/@/enums/sparkEnum';
 
 const { t } = useI18n();
 /* render input dropdown component */
@@ -272,10 +273,8 @@ export const renderStreamParkResource = ({ model, 
resources }) => {
         show-search
         allow-clear
         optionFilterProp="label"
-        mode="multiple"
-        max-tag-count={3}
-        onChange={(value) => (model.teamResource = value)}
-        value={model.teamResource}
+        onChange={(value) => (model.jar = value)}
+        value={model.jar}
         placeholder={t('flink.app.resourcePlaceHolder')}
       >
         {renderOptions()}
@@ -324,3 +323,27 @@ export const renderStreamParkJarApp = ({ model, resources 
}) => {
     </div>
   );
 };
+
+export const sparkJobTypeMap = {
+  [JobTypeEnum.JAR]: {
+    label: h('div', {}, [
+      h(SvgIcon, { name: 'code', color: '#108ee9' }, ''),
+      h('span', { class: 'pl-10px' }, 'Spark Jar'),
+    ]),
+    value: JobTypeEnum.JAR,
+  },
+  [JobTypeEnum.SQL]: {
+    label: h('div', {}, [
+      h(SvgIcon, { name: 'fql', color: '#108ee9' }, ''),
+      h('span', { class: 'pl-10px' }, 'Spark SQL'),
+    ]),
+    value: JobTypeEnum.SQL,
+  },
+  [JobTypeEnum.PYSPARK]: {
+    label: h('div', {}, [
+      h(SvgIcon, { name: 'py', color: '#108ee9' }, ''),
+      h('span', { class: 'pl-10px' }, 'PySpark'),
+    ]),
+    value: JobTypeEnum.PYSPARK,
+  },
+};
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkTableAction.ts
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkTableAction.ts
index 912936b59..f20e72907 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkTableAction.ts
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/hooks/useSparkTableAction.ts
@@ -98,7 +98,7 @@ export const useSparkTableAction = (handlePageDataReload: Fn, 
optionApps: Record
       {
         tooltip: { title: t('spark.app.operation.cancel') },
         ifShow:
-          record.state == AppStateEnum.RUNNIN && record['optionState'] == 
OptionStateEnum.NONE,
+          record.state == AppStateEnum.RUNNING && record['optionState'] == 
OptionStateEnum.NONE,
         auth: 'app:cancel',
         icon: 'ant-design:pause-circle-outlined',
         popConfirm: {
@@ -136,12 +136,12 @@ export const useSparkTableAction = (handlePageDataReload: 
Fn, optionApps: Record
         label: t('spark.app.operation.remapping'),
         ifShow: [
           AppStateEnum.ADDED,
-          AppStateEnum.FAILE,
+          AppStateEnum.FAILED,
           AppStateEnum.STOPPING,
           AppStateEnum.KILLED,
           AppStateEnum.SUCCEEDED,
-          AppStateEnum.FINISHE,
-          AppStateEnum.LOS,
+          AppStateEnum.FINISHED,
+          AppStateEnum.LOST,
         ].includes(record.state as AppStateEnum),
         auth: 'app:mapping',
         icon: 'ant-design:deployment-unit-outlined',
@@ -157,9 +157,9 @@ export const useSparkTableAction = (handlePageDataReload: 
Fn, optionApps: Record
           !isNullAndUnDef(record.state) &&
           [
             AppStateEnum.ADDED,
-            AppStateEnum.FAILE,
-            AppStateEnum.FINISHE,
-            AppStateEnum.LOS,
+            AppStateEnum.FAILED,
+            AppStateEnum.FINISHED,
+            AppStateEnum.LOST,
             AppStateEnum.SUCCEEDED,
             AppStateEnum.KILLED,
           ].includes(record.state),
@@ -253,7 +253,7 @@ export const useSparkTableAction = (handlePageDataReload: 
Fn, optionApps: Record
       showSubmitButton: false,
       showResetButton: false,
       async resetFunc() {
-        router.push({ path: '/spark/app/create' });
+        router.push({ path: '/spark/app/add' });
       },
       schemas: [
         {
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/index.vue 
b/streampark-console/streampark-console-webapp/src/views/spark/app/index.vue
index e56021a49..d0dd6cb31 100644
--- a/streampark-console/streampark-console-webapp/src/views/spark/app/index.vue
+++ b/streampark-console/streampark-console-webapp/src/views/spark/app/index.vue
@@ -198,7 +198,7 @@
   /* view */
   async function handleJobView(app: SparkApplication) {
     // Task is running, restarting, in savePoint
-    if (app.state && [AppStateEnum.RUNNIN].includes(app.state)) {
+    if (app.state && [AppStateEnum.RUNNING].includes(app.state)) {
       // yarn-per-job|yarn-session|yarn-application
       await handleView(app, unref(yarn));
     }
@@ -323,7 +323,7 @@
             </Row>
           </Form>
           <div v-auth="'app:create'">
-            <Button type="primary" @click="() => router.push({ path: 
'/spark/app/create' })">
+            <Button type="primary" @click="() => router.push({ path: 
'/spark/app/add' })">
               <PlusOutlined />
               {{ t('common.add') }}
             </Button>
@@ -344,7 +344,7 @@
           <span
             class="link"
             :class="{
-              'cursor-pointer': [AppStateEnum.RUNNIN].includes(record.state),
+              'cursor-pointer': [AppStateEnum.RUNNING].includes(record.state),
             }"
             @click="handleJobView(record)"
           >
diff --git 
a/streampark-console/streampark-console-webapp/src/views/spark/app/utils/index.ts
 
b/streampark-console/streampark-console-webapp/src/views/spark/app/utils/index.ts
index 99eff9459..e311480ea 100644
--- 
a/streampark-console/streampark-console-webapp/src/views/spark/app/utils/index.ts
+++ 
b/streampark-console/streampark-console-webapp/src/views/spark/app/utils/index.ts
@@ -107,9 +107,9 @@ export async function handleView(app: SparkApplication, 
yarn: Nullable<string>)
 export function handleIsStart(app: Recordable, optionApps: Recordable) {
   const status = [
     AppStateEnum.ADDED,
-    AppStateEnum.FAILE,
-    AppStateEnum.FINISHE,
-    AppStateEnum.LOS,
+    AppStateEnum.FAILED,
+    AppStateEnum.FINISHED,
+    AppStateEnum.LOST,
     AppStateEnum.REVOKED,
     AppStateEnum.SUCCEEDED,
     AppStateEnum.KILLED,


Reply via email to