yanzhen-design-vue
Version:
97 lines (96 loc) • 2.79 kB
JavaScript
import { computed, ref, useSlots, onUnmounted } from "vue";
import { pageProviderProps } from "@yanzhen-lowcode/core";
import { flattenDeep, isFunction } from "lodash-es";
import { useModelValue, unref, useDynamicProps, useProxyProps } from "@yanzhen-libs/utils-vue";
import { isObject } from "@yanzhen-libs/utils";
import { createReusableTemplate } from "@vueuse/core";
import { formProviderEmits } from "./form-provider.mjs";
import { useFormProviderSchema } from "./hooks/use-form-provider-schema.mjs";
function useFormProvider(props, emit) {
const modelValue = useModelValue(props, "value", emit);
const modelRef = computed(() => {
var _a;
return unref(modelValue) || props.model || ((_a = props.form) == null ? void 0 : _a.model);
});
const rulesRef = computed(() => {
var _a;
const rules = props.rules ?? ((_a = props.form) == null ? void 0 : _a.rules);
return isObject(rules) ? rules : {};
});
const formRef = ref(null);
const $slots = useSlots();
const type = "form";
const _schema = ref({ type });
const _schemaRef = computed(() => {
return {
...props.schema ?? {},
type
};
});
const options = {
form: computed(() => props.form),
row: computed(() => props.row),
model: modelRef,
rules: rulesRef,
slots: $slots
};
const { formSchema, bodySchema, rowSchema, bodySchemaConfig, handleFormProviderItemProps } = useFormProviderSchema(_schemaRef, options, formRef);
const updatePropsKey = useDynamicProps({ update: true });
const pageProviderProps$1 = useProxyProps(props, formProviderEmits, {
emit,
include: Object.keys(pageProviderProps),
exclude: ["value", "schema"],
filter: (key) => {
if (key === "onUpdate:value") {
const handleUpdateValue = flattenDeep([props["onUpdate:value"]]).find(isFunction);
return updatePropsKey.includes("value") && isFunction(handleUpdateValue);
}
return true;
}
});
const schemaRef = computed(() => {
const row = unref(rowSchema);
const body = unref(bodySchema);
const schema = {
type: "page",
body
};
if (row) {
schema.body = {
...row,
body: schema.body
};
}
return schema;
});
const [DefinePageProviderItem, ReusablePageProviderItem] = createReusableTemplate();
const ctx = {
pageProviderProps: pageProviderProps$1,
modelRef,
rulesRef,
schemaRef,
rowSchema,
formSchema,
formRef,
bodySchema,
bodySchemaConfig
};
const methods = {
handleFormProviderItemProps
};
const templates = {
DefinePageProviderItem,
ReusablePageProviderItem
};
onUnmounted(() => {
_schema.value = { type };
});
return {
ctx,
methods,
templates
};
}
export {
useFormProvider
};