2024-04-23 13:12:02 +08:00

70 lines
1.9 KiB
TypeScript

import type { App } from 'vue'
import CatchForm from './CatchForm.vue'
import { $global } from '/admin/components/catchForm/config/symbol'
import * as Directives from '/admin/components/catchForm/directive'
import type {
anyObject,
schemaType,
formValuesType,
contextType,
formItemType,
formItemsType,
formElement,
changeItemType,
$globalType
} from '/admin/components/catchForm/config/commonType'
import components from '/admin/components/catchForm/components'
/**
* 合并 custom elements
* @param customElements
* @returns
*/
const handleMergeElements = (customElements: { [key: string]: formElement }) => {
const mergeElements: { [key: string]: formElement } = {}
Object.entries(components).forEach(([key, value]) => {
const customData = customElements[key]
if (customData) {
return (mergeElements[key] = {
...value,
component: customData.component,
modelName: customData.modelName || 'modelValue',
attr: customData.attr || value.attr
})
}
return (mergeElements[key] = { ...value, modelName: 'modelValue' })
})
return mergeElements
}
type $optionsType = {
http?: any
// elements?: { [key: string]: formElement }
// iconSelectConfig?: iconSelectConfigType
customElements?: { [key: string]: formElement }
}
const install = function (app: App<Element>, options: $optionsType = {}) {
const { http, customElements = {} } = options
app.provide($global, {
http: http,
elements: handleMergeElements(customElements)
})
// 注册指令
Object.values(Directives).forEach(fn => fn(app))
}
export { CatchForm }
export type { anyObject, schemaType, formValuesType, contextType, formItemType, formItemsType, formElement, changeItemType, $globalType }
export function bootstrapCatchForm(app: App, options:Object = {}) {
install(app, options)
app.component('CatchForm', CatchForm)
}