@fmdevui/fm-dev
Version:
Page level components developed based on Element Plus.
526 lines (521 loc) • 20.7 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
require('./renderComp.vue.js');
require('./moreChoose.vue.js');
var svg = require('@element-plus/icons-vue');
var useComputed = require('./useComputed.js');
var renderComp_vue_vue_type_script_setup_true_lang = require('./renderComp.vue2.js');
var moreChoose_vue_vue_type_script_setup_true_lang = require('./moreChoose.vue2.js');
var _sfc_main = /* @__PURE__ */ vue.defineComponent({
...{
name: "FmQueryCondition"
},
__name: "index",
props: {
opts: { default: () => ({}) },
labelWidth: { default: "120px" },
btnCheckBind: { default: () => ({}) },
btnResetBind: { default: () => ({}) },
loading: { type: Boolean, default: false },
reset: { type: Boolean, default: true },
boolEnter: { type: Boolean, default: true },
isShowOpen: { type: Boolean, default: true },
isExpansion: { type: Boolean, default: false },
maxVisibleRows: { default: 1 },
packUpTxt: { default: "\u6536\u8D77" },
unfoldTxt: { default: "\u5C55\u5F00" },
isFooter: { type: Boolean, default: true },
configChangedReset: { type: Boolean, default: false },
isShowWidthSize: { type: Boolean, default: false },
widthSize: { default: 4 },
isDropDownSelectMore: { type: Boolean, default: false },
moreCheckList: { default: () => [] },
popoverAttrs: { default: () => ({}) }
},
emits: ["handleEvent", "submit", "reset", "getCheckList", "getRefs"],
setup(__props, { expose: __expose, emit: __emit }) {
const {
compChildName,
selectListType,
compChildLabel,
compChildValue,
compChildShowLabel,
getPlaceholder,
getColLength
} = useComputed.useComputed();
const props = __props;
const slots = vue.useSlots();
const isShow = (name) => {
return Object.keys(slots).includes(name);
};
const popoverAttrsBind = vue.computed(() => {
return {
showTxt: "\u66F4\u591A",
title: "\u6240\u6709\u6761\u4EF6",
allTxt: "\u5168\u9009",
reverseTxt: "\u53CD\u9009",
clearTxt: "\u6E05\u7A7A",
...props.popoverAttrs
};
});
let queryState = vue.reactive({
form: Object.keys(props.opts).reduce((acc, field) => {
acc[field] = props.opts[field].defaultVal ?? null;
return acc;
}, {})
});
let colLength = vue.ref(4);
let showOpen = vue.ref(false);
let open = vue.ref(false);
const queryAttrs = vue.computed(() => {
return {
btnTxt: "\u67E5\u8BE2",
...props.btnCheckBind
};
});
const resetAttrs = vue.computed(() => {
return { btnTxt: "\u91CD\u7F6E", ...props.btnResetBind };
});
const originCellLength = vue.computed(() => {
let length = 0;
Object.keys(props.opts).forEach((key) => {
let span = props.opts[key].span || 1;
if (length % colLength.value + span > colLength.value) {
length += colLength.value - length % colLength.value;
}
length += span;
});
return length;
});
const cOpts = vue.computed(() => {
let renderSpan = 0;
return Object.keys(props.opts).reduce((acc, field) => {
let opt = {
...props.opts[field]
};
if (showOpen.value) {
renderSpan += opt.span ?? 1;
if (!open.value && renderSpan - 1 >= props.maxVisibleRows * colLength.value) {
return acc;
}
}
opt.dataIndex = field;
acc[field] = opt;
return acc;
}, {});
});
const cellLength = vue.computed(() => {
let length = 0;
Object.keys(props.opts).forEach((key) => {
let span = props.opts[key].span > 4 ? 4 : props.opts[key].span || 1;
length += span;
});
return length;
});
const gridAreas = vue.computed(() => {
const fields = Object.keys(cOpts.value);
let rowIndex = 0;
let rowSpan = 0;
const areas = [[]];
for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {
const field = fields[fieldIndex];
const opt = cOpts.value[field];
const span = Math.min(opt.span ?? 1, Math.min(colLength.value, 4));
if (rowSpan + span > colLength.value) {
while (rowSpan < colLength.value) {
areas[rowIndex].push(".");
rowSpan += 1;
}
rowSpan = 0;
areas[++rowIndex] = [];
}
rowSpan += span;
for (let index = 0; index < span; index++) {
areas[rowIndex].push(field);
}
}
if (areas[rowIndex].length === colLength.value) {
areas.push(Array(colLength.value).fill("submit_btn"));
} else {
while (areas[rowIndex].length < colLength.value) {
areas[rowIndex].push("submit_btn");
}
}
return areas.reduce((acc, cur) => {
acc += `'${cur.join(" ")}'
`;
return acc;
}, "");
});
const cEvent = vue.computed(() => {
return (opt) => {
let event = { ...opt.eventHandle };
let changeEvent = {};
Object.keys(event).forEach((v) => {
changeEvent[v] = (e) => {
if (opt.comp.includes("select") || opt.comp.includes("picker") || opt.comp.includes("date")) {
event[v] && event[v](e, queryState.form);
} else {
if (e) {
event[v] && event[v](e, queryState.form);
} else {
event[v] && event[v](queryState.form);
}
}
};
});
return { ...changeEvent };
};
});
const initForm = (opts, keepVal = false) => {
return Object.keys(opts).reduce((acc, field) => {
if (keepVal && queryState.form) {
acc[field] = queryState.form[field] ?? opts[field].defaultVal ?? null;
} else {
acc[field] = opts[field].defaultVal ?? null;
}
return acc;
}, {});
};
const emits = __emit;
const tselecttableref = vue.ref({});
const handleRef = (el, opt, key) => {
emits("getRefs", el, opt, key);
if (el) {
tselecttableref.value[`tselecttableref-${key}`] = el;
}
};
const getRefs = (el, opt, index) => {
emits("getRefs", el, opt, index);
};
const resetHandle = () => {
queryState.form = initForm(props.opts);
const refList = Object.keys(tselecttableref.value).filter(
(item) => item.includes("tselecttableref")
);
if (refList.length > 0 && tselecttableref.value) {
refList.map((val) => {
tselecttableref.value[val].clear();
});
}
emits("reset", queryState.form);
checkHandle("reset");
};
const resetData = () => {
queryState.form = initForm(props.opts);
const refList = Object.keys(tselecttableref.value).filter(
(item) => item.includes("tselecttableref")
);
if (refList.length > 0 && tselecttableref.value) {
refList.map((val) => {
tselecttableref.value[val].clear();
});
}
};
const handleEvent = ({ isChange = false, type, val }, dataIndex) => {
if (!isChange) {
emits("handleEvent", type, val, queryState.form);
} else if (dataIndex) {
queryState.form[dataIndex] = val;
}
};
const checkHandle = (flagText = false) => {
emits("submit", queryState.form, flagText);
};
vue.onMounted(() => {
if (props.isShowOpen) {
showOpen.value = true;
} else {
showOpen.value = false;
}
if (props.isExpansion) {
open.value = true;
} else {
open.value = false;
}
if (props.isShowWidthSize) {
colLength.value = props.widthSize;
} else {
colLength.value = getColLength();
}
if (props.boolEnter) {
document.onkeyup = (e) => {
let key = e.keyCode;
let pagination = document.querySelectorAll(".el-pagination");
let isPaginationInputFocus = false;
if (pagination) {
pagination.forEach((ele) => {
let paginationInputList = ele.getElementsByTagName("input");
let paginationInput = paginationInputList[paginationInputList.length - 1];
if (paginationInput === document.activeElement) {
isPaginationInputFocus = true;
}
});
}
if (isPaginationInputFocus) {
return;
}
if (key === 13) {
checkHandle();
}
};
}
if (isShow("footerBtn") || !props.isFooter) {
open.value = true;
}
if (props.isDropDownSelectMore) {
open.value = true;
showOpen.value = false;
}
});
vue.watch(
() => props.widthSize,
(val) => {
colLength.value = val;
}
);
vue.watch(
() => props.opts,
(opts) => {
queryState.form = initForm(opts, !props.configChangedReset);
},
{ deep: true }
);
__expose({
queryState,
props,
colLength,
resetData,
resetHandle,
checkHandle,
handleEvent
});
return (_ctx, _cache) => {
const _component_el_form_item = vue.resolveComponent("el-form-item");
const _component_el_button = vue.resolveComponent("el-button");
const _component_el_icon = vue.resolveComponent("el-icon");
const _component_el_form = vue.resolveComponent("el-form");
return vue.openBlock(), vue.createBlock(_component_el_form, vue.mergeProps({ id: "t_query_condition" }, _ctx.$attrs, {
"label-width": _ctx.labelWidth,
form: vue.unref(queryState).form,
size: "default",
class: "fm-query-condition",
style: {
"grid-template-areas": gridAreas.value,
"grid-template-columns": `repeat(${vue.unref(colLength)}, minmax(0px, ${100 / vue.unref(colLength)}%))`
},
onSubmit: _cache[2] || (_cache[2] = vue.withModifiers(() => {
}, ["prevent"]))
}), {
default: vue.withCtx(() => [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList(cOpts.value, (opt, i) => {
return vue.openBlock(), vue.createBlock(_component_el_form_item, vue.mergeProps({
key: i,
label: opt.label,
"label-width": opt.labelWidth
}, { ref_for: true }, _ctx.$attrs, {
style: { gridArea: i },
class: [opt.className, { render_label: opt.labelRender }]
}), vue.createSlots({
default: vue.withCtx(() => [
opt.slotName ? vue.renderSlot(_ctx.$slots, opt.slotName, {
key: 0,
param: vue.unref(queryState).form,
scope: vue.unref(queryState).form
}) : vue.createCommentVNode("v-if", true),
opt.isSelfCom ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(opt.comp), vue.mergeProps(
{
key: 1,
ref_for: true,
ref: opt.comp === "fm-select-table" ? (el) => handleRef(el, opt, i) : (el) => getRefs(el, opt, i),
modelValue: vue.unref(queryState).form[opt.dataIndex],
"onUpdate:modelValue": ($event) => vue.unref(queryState).form[opt.dataIndex] = $event,
placeholder: opt.placeholder || vue.unref(getPlaceholder)(opt)
},
{ ref_for: true },
typeof opt.bind == "function" ? opt.bind(vue.unref(queryState).form) : { clearable: true, filterable: true, ..._ctx.$attrs, ...opt.bind },
{
style: { width: opt.width || "100%" },
onChange: ($event) => handleEvent({ type: opt.event, val: vue.unref(queryState).form[opt.dataIndex] })
},
vue.toHandlers(cEvent.value(opt))
), null, 16, ["modelValue", "onUpdate:modelValue", "placeholder", "style", "onChange"])) : vue.createCommentVNode("v-if", true),
!opt.isSelfCom && !opt.slotName ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(opt.comp), vue.mergeProps(
{
key: 2,
ref_for: true
},
typeof opt.bind == "function" ? opt.bind(vue.unref(queryState).form) : { clearable: true, filterable: true, ..._ctx.$attrs, ...opt.bind },
{
placeholder: opt.placeholder || vue.unref(getPlaceholder)(opt),
onChange: ($event) => handleEvent({ type: opt.event, val: vue.unref(queryState).form[opt.dataIndex] }),
ref_for: true,
ref: (el) => getRefs(el, opt, i)
},
vue.toHandlers(cEvent.value(opt)),
{
modelValue: vue.unref(queryState).form[opt.dataIndex],
"onUpdate:modelValue": ($event) => vue.unref(queryState).form[opt.dataIndex] = $event
}
), {
default: vue.withCtx(() => [
(vue.openBlock(true), vue.createElementBlock(
vue.Fragment,
null,
vue.renderList(vue.unref(selectListType)(opt), (value, key, index) => {
return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(vue.unref(compChildName)(opt)), {
key: index,
disabled: value.disabled,
label: vue.unref(compChildLabel)(opt, value),
value: vue.unref(compChildValue)(opt, value, key)
}, {
default: vue.withCtx(() => [
vue.createTextVNode(
vue.toDisplayString(vue.unref(compChildShowLabel)(opt, value)),
1
/* TEXT */
)
]),
_: 2
/* DYNAMIC */
}, 1032, ["disabled", "label", "value"]);
}),
128
/* KEYED_FRAGMENT */
))
]),
_: 2
/* DYNAMIC */
}, 1040, ["placeholder", "onChange", "modelValue", "onUpdate:modelValue"])) : vue.createCommentVNode("v-if", true)
]),
_: 2
/* DYNAMIC */
}, [
opt.labelRender ? {
name: "label",
fn: vue.withCtx(() => [
vue.createVNode(renderComp_vue_vue_type_script_setup_true_lang.default, {
form: vue.unref(queryState).form,
render: opt.labelRender
}, null, 8, ["form", "render"])
]),
key: "0"
} : void 0
]), 1040, ["label", "label-width", "style", "class"]);
}),
128
/* KEYED_FRAGMENT */
)),
Object.keys(cOpts.value).length > 0 ? (vue.openBlock(), vue.createBlock(_component_el_form_item, {
key: 0,
"label-width": "0",
style: { "grid-area": "submit_btn" },
class: vue.normalizeClass([
"btn",
{ flex_end: cellLength.value % vue.unref(colLength) === 0 },
{ btn_flex_end: Object.keys(cOpts.value).length === 4 || cellLength.value > 3 }
])
}, {
default: vue.withCtx(() => [
_ctx.isFooter ? (vue.openBlock(), vue.createElementBlock(
vue.Fragment,
{ key: 0 },
[
vue.renderSlot(_ctx.$slots, "footerBtn"),
!vue.unref(slots).footerBtn ? (vue.openBlock(), vue.createElementBlock(
vue.Fragment,
{ key: 0 },
[
vue.createVNode(_component_el_button, vue.mergeProps({
class: "btn_check",
onClick: checkHandle
}, { type: "primary", ...queryAttrs.value }, { loading: _ctx.loading }), {
default: vue.withCtx(() => [
vue.createTextVNode(
vue.toDisplayString(queryAttrs.value.btnTxt),
1
/* TEXT */
)
]),
_: 1
/* STABLE */
}, 16, ["loading"]),
_ctx.reset ? (vue.openBlock(), vue.createBlock(
_component_el_button,
vue.mergeProps({
key: 0,
class: "btn_reset"
}, resetAttrs.value, { onClick: resetHandle }),
{
default: vue.withCtx(() => [
vue.createTextVNode(
vue.toDisplayString(resetAttrs.value.btnTxt),
1
/* TEXT */
)
]),
_: 1
/* STABLE */
},
16
/* FULL_PROPS */
)) : vue.createCommentVNode("v-if", true),
vue.renderSlot(_ctx.$slots, "querybar"),
originCellLength.value > _ctx.maxVisibleRows * vue.unref(colLength) && vue.unref(showOpen) ? (vue.openBlock(), vue.createBlock(_component_el_button, {
key: 1,
onClick: _cache[0] || (_cache[0] = ($event) => vue.isRef(open) ? open.value = !vue.unref(open) : open = !vue.unref(open)),
link: ""
}, {
default: vue.withCtx(() => [
vue.createTextVNode(
vue.toDisplayString(vue.unref(open) ? _ctx.packUpTxt : _ctx.unfoldTxt) + " ",
1
/* TEXT */
),
vue.unref(open) ? (vue.openBlock(), vue.createBlock(_component_el_icon, { key: 0 }, {
default: vue.withCtx(() => [
vue.createVNode(vue.unref(svg.ArrowUp))
]),
_: 1
/* STABLE */
})) : (vue.openBlock(), vue.createBlock(_component_el_icon, { key: 1 }, {
default: vue.withCtx(() => [
vue.createVNode(vue.unref(svg.ArrowDown))
]),
_: 1
/* STABLE */
}))
]),
_: 1
/* STABLE */
})) : vue.createCommentVNode("v-if", true),
vue.createVNode(moreChoose_vue_vue_type_script_setup_true_lang.default, {
isDropDownSelectMore: _ctx.isDropDownSelectMore,
moreCheckList: _ctx.moreCheckList,
popoverAttrsBind: popoverAttrsBind.value,
onGetCheckList: _cache[1] || (_cache[1] = (event) => emits("getCheckList", event))
}, null, 8, ["isDropDownSelectMore", "moreCheckList", "popoverAttrsBind"])
],
64
/* STABLE_FRAGMENT */
)) : vue.createCommentVNode("v-if", true)
],
64
/* STABLE_FRAGMENT */
)) : vue.createCommentVNode("v-if", true)
]),
_: 3
/* FORWARDED */
}, 8, ["class"])) : vue.createCommentVNode("v-if", true)
]),
_: 3
/* FORWARDED */
}, 16, ["label-width", "form", "style"]);
};
}
});
exports.default = _sfc_main;