UNPKG

jobsys-newbie

Version:

Enhanced component based on ant-design-vue

168 lines (158 loc) 4.22 kB
import { defineComponent, provide, watch } from "vue" import { useI18n } from "vue-i18n" export const NEWBIE_LOCALE = Symbol("NEWBIE_LOCALE") export const NEWBIE_EDITOR = Symbol("NEWBIE_EDITOR") export const NEWBIE_TABLE = Symbol("NEWBIE_TABLE") export const NEWBIE_UPLOADER = Symbol("NEWBIE_UPLOADER") export const NEWBIE_FORM = Symbol("NEWBIE_FORM") export const NEWBIE_SEARCH = Symbol("NEWBIE_SEARCH") /** * Newbie 配置组件 * @version 1.0.0 */ export default defineComponent({ name: "NewbieProvider", /** * @typedef {Object} ProviderProps * @property {EditorProviderProps} [editor] `NewbieEditor` 配置 * @property {TableProviderProps} [table] `NewbieTable` 配置 * @property {UploaderProviderProps} [uploader] `NewbieUploader` 配置 * @property {FormProviderProps} [form] `NewbieForm` 配置 * @property {SearchProviderProps} [search] `NewbieSearch` 配置 * */ props: { /** * @typedef {Object} EditorProviderProps `NewbieEditor` 配置 * @property {string} editor.uploadUrl 上传地址 */ editor: { type: Object, default: () => ({ uploadUrl: "", }), }, /** * @typedef {Object} TableProviderProps `NewbieTable` 配置 * @property {number} [page] 当前页码 * @property {number} [pageSize] 每页条数 * @property {string} [pageKey] 页码参数名 * @property {string} [pageSizeKey] 每页条数参数名 * @property {Function} [afterFetched] 返回数据处理函数 */ table: { type: Object, default: () => ({ page: 1, pageSize: 10, pageKey: "page", pageSizeKey: "pageSize", afterFetched: null, }), }, /** * @typedef {Object} UploaderProviderProps `NewbieUploader` 配置 * @property {string} uploadUrl 上传地址 * @property {UploadFileItem} defaultFileItem 默认文件项 * * @typedef {Object} UploadFileItem 文件项 * @property {string} [id] 文件 ID * @property {string} [name] 文件名 * @property {string} defaultFileItem.url 文件地址 * @property {string} defaultFileItem.path 文件路径 * @property {string} [thumbUrl] 缩略图地址 */ uploader: { type: Object, default: () => ({ uploadUrl: "", defaultFileItem: { id: "id", name: "name", url: "url", path: "path", thumbUrl: "thumbUrl", }, }), }, /** * @typedef {Object} FormProviderProps `NewbieForm` 配置 * @property {Object} [format] 格式化配置, 如 {date: true} 表示在提交表单时使用 `useFormFormat` 格式所有日期字段 * @property {Function} [afterFetched] 处理接口返回数据的函数 * @property {Object} [columns] Field的默认配置, 如 {switch: {defaultProps: {...}}},可以被覆盖 */ form: { type: Object, default: () => ({ format: {}, afterFetched: null, columns: {}, }), }, /** * @typedef {Object} SearchProviderProps `NewbieSearch` 配置 * @property {Object} [maskClass] 定制伪 Input 样式 * @property {Object} [inputClass] 弹层中 Input 的样式 * @property {Function} [valueFormatter] 时间格式化函数 */ search: { type: Object, default: () => ({ maskClass: "", inputClass: "", valueFormatter: null, }), }, /** * 语言配置 */ locale: { type: String, default: "zh_CN", }, }, setup(props, { slots }) { // 获取当前 locale const { locale } = useI18n() watch( () => props.locale, (value) => { if (value) { locale.value = value } }, { immediate: true, }, ) // 提供语言配置 provide(NEWBIE_LOCALE, props.locale) provide(NEWBIE_EDITOR, { uploadUrl: "", ...props.editor }) provide(NEWBIE_TABLE, { page: 1, pageSize: 10, pageKey: "page", pageSizeKey: "pageSize", afterFetched: null, ...props.table, }) provide(NEWBIE_UPLOADER, { defaultFileItem: { id: "id", name: "name", url: "url", path: "path", thumbUrl: "thumbUrl", }, ...props.uploader, }) provide(NEWBIE_FORM, { format: {}, ...props.form }) provide(NEWBIE_SEARCH, { maskClass: "", inputClass: "", valueFormatter: null, ...props.search, }) return () => <div>{slots.default?.()}</div> }, })