Commit 9e3b461e authored by 张耀's avatar 张耀

feat:

优化指标配置前端逻辑
parent 22bf74d2
...@@ -29,12 +29,12 @@ ...@@ -29,12 +29,12 @@
@input="inputLabel($index, true)"></el-input> @input="inputLabel($index, true)"></el-input>
</template> </template>
<div class="filter-first-tree-lists" @mousedown.prevent=""> <div class="filter-first-tree-lists" @mousedown.prevent="">
<ul class="bg-scroll" v-show="dataTree($index).length > 0"> <ul class="bg-scroll" v-show="state.form.warningScopeRows[$index].firstOptions.length > 0">
<li <li
v-for="(data, i) in dataTree($index)" v-for="data in state.form.warningScopeRows[$index].firstOptions"
:key="data" :key="data"
:class="{ active: state.form.warningScopeRows[$index].indicator_scope == data.label }"> :class="{ active: state.form.warningScopeRows[$index].indicator_scope == data.label }">
<div class="first-label-main" @click="chooseTreeFirst($index, data, i)"> <div class="first-label-main" @click="chooseTreeFirst($index, data)">
<div class="tree-label" v-html="data.label_html"></div> <div class="tree-label" v-html="data.label_html"></div>
<div class="tree-icon"> <div class="tree-icon">
<bg-icon <bg-icon
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
</div> </div>
</li> </li>
</ul> </ul>
<ul v-show="dataTree($index).length == 0"> <ul v-show="state.form.warningScopeRows[$index].firstOptions.length == 0">
<li class="no-data"> <li class="no-data">
{{ {{
state.form.warningScopeRows[$index].input_indicator_tag state.form.warningScopeRows[$index].input_indicator_tag
...@@ -167,30 +167,8 @@ const tableRules = { ...@@ -167,30 +167,8 @@ const tableRules = {
const dataTreeDefault = ref([]); const dataTreeDefault = ref([]);
// 是否是输入触发 // 是否是输入触发
const isInput = ref(false); const isInput = ref(false);
// 当前操作的表格下标
const activeIndex = ref(-1);
// 指标输入框元素集合 // 指标输入框元素集合
const inputRef = ref([]); const inputRef = ref([]);
// 下拉数据处理
const dataTree = computed(() => {
return (index) => {
const { firstOptions, input_indicator_tag, oldQuery } = state.form.warningScopeRows[index];
let query = isInput.value ? input_indicator_tag : oldQuery;
// if (!query) return firstOptions;
if (!query) return [];
let arr = firstOptions.filter((e) => e.label.includes(query));
if (arr == []) {
state.form.warningScopeRows[index].lastOptions = [];
state.form.warningScopeRows[index].indicator_scope = "";
}
return arr.map((e) => {
return {
...e,
label_html: e.label.replaceAll(input_indicator_tag, `<span class='mate-str'>${input_indicator_tag}</span>`),
};
});
};
});
// 监听父组件传过来的指标表达式 // 监听父组件传过来的指标表达式
watch( watch(
() => props.indicator_expression, () => props.indicator_expression,
...@@ -209,7 +187,7 @@ watch( ...@@ -209,7 +187,7 @@ watch(
indicator_scope: "", indicator_scope: "",
indicator_tag: "", indicator_tag: "",
oldQuery: "", oldQuery: "",
firstOptions: dataTreeDefault.value, firstOptions: [],
lastOptions: [], lastOptions: [],
cname: "", cname: "",
visible: false, visible: false,
...@@ -221,40 +199,17 @@ watch( ...@@ -221,40 +199,17 @@ watch(
state.form.warningScopeRows = arr; state.form.warningScopeRows = arr;
} }
); );
// 监听编辑的原数据,并显示
watch(
() => props.warningScopeRows,
(n) => {
state.form.warningScopeRows =
n?.map((e) => {
return {
key: e.key,
input_indicator_tag: e.input_indicator_tag,
indicator_scope: e.indicator_scope,
indicator_tag: e.indicator_tag,
firstOptions: dataTreeDefault.value,
lastOptions: [],
oldQuery: "",
visible: false,
cname: e.cname,
is_required: e.is_required,
is_linkage: e.is_linkage,
};
}) || [];
},
{
deep: true,
immediate: true,
}
);
// 选择第一级,获取第二级数据 // 选择第一级,获取第二级数据
const chooseTreeFirst = (index, data) => { const chooseTreeFirst = (index, data, isInfo = false) => {
let i = "";
if (!isInfo) {
inputRef.value[index].focus(); inputRef.value[index].focus();
let i = state.form.warningScopeRows[index].firstOptions.findIndex((e) => e.label == data.label); i = state.form.warningScopeRows[index].firstOptions.findIndex((e) => e.label == data.label);
state.form.warningScopeRows[index].firstOptions[i].isLoading = true; state.form.warningScopeRows[index].firstOptions[i].isLoading = true;
state.form.warningScopeRows[activeIndex.value].indicator_tag = ""; state.form.warningScopeRows[index].indicator_tag = "";
state.form.warningScopeRows[index].indicator_scope = data.label; state.form.warningScopeRows[index].indicator_scope = data.label;
state.form.warningScopeRows[index].lastOptions = []; state.form.warningScopeRows[index].lastOptions = [];
}
const params = { const params = {
label_name: data.label, label_name: data.label,
}; };
...@@ -268,6 +223,7 @@ const chooseTreeFirst = (index, data) => { ...@@ -268,6 +223,7 @@ const chooseTreeFirst = (index, data) => {
} }
}) })
.finally(() => { .finally(() => {
if (i === "") return;
state.form.warningScopeRows[index].firstOptions[i].isLoading = false; state.form.warningScopeRows[index].firstOptions[i].isLoading = false;
}); });
}; };
...@@ -288,36 +244,63 @@ const getDataTreeLevelFirst = () => { ...@@ -288,36 +244,63 @@ const getDataTreeLevelFirst = () => {
}); });
}; };
let timer = null; let timer = null;
// 输入模糊查询数据 const inputType = ref(false);
const inputLabel = async (index, type) => { const TreeFilter = (index, type) => {
activeIndex.value = index; let options = dataTreeDefault.value;
// 用户输入节流 const { input_indicator_tag, oldQuery } = state.form.warningScopeRows[index];
timer && clearTimeout(timer); state.form.warningScopeRows[index].firstOptions = [];
timer = setTimeout(() => { if (input_indicator_tag == "") {
state.form.warningScopeRows[index].visible = true;
isInput.value = type;
if (state.form.warningScopeRows[index].input_indicator_tag == "") {
state.form.warningScopeRows[index].lastOptions = []; state.form.warningScopeRows[index].lastOptions = [];
}
if (type) {
state.form.warningScopeRows[index].oldQuery = state.form.warningScopeRows[index].input_indicator_tag;
state.form.warningScopeRows[index].indicator_scope = ""; state.form.warningScopeRows[index].indicator_scope = "";
state.form.warningScopeRows[index].indicator_tag = ""; state.form.warningScopeRows[index].indicator_tag = "";
state.form.warningScopeRows[index].oldQuery = "";
return;
}
let query = type ? input_indicator_tag : oldQuery;
for (let i = 0; i < options.length; i++) {
if (options[i].label.includes(query)) {
state.form.warningScopeRows[index].firstOptions.push({
...options[i],
label_html: options[i].label.replaceAll(
input_indicator_tag,
`<span class='mate-str'>${input_indicator_tag}</span>`
),
});
}
}
if (state.form.warningScopeRows[index].firstOptions.length == 0) {
state.form.warningScopeRows[index].lastOptions = []; state.form.warningScopeRows[index].lastOptions = [];
state.form.warningScopeRows[index].indicator_scope = "";
}
};
// 输入模糊查询数据
const inputLabel = async (index, type) => {
inputType.value = type;
// 用户输入节流
if (timer) {
clearTimeout(timer);
timer = null;
} }
}, 500); timer = setTimeout(
() => {
state.form.warningScopeRows[index].visible = true;
TreeFilter(index, type);
},
type ? 500 : 0
);
}; };
// 失去焦点是隐藏popper // 失去焦点是隐藏popper
const blurInput = (index) => { const blurInput = (index) => {
const { input_indicator_tag, oldQuery } = state.form.warningScopeRows[index];
state.form.warningScopeRows[index].oldQuery = inputType.value ? input_indicator_tag : oldQuery;
state.form.warningScopeRows[index].visible = false; state.form.warningScopeRows[index].visible = false;
}; };
// 选择范围中的属性 // 选择范围中的属性
const chooseTreeLast = async (last, index, type) => { const chooseTreeLast = async (last, index, type) => {
isInput.value = type; isInput.value = type;
state.form.warningScopeRows[activeIndex.value].input_indicator_tag = last; inputRef.value[index].blur();
state.form.warningScopeRows[activeIndex.value].indicator_tag = last; state.form.warningScopeRows[index].input_indicator_tag = last;
await delay(500); state.form.warningScopeRows[index].indicator_tag = last;
blurInput(index);
}; };
// form表单元素 // form表单元素
const form_ref = ref(null); const form_ref = ref(null);
...@@ -341,6 +324,33 @@ const Submit = async () => { ...@@ -341,6 +324,33 @@ const Submit = async () => {
} }
return form_valid && isFull; return form_valid && isFull;
}; };
// 监听编辑的原数据,并显示
watch(
() => props.warningScopeRows,
(n) => {
state.form.warningScopeRows =
n?.map((e, i) => {
chooseTreeFirst(i, { label: e.indicator_scope }, true);
return {
key: e.key,
input_indicator_tag: e.indicator_tag,
indicator_scope: e.indicator_scope,
indicator_tag: e.indicator_tag,
firstOptions: [],
lastOptions: [],
oldQuery: e.indicator_scope,
visible: false,
cname: e.cname,
is_required: e.is_required,
is_linkage: e.is_linkage,
};
}) || [];
},
{
deep: true,
immediate: true,
}
);
// 获取第一级指标范围列表 // 获取第一级指标范围列表
onMounted(() => { onMounted(() => {
getDataTreeLevelFirst(); getDataTreeLevelFirst();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment