@zhsz/cool-design-crud
Version:
98 lines (97 loc) • 2.29 kB
JavaScript
import { defineComponent, ref, watch, createVNode } from "vue";
import "../../utils/test.mjs";
import { useCore } from "../../hooks/core.mjs";
import { isArray } from "../../utils/index.mjs";
import "@formily/core";
import "lodash-es";
import "../../hooks/table.mjs";
const index = /* @__PURE__ */ defineComponent({
name: "cl-query",
props: {
modelValue: [String, Number],
list: {
type: Array,
required: true
},
field: {
type: String,
default: "query"
},
multiple: Boolean,
callback: Function
},
emits: ["update:modelValue", "change"],
setup(props, {
emit,
expose
}) {
const {
crud
} = useCore();
const list = ref([]);
function update() {
let arr = [];
if (isArray(props.modelValue)) {
arr = props.modelValue;
} else {
arr = [props.modelValue];
}
if (!props.multiple) {
arr.splice(1);
}
list.value = (props.list || []).map((e) => {
e.active = arr.includes(e.value);
return e;
});
}
update();
function selectItem(item) {
if (item.active) {
item.active = false;
} else {
if (props.multiple) {
item.active = true;
} else {
list.value.forEach((e) => {
e.active = e.value === item.value;
});
}
}
const selection = list.value.filter((e) => e.active).map((e) => e.value);
const value = props.multiple ? selection : selection[0];
if (props.callback) {
props.callback(value);
} else {
crud.refresh({
[props.field]: value
});
emit("change", value);
}
}
watch(() => props.modelValue, () => {
update();
});
expose({
list,
selectItem
});
return () => {
return createVNode("div", {
"class": "cl-query"
}, [createVNode("ul", null, [list.value.map((item, index2) => {
return createVNode("li", {
"class": {
"is-active": item.active
},
"key": index2,
"onClick": () => {
selectItem(item);
}
}, [createVNode("span", null, [item.label])]);
})])]);
};
}
});
export {
index as default
};