fix(data-center): clear and remount SQL datasource select on type switch
This commit is contained in:
parent
fbfaa59b14
commit
9662f41eec
@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<n-modal :show="show" @mask-click="handleClose">
|
||||
<n-card class="w-200 max-w-1200px" :title="t('home.dataCenter.Data set config')">
|
||||
<n-card class="w-200 max-w-1200px" :title="t('home.Data set config')">
|
||||
<n-form :model="model" :rules="rules" ref="formRef" label-placement="left" label-width="auto" :disabled="submitLoading">
|
||||
<n-grid :cols="24" :x-gap="24">
|
||||
<n-form-item-gi :span="12" :label="t('home.dataCenter.Data set name')" path="name">
|
||||
<n-form-item-gi :span="12" :label="t('home.Data set name')" path="name">
|
||||
<n-input v-model:value="model.name" />
|
||||
</n-form-item-gi>
|
||||
<n-form-item-gi :span="12" :label="t('home.dataCenter.Data set group')" path="groupId">
|
||||
<n-form-item-gi :span="12" :label="t('home.Data set group')" path="groupId">
|
||||
<n-cascader
|
||||
v-model:value="model.groupId"
|
||||
expand-trigger="hover"
|
||||
@ -19,13 +19,14 @@
|
||||
value-field="id"
|
||||
/>
|
||||
</n-form-item-gi>
|
||||
<n-form-item-gi :span="12" :label="t('home.dataCenter.Data set type')" path="type">
|
||||
<n-form-item-gi :span="12" :label="t('home.Data set type')" path="type">
|
||||
<n-select v-model:value="model.type" :options="setTypes" />
|
||||
</n-form-item-gi>
|
||||
|
||||
<template v-if="model.type === 'API'">
|
||||
<n-form-item-gi :span="12" :label="t('home.dataCenter.Method')" path="method">
|
||||
<n-form-item-gi :span="12" :label="t('home.Method')" path="method">
|
||||
<n-select
|
||||
:key="'dataset-method-select'"
|
||||
v-model:value="model.method"
|
||||
:options="[
|
||||
{ label: 'GET', value: 'GET' },
|
||||
@ -33,23 +34,23 @@
|
||||
]"
|
||||
/>
|
||||
</n-form-item-gi>
|
||||
<n-form-item-gi :span="24" :label="t('home.dataCenter.API interface')" path="api">
|
||||
<n-form-item-gi :span="24" :label="t('home.API interface')" path="api">
|
||||
<n-input v-model:value="model.api" type="textarea" />
|
||||
</n-form-item-gi>
|
||||
</template>
|
||||
|
||||
<template v-else-if="model.type === 'SQL'">
|
||||
<n-form-item-gi :span="12" :label="t('home.dataCenter.Data sources')" path="dataSourceId">
|
||||
<n-select v-model:value="model.dataSourceId" :options="dataSourceOptions" />
|
||||
<n-form-item-gi :span="12" :label="t('home.Data sources')" path="dataSourceId">
|
||||
<n-select :key="'dataset-datasource-select'" v-model:value="model.dataSourceId" :options="dataSourceOptions" />
|
||||
</n-form-item-gi>
|
||||
<n-form-item-gi :span="24" :label="`SQL(${t('home.dataCenter.Query only')})`" path="sql">
|
||||
<n-form-item-gi :span="24" :label="`SQL(${t('home.Query only')})`" path="sql">
|
||||
<SQLEditor v-model:value="model.sql as string" />
|
||||
</n-form-item-gi>
|
||||
<n-form-item-gi :span="24" label=" ">
|
||||
<n-blockquote>
|
||||
{{ t('home.dataCenter["Parameter is passed as:"]') }}
|
||||
{{ t('home.Parameter is passed as ') }}
|
||||
'${id}' ,
|
||||
{{ t('home.dataCenter["For example:"]') }}
|
||||
{{ t('home.For example:') }}
|
||||
SELECT * FROM table WHERE id='${id}'
|
||||
</n-blockquote>
|
||||
</n-form-item-gi>
|
||||
@ -123,27 +124,27 @@
|
||||
|
||||
const rules = computed(() => {
|
||||
const baseRules: Record<string, any> = {
|
||||
name: { required: true, message: t("home.dataCenter.Please enter a name for the dataset"), trigger: ["input", "blur"] },
|
||||
groupId: createRequiredRule(t("home.dataCenter.Please select a grouping for the dataset"), ["change", "blur"]),
|
||||
type: { required: true, message: t("home.dataCenter.Please select a dataset type"), trigger: ["change", "blur"] },
|
||||
name: { required: true, message: t("prompt.Please enter a name for the dataset"), trigger: ["input", "blur"] },
|
||||
groupId: createRequiredRule("请选择数据集分组", ["change", "blur"]),
|
||||
type: { required: true, message: "请选择数据集类型", trigger: ["change", "blur"] },
|
||||
};
|
||||
const type = props.model?.type;
|
||||
if (type === "API") {
|
||||
baseRules.method = {
|
||||
required: true,
|
||||
message: t("home.dataCenter.Please select a method"),
|
||||
message: "请选择请求方式",
|
||||
trigger: ["change", "blur"],
|
||||
};
|
||||
baseRules.api = {
|
||||
required: true,
|
||||
message: t("home.dataCenter.Please enter the interface url"),
|
||||
message: "请输入接口地址",
|
||||
trigger: ["input", "blur"],
|
||||
};
|
||||
} else if (type === "SQL") {
|
||||
baseRules.dataSourceId = createRequiredRule(t("home.dataCenter.Please select a data source"), ["change", "blur"]);
|
||||
baseRules.sql = { required: true, message: t("home.dataCenter.Please enter a SQL string"), trigger: ["blur"] };
|
||||
baseRules.dataSourceId = createRequiredRule("请选择数据源", ["change", "blur"]);
|
||||
baseRules.sql = { required: true, message: "请输入 SQL 语句", trigger: ["blur"] };
|
||||
} else if (type === "JSON") {
|
||||
baseRules.json = { required: true, message: t("home.dataCenter.Please enter the JSON data"), trigger: ["blur"] };
|
||||
baseRules.json = { required: true, message: "请输入 JSON 数据", trigger: ["blur"] };
|
||||
}
|
||||
return baseRules;
|
||||
});
|
||||
@ -211,7 +212,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
function resetFieldsForType(type: string) {
|
||||
function resetFieldsForType(type: string, prevType?: string) {
|
||||
if (!props.model) {
|
||||
return;
|
||||
}
|
||||
@ -225,6 +226,9 @@
|
||||
if (type !== "SQL") {
|
||||
props.model.dataSourceId = undefined;
|
||||
props.model.sql = "";
|
||||
} else if (prevType && prevType !== "SQL") {
|
||||
props.model.dataSourceId = undefined;
|
||||
props.model.sql = "";
|
||||
}
|
||||
if (type !== "JSON") {
|
||||
props.model.json = "";
|
||||
@ -234,11 +238,11 @@
|
||||
function validateSql(sql: string) {
|
||||
const trimmed = sql.trim();
|
||||
if (!/^(SELECT|WITH)\b/i.test(trimmed)) {
|
||||
window.$message?.error(t("home.dataCenter.SQL must start with SELECT or WITH"));
|
||||
window.$message?.error("SQL 必须以 SELECT 或 WITH 开头");
|
||||
return false;
|
||||
}
|
||||
if (/[;]|--|\/\*/.test(trimmed)) {
|
||||
window.$message?.error(t("home.dataCenter.SQL must not include unsafe tokens"));
|
||||
window.$message?.error("SQL 不允许包含危险语句标记");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -290,7 +294,7 @@
|
||||
if (!next || next === prev) {
|
||||
return;
|
||||
}
|
||||
resetFieldsForType(next);
|
||||
resetFieldsForType(next, prev);
|
||||
formRef.value?.restoreValidation();
|
||||
}
|
||||
);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user