diff --git a/apps/daas/src/plugins/axios.ts b/apps/daas/src/plugins/axios.ts index fec8c9178e..ad37f1fd9a 100644 --- a/apps/daas/src/plugins/axios.ts +++ b/apps/daas/src/plugins/axios.ts @@ -45,7 +45,7 @@ const errorCallback = (error: AxiosError): Promise => { if (axios.isCancel(error)) { // eslint-disable-next-line no-console console.log('Request canceled', error.message) - return Promise.reject('Request canceled') + return Promise.reject(error) } if (error?.config || error?.response?.config) { removePending(error.config || error.response.config) @@ -114,7 +114,7 @@ axios.interceptors.request.use(function (config: AxiosRequestConfig): AxiosReque cancelFunc = c }) if (pending.includes(key)) { - console.log('Cancel request:', JSON.parse(key)) //eslint-disable-line + console.warn('Cancel request:', JSON.parse(key)) //eslint-disable-line cancelFunc() } else if (config.method !== 'get') { pending.push(key) diff --git a/apps/daas/src/views/user/List.vue b/apps/daas/src/views/user/List.vue index 500c8781d6..0fa2fe8952 100644 --- a/apps/daas/src/views/user/List.vue +++ b/apps/daas/src/views/user/List.vue @@ -100,7 +100,7 @@ @@ -769,12 +769,13 @@ export default { }) }, // 关联用户 - permissionsmethod(data) { + permissionsmethod(data = [], roleusers = []) { let html = '' if (data && data.length) { - data.forEach(item => { - if (item.role && item.role.name) { - html += ' ' + item.role.name + ',' + roleusers.forEach(item => { + const roleName = data.find(t => t.roleId === item)?.role?.name + if (roleName) { + html += ' ' + roleName + ',' } }) } diff --git a/apps/daas/vue.config.js b/apps/daas/vue.config.js index 02f085c508..d598ca3e95 100644 --- a/apps/daas/vue.config.js +++ b/apps/daas/vue.config.js @@ -25,7 +25,7 @@ const proxy = { module.exports = { assetsDir: 'static', - lintOnSave: process.env.NODE_ENV !== 'production', // 打包时关闭lint输出 + lintOnSave: SERVE_ENV !== 'dev' && process.env.NODE_ENV !== 'production', // 打包时关闭lint输出 productionSourceMap: false, publicPath: './', devServer: { diff --git a/apps/dfs/src/components/guide/Spec.vue b/apps/dfs/src/components/guide/Spec.vue index 8f6006fd60..6cffeb8659 100644 --- a/apps/dfs/src/components/guide/Spec.vue +++ b/apps/dfs/src/components/guide/Spec.vue @@ -221,12 +221,7 @@ export default { this.specificationItems = uniqBy( paidPrice.map(t => { const { cpu = 0, memory = 0 } = t.spec || {} - let desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { - val: this.getSuggestPipelineNumber(cpu, memory) - }) - if (t.chargeProvider === 'FreeTier') { - desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_mianfeishilizui') - } + return { label: getSpec(t.spec), value: getSpec(t.spec), @@ -234,7 +229,9 @@ export default { memory, name: t.spec.name.toUpperCase(), chargeProvider: t.chargeProvider, - desc: desc + desc: i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { + val: t.limitTask + }) } }), 'value' @@ -267,16 +264,7 @@ export default { console.log('specificationItems', this.specificationItems) // eslint-disable-line }) }, - //查询定价列表 - getSuggestPipelineNumber(cpu, memory) { - if (memory == 2) { - return 3 - } - if (memory == 4) { - return 5 - } - return memory / 0.8 - }, + //订购时长对应价格 loadPackageItems() { const specification = this.specificationItems.find(t => t.value === this.specification) @@ -359,7 +347,6 @@ export default { updateAgentCap(cpu, memory) { return { mem: parseInt(memory * 1.1 + 2) + 'G', - pipeline: this.getSuggestPipelineNumber(cpu, memory), tps: cpu * 2000 } }, diff --git a/apps/dfs/src/i18n/langs/en.js b/apps/dfs/src/i18n/langs/en.js index 5afca5d5a7..9db8f31fb8 100644 --- a/apps/dfs/src/i18n/langs/en.js +++ b/apps/dfs/src/i18n/langs/en.js @@ -1388,6 +1388,8 @@ export default { '1. After 1 day expires, the Agent will be automatically stopped (the tasks running on the Agent will also be stopped)', dfs_instance_expired_time_full_tip3: '2. When the instance is stopped due to expiration, the instance can be resumed by renewal to continue running tasks', + dfs_instance_tapdata_agent_status_tip: + 'The tapdata start/stop management service is offline. Please manually perform the start/stop operation in the installation directory.', dfs_user_center_zhifufuwu: 'Payment Service', dfs_user_center_ninjiangzhifur: 'You will pay for the "{val1}" service, and you will enjoy the service after payment. Are you sure whether to continue? ', diff --git a/apps/dfs/src/i18n/langs/zh-CN.js b/apps/dfs/src/i18n/langs/zh-CN.js index b03661628f..816876b7ab 100644 --- a/apps/dfs/src/i18n/langs/zh-CN.js +++ b/apps/dfs/src/i18n/langs/zh-CN.js @@ -1288,6 +1288,7 @@ export default { dfs_instance_expired_time_tip4: '3.实例因过期禁止调度时,可以通过续费恢复实例继续调度运行任务', dfs_instance_expired_time_full_tip2: '1.过期1天后,将自动停止 Agent(Agent 上运行的任务也会停止)', dfs_instance_expired_time_full_tip3: '2.实例因过期停止时,可以通过续费恢复实例继续运行任务', + dfs_instance_tapdata_agent_status_tip: 'tapdata启停管理服务已离线,请手动在安装目录执行启停操作', dfs_user_center_zhifufuwu: '支付服务', dfs_user_center_ninjiangzhifur: '您将支付“{val1}”业务,支付后您将享受该服务,确定是否继续?', dfs_user_center_xudingfuwu: '续订服务', diff --git a/apps/dfs/src/i18n/langs/zh-TW.js b/apps/dfs/src/i18n/langs/zh-TW.js index f448edf348..2444547634 100644 --- a/apps/dfs/src/i18n/langs/zh-TW.js +++ b/apps/dfs/src/i18n/langs/zh-TW.js @@ -1259,6 +1259,7 @@ export default { dfs_instance_expired_time_tip4: '3.实例因过期禁止调度时,可以通过续费恢复实例继续调度运行任务', dfs_instance_expired_time_full_tip2: '1.过期1天后,将自动停止 Agent(Agent 上运行的任务也会停止)', dfs_instance_expired_time_full_tip3: '2.实例因过期停止时,可以通过续费恢复实例继续运行任务', + dfs_instance_tapdata_agent_status_tip: 'tapdata啟停管理服務已離線,請手動在安裝目錄執行啟停操作。', dfs_user_center_zhifufuwu: '支付服務', dfs_user_center_ninjiangzhifur: '您將支付“{val1}”業務,支付後您將享受該服務,確定是否繼續? ', dfs_user_center_xudingfuwu: '續訂服務', diff --git a/apps/dfs/src/init.js b/apps/dfs/src/init.js index bc40fc3a63..1478618204 100644 --- a/apps/dfs/src/init.js +++ b/apps/dfs/src/init.js @@ -210,10 +210,10 @@ export default ({ routes }) => { window.axios .get('config/config.json', { - cache: false, responseType: 'json', headers: { - Accept: 'application/json' + Accept: 'application/json', + 'Cache-Control': 'no-cache' } }) .then(res => { diff --git a/apps/dfs/src/plugins/axios.js b/apps/dfs/src/plugins/axios.js index ce09132163..f6e4eae49c 100644 --- a/apps/dfs/src/plugins/axios.js +++ b/apps/dfs/src/plugins/axios.js @@ -48,9 +48,7 @@ let skipErrorHandler = false const errorCallback = error => { let status = error?.response?.status if (axios.isCancel(error)) { - // eslint-disable-next-line no-console - console.log('Request canceled', error.message) - return Promise.reject('Request canceled') + return Promise.reject(error) } // 从请求池清除掉错误请求 if (error?.response?.config || error?.config) { @@ -122,7 +120,7 @@ const requestInterceptor = config => { let key = getPendingKey(config) // 判断请求池是否有相同请求,有则取消当前请求(后一条),没有则将请求注入请求池 if (pending.includes(key)) { - console.log('Cancel request:', config) //eslint-disable-line + console.warn('Cancel request:', config) //eslint-disable-line cancelFunc('cancel') } else if (config.method !== 'get') { pending.push(key) diff --git a/apps/dfs/src/views/instance/Create.vue b/apps/dfs/src/views/instance/Create.vue deleted file mode 100644 index 16598f149d..0000000000 --- a/apps/dfs/src/views/instance/Create.vue +++ /dev/null @@ -1,340 +0,0 @@ - - - - - diff --git a/apps/dfs/src/views/instance/CreateAgent.vue b/apps/dfs/src/views/instance/CreateAgent.vue index daaddd381a..47a249c461 100644 --- a/apps/dfs/src/views/instance/CreateAgent.vue +++ b/apps/dfs/src/views/instance/CreateAgent.vue @@ -50,19 +50,30 @@ {{ $t('dfs_agent_download_subscriptionmodeldialog_yunfuwushang') }} - - - - {{ item.cloudProviderName }} - - - + + + + + + {{ $t('dfs_agent_download_subscriptionmodeldialog_diqu') }} - - - - {{ item.regionName }} - - - + + + + + @@ -91,71 +112,90 @@
{{ $t('dfs_guide_index_xuanzejisuanyin') }}
- - -
-
-
- check-bold -
-
- {{ item.name }}: {{ item.desc }} - {{ - platform === 'selfHost' - ? $t('dfs_instance_instance_mianfei') - : $t('dfs_instance_createagent_mianfeitiyan') - }} -
-
+ + + +
{{ $t('dfs_instance_instance_dingyuefangshi') }}
- - - - {{ item.label }} - {{ $t('dfs_agent_subscription_discount', { val: getDiscount(item) }) }} - hot-o + + +
@@ -199,6 +239,7 @@ export default { data() { return { + loading: false, submitLoading: false, platform: 'selfHost', platformOptions: [ @@ -268,18 +309,13 @@ export default { const params = { productType: this.platform } - this.$axios.get('api/tcm/orders/paid/price', { params }).then(data => { + return this.$axios.get('api/tcm/orders/paid/price', { params }).then(data => { let { paidPrice = [] } = data?.[0] || {} // 规格 this.specificationItems = uniqBy( paidPrice.map(t => { const { cpu = 0, memory = 0 } = t.spec || {} - let desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { - val: this.getSuggestPipelineNumber(cpu, memory) - }) - if (t.chargeProvider === 'FreeTier') { - desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_mianfeishilizui') - } + return { label: getSpec(t.spec), value: getSpec(t.spec), @@ -287,7 +323,9 @@ export default { memory, name: t.spec.name.toUpperCase(), chargeProvider: t.chargeProvider, - desc: desc + desc: i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { + val: t.limitTask + }) } }), 'value' @@ -330,23 +368,25 @@ export default { }, //查找云厂商 - getCloudProvider() { - return this.$axios.get('api/tcm/orders/queryCloudProvider').then(data => { - this.cloudProviderList = data?.items || [] - this.provider = this.cloudProviderList?.[0].cloudProvider - this.changeProvider() - this.getPrice() - }) + async getCloudProvider() { + const data = await this.$axios.get('api/tcm/orders/queryCloudProvider') + + this.cloudProviderList = data?.items || [] + this.provider = this.cloudProviderList?.[0].cloudProvider + this.changeProvider() + await this.getPrice() }, - handleChangePlatform(platform) { + async handleChangePlatform(platform) { + this.loading = true this.platform = platform if (this.platform === 'fullManagement') { - this.getCloudProvider() + await this.getCloudProvider() } else { - this.getPrice() + await this.getPrice() } + this.loading = false }, //切换云厂商 diff --git a/apps/dfs/src/views/instance/CreateAgentOld.vue b/apps/dfs/src/views/instance/CreateAgentOld.vue deleted file mode 100644 index c793849f69..0000000000 --- a/apps/dfs/src/views/instance/CreateAgentOld.vue +++ /dev/null @@ -1,2767 +0,0 @@ - - - - - diff --git a/apps/dfs/src/views/instance/Instance.vue b/apps/dfs/src/views/instance/Instance.vue index 23a32f81dc..025ad6d79f 100644 --- a/apps/dfs/src/views/instance/Instance.vue +++ b/apps/dfs/src/views/instance/Instance.vue @@ -176,12 +176,15 @@ {{ $t('public_agent_button_deploy') }} {{ $t('public_button_stop') }}{{ $t('dfs_instance_instance_zhongqi') }}{{ $t('public_button_restart') }} {{ $t('dfs_instance_instance_zhongqi') }}{{ $t('public_button_restart') }} @@ -238,6 +247,7 @@ v-if="(item.orderInfo || item.orderInfo.chargeProvider === 'Stripe') && !disableRenew(item)" class="mr-2" size="mini" + type="primary" @click="openRenew(item)" >{{ $t('public_button_renew') }} @@ -252,22 +262,25 @@ :content="getTooltipContent(item, 'upgrading')" key="upgrading" > -
- loading-circle - -
+ + + {{ $t('public_status_altering') }} + + {{ (upgradingProgres(item) || 0) + '%' }} + + - upgrade-error-color + {{ $t('dfs_instance_instance_shengji') }} + warning + - {{ - $t('dfs_instance_instance_shengji') - }} + {{ $t('dfs_instance_instance_shengji') }} @@ -394,7 +419,8 @@ @@ -422,15 +448,7 @@ >--> - - - - + @@ -545,9 +563,6 @@ import { secondDifference } from '../../util' import updateLocale from 'dayjs/plugin/updateLocale' import { mapGetters } from 'vuex' -const CreateDialog = () => import(/* webpackChunkName: "CreateInstanceDialog" */ './Create') -const SelectListDialog = () => import(/* webpackChunkName: "SelectListInstanceDialog" */ './SelectList') - let timer = null export default { @@ -558,8 +573,6 @@ export default { VIcon, Details, FilterBar, - CreateDialog, - SelectListDialog, transferDialog, SubscriptionModelDialog, Unsubscribe @@ -648,8 +661,6 @@ export default { showDetails: false, detailId: null, filterItems: [], - createDialog: false, - selectListDialog: false, selectListType: 'code', subscriptionModelVisible: false, showUnsubscribeDetailVisible: false, @@ -896,23 +907,23 @@ export default { const AES_KEY = '5fa25b06ee34581d' const AES_PAD = '5fa25b06ee34581d' const AES_PASSWORD = CryptoJS.AES.decrypt( - { - ciphertext: CryptoJS.enc.Base64.parse(password) - }, - CryptoJS.enc.Latin1.parse(AES_KEY), - { - iv: CryptoJS.enc.Latin1.parse(AES_PAD) - } + { + ciphertext: CryptoJS.enc.Base64.parse(password) + }, + CryptoJS.enc.Latin1.parse(AES_KEY), + { + iv: CryptoJS.enc.Latin1.parse(AES_PAD) + } ).toString(CryptoJS.enc.Utf8) const splitStr = '://' const splitIndex = connectionString.indexOf(splitStr) + splitStr.length if (splitIndex > -1) { item.visitInfo.showUri = - connectionString.slice(0, splitIndex) + `***:***@` + connectionString.slice(splitIndex) + connectionString.slice(0, splitIndex) + `***:***@` + connectionString.slice(splitIndex) item.visitInfo.copyUri = - connectionString.slice(0, splitIndex) + - `${username}:${AES_PASSWORD}@` + - connectionString.slice(splitIndex) + connectionString.slice(0, splitIndex) + + `${username}:${AES_PASSWORD}@` + + connectionString.slice(splitIndex) } } @@ -1156,6 +1167,10 @@ export default { if (this.stopBtnDisabled(row)) { return } + if (row.tapdataAgentStatus === 'stopped') { + this.$message.warning(this.$t('dfs_instance_tapdata_agent_status_tip')) + return + } let flag = false if (from === 'details' && this.selectedRow?.id === row.id) { row = this.selectedRow @@ -1453,44 +1468,7 @@ export default { this.showCreateIps = false }) }, - // 创建Agent - async createAgent() { - this.createAgentLoading = true - const userInfo = window.__USER_INFO__ || {} - // 免费实例 - if (await this.handleFreeAgent()) return (this.createAgentLoading = false) - // 开启授权码 - if (userInfo.enableLicense) { - this.$axios - .get('api/tcm/aliyun/market/license/available') - .then(data => { - if (data.length) { - this.handleSelectListDialog('code') - } else { - this.handleCreateAuthorizationCode() - } - }) - .finally(() => { - this.createAgentLoading = false - }) - return - } - this.$axios - .get('api/tcm/paid/plan/queryAvailableSubscribe') - .then(data => { - if (data.length) { - this.handleSelectListDialog('order') - return - } - this.createDialog = true - }) - .finally(() => { - this.createAgentLoading = false - }) - .catch(() => { - this.createDialog = true - }) - }, + // 禁用部署 deployBtnDisabled(row) { return row.agentType === 'Cloud' || !!row.deployDisable @@ -1500,8 +1478,7 @@ export default { return ( row.agentType === 'Cloud' || row.status !== 'Running' || - row.metric.runningTaskNum > 0 || - row.tapdataAgentStatus === 'stopped' //tapdataAgent 失活了 + row.metric.runningTaskNum > 0 ) }, // 禁用删除 @@ -1547,7 +1524,6 @@ export default { restartBtnDisabled(row) { return ( ['Creating', 'Stopping', 'Stopped'].includes(row.status) || - row.tapdataAgentStatus === 'stopped' || ['starting'].includes(row.engineStatus) ) //tapdataAgent 失活了 }, @@ -1555,7 +1531,6 @@ export default { startBtnDisabled(row) { return ( ['Creating', 'Stopping', 'Running'].includes(row.status) || - row.tapdataAgentStatus === 'stopped' || ['starting'].includes(row.engineStatus) //tapdataAgent 失活了 ) }, @@ -1600,10 +1575,7 @@ export default { isWindons(row) { return row?.metric?.systemInfo?.os?.includes('win') }, - handleSelectListDialog(type = 'code') { - this.selectListType = type - this.selectListDialog = true - }, + async handleNewAgent(params = {}) { try { const data = await this.$axios.post('api/tcm/orders', params) @@ -1663,6 +1635,10 @@ export default { }, // 半托管重启 handleRestart(row) { + if (row.tapdataAgentStatus === 'stopped') { + this.$message.warning(this.$t('dfs_instance_tapdata_agent_status_tip')) + return + } this.$axios .post('tm/api/clusterStates/updataAgent', { process_id: row?.tmInfo?.agentId, @@ -1675,6 +1651,10 @@ export default { }, // 半托管启动 handleStart(row) { + if (row.tapdataAgentStatus === 'stopped') { + this.$message.warning(this.$t('dfs_instance_tapdata_agent_status_tip')) + return + } this.$axios .post('tm/api/clusterStates/updataAgent', { process_id: row?.tmInfo?.agentId, @@ -1959,8 +1939,8 @@ export default { .upgrading-progress { ::v-deep { .el-progress-circle { - width: 20px !important; - height: 20px !important; + width: 16px !important; + height: 16px !important; } } } diff --git a/apps/dfs/src/views/order/Change.vue b/apps/dfs/src/views/order/Change.vue index 37460e2f41..b3977e0f67 100644 --- a/apps/dfs/src/views/order/Change.vue +++ b/apps/dfs/src/views/order/Change.vue @@ -220,12 +220,7 @@ export default { this.specificationItems = uniqBy( paidPrice.map(t => { const { cpu = 0, memory = 0 } = t.spec || {} - let desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { - val: this.getSuggestPipelineNumber(cpu, memory) - }) - if (t.chargeProvider == 'FreeTier') { - desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_mianfeishilizui') - } + return { label: getSpec(t.spec), value: getSpec(t.spec), @@ -233,7 +228,9 @@ export default { memory, name: t.spec.name.toUpperCase(), chargeProvider: t.chargeProvider, - desc: desc + desc: i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { + val: t.limitTask + }) } }), 'value' diff --git a/apps/dfs/src/views/user/Center.vue b/apps/dfs/src/views/user/Center.vue index 1f91894984..c2525e15ad 100644 --- a/apps/dfs/src/views/user/Center.vue +++ b/apps/dfs/src/views/user/Center.vue @@ -278,7 +278,12 @@ disabled > - + {{ '+ ' + item.dial_code }} {{ item.name }} diff --git a/apps/dfs/vue.config.js b/apps/dfs/vue.config.js index 5680adc169..fae5e8fab8 100644 --- a/apps/dfs/vue.config.js +++ b/apps/dfs/vue.config.js @@ -87,7 +87,7 @@ let localTmProxy = { module.exports = { pages, - lintOnSave: process.env.NODE_ENV !== 'production', // 打包时关闭lint输出 + lintOnSave: SERVE_ENV !== 'dev' && process.env.NODE_ENV !== 'production', // 打包时关闭lint输出 publicPath: './', productionSourceMap: false, diff --git a/package.json b/package.json index bcc9e7cbc6..873ce12816 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ "cross-env": "^7.0.3", "eslint": "^7.1.0", "prettier": "^2.2.1", - "sass": "^1.34.1", - "sass-loader": "^10.2.0", + "sass": "^1.55.0", + "sass-loader": "^10.4.1", "tslib": "^2.4.0", "typescript": "~4.5.5" }, diff --git a/packages/api/src/Http.ts b/packages/api/src/Http.ts index c782881fd7..fa8ef37146 100644 --- a/packages/api/src/Http.ts +++ b/packages/api/src/Http.ts @@ -1,6 +1,8 @@ import axios, { AxiosInstance } from 'axios' const CancelToken = axios.CancelToken +const isCancel = axios.isCancel + export default class Http { url: string axios: AxiosInstance @@ -39,6 +41,8 @@ export default class Http { return this.axios.post(this.url + '/update?where=' + encodeURIComponent(queryStr), attributes) } + get(params: unknown, filter: unknown, headers: unknown) + get(params: unknown, filter: unknown) { if (Array.isArray(params)) { let queryStr = '' @@ -69,4 +73,4 @@ export default class Http { return this.axios.get(this.url + '/findOne', { params }) } } -export { CancelToken } +export { CancelToken, isCancel } diff --git a/packages/api/src/Task.ts b/packages/api/src/Task.ts index a81ac5beb4..d8e7465a97 100644 --- a/packages/api/src/Task.ts +++ b/packages/api/src/Task.ts @@ -1,6 +1,7 @@ import Http from './Http' import { isPlainObj } from '@tap/shared' import Cookie from '@tap/shared/src/cookie' +import { AxiosResponse } from 'axios' export default class Task extends Http { constructor() { diff --git a/packages/api/src/index.js b/packages/api/src/index.js index 22e4d0459d..6a30470c50 100644 --- a/packages/api/src/index.js +++ b/packages/api/src/index.js @@ -1,4 +1,4 @@ -import Http, { CancelToken } from './Http' +import Http, { CancelToken, isCancel } from './Http' import Connections from './Connections' const connectionsApi = new Connections() @@ -240,6 +240,6 @@ export { } export * from './ApiClient' -export { CancelToken } +export { CancelToken, isCancel } export default Http diff --git a/packages/assets/icons/svg/location.svg b/packages/assets/icons/svg/location.svg new file mode 100644 index 0000000000..652e60a54a --- /dev/null +++ b/packages/assets/icons/svg/location.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/assets/styles/var.scss b/packages/assets/styles/var.scss index 361c61c4b5..dca897bfa7 100644 --- a/packages/assets/styles/var.scss +++ b/packages/assets/styles/var.scss @@ -13,13 +13,13 @@ $fontBaseTitle: 14px; $color: ( // primary: #337dff, - primary: #2c65ff, + primary: #3b47e5, dprimary: #0e42d2, lprimary: #4080ff, disprimary: #94bfff, - success: #10c038, - lsuccess: #dbefd1, - danger: #d44d4d, + success: #00B42A, + lsuccess: #E8FFEA, + danger: #f53f3f, warning: #ff7d00, info: #75849b, linfo: #e9edf2, diff --git a/packages/business/src/components/TaskStatus.vue b/packages/business/src/components/TaskStatus.vue index 68ac676aa6..6f1731bb73 100644 --- a/packages/business/src/components/TaskStatus.vue +++ b/packages/business/src/components/TaskStatus.vue @@ -57,14 +57,13 @@ key="retrying" placement="top" popper-class="agent-tooltip__popper" - :visible-arrow="false" effect="light" > warning @@ -136,6 +135,12 @@ export default { showRetrying() { const { functionRetryStatus, taskRetryStatus } = this.task return functionRetryStatus === 'Retrying' || taskRetryStatus === 'Retrying' + }, + + taskRetryStartTimeTip() { + return this.$t('packages_business_task_status_retrying_tooltip', { + val: dayjs(this.task.taskRetryStartTime).format('YYYY-MM-DD HH:mm:ss') + }) } }, diff --git a/packages/business/src/components/create-connection/SceneForm.vue b/packages/business/src/components/create-connection/SceneForm.vue index 34a6507228..41200a342e 100644 --- a/packages/business/src/components/create-connection/SceneForm.vue +++ b/packages/business/src/components/create-connection/SceneForm.vue @@ -86,11 +86,11 @@ import { } from '@tap/api' import { VIcon } from '@tap/component' import { SchemaToForm } from '@tap/form' -import { checkConnectionName, isEmpty, openUrl, submitForm } from '@tap/shared' +import { checkConnectionName, openUrl, submitForm } from '@tap/shared' import Test from '@tap/business/src/views/connections/Test' import { getConnectionIcon } from '@tap/business/src/views/connections/util' import resize from '@tap/component/src/directives/resize' -import { cloneDeep } from 'lodash' +import { cloneDeep, isEmpty } from 'lodash' import ConnectorDoc from '../ConnectorDoc' export default { diff --git a/packages/business/src/components/milestone/List.vue b/packages/business/src/components/milestone/List.vue index 4b76d695ba..9f8d89a673 100644 --- a/packages/business/src/components/milestone/List.vue +++ b/packages/business/src/components/milestone/List.vue @@ -12,10 +12,14 @@
diff --git a/packages/business/src/locale/lang/en.js b/packages/business/src/locale/lang/en.js index 016f59fadd..586fbeae67 100644 --- a/packages/business/src/locale/lang/en.js +++ b/packages/business/src/locale/lang/en.js @@ -580,7 +580,8 @@ export default { packages_business_verification_form_jiaoyanrenwumo: 'Validation task mode', packages_business_task_status_agent_tooltip_time: 'It has been {time} since the previous status report was issued.', packages_business_task_status_agent_tooltip_agent: 'The Agent where the task is located is', - packages_business_task_status_retrying_tooltip: 'The task is retrying', + packages_business_task_status_retrying_tooltip: + 'The current task entered a retry state on {val}. The system will monitor for one hour to confirm if the task has recovered from retry. Please ignore this alert if the task has returned to normal.', packages_business_select_placeholder: 'Please add or select', packages_business_verification_form_youjiantongzhi: 'Mail Notification', packages_business_verification_form_xitongtongzhi: 'System Notification', diff --git a/packages/business/src/locale/lang/zh-CN.js b/packages/business/src/locale/lang/zh-CN.js index a20f7cfc5e..b8d9510f16 100644 --- a/packages/business/src/locale/lang/zh-CN.js +++ b/packages/business/src/locale/lang/zh-CN.js @@ -556,7 +556,8 @@ export default { packages_business_verification_form_jiaoyanrenwumo: '校验任务模式', packages_business_task_status_agent_tooltip_time: '距上次状态上报时间已经{time}', packages_business_task_status_agent_tooltip_agent: '任务所在的引擎为', - packages_business_task_status_retrying_tooltip: '任务正在重试中', + packages_business_task_status_retrying_tooltip: + '当前任务在{val}进入重试状态,系统将持续观察一小时以确认任务是否退出重试恢复正常,如任务已恢复正常请忽略该提醒。', packages_business_select_placeholder: '请添加或选择', packages_business_verification_form_youjiantongzhi: '邮件通知', packages_business_verification_form_xitongtongzhi: '系统通知', diff --git a/packages/business/src/locale/lang/zh-TW.js b/packages/business/src/locale/lang/zh-TW.js index 3474aef730..31876c5f42 100644 --- a/packages/business/src/locale/lang/zh-TW.js +++ b/packages/business/src/locale/lang/zh-TW.js @@ -557,7 +557,8 @@ export default { packages_business_verification_form_jiaoyanrenwumo: '校驗任務模式', packages_business_task_status_agent_tooltip_time: '距上次狀態上報時間已經{time}', packages_business_task_status_agent_tooltip_agent: '任務所在的引擎為', - packages_business_task_status_retrying_tooltip: '任務正在重試中', + packages_business_task_status_retrying_tooltip: + '當前任務於{val}進入重試狀態,系統將持續觀察一小時以確認任務是否退出重試,恢復正常。如任務已恢復正常,請忽略該提醒。', packages_business_select_placeholder: '請添加或選擇', packages_business_verification_form_youjiantongzhi: '郵件通知', packages_business_verification_form_xitongtongzhi: '系統通知', diff --git a/packages/business/src/views/connections/DatabaseForm.vue b/packages/business/src/views/connections/DatabaseForm.vue index 2de9696672..8ed1826b46 100644 --- a/packages/business/src/views/connections/DatabaseForm.vue +++ b/packages/business/src/views/connections/DatabaseForm.vue @@ -281,9 +281,7 @@ export default { name: 'connections' }) } else { - this.$router.push({ - path: this.pathUrl - }) + this.$router.back() } }) }, @@ -334,18 +332,7 @@ export default { result: true }) this.$message.success(this.$t('public_message_save_ok')) - if (this.$route.query.step) { - this.$router.push({ - name: 'connections', - query: { - step: this.$route.query.step - } - }) - } else { - this.$router.push({ - name: 'connections' - }) - } + this.$router.back() }) .catch(() => { this.buried('connectionSubmit', '', { diff --git a/packages/business/src/views/connections/List.vue b/packages/business/src/views/connections/List.vue index 62b56d6d36..98e884fb74 100644 --- a/packages/business/src/views/connections/List.vue +++ b/packages/business/src/views/connections/List.vue @@ -347,15 +347,16 @@ export default { }) }, mounted() { - const { step, action, keyword } = this.$route.query || {} - if (step) { - this.handleGuide() - } + const { action } = this.$route.query || {} + if (action === 'create') { this.checkTestConnectionAvailable() } - if (keyword) { - this.searchParams.keyword = keyword + + for (const key in this.searchParams) { + if (key in this.$route.query) { + this.searchParams[key] = this.$route.query[key] + } } }, destroyed() { diff --git a/packages/business/src/views/order/Change.vue b/packages/business/src/views/order/Change.vue index ebd5f787d0..d8497f76b0 100644 --- a/packages/business/src/views/order/Change.vue +++ b/packages/business/src/views/order/Change.vue @@ -220,12 +220,7 @@ export default { this.specificationItems = uniqBy( paidPrice.map(t => { const { cpu = 0, memory = 0 } = t.spec || {} - let desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { - val: this.getSuggestPipelineNumber(cpu, memory) - }) - if (t.chargeProvider == 'FreeTier') { - desc = i18n.t('dfs_agent_download_subscriptionmodeldialog_mianfeishilizui') - } + return { label: getSpec(t.spec), value: getSpec(t.spec), @@ -233,7 +228,9 @@ export default { memory, name: t.spec.name.toUpperCase(), chargeProvider: t.chargeProvider, - desc: desc + desc: i18n.t('dfs_agent_download_subscriptionmodeldialog_renwushujianyi', { + val: t.limitTask + }) } }), 'value' diff --git a/packages/business/src/views/task/List.vue b/packages/business/src/views/task/List.vue index 5adaf65693..41cf4d20ee 100644 --- a/packages/business/src/views/task/List.vue +++ b/packages/business/src/views/task/List.vue @@ -545,7 +545,8 @@ export default { functionRetryStatus: true, taskRetryStatus: true, shareCdcStop: true, - shareCdcStopMessage: true + shareCdcStopMessage: true, + taskRetryStartTime: true } let where = { syncType @@ -1134,7 +1135,7 @@ export default { return } - items.length <= 1 && items.some(t => t.orderInfo?.chargeProvider === 'FreeTier') + items.length <= 1 && items.some(t => t.orderInfo?.chargeProvider === 'FreeTier' || !t.orderInfo?.amount) ? this.handleShowUpgradeFee() : this.handleShowUpgradeCharges() }) diff --git a/packages/business/src/views/verification/Form.vue b/packages/business/src/views/verification/Form.vue index e9645b7233..b0ed900a6a 100644 --- a/packages/business/src/views/verification/Form.vue +++ b/packages/business/src/views/verification/Form.vue @@ -773,15 +773,9 @@ export default { alarmSettings }) ).then(() => { - // this.$router.back() this.$message.success(this.$t('public_message_save_ok')) - this.$router.push({ - name: 'dataVerificationList' - }) + this.$router.back() // back 保留上个路由的参数 }) - // .catch(err => { - // this.$message.error(message) - // }) } }) }, diff --git a/packages/business/src/views/verification/components/ConditionBox.vue b/packages/business/src/views/verification/components/ConditionBox.vue index a5b610b07c..dcc86fd338 100644 --- a/packages/business/src/views/verification/components/ConditionBox.vue +++ b/packages/business/src/views/verification/components/ConditionBox.vue @@ -57,9 +57,8 @@ item.id === $supportFilterFunction)}}` + visible: `{{$values.source.capabilities && $values.source.capabilities.some(item => item.id === 'execute_command_function')}}` } } } ] }, - conditions: { - type: 'array', - title: ' ', - default: [{ key: '', value: '', operator: 5 }], - 'x-decorator': 'FormItem', - 'x-decorator-props': { - colon: false - }, - 'x-component': 'ArrayItems', - items: { - type: 'object', - properties: { - space: { - type: 'void', - 'x-component': 'Space', - properties: { - key: { - type: 'string', - required: 'true', - 'x-decorator': 'FormItem', - 'x-component': 'Select', - 'x-component-props': { - filterable: true - }, - enum: [] + customCommand: { + type: 'object', + properties: { + command: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + default: 'executeQuery', + 'x-decorator': 'FormItem', + 'x-component': 'Radio.Group', + enum: [ + { label: i18n.t('public_query'), value: 'executeQuery' }, + { label: i18n.t('public_aggregate'), value: 'aggregate' } + ], + 'x-reactions': { + dependencies: ['source.databaseType'], + fulfill: { + state: { + display: '{{$deps[0].toLowerCase().includes("mongo")?"visible":"hidden"}}' + } + } + } + }, + params: { + type: 'object', + properties: { + mongoQuery: { + title: ' ', + 'x-decorator-props': { + colon: false }, - operator: { - type: 'number', - required: 'true', - enum: [ - { - label: '>', - value: 1 - }, - { - label: '>=', - value: 2 - }, - { - label: '<', - value: 3 - }, - { - label: '<=', - value: 4 - }, - { - label: '=', - value: 5 + type: 'void', + 'x-reactions': { + dependencies: ['source.customCommand.command', 'source.databaseType'], + fulfill: { + state: { + visible: '{{$deps[1].toLowerCase().includes("mongo") && $deps[0]==="executeQuery"}}' } - ], - 'x-decorator': 'FormItem', - 'x-decorator-props': { - wrapperWidth: 100 - }, - 'x-component': 'Select' + } }, - value: { - type: 'string', - required: 'true', - 'x-decorator': 'FormItem', - 'x-component': 'Input', - 'x-component-props': { - type: 'datetime', - align: 'right', - format: 'yyyy-MM-dd HH:mm:ss' + properties: { + op: { + type: 'string', + default: 'find' }, - 'x-reactions': { - dependencies: ['.key', '.key#dataSource'], - fulfill: { - schema: { - 'x-component': `{{field=$deps[1] && $deps[1].find(item=>item.value===$deps[0]),field&&/timestamp|date|DATE_TIME|datetime/i.test(field.data_type)?"DatePicker":"Input"}}` + collection: { + type: 'string', + 'x-reactions': { + fulfill: { + state: { + value: '{{$values.tableName}}' + } } } + }, + filter: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + 'x-decorator': 'FormItem', + description: i18n.t('packages_dag_nodes_table_jinzhichiqu'), + 'x-component': 'JsonEditor', + 'x-component-props': { + options: { showPrintMargin: false, useWrapMode: true } + } } + } + }, + mongoAgg: { + title: ' ', + 'x-decorator-props': { + colon: false }, - remove: { - type: 'void', - 'x-decorator': 'FormItem', - 'x-component': 'ArrayItems.Remove', - 'x-component-props': { - disabled: '{{$values.source.conditions.length<2}}' + type: 'void', + 'x-reactions': { + dependencies: ['source.customCommand.command', 'source.databaseType'], + fulfill: { + state: { + visible: '{{$deps[1].toLowerCase().includes("mongo") && $deps[0]==="aggregate"}}' + } + } + }, + properties: { + collection: { + type: 'string', + 'x-reactions': { + dependencies: ['source.tableName'], + fulfill: { + state: { + value: '{{$deps[0]}}' + } + } + } + }, + pipeline: { + type: 'string', + title: ' ', + 'x-decorator-props': { + colon: false + }, + 'x-decorator': 'FormItem', + description: i18n.t('packages_dag_nodes_table_shiligro'), + 'x-component': 'JsonEditor', + 'x-component-props': { + options: { showPrintMargin: false, useWrapMode: true } + } + } + } + }, + sql: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'SqlEditor', + 'x-component-props': { + options: { showPrintMargin: false, useWrapMode: true } + }, + 'x-reactions': { + dependencies: ['source.enableCustomCommand', 'source.databaseType'], + fulfill: { + state: { + visible: '{{!!$deps[0] && !$deps[1].toLowerCase().includes("mongo")}}' + } } } } } } }, - properties: { - add: { - type: 'void', - title: i18n.t('packages_dag_nodes_table_tianjia'), - 'x-component': 'ArrayItems.Addition', - 'x-component-props': { - defaultValue: { key: '', value: '', operator: 5 } - } - } - }, 'x-reactions': [ { - dependencies: ['.isFilter'], + dependencies: ['source.enableCustomCommand'], fulfill: { state: { - visible: '{{!!$deps[0]}}' + visible: `{{$deps[0]}}` } } } @@ -531,6 +576,10 @@ export default { type: 'object', 'x-component': 'FormGrid.GridColumn', properties: { + databaseType: { + type: 'string', + 'x-display': 'hidden' + }, nodeSchema: { type: 'array', 'x-display': 'hidden', @@ -547,126 +596,169 @@ export default { } ] }, - isFilter: { - type: 'boolean', + enableCustomCommand: { title: i18n.t('packages_business_components_conditionbox_mubiaobiaoshuju'), + type: 'boolean', 'x-decorator': 'FormItem', + 'x-decorator-props': { + className: 'item-control-horizontal', + layout: 'horizontal', + tooltip: '' + }, 'x-component': 'Switch', default: false, 'x-reactions': [ { fulfill: { state: { - visible: `{{$values.target.capabilities && $values.target.capabilities.some(item => item.id === $supportFilterFunction)}}` + visible: `{{$values.target.capabilities && $values.target.capabilities.some(item => item.id === 'execute_command_function')}}` } } } ] }, - conditions: { - type: 'array', - title: ' ', - default: [{ key: '', value: '', operator: 5 }], - 'x-decorator': 'FormItem', - 'x-decorator-props': { - colon: false - }, - 'x-component': 'ArrayItems', - items: { - type: 'object', - properties: { - space: { - type: 'void', - 'x-component': 'Space', - properties: { - key: { - type: 'string', - required: 'true', - 'x-decorator': 'FormItem', - 'x-component': 'Select', - 'x-component-props': { - filterable: true - }, - enum: [] + customCommand: { + type: 'object', + properties: { + command: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + default: 'executeQuery', + 'x-decorator': 'FormItem', + 'x-component': 'Radio.Group', + enum: [ + { label: i18n.t('public_query'), value: 'executeQuery' }, + { label: i18n.t('public_aggregate'), value: 'aggregate' } + ], + 'x-reactions': { + dependencies: ['target.databaseType'], + fulfill: { + state: { + display: '{{$deps[0].toLowerCase().includes("mongo")?"visible":"hidden"}}' + } + } + } + }, + params: { + type: 'object', + properties: { + mongoQuery: { + title: ' ', + 'x-decorator-props': { + colon: false }, - operator: { - type: 'number', - required: 'true', - enum: [ - { - label: '>', - value: 1 - }, - { - label: '>=', - value: 2 - }, - { - label: '<', - value: 3 - }, - { - label: '<=', - value: 4 - }, - { - label: '=', - value: 5 + type: 'void', + 'x-reactions': { + dependencies: ['target.customCommand.command', 'target.databaseType'], + fulfill: { + state: { + visible: '{{$deps[1].toLowerCase().includes("mongo") && $deps[0]==="executeQuery"}}' } - ], - 'x-decorator': 'FormItem', - 'x-decorator-props': { - wrapperWidth: 100 - }, - 'x-component': 'Select' + } }, - value: { - type: 'string', - required: 'true', - 'x-decorator': 'FormItem', - 'x-component': 'Input', - 'x-component-props': { - type: 'datetime', - align: 'right', - format: 'yyyy-MM-dd HH:mm:ss' + properties: { + op: { + type: 'string', + default: 'find' }, - 'x-reactions': { - dependencies: ['.key', '.key#dataSource'], - fulfill: { - schema: { - 'x-component': `{{field=$deps[1] && $deps[1].find(item=>item.value===$deps[0]),field&&/timestamp|date|DATE_TIME|datetime/i.test(field.data_type)?"DatePicker":"Input"}}` + collection: { + type: 'string', + 'x-reactions': { + fulfill: { + state: { + value: '{{$values.tableName}}' + } } } + }, + filter: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + 'x-decorator': 'FormItem', + description: i18n.t('packages_dag_nodes_table_jinzhichiqu'), + 'x-component': 'JsonEditor', + 'x-component-props': { + options: { showPrintMargin: false, useWrapMode: true } + } } + } + }, + mongoAgg: { + title: ' ', + 'x-decorator-props': { + colon: false }, - remove: { - type: 'void', - 'x-decorator': 'FormItem', - 'x-component': 'ArrayItems.Remove', - 'x-component-props': { - disabled: '{{$values.target.conditions.length<2}}' + type: 'void', + 'x-reactions': { + dependencies: ['target.customCommand.command', 'target.databaseType'], + fulfill: { + state: { + visible: '{{$deps[1].toLowerCase().includes("mongo") && $deps[0]==="aggregate"}}' + } + } + }, + properties: { + collection: { + type: 'string', + 'x-reactions': { + dependencies: ['target.tableName'], + fulfill: { + state: { + value: '{{$deps[0]}}' + } + } + } + }, + pipeline: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + 'x-decorator': 'FormItem', + description: i18n.t('packages_dag_nodes_table_shiligro'), + 'x-component': 'JsonEditor', + 'x-component-props': { + options: { showPrintMargin: false, useWrapMode: true } + } + } + } + }, + sql: { + title: ' ', + 'x-decorator-props': { + colon: false + }, + type: 'string', + 'x-decorator': 'FormItem', + 'x-component': 'SqlEditor', + 'x-component-props': { + options: { showPrintMargin: false, useWrapMode: true } + }, + 'x-reactions': { + dependencies: ['target.enableCustomCommand', 'target.databaseType'], + fulfill: { + state: { + visible: '{{!!$deps[0] && !$deps[1].toLowerCase().includes("mongo")}}' + } } } } } } }, - properties: { - add: { - type: 'void', - title: i18n.t('packages_dag_nodes_table_tianjia'), - 'x-component': 'ArrayItems.Addition', - 'x-component-props': { - defaultValue: { key: '', value: '', operator: 5 } - } - } - }, 'x-reactions': [ { - dependencies: ['.isFilter'], + dependencies: ['target.enableCustomCommand'], fulfill: { state: { - visible: '{{!!$deps[0]}}' + visible: `{{$deps[0]}}` } } } diff --git a/packages/dag/src/Editor.vue b/packages/dag/src/Editor.vue index d75f39f13b..8e063ff8a8 100644 --- a/packages/dag/src/Editor.vue +++ b/packages/dag/src/Editor.vue @@ -98,7 +98,11 @@ + + @@ -217,6 +219,7 @@ import NodeDetailDialog from './components/monitor/components/NodeDetailDialog' import { TIME_FORMAT_MAP, getTimeGranularity } from './components/monitor/util' import AlarmStatistics from './components/monitor/components/AlarmStatistics' import ConsolePanel from './components/migration/ConsolePanel' +import MaterializedView from './components/materialized-view/MaterializedView.vue' export default { name: 'MigrationMonitor', @@ -228,6 +231,7 @@ export default { mixins: [deviceSupportHelpers, titleChange, showMessage, formScope, editor], components: { + MaterializedView, UpgradeFee, UpgradeCharges, AlarmStatistics, diff --git a/packages/dag/src/components/BaseNode.vue b/packages/dag/src/components/BaseNode.vue index 1e74acc5e9..24dfea19ae 100644 --- a/packages/dag/src/components/BaseNode.vue +++ b/packages/dag/src/components/BaseNode.vue @@ -194,7 +194,7 @@ $height: 30px; } } - &:hover/*:not(.node--disabled:not(.node--disabled__main))*/ { + &:hover:not(.node--disabled:not(.node--disabled__main)) { .df-node-options { display: flex; } diff --git a/packages/dag/src/components/DFNode.vue b/packages/dag/src/components/DFNode.vue index bf061c5b1d..e9e1e80d13 100644 --- a/packages/dag/src/components/DFNode.vue +++ b/packages/dag/src/components/DFNode.vue @@ -11,7 +11,7 @@ /> beta -
+
action-add
-
- action-delete -
+ +
+ action-delete +
warning diff --git a/packages/dag/src/components/TopHeader.vue b/packages/dag/src/components/TopHeader.vue index 3737a75a4d..4e673e3d86 100644 --- a/packages/dag/src/components/TopHeader.vue +++ b/packages/dag/src/components/TopHeader.vue @@ -12,6 +12,7 @@ max-width="260" hidden-icon :input-min-width="32" + :maxlength="200" @change="onNameInputChange" /> diff --git a/packages/dag/src/components/form/merge-table-tree/index.js b/packages/dag/src/components/form/merge-table-tree/index.js index ed42f5b17b..0df88b8d14 100644 --- a/packages/dag/src/components/form/merge-table-tree/index.js +++ b/packages/dag/src/components/form/merge-table-tree/index.js @@ -2,8 +2,8 @@ import i18n from '@tap/i18n' import { defineComponent, ref, watch, onMounted, computed, nextTick } from '@vue/composition-api' import { observer } from '@formily/reactive-vue' import { observe } from '@formily/reactive' -import { FormItem, Space, h as createElement, useFieldSchema, useForm, RecursionField } from '@tap/form' -import { getNodeIconSrc } from '@tap/business' +import { FormItem, h as createElement, useFieldSchema, useForm, RecursionField } from '@tap/form' +import { OverflowTooltip, IconButton } from '@tap/component' import { metadataInstancesApi } from '@tap/api' import './style.scss' import NodeIcon from '../../NodeIcon' @@ -14,11 +14,7 @@ export const MergeTableTree = observer( value: Array, disabled: Boolean, findNodeById: Function, - loadFieldsMethod: Function, - treeWidth: { - type: [Number, String], - default: 320 - } + loadFieldsMethod: Function }, setup(props, { emit, refs, root }) { const formRef = useForm() @@ -27,14 +23,6 @@ export const MergeTableTree = observer( const treeRef = ref([]) const currentKey = ref('') const currentPath = ref('') - const treeStyle = computed(() => { - let width = props.treeWidth - if (!isNaN(width)) width += 'px' - return { - width - } - }) - const setPath = pathArr => { const path = pathArr.join('.children.') currentPath.value = path @@ -52,8 +40,6 @@ export const MergeTableTree = observer( watch( treeRef, val => { - // eslint-disable-next-line - console.log('🤖MergeTableTree.watch', val, treeRef.value) emit('change', JSON.parse(JSON.stringify(val))) }, { deep: true } @@ -113,8 +99,6 @@ export const MergeTableTree = observer( makeTree() observe(formRef.value.values.$inputs, () => { - // eslint-disable-next-line - console.log('formRef.value.values.$inputs', formRef.value.values.$inputs) makeTree() }) @@ -123,9 +107,12 @@ export const MergeTableTree = observer( if (!dagNode) return return ( -
+
-
{dagNode.name}
+ + emit('center-node', data.id)} class="merge-table-tree-node-action"> + location +
) } @@ -135,7 +122,6 @@ export const MergeTableTree = observer( const nodePath = refs.tree.getNodePath(node) nodePath.reduce((parent, item) => { if (parent) { - // temp.push(parent.indexOf(item)) temp.push(parent.findIndex(p => p.id === item.id)) } return item.children @@ -213,14 +199,16 @@ export const MergeTableTree = observer( return () => { return ( - +
-
+
{currentPath.value && createElement( RecursionField, { - // key: currentPath.value, - // key: `${currentKey.value}_${currentPath.value}`, props: { onlyRenderProperties: true, name: currentPath.value, @@ -250,7 +236,7 @@ export const MergeTableTree = observer( {} )}
- +
) } } diff --git a/packages/dag/src/components/form/merge-table-tree/style.scss b/packages/dag/src/components/form/merge-table-tree/style.scss index 59c8dc81bf..186491f65a 100644 --- a/packages/dag/src/components/form/merge-table-tree/style.scss +++ b/packages/dag/src/components/form/merge-table-tree/style.scss @@ -1,7 +1,7 @@ .merge-table-tree-space { - padding: 0 12px; border-radius: 4px; border: 1px solid rgba(221, 221, 221, 0.4); + max-height: calc(100vh - 120px); hr.v-divider { border-color: rgba(221, 221, 221, 0.4); @@ -13,8 +13,6 @@ .el-tree { &-node { - margin-top: 1px; - &__content { height: 30px; border-radius: 4px; @@ -64,4 +62,14 @@ } } } + + .merge-table-tree-node { + &-action { + display: none; + } + + &:hover .merge-table-tree-node-action { + display: inline-flex; + } + } } diff --git a/packages/dag/src/components/materialized-view/MaterializedView.vue b/packages/dag/src/components/materialized-view/MaterializedView.vue index 2e71fe3a53..13e9cd4226 100644 --- a/packages/dag/src/components/materialized-view/MaterializedView.vue +++ b/packages/dag/src/components/materialized-view/MaterializedView.vue @@ -12,7 +12,7 @@
{{ $t('packages_dag_materialized_view') }}
- + @@ -71,9 +71,21 @@
+ + {{ $t('public_button_start') }} + { + return {} + } + } }, components: { VIcon, VDivider, PaperScroller, TargetNode, Node, IconButton }, @@ -164,7 +186,7 @@ export default { }, computed: { - ...mapGetters('dataflow', ['allNodes', 'activeNode', 'nodeById']), + ...mapGetters('dataflow', ['allNodes', 'activeNode', 'nodeById', 'transformLoading']), ...mapState('dataflow', ['taskSaving']), scaleTxt() { @@ -231,7 +253,7 @@ export default { mounted() { Mousetrap(this.$refs.container).bind(['backspace', 'del'], () => { - this.visible && this.handleDelete() + this.visible && !this.disabled && this.handleDelete() }) Mousetrap(this.$refs.container).bind(['option+command+l', 'ctrl+alt+l'], e => { e.preventDefault() @@ -271,7 +293,7 @@ export default { this.$refs.paperScroller.centerContent(false, 24, allNodes, '') }, - handleDelete() { + async handleDelete() { if (!this.selectedNodeId || this.nodes.length === 1) return const { selectedNodeId: id } = this @@ -294,6 +316,10 @@ export default { const indexOfParent = parentNode.children.findIndex(n => n.id === id) ~indexOfParent && parentNode.children.splice(indexOfParent, 1) parentNode.children.push(...childrenNodes) + + // 从父节点的输入上删除 + const oldIndex = this.inputsMap[parentNode.id].indexOf(id) + this.inputsMap[parentNode.id].splice(oldIndex, 1) } else { const { mergeProperties } = this.activeNode const index = mergeProperties.findIndex(n => n.id === id) @@ -320,6 +346,9 @@ export default { } this.$emit('delete-node', id) + + await this.afterTaskSaved() + await this.onLoadTargetSchema(this.targetNode.id) }, handleZoomIn() { @@ -647,7 +676,7 @@ export default { if (this.targetNode?.id) { // 更新目标节点schema await this.afterTaskSaved() - await this.loadNodeSchema(this.targetNode.id) + await this.onLoadTargetSchema(this.targetNode.id) } }, @@ -751,7 +780,6 @@ export default { afterTaskSaved() { return new Promise(resolve => { setTimeout(() => { - console.log('afterTaskSaved', this.taskSaving) if (this.taskSaving) { let unwatch = this.$watch('taskSaving', () => { unwatch() diff --git a/packages/dag/src/components/materialized-view/Node.vue b/packages/dag/src/components/materialized-view/Node.vue index 36c2fe7044..dcd511b8cf 100644 --- a/packages/dag/src/components/materialized-view/Node.vue +++ b/packages/dag/src/components/materialized-view/Node.vue @@ -25,6 +25,7 @@
- + +
diff --git a/packages/dag/src/components/migration/SettingPanel.vue b/packages/dag/src/components/migration/SettingPanel.vue index b4aa3d5cea..8479ceda91 100644 --- a/packages/dag/src/components/migration/SettingPanel.vue +++ b/packages/dag/src/components/migration/SettingPanel.vue @@ -6,12 +6,11 @@ import i18n from '@tap/i18n' import { mapGetters } from 'vuex' -import { createForm, onFieldValueChange, onFormInputChange, onFormValuesChange } from '@formily/core' -// import { observable } from '@formily/reactive' +import { createForm, onFieldInputValueChange, onFieldValueChange } from '@formily/core' import { observer } from '@formily/reactive-vue' import FormRender from '../FormRender' import { debounce } from 'lodash' -import { alarmApi, taskApi, usersApi, dataPermissionApi } from '@tap/api' +import { alarmApi, dataPermissionApi, taskApi, usersApi } from '@tap/api' import { getPickerOptionsBeforeTime } from '@tap/business/src/shared/util' import { FormTab } from '../../../../form' import { action } from '@formily/reactive' @@ -132,6 +131,27 @@ export default observer({ handleRemovePermissionsItem: () => { this.savePermissionsConfig() + }, + + getConnectionNameByAgent: field => { + // 消费收集下 field.dataSource 的依赖,当选项改变时重新执行该方法 + if (!field.value || !field.dataSource?.length || !this.accessNodeProcessIdMap[field.value]) { + field.setDescription('') + return + } + + const map = {} + + for (const id of this.accessNodeProcessIdMap[field.value]) { + const node = this.$store.state.dataflow.NodeMap[id] + map[node.connectionId] = node.attrs.connectionName + } + + const values = Object.values(map) + + field.setDescription( + values.length ? `${this.$t('packages_dag_agent_setting_from')}: ${values.join(', ')}` : '' + ) } }, @@ -644,7 +664,8 @@ export default observer({ effects: ['onFieldInputValueChange'], fulfill: { state: { - value: '{{$target.value || $target.dataSource[0].value}}' + value: + '{{$target.value || (item = $target.dataSource.find(item => !item.disabled), item ? item.value:undefined)}}' } } } @@ -653,7 +674,8 @@ export default observer({ accessNodeProcessId: { type: 'string', 'x-decorator': 'FormItem', - 'x-component': 'Select' + 'x-component': 'Select', + 'x-reactions': '{{getConnectionNameByAgent}}' } } } @@ -1088,19 +1110,31 @@ export default observer({ computed: { ...mapGetters('dataflow', ['stateIsReadonly', 'allNodes']), - accessNodeProcessIdArr() { - const set = this.allNodes + accessNodeProcessIdMap() { + return this.allNodes .filter(item => item.type === 'database' || item.type === 'table') - .reduce((set, item) => { - item.attrs.accessNodeProcessId && set.add(item.attrs.accessNodeProcessId) - return set - }, new Set()) - return [...set] + .reduce((map, node) => { + const { accessNodeProcessId } = node.attrs + if (accessNodeProcessId) { + let nodeIdArr = map[accessNodeProcessId] + + if (!nodeIdArr) { + nodeIdArr = map[accessNodeProcessId] = [] + } + + nodeIdArr.push(node.id) + } + return map + }, {}) + }, + + accessNodeProcessIdArr() { + return Object.keys(this.accessNodeProcessIdMap) }, accessNodeProcessList() { if (!this.accessNodeProcessIdArr.length) return this.scope.$agents - return this.scope.$agents.filter(item => this.accessNodeProcessIdArr.includes(item.value)) + return this.scope.$agents.filter(item => !!this.accessNodeProcessIdMap[item.value]) }, sourceNodes() { @@ -1155,6 +1189,7 @@ export default observer({ }, immediate: true }, + accessNodeProcessList: { handler(dataSource = []) { this.form.setFieldState('accessNodeProcessId', { @@ -1216,7 +1251,7 @@ export default observer({ methods: { // 绑定表单事件 useEffects() { - onFieldValueChange('*(alarmSettings.*.*,alarmRules.*.*)', (field, form) => { + onFieldInputValueChange('*(alarmSettings.*.*,alarmRules.*.*)', (field, form) => { if (this.stateIsReadonly) this.lazySaveAlarmConfig() }) // 权限设置修改了 @@ -1226,12 +1261,16 @@ export default observer({ }, saveAlarmConfig() { - if (!this.form.values?.id || !this.form.values?.name) { + const { values } = this.form + + if (!values?.id || !values?.name) { return } + taskApi.patch({ - id: this.form.values.id, - ...JSON.parse(JSON.stringify(this.form.values)) + id: values.id, + alarmSettings: values.alarmSettings, + alarmRules: values.alarmRules }) }, diff --git a/packages/dag/src/components/monitor/TopHeader.vue b/packages/dag/src/components/monitor/TopHeader.vue index c2b5690131..c06c83d0ef 100644 --- a/packages/dag/src/components/monitor/TopHeader.vue +++ b/packages/dag/src/components/monitor/TopHeader.vue @@ -11,6 +11,7 @@ v-model="name" :placeholder="$t('packages_dag_monitor_topheader_qingshururenwu')" :input-min-width="32" + :maxlength="200" @change="onNameInputChange" /> diff --git a/packages/dag/src/locale/lang/en.js b/packages/dag/src/locale/lang/en.js index ae0b0c025a..d267bf5c68 100644 --- a/packages/dag/src/locale/lang/en.js +++ b/packages/dag/src/locale/lang/en.js @@ -58,6 +58,7 @@ export default { packages_dag_dag_data_setting_runMinute: 'Run every minute', packages_dag_dag_data_setting_runDay: "Run at 2 o'clock every day", packages_dag_connection_form_access_node: 'Agent Settings', + packages_dag_agent_setting_from: 'Agent settings derive from the following', packages_dag_connection_form_automatic: 'Platform automatic allocation', packages_dag_connection_form_manual: 'User specified manually', packages_dag_task_setting_automatic_ddl: 'Automatic DDL', @@ -324,6 +325,7 @@ export default { packages_dag_nodes_aggregate_juhehanshu: 'Aggregate Function', packages_dag_nodes_database_zengliangduoxiancheng: 'Incremental multi-threaded write', packages_dag_nodes_database_quanliangduoxiancheng: 'Full multi-threaded write', + packages_dag_nodes_database_duoxianchengfenqujian: 'Multithreaded Write - Partition Key', packages_dag_nodes_database_bucunzaishidiu: 'Discard if not exists', packages_dag_nodes_database_shanchushijian: 'Delete Event', packages_dag_nodes_database_bucunzaishicha: 'Insert if not exists', @@ -391,6 +393,7 @@ export default { packages_dag_nodes_table_fuzhibiaoming: 'Copy table name', packages_dag_nodes_table_qingxuanzebiao: 'Please select a table', packages_dag_nodes_table_fuzhishujuku: 'Copy database name', + packages_dag_copy_node_id: 'Copy Node ID', packages_dag_nodes_table_shujuku: 'Database', packages_dag_nodes_targetdatabase_mubiaocunzaishi: 'Update when target exists', packages_dag_nodes_targetdatabase_baochimubiaoduan: @@ -530,7 +533,7 @@ export default { packages_dag_js_processor_index_riqichuli: 'Date Processing', packages_dag_merge_table_tree_index_biaozhijianketong: 'Tables can be nested by dragging and dropping to determine the master-slave relationship', - packages_dag_merge_table_tree_index_biaomingchengzhichi: 'Table Name (support drag and drop)', + packages_dag_merge_table_tree_index_biaomingchengzhichi: 'Table Name', packages_dag_migration_settingpanel_cronbiao: 'Cron expression format error', packages_dag_hooks_useaftertasksaved_moxingyishengcheng: 'The model has been generated, execute callback', packages_dag_mixins_editor_wsshoudaole: 'Ws received the return of other tasks', @@ -698,5 +701,6 @@ export default { packages_dag_unwind_preserveNullAndEmptyArrays: 'Preserve Empty and Null Arrays', packages_dag_unwind_preserveNullAndEmptyArrays_tips: 'If true, if the path is null, missing, or an empty array, outputs the document.\nIf false, if path is null, missing, or an empty array, does not output a document.', - packages_dag_btn_disable_node: 'Disable Node' + packages_dag_btn_disable_node: 'Disable Node', + packages_dag_only_mongodb: 'Supports MongoDB databases only.' } diff --git a/packages/dag/src/locale/lang/zh-CN.js b/packages/dag/src/locale/lang/zh-CN.js index 7e6fd88215..850b91a38c 100644 --- a/packages/dag/src/locale/lang/zh-CN.js +++ b/packages/dag/src/locale/lang/zh-CN.js @@ -52,6 +52,7 @@ export default { packages_dag_dag_data_setting_runMinute: '每分钟运行一次', packages_dag_dag_data_setting_runDay: '每天2点运行', packages_dag_connection_form_access_node: 'agent设置', + packages_dag_agent_setting_from: 'agent设置来源于以下连接', packages_dag_connection_form_automatic: '平台自动分配', packages_dag_connection_form_manual: '用户手动指定', packages_dag_task_setting_automatic_ddl: '自动DDL', @@ -311,6 +312,7 @@ export default { packages_dag_nodes_aggregate_juhehanshu: '聚合函数', packages_dag_nodes_database_zengliangduoxiancheng: '增量多线程写入', packages_dag_nodes_database_quanliangduoxiancheng: '全量多线程写入', + packages_dag_nodes_database_duoxianchengfenqujian: '多线程写入-分区键', packages_dag_nodes_database_bucunzaishidiu: '不存在时丢弃', packages_dag_nodes_database_shanchushijian: '删除事件', packages_dag_nodes_database_bucunzaishicha: '不存在时插入', @@ -377,6 +379,7 @@ export default { packages_dag_nodes_table_fuzhibiaoming: '复制表名', packages_dag_nodes_table_qingxuanzebiao: '请选择表', packages_dag_nodes_table_fuzhishujuku: '复制数据库名', + packages_dag_copy_node_id: '复制节点ID', packages_dag_nodes_table_shujuku: '数据库', packages_dag_nodes_targetdatabase_mubiaocunzaishi: '目标存在时更新', packages_dag_nodes_targetdatabase_baochimubiaoduan: '保持目标端原有表结构,清除数据', @@ -659,5 +662,6 @@ export default { packages_dag_unwind_preserveNullAndEmptyArrays: '保留NULL或空数组', packages_dag_unwind_preserveNullAndEmptyArrays_tips: '如果为true,数组为null或为空数组时输出文档。\n如果为false,数组为null或为空数组时不会输出文档。', - packages_dag_btn_disable_node: '禁用节点' + packages_dag_btn_disable_node: '禁用节点', + packages_dag_only_mongodb: '仅支持 MongoDB 数据库' } diff --git a/packages/dag/src/locale/lang/zh-TW.js b/packages/dag/src/locale/lang/zh-TW.js index 3989abbfba..df134b63d1 100644 --- a/packages/dag/src/locale/lang/zh-TW.js +++ b/packages/dag/src/locale/lang/zh-TW.js @@ -52,6 +52,7 @@ export default { packages_dag_dag_data_setting_runMinute: '每分鐘運行一次', packages_dag_dag_data_setting_runDay: '每天2點運行', packages_dag_connection_form_access_node: 'agent設置', + packages_dag_agent_setting_from: '代理设置來自以下連結', packages_dag_connection_form_automatic: '平台自動分配', packages_dag_connection_form_manual: '用戶手動指定', packages_dag_task_setting_automatic_ddl: '自動DDL', @@ -311,6 +312,7 @@ export default { packages_dag_nodes_aggregate_juhehanshu: '聚合函數', packages_dag_nodes_database_zengliangduoxiancheng: '增量多線程寫入', packages_dag_nodes_database_quanliangduoxiancheng: '全量多線程寫入', + packages_dag_nodes_database_duoxianchengfenqujian: '多線程寫入-分區鍵', packages_dag_nodes_database_bucunzaishidiu: '不存在時丟棄', packages_dag_nodes_database_shanchushijian: '刪除事件', packages_dag_nodes_database_bucunzaishicha: '不存在時插入', @@ -376,6 +378,7 @@ export default { packages_dag_nodes_table_fuzhibiaoming: '複製表名', packages_dag_nodes_table_qingxuanzebiao: '請選擇表', packages_dag_nodes_table_fuzhishujuku: '複製數據庫名', + packages_dag_copy_node_id: '複製節點ID', packages_dag_nodes_table_shujuku: '數據庫', packages_dag_nodes_targetdatabase_mubiaocunzaishi: '目標存在時更新', packages_dag_nodes_targetdatabase_baochimubiaoduan: '保持目標端原有表結構,清除數據', @@ -645,5 +648,6 @@ export default { packages_dag_unwind_preserveNullAndEmptyArrays: '保留NULL或空數組', packages_dag_unwind_preserveNullAndEmptyArrays_tips: '如果為true,數組為null或為空數組时輸出文檔。\n如果為false,數組為null或為空數組时不會輸出文檔。', - packages_dag_btn_disable_node: '禁用節點' + packages_dag_btn_disable_node: '禁用節點', + packages_dag_only_mongodb: '僅支持 MongoDB 數據庫' } diff --git a/packages/dag/src/mixins/editor.js b/packages/dag/src/mixins/editor.js index b5e3f4057c..bac98d0416 100644 --- a/packages/dag/src/mixins/editor.js +++ b/packages/dag/src/mixins/editor.js @@ -206,7 +206,10 @@ export default { // 连线 edges.forEach(({ source, target }) => { - this.jsPlumbIns.connect({ uuids: [`${NODE_PREFIX}${source}_source`, `${NODE_PREFIX}${target}_target`] }) + this.jsPlumbIns.connect({ + uuids: [`${NODE_PREFIX}${source}_source`, `${NODE_PREFIX}${target}_target`], + cssClass: this.nodeById(source).attrs.disabled ? 'connection-disabled' : '' + }) }) }, @@ -371,6 +374,7 @@ export default { const source = this.nodeById(sourceId) const target = this.nodeById(targetId) + if (target.attrs.disabled) return false if (!this.checkAsTarget(target, showMsg)) return false if (!this.checkTargetMaxInputs(target, showMsg)) return false return this.allowConnect(sourceId, targetId) && this.checkAllowTargetOrSource(source, target, showMsg) @@ -715,12 +719,6 @@ export default { } }) } - - // makeStatusAndDisabled(data) - // this.$set(this.dataflow, 'status', data.status) - // this.$set(this.dataflow, 'disabledData', data.btnDisabled) - // this.$set(this.dataflow, 'taskRecordId', data.taskRecordId) - // console.log('this.dataflow', this.dataflow) // eslint-disable-line }, async confirmMessage(message, headline, type, confirmButtonText, cancelButtonText) { @@ -843,7 +841,7 @@ export default { const connectionIns = info.connection info.connection.bind('click', () => { - if (this.stateIsReadonly) return + if (this.stateIsReadonly || connectionIns.hasClass('connection-disabled')) return this.handleDeselectAllConnections() info.connection.showOverlay('removeConn') info.connection.showOverlay('addNodeOnConn') @@ -851,14 +849,15 @@ export default { this.selectConnection(connection) }) info.connection.bind('mouseover', () => { - if (!this.stateIsReadonly) { - info.connection.showOverlay('removeConn') - info.connection.showOverlay('addNodeOnConn') - } + if (this.stateIsReadonly || connectionIns.hasClass('connection-disabled')) return + + info.connection.showOverlay('removeConn') + info.connection.showOverlay('addNodeOnConn') }) info.connection.bind('mouseout', () => { if ( - connectionIns.hasClass('connection-selected') /* || + connectionIns.hasClass('connection-selected') || + connectionIns.hasClass('connection-disabled') /* || (this.nodeMenu.show && this.nodeMenu.reference === connectionIns.canvas)*/ ) return @@ -935,6 +934,9 @@ export default { if (this.stateIsReadonly) return false // 根据连接类型判断,节点是否仅支持作为目标 const node = this.nodeById(this.getRealId(sourceId)) + + if (node.disabled || node.attrs.disabled) return false + return this.checkAsSource(node, true) }) @@ -942,7 +944,9 @@ export default { jsPlumbIns.bind('connectionDrag', info => { if (this.stateIsReadonly) return false const source = this.nodeById(this.getRealId(info.sourceId)) - const canBeConnectedNodes = this.allNodes.filter(target => this.checkCanBeConnected(source.id, target.id)) + const canBeConnectedNodes = this.allNodes.filter( + target => !target.attrs.disabled && this.checkCanBeConnected(source.id, target.id) + ) this.setCanBeConnectedNodeIds(canBeConnectedNodes.map(n => n.id)) }) @@ -1027,22 +1031,24 @@ export default { this.nodeMenu.show = false // 防止节点删除后,popover仍在显示 }, - findParentNodes(id) { + findParentNodes(id, excludeId) { let node = this.scope.findNodeById(id) const nodes = [] let parentIds = node.$inputs || [] - parentIds.forEach(id => { - let node = this.scope.findNodeById(id) + for (const parentId of parentIds) { + if (parentId === excludeId) continue - if (!node || node.__Ctor.maxInputs !== 1 || node.$outputs.length > 1) return + let node = this.scope.findNodeById(parentId) + + if (!node || node.__Ctor.maxInputs !== 1 || node.$outputs.length > 1) continue nodes.push(node) if (node.$inputs?.length) { - nodes.push(...this.findParentNodes(id)) + nodes.push(...this.findParentNodes(parentId)) } - }) + } return nodes }, @@ -1053,13 +1059,18 @@ export default { let ids = node.$outputs || [] ids.forEach(id => { - let node = this.scope.findNodeById(id) + let child = this.scope.findNodeById(id) - if (!node || node.__Ctor.maxInputs !== 1) return + if (!child) return - nodes.push(node) + // Join 节点特殊处理,整个Join链路禁用 + if (child.type === 'join_processor') { + nodes.push(...this.findParentNodes(child.id, node.id)) + } else if (child.__Ctor.maxInputs !== 1) return + + nodes.push(child) - if (node.$outputs?.length) { + if (child.$outputs?.length) { nodes.push(...this.findChildNodes(id)) } }) @@ -1095,12 +1106,19 @@ export default { target: NODE_PREFIX + node.id }) ) + connections.push( + ...this.jsPlumbIns.getConnections({ + source: NODE_PREFIX + node.id + }) + ) }) const handler = value ? 'addClass' : 'removeClass' connections.forEach(connection => { connection[handler]('connection-disabled') }) + + this.updateDag({ vm: this }) }, handleZoomIn() { @@ -1278,9 +1296,9 @@ export default { } }, - async validateAllNodes() { + async validateAllNodes(nodes) { await Promise.all( - this.allNodes.map(node => { + nodes.map(node => { if (this.activeNodeId === node.id) { return this.$refs.configPanel.validateForm() } else { @@ -1572,9 +1590,16 @@ export default { async validate() { if (!this.dataflow.name) return this.$t('packages_dag_editor_cell_validate_empty_name') - if (!this.allNodes.length) return this.$t('packages_dag_editor_cell_validate_none_data_node') - await this.validateAllNodes() + const nodes = this.allNodes.filter(node => { + return !node.disabled && !node.attrs.disabled + }) + + if (nodes.length < 2) { + return this.$t('packages_dag_editor_cell_validate_none_data_node') + } + + await this.validateAllNodes(nodes) return await this.eachValidate( this.validateSetting, @@ -2409,7 +2434,7 @@ export default { return } - items.length <= 1 && items.some(t => t.orderInfo?.chargeProvider === 'FreeTier') + items.length <= 1 && items.some(t => t.orderInfo?.chargeProvider === 'FreeTier' || !t.orderInfo?.amount) ? this.handleShowUpgradeFee() : this.handleShowUpgradeCharges() }) diff --git a/packages/dag/src/mixins/formScope.js b/packages/dag/src/mixins/formScope.js index d4048e0a98..5a595b1fd4 100644 --- a/packages/dag/src/mixins/formScope.js +++ b/packages/dag/src/mixins/formScope.js @@ -1,7 +1,7 @@ import i18n from '@tap/i18n' import { action } from '@formily/reactive' import { mapGetters, mapState } from 'vuex' -import { merge, isEqual } from 'lodash' +import { merge, isEqual, isEmpty } from 'lodash' import { connectionsApi, metadataInstancesApi, clusterApi, proxyApi, databaseTypesApi, alarmApi } from '@tap/api' import { externalStorageApi } from '@tap/api' import { isPlainObj } from '@tap/shared' @@ -880,6 +880,26 @@ export default { return !$values.updateConditionFields?.length ? i18n.t('packages_dag_mixins_formscope_gaiziduanshibi') : '' }, + validateConcurrentWritePartitionMap: async (value, rule, ctx) => { + const { field, form } = ctx + const $values = form.values + if (!$values.$inputs[0]) { + return + } + + let flag = false + const concurrentWritePartitionMap = JSON.parse(JSON.stringify($values.concurrentWritePartitionMap)) + if (isEmpty(concurrentWritePartitionMap)) { + flag = true + } + for (let key in concurrentWritePartitionMap) { + if (!concurrentWritePartitionMap[key]?.length) { + flag = true + } + } + return flag ? i18n.t('packages_dag_mixins_formscope_gaiziduanshibi') : '' + }, + validateTableNames: (value, rule, ctx) => { const { field, form } = ctx const $values = form.values @@ -949,6 +969,13 @@ export default { } return options + }, + + centerNode: nodeId => { + this.$refs.paperScroller.centerNode(this.$store.state.dataflow.NodeMap[nodeId]) + setTimeout(() => { + this.nodeSelectedById(nodeId, false, true) + }, 300) } } } @@ -986,7 +1013,8 @@ export default { afterTaskSaved() { return new Promise(resolve => { if (this.taskSaving) { - this.$watch('taskSaving', () => { + let unwatch = this.$watch('taskSaving', () => { + unwatch() resolve() }) } else { diff --git a/packages/dag/src/nodes/Database.js b/packages/dag/src/nodes/Database.js index ce91d4f37c..9c77178510 100644 --- a/packages/dag/src/nodes/Database.js +++ b/packages/dag/src/nodes/Database.js @@ -67,12 +67,45 @@ export class Database extends NodeType { columnGap: 16 }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, 'attrs.connectionName': { type: 'string', diff --git a/packages/dag/src/nodes/DateProcessor.js b/packages/dag/src/nodes/DateProcessor.js index f7981785ec..ffc9913d2d 100644 --- a/packages/dag/src/nodes/DateProcessor.js +++ b/packages/dag/src/nodes/DateProcessor.js @@ -35,12 +35,45 @@ export class DateProcessor extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, dataTypes: { type: 'array', diff --git a/packages/dag/src/nodes/FieldAddDel.js b/packages/dag/src/nodes/FieldAddDel.js index ed76dc8a9c..5fd6af2720 100644 --- a/packages/dag/src/nodes/FieldAddDel.js +++ b/packages/dag/src/nodes/FieldAddDel.js @@ -34,12 +34,45 @@ export class FieldAddDel extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, operations: { type: 'array', diff --git a/packages/dag/src/nodes/FieldCalc.js b/packages/dag/src/nodes/FieldCalc.js index 3fee2bfc4d..0ccec80440 100644 --- a/packages/dag/src/nodes/FieldCalc.js +++ b/packages/dag/src/nodes/FieldCalc.js @@ -34,12 +34,45 @@ export class FieldCalc extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, scripts: { type: 'array', diff --git a/packages/dag/src/nodes/FieldModType.js b/packages/dag/src/nodes/FieldModType.js index 4e8cd9a400..65fc4d44e1 100644 --- a/packages/dag/src/nodes/FieldModType.js +++ b/packages/dag/src/nodes/FieldModType.js @@ -34,12 +34,45 @@ export class FieldModType extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, operations: { type: 'array', diff --git a/packages/dag/src/nodes/FieldModTypeFilter.js b/packages/dag/src/nodes/FieldModTypeFilter.js index bdd0b560a9..f2ad0c74cf 100644 --- a/packages/dag/src/nodes/FieldModTypeFilter.js +++ b/packages/dag/src/nodes/FieldModTypeFilter.js @@ -34,12 +34,45 @@ export class FieldModTypeFilter extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, filterTypes: { type: 'array', diff --git a/packages/dag/src/nodes/FieldProcessor.js b/packages/dag/src/nodes/FieldProcessor.js index 90f08e73fc..b745f66478 100644 --- a/packages/dag/src/nodes/FieldProcessor.js +++ b/packages/dag/src/nodes/FieldProcessor.js @@ -35,12 +35,45 @@ export class FieldProcessor extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, fieldsOperation: { type: 'object', diff --git a/packages/dag/src/nodes/FieldRename.js b/packages/dag/src/nodes/FieldRename.js index 0195e93da0..d7800c9629 100644 --- a/packages/dag/src/nodes/FieldRename.js +++ b/packages/dag/src/nodes/FieldRename.js @@ -35,12 +35,45 @@ export class FieldRename extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, operations: { type: 'array', diff --git a/packages/dag/src/nodes/JavaScript.js b/packages/dag/src/nodes/JavaScript.js index 7e8981ba42..05c5d79a7c 100644 --- a/packages/dag/src/nodes/JavaScript.js +++ b/packages/dag/src/nodes/JavaScript.js @@ -38,12 +38,45 @@ export class JavaScript extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, jsType: { type: 'number', diff --git a/packages/dag/src/nodes/Join.js b/packages/dag/src/nodes/Join.js index 36fc8c6e0a..3dbd8ebd85 100644 --- a/packages/dag/src/nodes/Join.js +++ b/packages/dag/src/nodes/Join.js @@ -55,12 +55,45 @@ export class Join extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, leftNodeId: { type: 'string', diff --git a/packages/dag/src/nodes/JsProcessor.js b/packages/dag/src/nodes/JsProcessor.js index 26a13138fc..0df110e156 100644 --- a/packages/dag/src/nodes/JsProcessor.js +++ b/packages/dag/src/nodes/JsProcessor.js @@ -39,12 +39,45 @@ export class JavaScript extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, jsType: { type: 'number', diff --git a/packages/dag/src/nodes/MergeTable.js b/packages/dag/src/nodes/MergeTable.js index 655e4e93c1..be04f647e2 100644 --- a/packages/dag/src/nodes/MergeTable.js +++ b/packages/dag/src/nodes/MergeTable.js @@ -57,12 +57,45 @@ export class MergeTable extends NodeType { ] }, - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, mergeMode: { @@ -93,7 +126,8 @@ export class MergeTable extends NodeType { 'x-component-props': { treeWidth: 200, findNodeById: '{{findNodeById}}', - loadFieldsMethod: '{{loadNodeFieldOptions}}' + loadFieldsMethod: '{{loadNodeFieldOptions}}', + '@center-node': '{{centerNode}}' }, items: { type: 'object', diff --git a/packages/dag/src/nodes/MigrateDateProcessor.js b/packages/dag/src/nodes/MigrateDateProcessor.js index 2138e5dda3..489685b7f5 100644 --- a/packages/dag/src/nodes/MigrateDateProcessor.js +++ b/packages/dag/src/nodes/MigrateDateProcessor.js @@ -35,12 +35,45 @@ export class MigrateDateProcessor extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, dataTypes: { type: 'array', diff --git a/packages/dag/src/nodes/MigrateFieldModTypeFilter.js b/packages/dag/src/nodes/MigrateFieldModTypeFilter.js index c9799fe90f..549fe62633 100644 --- a/packages/dag/src/nodes/MigrateFieldModTypeFilter.js +++ b/packages/dag/src/nodes/MigrateFieldModTypeFilter.js @@ -34,12 +34,45 @@ export class FieldModTypeFilter extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, filterTypes: { type: 'array', diff --git a/packages/dag/src/nodes/Python.js b/packages/dag/src/nodes/Python.js index edc229d1f7..551957fc54 100644 --- a/packages/dag/src/nodes/Python.js +++ b/packages/dag/src/nodes/Python.js @@ -38,12 +38,45 @@ export class JavaScript extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, script: { title: i18n.t('packages_dag_nodes_javascript_jiaoben'), diff --git a/packages/dag/src/nodes/PythonProcessor.js b/packages/dag/src/nodes/PythonProcessor.js index 4022931054..67b6a683e2 100644 --- a/packages/dag/src/nodes/PythonProcessor.js +++ b/packages/dag/src/nodes/PythonProcessor.js @@ -39,12 +39,45 @@ export class JavaScript extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, jsType: { type: 'number', diff --git a/packages/dag/src/nodes/RowFilter.js b/packages/dag/src/nodes/RowFilter.js index 44dc16d261..f26adf0d58 100644 --- a/packages/dag/src/nodes/RowFilter.js +++ b/packages/dag/src/nodes/RowFilter.js @@ -30,12 +30,45 @@ export class RowFilter extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, action: { title: i18n.t('packages_dag_nodes_rowfilter_zhixingdongzuo'), diff --git a/packages/dag/src/nodes/StandardJs.js b/packages/dag/src/nodes/StandardJs.js index f31444320f..a18ed6a391 100644 --- a/packages/dag/src/nodes/StandardJs.js +++ b/packages/dag/src/nodes/StandardJs.js @@ -36,12 +36,45 @@ export class StandardJs extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, script: { title: i18n.t('packages_dag_nodes_javascript_jiaoben'), diff --git a/packages/dag/src/nodes/StandardMigrateJs.js b/packages/dag/src/nodes/StandardMigrateJs.js index 12b6c3a107..a067022f42 100644 --- a/packages/dag/src/nodes/StandardMigrateJs.js +++ b/packages/dag/src/nodes/StandardMigrateJs.js @@ -35,12 +35,45 @@ export class StandardJs extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, script: { title: i18n.t('packages_dag_nodes_javascript_jiaoben'), diff --git a/packages/dag/src/nodes/Table.js b/packages/dag/src/nodes/Table.js index 4070af065c..1b6217f744 100644 --- a/packages/dag/src/nodes/Table.js +++ b/packages/dag/src/nodes/Table.js @@ -49,6 +49,11 @@ export class Table extends NodeType { } } }, + connectionId: { + type: 'string', + 'x-display': 'hidden', + 'x-reactions': '{{useAsyncDataSourceByConfig({service: useSyncConnection})}}' + }, tabs: { type: 'void', 'x-decorator': 'FormItem', @@ -77,16 +82,44 @@ export class Table extends NodeType { columnGap: 16 }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input', + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', 'x-component-props': { - onChange: `{{() => { - $values.attrs.hasNameEdited = true - }}}` + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } } }, 'attrs.connectionName': { @@ -405,6 +438,32 @@ export class Table extends NodeType { } } } + }, + concurrentWritePartitionMap: { + type: 'object', + title: i18n.t('packages_dag_nodes_database_duoxianchengfenqujian'), + 'x-decorator': 'FormItem', + 'x-component': 'TableFieldSelect', + 'x-component-props': { + nodeId: `{{ $values.id }}`, + tableName: `{{ $values.tableName }}`, + defaultFields: `{{ $values.updateConditionFields }}`, + refresh: `{{ 'refresh' + $values.initialConcurrent + $values.cdcConcurrent }}` + }, + 'x-reactions': [ + { + dependencies: ['.initialConcurrent', '.cdcConcurrent'], + fulfill: { + state: { + display: '{{($deps[0] || $deps[1]) ? "visible":"hidden"}}' + } + } + } + ], + 'x-validator': { + triggerType: 'onBlur', + validator: `{{validateConcurrentWritePartitionMap}}` + } } } }, diff --git a/packages/dag/src/nodes/TableProcessor.js b/packages/dag/src/nodes/TableProcessor.js index cd66e6b40d..5287f092d9 100644 --- a/packages/dag/src/nodes/TableProcessor.js +++ b/packages/dag/src/nodes/TableProcessor.js @@ -35,12 +35,45 @@ export class TableProcessor extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, tableNames: { type: 'array', diff --git a/packages/dag/src/nodes/TargetDatabase.js b/packages/dag/src/nodes/TargetDatabase.js deleted file mode 100644 index 5d75efc63a..0000000000 --- a/packages/dag/src/nodes/TargetDatabase.js +++ /dev/null @@ -1,319 +0,0 @@ -import i18n from '@tap/i18n' -import { NodeType } from './extends/NodeType' - -export class TargetDatabase extends NodeType { - constructor() { - super() - } - - type = 'database' - - maxInputs = 1 // 最大输入个数 - - // allowTarget = false // 该节点不允许有目标 - - group = 'output' - - formSchema = { - type: 'object', - properties: { - $inputs: { - type: 'array', - 'x-display': 'hidden' - }, - $outputs: { - type: 'array', - 'x-display': 'hidden' - }, - databaseType: { - type: 'string', - 'x-display': 'hidden' - }, - connectionId: { - type: 'string', - 'x-display': 'hidden', - 'x-reactions': '{{useSyncConnection}}' - }, - - layout: { - type: 'void', - 'x-component': 'FormLayout', - 'x-component-props': { - layout: 'horizontal', - colon: false, - labelAlign: 'left', - labelWidth: 80, - feedbackLayout: 'none' - }, - properties: { - 'attrs.connectionName': { - type: 'string', - title: i18n.t('public_connection_name'), - 'x-decorator': 'FormItem', - 'x-component': 'PreviewText.Input' - }, - 'attrs.accessNodeProcessId': { - type: 'string', - title: i18n.t('packages_dag_nodes_database_suoshuage'), - 'x-decorator': 'FormItem', - 'x-component': 'PreviewText.Input', - 'x-component-props': { - content: - '{{$agentMap[$self.value] ? `${$agentMap[$self.value].hostName}(${$agentMap[$self.value].ip})` : "-"}}' - }, - 'x-reactions': { - fulfill: { - state: { - display: '{{!$self.value ? "hidden":"visible"}}' - } - } - } - } - } - }, - - desc: { - type: 'string', - title: i18n.t('packages_dag_nodes_targetdatabase_jiedianmiaoshu'), - 'x-decorator': 'FormItem', - 'x-component': 'Input.TextArea', - 'x-component-props': { - autosize: { maxRows: 2 } - } - }, - // clipBtn: { - // type: 'void', - // 'x-decorator': 'FormItem', - // 'x-component': 'ClipboardBtn' - // }, - - ddlEvents: { - type: 'void', - title: i18n.t('packages_dag_nodes_database_ddLshijian'), - 'x-decorator': 'FormItem', - 'x-decorator-props': { - tooltip: i18n.t('packages_dag_nodes_database_dangqianjiedianzhi'), - feedbackLayout: 'none' - }, - 'x-component': 'DdlEventList', - 'x-component-props': { - findParentNodes: '{{findParentNodes}}' - } - }, - - name: { - type: 'string', - 'x-display': 'hidden' - }, - fieldMapping: { - type: 'void', - title: i18n.t('packages_dag_nodes_database_tuiyanjieguo'), - 'x-decorator': 'FormItem', - 'x-component': 'SchemaFiledMapping' - }, - collapse: { - type: 'void', - 'x-decorator': 'FormItem', - 'x-component': 'FormCollapse', - properties: { - tab1: { - type: 'void', - 'x-component': 'FormCollapse.Item', - 'x-component-props': { - title: i18n.t('packages_dag_task_stetting_most_setting') - }, - properties: { - existDataProcessMode: { - type: 'string', - title: i18n.t('packages_dag_nodes_database_chongfuchulice'), - default: 'keepData', - enum: [ - { - label: i18n.t('packages_dag_nodes_database_qingchumubiaoduan'), - value: 'dropTable' - }, - { - label: i18n.t('packages_dag_nodes_targetdatabase_baochimubiaoduan'), - value: 'removeData' - }, - { - label: i18n.t('packages_dag_nodes_database_baochimubiaoduan'), - value: 'keepData' - } - ], - 'x-decorator': 'FormItem', - required: true, - 'x-component': 'Select' - }, - dmlPolicy: { - title: i18n.t('packages_dag_nodes_database_shujuxieruce'), - type: 'object', - 'x-decorator': 'FormItem', - 'x-decorator-props': { - feedbackLayout: 'none' - }, - 'x-component': 'FormLayout', - 'x-component-props': { - layout: 'horizontal', - colon: false, - feedbackLayout: 'none' - }, - properties: { - insertPolicy: { - type: 'string', - 'x-component': 'Select', - 'x-decorator': 'FormItem', - 'x-decorator-props': { - className: 'font-color-dark mb-2', - wrapperWidth: 300, - addonBefore: i18n.t('packages_dag_nodes_database_charushijian') - }, - default: 'update_on_exists', - enum: [ - { - label: i18n.t('packages_dag_nodes_targetdatabase_mubiaocunzaishi'), - value: 'update_on_exists' - }, - { - label: i18n.t('packages_dag_nodes_database_mubiaocunzaishi'), - value: 'ignore_on_exists' - } - ] - }, - updatePolicy: { - type: 'string', - 'x-component': 'Select', - 'x-decorator': 'FormItem', - 'x-decorator-props': { - className: 'font-color-dark mb-2', - wrapperWidth: 300, - addonBefore: i18n.t('packages_dag_nodes_database_gengxinshijian') - }, - default: 'ignore_on_nonexists', - enum: [ - { - label: i18n.t('packages_dag_nodes_database_bucunzaishidiu'), - value: 'ignore_on_nonexists' - }, - { - label: i18n.t('packages_dag_nodes_database_bucunzaishicha'), - value: 'insert_on_nonexists' - }, - { - label: i18n.t('packages_dag_nodes_database_bucunzaishidayinrizhi'), - value: 'log_on_nonexists' - } - ] - }, - deletePolicy: { - type: 'void', - 'x-decorator': 'FormItem', - 'x-decorator-props': { - className: 'font-color-dark', - wrapperWidth: 300, - addonBefore: i18n.t('packages_dag_nodes_database_shanchushijian') - }, - 'x-component': 'Tag', - 'x-content': i18n.t('packages_dag_nodes_database_bucunzaishidiu'), - 'x-component-props': { - type: 'info', - effect: 'light' - } - } - } - }, - - initialConcurrentSpace: { - title: i18n.t('packages_dag_nodes_database_quanliangduoxiancheng'), - 'x-decorator': 'FormItem', - 'x-decorator-props': { - layout: 'horizontal' - }, - type: 'void', - 'x-component': 'Space', - 'x-component-props': { - size: 'middle' - }, - properties: { - initialConcurrent: { - type: 'boolean', - default: true, - 'x-component': 'Switch', - 'x-reactions': { - target: '.initialConcurrentWriteNum', - fulfill: { - state: { - visible: '{{!!$self.value}}' - } - } - } - }, - initialConcurrentWriteNum: { - type: 'number', - default: 8, - 'x-component': 'InputNumber', - 'x-component-props': { - min: 0 - } - } - } - }, - cdcConcurrentSpace: { - type: 'void', - title: i18n.t('packages_dag_nodes_database_zengliangduoxiancheng'), - 'x-decorator': 'FormItem', - 'x-decorator-props': { - layout: 'horizontal' - }, - 'x-component': 'Space', - 'x-component-props': { - size: 'middle' - }, - properties: { - cdcConcurrent: { - type: 'boolean', - 'x-component': 'Switch', - 'x-reactions': { - target: '.cdcConcurrentWriteNum', - fulfill: { - state: { - visible: '{{!!$self.value}}' - } - } - } - }, - cdcConcurrentWriteNum: { - type: 'number', - default: 4, - 'x-component': 'InputNumber', - 'x-component-props': { - min: 0 - } - } - } - } - } - } - } - }, - - // 切换连接,保存连接的类型 - 'attrs.connectionType': { - type: 'string', - 'x-display': 'hidden' - }, - - // 切换连接,保存连接的类型 - 'attrs.capabilities': { - type: 'array', - 'x-display': 'hidden', - 'x-reactions': '{{useDmlPolicy}}' - } - } - } - - selector(node) { - // attrs.isTarget 是UI属性,在无UI的模式生成的节点,通过是否有输入($inputs)来判断 - return node.type === 'database' && (node.attrs?.isTarget || node.$inputs?.length) - } -} diff --git a/packages/dag/src/nodes/Union.js b/packages/dag/src/nodes/Union.js index 626abd619b..fc727faeba 100644 --- a/packages/dag/src/nodes/Union.js +++ b/packages/dag/src/nodes/Union.js @@ -27,12 +27,45 @@ export class Union extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, schemaPreview: { diff --git a/packages/dag/src/nodes/UnwindProcessor.js b/packages/dag/src/nodes/UnwindProcessor.js index 844654eae3..3295514cec 100644 --- a/packages/dag/src/nodes/UnwindProcessor.js +++ b/packages/dag/src/nodes/UnwindProcessor.js @@ -35,12 +35,45 @@ export class UnwindProcessor extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, path: { type: 'string', diff --git a/packages/dag/src/nodes/logCollector.js b/packages/dag/src/nodes/logCollector.js index 1c49926d46..63106e4a24 100644 --- a/packages/dag/src/nodes/logCollector.js +++ b/packages/dag/src/nodes/logCollector.js @@ -58,12 +58,45 @@ export class LogCollector extends NodeType { label: i18n.t('public_basic_settings') }, properties: { - name: { - type: 'string', + nameWrap: { + type: 'void', title: i18n.t('public_node_name'), - required: true, 'x-decorator': 'FormItem', - 'x-component': 'Input' + 'x-decorator-props': { + asterisk: true, + feedbackLayout: 'none' + }, + 'x-component': 'FormFlex', + 'x-component-props': { + gap: 8, + align: 'start' + }, + properties: { + name: { + type: 'string', + required: true, + 'x-decorator': 'FormItem', + 'x-decorator-props': { + style: { + flex: 1 + } + }, + 'x-component': 'Input', + 'x-component-props': { + onChange: `{{() => { $values.attrs.hasNameEdited = true }}}` + } + }, + + clipboardButton: { + type: 'void', + 'x-component': 'ClipboardButton', + 'x-component-props': { + tooltip: i18n.t('packages_dag_copy_node_id'), + finishTooltip: i18n.t('packages_dag_nodes_table_yifuzhi'), + content: '{{$values.id}}' + } + } + } }, sourceConfig: { diff --git a/packages/dag/src/store.js b/packages/dag/src/store.js index f3df1ad588..0326c16542 100644 --- a/packages/dag/src/store.js +++ b/packages/dag/src/store.js @@ -6,7 +6,7 @@ import { observable } from '@formily/reactive' import { setValidateLanguage } from '@formily/core' import { isObject, uuid, mergeLocales, lowerSnake } from '@tap/shared' -import { taskApi, customNodeApi } from '@tap/api' +import { taskApi, customNodeApi, isCancel } from '@tap/api' import { getCurrentLanguage } from '@tap/i18n/src/shared/util' import { AddDagCommand } from './command' @@ -240,8 +240,14 @@ const actions = { } ) data?.editVersion && commit('setEditVersion', data.editVersion) + commit('toggleTaskSaving', false) } catch (e) { console.error(e) // eslint-disable-line + + if (isCancel(e)) return + + commit('toggleTaskSaving', false) // 任务保存请求被cancel不希望设置为false + if (e?.data?.code === 'Task.OldVersion') { vm.$confirm('', i18n.t('packages_dag_task_old_version_confirm'), { onlyTitle: true, @@ -255,7 +261,6 @@ const actions = { vm.$message.error(e.data.message) } } - commit('toggleTaskSaving', false) }, 50), async patchTaskNow({ state, commit }, { vm }) { @@ -273,8 +278,14 @@ const actions = { } ) data?.editVersion && commit('setEditVersion', data.editVersion) + commit('toggleTaskSaving', false) } catch (e) { console.error(e) // eslint-disable-line + + if (isCancel(e)) return + + commit('toggleTaskSaving', false) // 任务保存请求被cancel不希望设置为false + if (e?.data?.code === 'Task.OldVersion') { vm.$confirm('', i18n.t('packages_dag_task_old_version_confirm'), { onlyTitle: true, @@ -288,7 +299,6 @@ const actions = { vm.$message.error(e.data.message) } } - commit('toggleTaskSaving', false) }, async updateDag({ state, commit, dispatch }, data = {}) { diff --git a/packages/dag/src/util.js b/packages/dag/src/util.js index 75e6f00ffc..16edba6380 100644 --- a/packages/dag/src/util.js +++ b/packages/dag/src/util.js @@ -91,6 +91,8 @@ export function getPrimaryKeyTablesByType(data = [], filterType = 'All', map = { return Object.assign({}, { tableName: t, tableComment: '', primaryKeyCounts: 0, uniqueIndexCounts: 0 }, map[t]) }) const list = - filterType === 'HasKeys' ? result.filter(t => !!t.primaryKeyCounts || !!t.uniqueIndexCounts) : result.filter(t => !t.primaryKeyCounts && !t.uniqueIndexCounts) + filterType === 'HasKeys' + ? result.filter(t => !!t.primaryKeyCounts || !!t.uniqueIndexCounts) + : result.filter(t => !t.primaryKeyCounts && !t.uniqueIndexCounts) return list.map(t => t.tableName) } diff --git a/packages/form/src/components/async-select/AsyncSelect.vue b/packages/form/src/components/async-select/AsyncSelect.vue index 62a9732fd3..b721ecaaa4 100644 --- a/packages/form/src/components/async-select/AsyncSelect.vue +++ b/packages/form/src/components/async-select/AsyncSelect.vue @@ -137,6 +137,7 @@ v-show="options.length > 0 && !showLoading" >
+ @@ -421,16 +422,7 @@ export default { async setSelected() { if (!this.multiple) { let option = await this.getOption(this.value) - // 不添加!this.lazy 会导致 onSetSelected 的参数为 { value: this.value, currentLabel: this.currentLabel} - // 防止开启了lazy 同时设置了currentLabel,进入这个判断 - if (this.currentLabel && !this.lazy) { - option = { - value: this.value, - currentLabel: this.currentLabel - } - } else { - option = await this.getOption(this.value) - } + if (this.onSetSelected && ~this.hoverIndex) { if (!option.$el) { this.onSetSelected(option) @@ -448,6 +440,10 @@ export default { this.selectedLabel = option.currentLabel this.selected = option if (this.filterable) this.query = this.selectedLabel + + if (option.currentLabel === option.value && this.itemType === 'object' && this.currentLabel) { + this.selectedLabel = this.currentLabel + } return } let result = [] diff --git a/packages/form/src/components/index.js b/packages/form/src/components/index.js index e398c6f3b3..c616a0f183 100644 --- a/packages/form/src/components/index.js +++ b/packages/form/src/components/index.js @@ -20,5 +20,6 @@ export * from './input' export * from './batch-add-field' export * from './json-editor' export * from './form-collapse' +export * from './table-field-select' export * from '@formily/element' diff --git a/packages/form/src/components/table-field-select/Main.vue b/packages/form/src/components/table-field-select/Main.vue new file mode 100644 index 0000000000..60af0f4590 --- /dev/null +++ b/packages/form/src/components/table-field-select/Main.vue @@ -0,0 +1,102 @@ + + + diff --git a/packages/form/src/components/table-field-select/index.js b/packages/form/src/components/table-field-select/index.js new file mode 100644 index 0000000000..29b9f7298b --- /dev/null +++ b/packages/form/src/components/table-field-select/index.js @@ -0,0 +1,5 @@ +import TableFieldSelect from './Main' + +export { TableFieldSelect } + +export default TableFieldSelect diff --git a/packages/ldp/src/Dashboard.vue b/packages/ldp/src/Dashboard.vue index 119f3ae64a..ac0e885b53 100644 --- a/packages/ldp/src/Dashboard.vue +++ b/packages/ldp/src/Dashboard.vue @@ -70,7 +70,11 @@ @success="handleSettingsSuccess" @init="handleSettingsInit" > - + t.orderInfo?.chargeProvider === 'FreeTier') + items.length <= 1 && items.some(t => t.orderInfo?.chargeProvider === 'FreeTier' || !t.orderInfo?.amount) ? this.handleShowUpgradeFee() : this.handleShowUpgradeCharges() }) diff --git a/packages/ldp/src/ReplicationBoard.vue b/packages/ldp/src/ReplicationBoard.vue index 906599a761..cfb5c709dd 100644 --- a/packages/ldp/src/ReplicationBoard.vue +++ b/packages/ldp/src/ReplicationBoard.vue @@ -177,10 +177,24 @@ export default { handleAdd(type) { this.selectorType = type this.showSceneDialog = true + + if (this.startingTour) { + type = type.charAt(0).toUpperCase() + type.slice(1) + // 上报引导创建源/目标连接 + this.buried(`guideCreate${type}Connection`, '') + } }, handleSuccess(connection) { - this.$store.commit('setTourBehavior', 'add-' + this.selectorType) + if (this.startingTour) { + let type = this.selectorType + type = type.charAt(0).toUpperCase() + type.slice(1) + this.$store.commit('setTourBehavior', 'add-' + this.selectorType) + // 上报引导创建源/目标连接 + this.buried(`guideCreate${type}Connection`, '', { + result: true + }) + } if (connection.connection_type === 'source_and_target') { this.$refs.source.addItem(connection) diff --git a/packages/ldp/src/TargetPanel.vue b/packages/ldp/src/TargetPanel.vue index 5aba7733fa..d1af1b92b4 100644 --- a/packages/ldp/src/TargetPanel.vue +++ b/packages/ldp/src/TargetPanel.vue @@ -262,6 +262,7 @@ import { } from '@tap/business' import CreateRestApi from './components/CreateRestApi' import commonMix from './mixins/common' +import { mapGetters } from 'vuex' const TaskList = defineComponent({ props: ['list', 'startTask', 'forceStopTask', 'stopTask', 'getReplicateLag'], @@ -443,6 +444,7 @@ export default { }, computed: { + ...mapGetters(['startingTour']), allowDrop() { return ( this.dragState.isDragging && @@ -983,7 +985,11 @@ export default { ) }) - this.$store.commit('setTourBehavior', 'add-task') + if (this.startingTour) { + this.$store.commit('setTourBehavior', 'add-task') + // 上报引导创任务 + this.buried(`guideCreateTask`, '') + } } }) }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a78aede85..d564666d9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,7 +48,7 @@ importers: version: 5.59.8(eslint@7.32.0)(typescript@4.5.5) '@vue/cli-plugin-babel': specifier: ~4.5.0 - version: 4.5.19(@vue/cli-service@4.5.19)(core-js@3.30.2)(vue@2.6.14) + version: 4.5.19(@vue/cli-service@4.5.19)(vue@2.6.14) '@vue/cli-plugin-eslint': specifier: ~4.5.0 version: 4.5.19(@vue/cli-service@4.5.19)(eslint@7.32.0) @@ -60,7 +60,7 @@ importers: version: 4.5.19(@vue/cli-service@4.5.19) '@vue/cli-service': specifier: ~4.5.0 - version: 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue-template-compiler@2.6.14)(vue@2.6.14) + version: 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue@2.6.14) '@vue/eslint-config-typescript': specifier: ^9.1.0 version: 9.1.0(@typescript-eslint/eslint-plugin@5.59.8)(@typescript-eslint/parser@5.59.8)(eslint-plugin-vue@8.7.1)(eslint@7.32.0)(typescript@4.5.5) @@ -77,11 +77,11 @@ importers: specifier: ^2.2.1 version: 2.8.8 sass: - specifier: ^1.34.1 - version: 1.62.1 + specifier: ^1.55.0 + version: 1.55.0 sass-loader: - specifier: ^10.2.0 - version: 10.4.1(sass@1.62.1)(webpack@4.46.0) + specifier: ^10.4.1 + version: 10.4.1(sass@1.55.0)(webpack@5.89.0) tslib: specifier: ^2.4.0 version: 2.5.2 @@ -2398,6 +2398,13 @@ packages: engines: {node: '>=6.0.0'} dev: true + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true @@ -2539,6 +2546,24 @@ packages: '@types/node': 18.16.16 dev: true + /@types/eslint-scope@3.7.6: + resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} + dependencies: + '@types/eslint': 8.44.6 + '@types/estree': 1.0.4 + dev: true + + /@types/eslint@8.44.6: + resolution: {integrity: sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==} + dependencies: + '@types/estree': 1.0.4 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@1.0.4: + resolution: {integrity: sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==} + dev: true + /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: @@ -2986,6 +3011,27 @@ packages: - webpack-command dev: true + /@vue/cli-plugin-babel@4.5.19(@vue/cli-service@4.5.19)(vue@2.6.14): + resolution: {integrity: sha512-8ebXzaMW9KNTMAN6+DzkhFsjty1ieqT7hIW5Lbk4v30Qhfjkms7lBWyXPGkoq+wAikXFa1Gnam2xmWOBqDDvWg==} + peerDependencies: + '@vue/cli-service': ^3.0.0 || ^4.0.0-0 + dependencies: + '@babel/core': 7.22.1 + '@vue/babel-preset-app': 4.5.19(@babel/core@7.22.1)(core-js@3.30.2)(vue@2.6.14) + '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue@2.6.14) + '@vue/cli-shared-utils': 4.5.19 + babel-loader: 8.3.0(@babel/core@7.22.1)(webpack@4.46.0) + cache-loader: 4.1.0(webpack@4.46.0) + thread-loader: 2.1.3(webpack@4.46.0) + webpack: 4.46.0 + transitivePeerDependencies: + - core-js + - supports-color + - vue + - webpack-cli + - webpack-command + dev: true + /@vue/cli-plugin-eslint@4.5.19(@vue/cli-service@4.5.19)(eslint@6.8.0): resolution: {integrity: sha512-53sa4Pu9j5KajesFlj494CcO8vVo3e3nnZ1CCKjGGnrF90id1rUeepcFfz5XjwfEtbJZp2x/NoX/EZE6zCzSFQ==} peerDependencies: @@ -3012,7 +3058,7 @@ packages: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 eslint: '>= 1.6.0 < 7.0.0' dependencies: - '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue-template-compiler@2.6.14)(vue@2.6.14) + '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue@2.6.14) '@vue/cli-shared-utils': 4.5.19 eslint: 7.32.0 eslint-loader: 2.2.1(eslint@7.32.0)(webpack@4.46.0) @@ -3031,7 +3077,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue-template-compiler@2.6.14)(vue@2.6.14) + '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue@2.6.14) '@vue/cli-shared-utils': 4.5.19 dev: true @@ -3040,7 +3086,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue-template-compiler@2.6.14)(vue@2.6.14) + '@vue/cli-service': 4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue@2.6.14) dev: true /@vue/cli-service@4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue-template-compiler@2.6.14)(vue@2.6.14): @@ -3193,6 +3239,155 @@ packages: - whiskers dev: true + /@vue/cli-service@4.5.19(lodash@4.17.21)(sass-loader@10.4.1)(typescript@4.5.5)(vue@2.6.14): + resolution: {integrity: sha512-+Wpvj8fMTCt9ZPOLu5YaLkFCQmB4MrZ26aRmhhKiCQ/4PMoL6mLezfqdt6c+m2htM+1WV5RunRo+0WHl2DfwZA==} + engines: {node: '>=8'} + hasBin: true + peerDependencies: + '@vue/compiler-sfc': ^3.0.0-beta.14 + less-loader: '*' + pug-plain-loader: '*' + raw-loader: '*' + sass-loader: '*' + stylus-loader: '*' + vue-template-compiler: ^2.0.0 + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + less-loader: + optional: true + pug-plain-loader: + optional: true + raw-loader: + optional: true + sass-loader: + optional: true + stylus-loader: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@intervolga/optimize-cssnano-plugin': 1.0.6(webpack@4.46.0) + '@soda/friendly-errors-webpack-plugin': 1.8.1(webpack@4.46.0) + '@soda/get-current-script': 1.0.2 + '@types/minimist': 1.2.2 + '@types/webpack': 4.41.33 + '@types/webpack-dev-server': 3.11.6(debug@4.3.4) + '@vue/cli-overlay': 4.5.19 + '@vue/cli-plugin-router': 4.5.19(@vue/cli-service@4.5.19) + '@vue/cli-plugin-vuex': 4.5.19(@vue/cli-service@4.5.19) + '@vue/cli-shared-utils': 4.5.19 + '@vue/component-compiler-utils': 3.3.0(lodash@4.17.21) + '@vue/preload-webpack-plugin': 1.1.2(html-webpack-plugin@3.2.0)(webpack@4.46.0) + '@vue/web-component-wrapper': 1.3.0 + acorn: 7.4.1 + acorn-walk: 7.2.0 + address: 1.2.2 + autoprefixer: 9.8.8 + browserslist: 4.21.7 + cache-loader: 4.1.0(webpack@4.46.0) + case-sensitive-paths-webpack-plugin: 2.4.0 + cli-highlight: 2.1.11 + clipboardy: 2.3.0 + cliui: 6.0.0 + copy-webpack-plugin: 5.1.2(webpack@4.46.0) + css-loader: 3.6.0(webpack@5.89.0) + cssnano: 4.1.11 + debug: 4.3.4(supports-color@6.1.0) + default-gateway: 5.0.5 + dotenv: 8.6.0 + dotenv-expand: 5.1.0 + file-loader: 4.3.0(webpack@4.46.0) + fs-extra: 7.0.1 + globby: 9.2.0 + hash-sum: 2.0.0 + html-webpack-plugin: 3.2.0(webpack@5.89.0) + launch-editor-middleware: 2.6.0 + lodash.defaultsdeep: 4.6.1 + lodash.mapvalues: 4.6.0 + lodash.transform: 4.6.0 + mini-css-extract-plugin: 0.9.0(webpack@4.46.0) + minimist: 1.2.8 + pnp-webpack-plugin: 1.7.0(typescript@4.5.5) + portfinder: 1.0.32 + postcss-loader: 3.0.0 + sass-loader: 10.4.1(sass@1.55.0)(webpack@5.89.0) + ssri: 8.0.1 + terser-webpack-plugin: 1.4.5(webpack@4.46.0) + thread-loader: 2.1.3(webpack@4.46.0) + url-loader: 2.3.0(file-loader@4.3.0)(webpack@4.46.0) + vue-loader: 15.10.1(cache-loader@4.1.0)(css-loader@3.6.0)(lodash@4.17.21)(webpack@4.46.0) + vue-style-loader: 4.1.3 + webpack: 4.46.0 + webpack-bundle-analyzer: 3.9.0 + webpack-chain: 6.5.1 + webpack-dev-server: 3.11.3(webpack@4.46.0) + webpack-merge: 4.2.2 + optionalDependencies: + vue-loader-v16: /vue-loader@16.8.3(vue@2.6.14)(webpack@4.46.0) + transitivePeerDependencies: + - arc-templates + - atpl + - babel-core + - bracket-template + - bufferutil + - coffee-script + - dot + - dust + - dustjs-helpers + - dustjs-linkedin + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jade + - jazz + - jqtpl + - just + - liquid-node + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - supports-color + - swig + - swig-templates + - teacup + - templayed + - then-jade + - then-pug + - tinyliquid + - toffee + - twig + - twing + - typescript + - underscore + - utf-8-validate + - vash + - velocityjs + - vue + - walrus + - webpack-cli + - webpack-command + - whiskers + dev: true + /@vue/cli-shared-utils@4.5.19: resolution: {integrity: sha512-JYpdsrC/d9elerKxbEUtmSSU6QRM60rirVubOewECHkBHj+tLNznWq/EhCjswywtePyLaMUK25eTqnTSZlEE+g==} dependencies: @@ -3329,7 +3524,7 @@ packages: html-webpack-plugin: '>=2.26.0' webpack: '>=4.0.0' dependencies: - html-webpack-plugin: 3.2.0(webpack@4.46.0) + html-webpack-plugin: 3.2.0(webpack@5.89.0) webpack: 4.46.0 dev: true @@ -3337,6 +3532,13 @@ packages: resolution: {integrity: sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==} dev: true + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + /@webassemblyjs/ast@1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -3345,14 +3547,26 @@ packages: '@webassemblyjs/wast-parser': 1.9.0 dev: true + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + /@webassemblyjs/floating-point-hex-parser@1.9.0: resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} dev: true + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + /@webassemblyjs/helper-api-error@1.9.0: resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} dev: true + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + /@webassemblyjs/helper-buffer@1.9.0: resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} dev: true @@ -3373,10 +3587,31 @@ packages: '@webassemblyjs/ast': 1.9.0 dev: true + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + /@webassemblyjs/helper-wasm-bytecode@1.9.0: resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} dev: true + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + /@webassemblyjs/helper-wasm-section@1.9.0: resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} dependencies: @@ -3386,22 +3621,51 @@ packages: '@webassemblyjs/wasm-gen': 1.9.0 dev: true + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + /@webassemblyjs/ieee754@1.9.0: resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + /@webassemblyjs/leb128@1.9.0: resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} dependencies: '@xtuc/long': 4.2.2 dev: true + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + /@webassemblyjs/utf8@1.9.0: resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} dev: true + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + /@webassemblyjs/wasm-edit@1.9.0: resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} dependencies: @@ -3415,6 +3679,16 @@ packages: '@webassemblyjs/wast-printer': 1.9.0 dev: true + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + /@webassemblyjs/wasm-gen@1.9.0: resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} dependencies: @@ -3425,6 +3699,15 @@ packages: '@webassemblyjs/utf8': 1.9.0 dev: true + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + /@webassemblyjs/wasm-opt@1.9.0: resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} dependencies: @@ -3434,6 +3717,17 @@ packages: '@webassemblyjs/wasm-parser': 1.9.0 dev: true + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + /@webassemblyjs/wasm-parser@1.9.0: resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} dependencies: @@ -3456,6 +3750,13 @@ packages: '@xtuc/long': 4.2.2 dev: true + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + /@webassemblyjs/wast-printer@1.9.0: resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} dependencies: @@ -3487,6 +3788,14 @@ packages: /ace-builds@1.22.0: resolution: {integrity: sha512-7IlgBtb/A1qljFLB9Xz+Cuv3vILYHLpxE+9gpujoCzI1G0RpCPc1TKzoCbJ+IWIWtdtbJ0BdXKg3AsO3ZUJosw==} + /acorn-import-assertions@1.9.0(acorn@8.8.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.2 + dev: true + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -5244,6 +5553,28 @@ packages: webpack: 4.46.0 dev: true + /css-loader@3.6.0(webpack@5.89.0): + resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} + engines: {node: '>= 8.9.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + camelcase: 5.3.1 + cssesc: 3.0.0 + icss-utils: 4.1.1 + loader-utils: 1.4.2 + normalize-path: 3.0.0 + postcss: 7.0.39 + postcss-modules-extract-imports: 2.0.0 + postcss-modules-local-by-default: 3.0.3 + postcss-modules-scope: 2.2.0 + postcss-modules-values: 3.0.0 + postcss-value-parser: 4.2.0 + schema-utils: 2.7.1 + semver: 6.3.0 + webpack: 5.89.0 + dev: true + /css-select-base-adapter@0.1.1: resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} dev: true @@ -5912,6 +6243,14 @@ packages: tapable: 1.1.3 dev: true + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -5995,6 +6334,10 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true + /es-module-lexer@1.3.1: + resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} + dev: true + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -7082,6 +7425,10 @@ packages: resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} dev: true + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -7469,6 +7816,23 @@ packages: webpack: 4.46.0 dev: true + /html-webpack-plugin@3.2.0(webpack@5.89.0): + resolution: {integrity: sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==} + engines: {node: '>=6.9'} + deprecated: 3.x is no longer supported + peerDependencies: + webpack: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + dependencies: + html-minifier: 3.5.21 + loader-utils: 0.2.17 + lodash: 4.17.21 + pretty-error: 2.1.2 + tapable: 1.1.3 + toposort: 1.0.7 + util.promisify: 1.0.0 + webpack: 5.89.0 + dev: true + /htmlparser2@3.10.1: resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} dependencies: @@ -8217,6 +8581,15 @@ packages: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} dev: true + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.16.16 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -8566,6 +8939,11 @@ packages: engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} dev: true + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + /loader-utils@0.2.17: resolution: {integrity: sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==} dependencies: @@ -10936,6 +11314,31 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + /sass-loader@10.4.1(sass@1.55.0)(webpack@5.89.0): + resolution: {integrity: sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + sass: ^1.3.0 + webpack: ^4.36.0 || ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + klona: 2.0.6 + loader-utils: 2.0.4 + neo-async: 2.6.2 + sass: 1.55.0 + schema-utils: 3.1.2 + semver: 7.5.1 + webpack: 5.89.0 + dev: true + /sass-loader@10.4.1(sass@1.62.1)(webpack@4.46.0): resolution: {integrity: sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==} engines: {node: '>= 10.13.0'} @@ -10961,6 +11364,16 @@ packages: webpack: 4.46.0 dev: true + /sass@1.55.0: + resolution: {integrity: sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.0 + source-map-js: 1.0.2 + dev: true + /sass@1.62.1: resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==} engines: {node: '>=14.0.0'} @@ -11001,6 +11414,15 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: true + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + /scrollparent@2.1.0: resolution: {integrity: sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==} dev: false @@ -11078,6 +11500,12 @@ packages: randombytes: 2.1.0 dev: true + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-index@1.9.1(supports-color@6.1.0): resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} engines: {node: '>= 0.8.0'} @@ -11725,6 +12153,13 @@ packages: has-flag: 4.0.0 dev: true + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -11853,6 +12288,11 @@ packages: engines: {node: '>=6'} dev: true + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /tar@6.1.15: resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} engines: {node: '>=10'} @@ -11883,6 +12323,30 @@ packages: worker-farm: 1.7.0 dev: true + /terser-webpack-plugin@5.3.9(webpack@5.89.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.24.0 + webpack: 5.89.0 + dev: true + /terser@4.8.1: resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} engines: {node: '>=6.0.0'} @@ -11894,6 +12358,17 @@ packages: source-map-support: 0.5.21 dev: true + /terser@5.24.0: + resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true @@ -12654,6 +13129,86 @@ packages: - whiskers dev: true + /vue-loader@15.10.1(cache-loader@4.1.0)(css-loader@3.6.0)(lodash@4.17.21)(webpack@4.46.0): + resolution: {integrity: sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==} + peerDependencies: + '@vue/compiler-sfc': ^3.0.8 + cache-loader: '*' + css-loader: '*' + vue-template-compiler: '*' + webpack: ^3.0.0 || ^4.1.0 || ^5.0.0-0 + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + cache-loader: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@vue/component-compiler-utils': 3.3.0(lodash@4.17.21) + cache-loader: 4.1.0(webpack@4.46.0) + css-loader: 3.6.0(webpack@5.89.0) + hash-sum: 1.0.2 + loader-utils: 1.4.2 + vue-hot-reload-api: 2.3.4 + vue-style-loader: 4.1.3 + webpack: 4.46.0 + transitivePeerDependencies: + - arc-templates + - atpl + - babel-core + - bracket-template + - coffee-script + - dot + - dust + - dustjs-helpers + - dustjs-linkedin + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jade + - jazz + - jqtpl + - just + - liquid-node + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - swig + - swig-templates + - teacup + - templayed + - then-jade + - then-pug + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: true + /vue-loader@16.8.3(vue@2.6.14)(webpack@4.46.0): resolution: {integrity: sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==} requiresBuild: true @@ -12775,6 +13330,14 @@ packages: - supports-color dev: true + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + /wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} dependencies: @@ -12904,6 +13467,11 @@ packages: source-map: 0.6.1 dev: true + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + /webpack@4.46.0: resolution: {integrity: sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==} engines: {node: '>=6.11.5'} @@ -12944,6 +13512,46 @@ packages: - supports-color dev: true + /webpack@5.89.0: + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.6 + '@types/estree': 1.0.4 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.21.7 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.89.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /websocket-driver@0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'}