@awen-utils/vue-element 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +196 -0
- package/dist/index.js +265 -0
- package/dist/index.js.map +1 -0
- package/dist/vue-element.css +1 -0
- package/package.json +63 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),v=require("@awen-utils/shared"),p=require("element-plus"),y={key:0,class:"m-button__count"},B=e.defineComponent({__name:"MButton",props:{label:{default:"Button"},type:{default:"default"},size:{default:"default"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},plain:{type:Boolean,default:!1},count:{},showTimestamp:{type:Boolean,default:!1}},emits:["click"],setup(t,{emit:i}){const r=t,o=i,n=u=>{if(r.showTimestamp){const s=v.formatDate(new Date,"YYYY-MM-DD HH:mm:ss");console.log("[MButton] Clicked at:",s)}o("click",u)};return(u,s)=>(e.openBlock(),e.createBlock(e.unref(p.ElButton),{type:t.type,size:t.size,disabled:t.disabled,loading:t.loading,plain:t.plain,onClick:n},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.label)+" ",1),t.count!==void 0?(e.openBlock(),e.createElementBlock("span",y,"("+e.toDisplayString(t.count)+")",1)):e.createCommentVNode("",!0)]),_:1},8,["type","size","disabled","loading","plain"]))}}),k=(t,i)=>{const r=t.__vccOpts||t;for(const[o,n]of i)r[o]=n;return r},w=k(B,[["__scopeId","data-v-0d1ef3ba"]]),C=e.defineComponent({__name:"MForm",props:{model:{},items:{},labelWidth:{default:"100px"},showActions:{type:Boolean,default:!0},submitText:{default:"提交"},resetText:{default:"重置"},inline:{type:Boolean,default:!1}},emits:["submit","reset"],setup(t,{expose:i,emit:r}){const o=t,n=r,u=e.ref(),s=e.reactive({}),m=async()=>{let c=!0;for(const d of o.items)if(d.customValidator){const a=o.model[d.prop],f=d.customValidator(a);f.valid?delete s[d.prop]:(s[d.prop]=f.message||"校验失败",c=!1)}return c},h=async()=>{const c=await u.value?.validate().catch(()=>!1),d=await m();c&&d&&n("submit",o.model)},l=()=>{u.value?.resetFields(),Object.keys(s).forEach(c=>delete s[c]),n("reset")},g=c=>{const d=[];return c.required&&d.push({required:!0,message:`${c.label}不能为空`,trigger:"blur"}),c.rules&&(Array.isArray(c.rules)?d.push(...c.rules):d.push(c.rules)),d};return i({formRef:u,validate:()=>u.value?.validate(),resetFields:l}),(c,d)=>(e.openBlock(),e.createBlock(e.unref(p.ElForm),{ref_key:"formRef",ref:u,model:t.model,"label-width":t.labelWidth,inline:t.inline},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.items,a=>(e.openBlock(),e.createBlock(e.unref(p.ElFormItem),{key:a.prop,prop:a.prop,label:a.label,rules:g(a),error:s[a.prop]},{default:e.withCtx(()=>[e.renderSlot(c.$slots,a.slot||a.prop,e.mergeProps({ref_for:!0},{item:a,model:t.model}))]),_:2},1032,["prop","label","rules","error"]))),128)),t.showActions?(e.openBlock(),e.createBlock(e.unref(p.ElFormItem),{key:0},{default:e.withCtx(()=>[e.createVNode(e.unref(p.ElButton),{type:"primary",onClick:h},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.submitText),1)]),_:1}),e.createVNode(e.unref(p.ElButton),{onClick:l},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.resetText),1)]),_:1})]),_:1})):e.createCommentVNode("",!0)]),_:3},8,["model","label-width","inline"]))}}),x={class:"m-table-wrapper"},S={key:0,class:"m-table__pagination"},E=e.defineComponent({__name:"MTable",props:{data:{},columns:{},showIndex:{type:Boolean,default:!0},indexLabel:{default:"序号"},loading:{type:Boolean,default:!1},showPagination:{type:Boolean,default:!0},currentPage:{default:1},pageSize:{default:10},total:{default:0},paginationSizes:{default:()=>[10,20,50,100]}},emits:["update:currentPage","update:pageSize","page-change"],setup(t,{emit:i}){const r=t,o=i,n=s=>{o("update:currentPage",s),o("page-change",s,r.pageSize)},u=s=>{o("update:pageSize",s),o("page-change",1,s)};return(s,m)=>{const h=e.resolveDirective("loading");return e.openBlock(),e.createElementBlock("div",x,[e.withDirectives((e.openBlock(),e.createBlock(e.unref(p.ElTable),{data:t.data,style:{width:"100%"}},{default:e.withCtx(()=>[t.showIndex?(e.openBlock(),e.createBlock(e.unref(p.ElTableColumn),{key:0,type:"index",label:t.indexLabel,width:"70",align:"center"},null,8,["label"])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,l=>(e.openBlock(),e.createBlock(e.unref(p.ElTableColumn),{key:l.prop||l.label,prop:l.prop,label:l.label,width:l.width,"min-width":l.minWidth,align:l.align,fixed:l.fixed,sortable:l.sortable,formatter:l.formatter},e.createSlots({_:2},[l.slot?{name:"default",fn:e.withCtx(g=>[e.renderSlot(s.$slots,l.slot,e.mergeProps({ref_for:!0},g),void 0,!0)]),key:"0"}:void 0]),1032,["prop","label","width","min-width","align","fixed","sortable","formatter"]))),128))]),_:3},8,["data"])),[[h,t.loading]]),t.showPagination?(e.openBlock(),e.createElementBlock("div",S,[e.createVNode(e.unref(p.ElPagination),{"current-page":r.currentPage,"onUpdate:currentPage":m[0]||(m[0]=l=>r.currentPage=l),"page-size":r.pageSize,"onUpdate:pageSize":m[1]||(m[1]=l=>r.pageSize=l),"page-sizes":t.paginationSizes,total:t.total,layout:"total, sizes, prev, pager, next, jumper",onCurrentChange:n,onSizeChange:u},null,8,["current-page","page-size","page-sizes","total"])])):e.createCommentVNode("",!0)])}}}),z=k(E,[["__scopeId","data-v-fdd60079"]]);function T(t){const{initialValues:i,validators:r}=t,o=e.reactive({...i}),n=e.reactive({}),u=e.reactive({}),s=e.computed(()=>Object.keys(n).length===0),m=(a,f)=>{o[a]=f,u[a]=!0,delete n[a]},h=(a,f)=>{f?n[a]=f:delete n[a]},l=a=>{if(!r||!r[a])return!0;const f=r[a],b=f(o[a]);return b.valid?(delete n[a],!0):(n[a]=b.message||"校验失败",!1)},g=()=>{let a=!0;for(const f of Object.keys(o))l(f)||(a=!1);return a};return{values:o,errors:n,touched:u,valid:s,setFieldValue:m,setFieldError:h,validateField:l,validateAll:g,reset:()=>{Object.assign(o,i),Object.keys(n).forEach(a=>delete n[a]),Object.keys(u).forEach(a=>delete u[a])},submit:async a=>g()?(await a({...o}),!0):!1}}function V(t=!1){const i=e.ref(t),r=()=>{i.value=!i.value},o=()=>{i.value=!0},n=()=>{i.value=!1};return{value:e.computed(()=>i.value),toggle:r,setTrue:o,setFalse:n,setValue:u=>{i.value=u}}}exports.MButton=w;exports.MForm=C;exports.MTable=z;exports.useForm=T;exports.useToggle=V;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/components/MButton.vue","../src/components/MForm.vue","../src/components/MTable.vue","../src/composables/useForm.ts","../src/composables/useToggle.ts"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { Numeric } from \"@awen-utils/shared\";\r\nimport { formatDate } from \"@awen-utils/shared\";\r\nimport { ElButton } from \"element-plus\";\r\n\r\nexport interface ButtonProps {\r\n /** 按钮文本 */\r\n label?: string;\r\n /** 按钮类型 */\r\n type?: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"default\";\r\n /** 按钮尺寸 */\r\n size?: \"large\" | \"default\" | \"small\";\r\n /** 是否禁用 */\r\n disabled?: boolean;\r\n /** 是否加载中 */\r\n loading?: boolean;\r\n /** 是否朴素按钮 */\r\n plain?: boolean;\r\n /** 计数显示 */\r\n count?: Numeric;\r\n /** 是否显示时间戳 */\r\n showTimestamp?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ButtonProps>(), {\r\n label: \"Button\",\r\n type: \"default\",\r\n size: \"default\",\r\n disabled: false,\r\n loading: false,\r\n plain: false,\r\n showTimestamp: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n click: [event: MouseEvent];\r\n}>();\r\n\r\nconst handleClick = (event: MouseEvent) => {\r\n if (props.showTimestamp) {\r\n const now = formatDate(new Date(), \"YYYY-MM-DD HH:mm:ss\");\r\n console.log(\"[MButton] Clicked at:\", now);\r\n }\r\n emit(\"click\", event);\r\n};\r\n</script>\r\n\r\n<template>\r\n <ElButton\r\n :type=\"type\"\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n :plain=\"plain\"\r\n @click=\"handleClick\"\r\n >\r\n {{ label }}\r\n <span v-if=\"count !== undefined\" class=\"m-button__count\"\r\n >({{ count }})</span\r\n >\r\n </ElButton>\r\n</template>\r\n\r\n<style scoped>\r\n.m-button__count {\r\n margin-left: 4px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\r\nimport { type ValidationResult } from \"@awen-utils/shared\";\r\nimport type { FormInstance, FormRules } from \"element-plus\";\r\nimport { ElButton, ElForm, ElFormItem } from \"element-plus\";\r\nimport { reactive, ref } from \"vue\";\r\n\r\nexport interface FormItem {\r\n prop: string;\r\n label: string;\r\n required?: boolean;\r\n rules?: FormRules[string];\r\n customValidator?: (value: any) => ValidationResult;\r\n slot?: string;\r\n}\r\n\r\nexport interface FormProps<T> {\r\n /** 表单数据 */\r\n model: T;\r\n /** 表单项配置 */\r\n items: FormItem[];\r\n /** 标签宽度 */\r\n labelWidth?: string | number;\r\n /** 是否显示操作按钮 */\r\n showActions?: boolean;\r\n /** 提交按钮文本 */\r\n submitText?: string;\r\n /** 重置按钮文本 */\r\n resetText?: string;\r\n /** 行内表单 */\r\n inline?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<FormProps<T>>(), {\r\n labelWidth: \"100px\",\r\n showActions: true,\r\n submitText: \"提交\",\r\n resetText: \"重置\",\r\n inline: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n submit: [values: T];\r\n reset: [];\r\n}>();\r\n\r\nconst formRef = ref<FormInstance>();\r\nconst customErrors = reactive<Partial<Record<string, string>>>({});\r\n\r\nconst validateCustom = async (): Promise<boolean> => {\r\n let isValid = true;\r\n\r\n for (const item of props.items) {\r\n if (item.customValidator) {\r\n const value = props.model[item.prop as keyof T];\r\n const result = item.customValidator(value);\r\n if (!result.valid) {\r\n customErrors[item.prop] = result.message || \"校验失败\";\r\n isValid = false;\r\n } else {\r\n delete customErrors[item.prop];\r\n }\r\n }\r\n }\r\n\r\n return isValid;\r\n};\r\n\r\nconst handleSubmit = async () => {\r\n const valid = await formRef.value?.validate().catch(() => false);\r\n const customValid = await validateCustom();\r\n\r\n if (valid && customValid) {\r\n emit(\"submit\", props.model);\r\n }\r\n};\r\n\r\nconst handleReset = () => {\r\n formRef.value?.resetFields();\r\n Object.keys(customErrors).forEach((key) => delete customErrors[key]);\r\n emit(\"reset\");\r\n};\r\n\r\nconst getRules = (item: FormItem): FormRules[string] => {\r\n const rules: FormRules[string] = [];\r\n\r\n if (item.required) {\r\n rules.push({\r\n required: true,\r\n message: `${item.label}不能为空`,\r\n trigger: \"blur\",\r\n });\r\n }\r\n\r\n if (item.rules) {\r\n if (Array.isArray(item.rules)) {\r\n rules.push(...item.rules);\r\n } else {\r\n rules.push(item.rules);\r\n }\r\n }\r\n\r\n return rules;\r\n};\r\n\r\ndefineExpose({\r\n formRef,\r\n validate: () => formRef.value?.validate(),\r\n resetFields: handleReset,\r\n});\r\n</script>\r\n\r\n<template>\r\n <ElForm\r\n ref=\"formRef\"\r\n :model=\"model\"\r\n :label-width=\"labelWidth\"\r\n :inline=\"inline\"\r\n >\r\n <ElFormItem\r\n v-for=\"item in items\"\r\n :key=\"item.prop\"\r\n :prop=\"item.prop\"\r\n :label=\"item.label\"\r\n :rules=\"getRules(item)\"\r\n :error=\"customErrors[item.prop]\"\r\n >\r\n <slot :name=\"item.slot || item.prop\" v-bind=\"{ item, model }\">\r\n <!-- 默认插槽内容 -->\r\n </slot>\r\n </ElFormItem>\r\n\r\n <ElFormItem v-if=\"showActions\">\r\n <ElButton type=\"primary\" @click=\"handleSubmit\">{{ submitText }}</ElButton>\r\n <ElButton @click=\"handleReset\">{{ resetText }}</ElButton>\r\n </ElFormItem>\r\n </ElForm>\r\n</template>\r\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\r\nimport { ElPagination, ElTable, ElTableColumn } from \"element-plus\";\r\n\r\nexport interface TableColumn<T = any> {\r\n prop?: string;\r\n label: string;\r\n width?: string | number;\r\n minWidth?: string | number;\r\n align?: \"left\" | \"center\" | \"right\";\r\n fixed?: \"left\" | \"right\";\r\n sortable?: boolean;\r\n formatter?: (row: T, column: any, cellValue: any, index: number) => string;\r\n slot?: string;\r\n}\r\n\r\nexport interface TableProps<T> {\r\n /** 表格数据 */\r\n data: T[];\r\n /** 列配置 */\r\n columns: TableColumn<T>[];\r\n /** 是否显示序号列 */\r\n showIndex?: boolean;\r\n /** 序号列标题 */\r\n indexLabel?: string;\r\n /** 加载状态 */\r\n loading?: boolean;\r\n /** 是否显示分页 */\r\n showPagination?: boolean;\r\n /** 当前页 */\r\n currentPage?: number;\r\n /** 每页条数 */\r\n pageSize?: number;\r\n /** 总条数 */\r\n total?: number;\r\n /** 分页尺寸 */\r\n paginationSizes?: number[];\r\n}\r\n\r\nconst props = withDefaults(defineProps<TableProps<T>>(), {\r\n showIndex: true,\r\n indexLabel: \"序号\",\r\n loading: false,\r\n showPagination: true,\r\n currentPage: 1,\r\n pageSize: 10,\r\n total: 0,\r\n paginationSizes: () => [10, 20, 50, 100],\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:currentPage\": [page: number];\r\n \"update:pageSize\": [size: number];\r\n \"page-change\": [page: number, pageSize: number];\r\n}>();\r\n\r\nconst handleCurrentChange = (page: number) => {\r\n emit(\"update:currentPage\", page);\r\n emit(\"page-change\", page, props.pageSize);\r\n};\r\n\r\nconst handleSizeChange = (size: number) => {\r\n emit(\"update:pageSize\", size);\r\n emit(\"page-change\", 1, size);\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"m-table-wrapper\">\r\n <ElTable v-loading=\"loading\" :data=\"data\" style=\"width: 100%\">\r\n <!-- 序号列 -->\r\n <ElTableColumn\r\n v-if=\"showIndex\"\r\n type=\"index\"\r\n :label=\"indexLabel\"\r\n width=\"70\"\r\n align=\"center\"\r\n />\r\n\r\n <!-- 动态列 -->\r\n <ElTableColumn\r\n v-for=\"column in columns\"\r\n :key=\"column.prop || column.label\"\r\n :prop=\"column.prop\"\r\n :label=\"column.label\"\r\n :width=\"column.width\"\r\n :min-width=\"column.minWidth\"\r\n :align=\"column.align\"\r\n :fixed=\"column.fixed\"\r\n :sortable=\"column.sortable\"\r\n :formatter=\"column.formatter\"\r\n >\r\n <template v-if=\"column.slot\" #default=\"scope\">\r\n <slot :name=\"column.slot\" v-bind=\"scope\" />\r\n </template>\r\n </ElTableColumn>\r\n </ElTable>\r\n\r\n <!-- 分页 -->\r\n <div v-if=\"showPagination\" class=\"m-table__pagination\">\r\n <ElPagination\r\n v-model:current-page=\"props.currentPage\"\r\n v-model:page-size=\"props.pageSize\"\r\n :page-sizes=\"paginationSizes\"\r\n :total=\"total\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n @current-change=\"handleCurrentChange\"\r\n @size-change=\"handleSizeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.m-table-wrapper {\r\n width: 100%;\r\n}\r\n\r\n.m-table__pagination {\r\n margin-top: 16px;\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n</style>\r\n","import { type ValidationResult } from \"@awen-utils/shared\";\r\nimport { computed, reactive } from \"vue\";\r\n\r\nexport interface UseFormOptions<T> {\r\n initialValues: T;\r\n validators?: Partial<Record<keyof T, (value: any) => ValidationResult>>;\r\n}\r\n\r\nexport interface FormState<T> {\r\n values: T;\r\n errors: Partial<Record<keyof T, string>>;\r\n touched: Partial<Record<keyof T, boolean>>;\r\n valid: boolean;\r\n}\r\n\r\n/**\r\n * useForm - 表单状态管理\r\n * @param options - 配置选项\r\n */\r\nexport function useForm<T extends Record<string, any>>(\r\n options: UseFormOptions<T>,\r\n) {\r\n const { initialValues, validators } = options;\r\n\r\n const values = reactive<T>({ ...initialValues });\r\n const errors = reactive<Partial<Record<keyof T, string>>>({});\r\n const touched = reactive<Partial<Record<keyof T, boolean>>>({});\r\n\r\n const valid = computed(() => Object.keys(errors).length === 0);\r\n\r\n const setFieldValue = (field: keyof T, value: any) => {\r\n (values as any)[field] = value;\r\n (touched as any)[field] = true;\r\n // 清除错误\r\n delete (errors as any)[field];\r\n };\r\n\r\n const setFieldError = (field: keyof T, error: string | undefined) => {\r\n if (error) {\r\n (errors as any)[field] = error;\r\n } else {\r\n delete (errors as any)[field];\r\n }\r\n };\r\n\r\n const validateField = (field: keyof T): boolean => {\r\n if (!validators || !validators[field]) return true;\r\n\r\n const validator = validators[field]!;\r\n const result = validator((values as any)[field]);\r\n\r\n if (!result.valid) {\r\n (errors as any)[field] = result.message || \"校验失败\";\r\n return false;\r\n } else {\r\n delete (errors as any)[field];\r\n return true;\r\n }\r\n };\r\n\r\n const validateAll = (): boolean => {\r\n let isValid = true;\r\n for (const field of Object.keys(values) as Array<keyof T>) {\r\n if (!validateField(field)) {\r\n isValid = false;\r\n }\r\n }\r\n return isValid;\r\n };\r\n\r\n const reset = () => {\r\n Object.assign(values, initialValues);\r\n Object.keys(errors).forEach((key) => delete (errors as any)[key]);\r\n Object.keys(touched).forEach((key) => delete (touched as any)[key]);\r\n };\r\n\r\n const submit = async (\r\n submitFn: (values: T) => Promise<void> | void,\r\n ): Promise<boolean> => {\r\n if (!validateAll()) return false;\r\n await submitFn({ ...values } as T);\r\n return true;\r\n };\r\n\r\n return {\r\n values,\r\n errors,\r\n touched,\r\n valid,\r\n setFieldValue,\r\n setFieldError,\r\n validateField,\r\n validateAll,\r\n reset,\r\n submit,\r\n };\r\n}\r\n","import { computed, ref } from 'vue';\r\n\r\n/**\r\n * useToggle - 布尔值切换 Hook\r\n * @param initialValue - 初始值\r\n */\r\nexport function useToggle(initialValue: boolean = false) {\r\n const value = ref(initialValue);\r\n\r\n const toggle = () => {\r\n value.value = !value.value;\r\n };\r\n\r\n const setTrue = () => {\r\n value.value = true;\r\n };\r\n\r\n const setFalse = () => {\r\n value.value = false;\r\n };\r\n\r\n return {\r\n value: computed(() => value.value),\r\n toggle,\r\n setTrue,\r\n setFalse,\r\n setValue: (v: boolean) => {\r\n value.value = v;\r\n }\r\n };\r\n}\r\n"],"names":["props","__props","emit","__emit","handleClick","event","now","formatDate","_createBlock","_unref","ElButton","_createTextVNode","_toDisplayString","_openBlock","_createElementBlock","_hoisted_1","formRef","ref","customErrors","reactive","validateCustom","isValid","item","value","result","handleSubmit","valid","customValid","handleReset","key","getRules","rules","__expose","ElForm","_Fragment","_renderList","ElFormItem","_renderSlot","_ctx","_mergeProps","_createVNode","handleCurrentChange","page","handleSizeChange","size","ElTable","ElTableColumn","column","_withCtx","scope","_hoisted_2","ElPagination","_cache","$event","useForm","options","initialValues","validators","values","errors","touched","computed","setFieldValue","field","setFieldError","error","validateField","validator","validateAll","submitFn","useToggle","initialValue","toggle","setTrue","setFalse","v"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { AllowedComponentProps } from 'vue';
|
|
2
|
+
import { ComponentCustomProps } from 'vue';
|
|
3
|
+
import { ComponentOptionsMixin } from 'vue';
|
|
4
|
+
import { ComponentProvideOptions } from 'vue';
|
|
5
|
+
import { ComputedRef } from 'vue';
|
|
6
|
+
import { DefineComponent } from 'vue';
|
|
7
|
+
import { FormInstance } from 'element-plus';
|
|
8
|
+
import { FormRules } from 'element-plus';
|
|
9
|
+
import { FormValidationResult } from 'element-plus';
|
|
10
|
+
import { Numeric } from '@awen-utils/shared';
|
|
11
|
+
import { PublicProps } from 'vue';
|
|
12
|
+
import { Reactive } from 'vue';
|
|
13
|
+
import { Ref } from 'vue';
|
|
14
|
+
import { ShallowUnwrapRef } from 'vue';
|
|
15
|
+
import { ValidationResult } from '@awen-utils/shared';
|
|
16
|
+
import { VNode } from 'vue';
|
|
17
|
+
import { VNodeProps } from 'vue';
|
|
18
|
+
|
|
19
|
+
declare type __VLS_PrettifyLocal<T> = {
|
|
20
|
+
[K in keyof T]: T[K];
|
|
21
|
+
} & {};
|
|
22
|
+
|
|
23
|
+
declare type __VLS_PrettifyLocal_2<T> = {
|
|
24
|
+
[K in keyof T]: T[K];
|
|
25
|
+
} & {};
|
|
26
|
+
|
|
27
|
+
export declare interface ButtonProps {
|
|
28
|
+
/** 按钮文本 */
|
|
29
|
+
label?: string;
|
|
30
|
+
/** 按钮类型 */
|
|
31
|
+
type?: "primary" | "success" | "warning" | "danger" | "info" | "default";
|
|
32
|
+
/** 按钮尺寸 */
|
|
33
|
+
size?: "large" | "default" | "small";
|
|
34
|
+
/** 是否禁用 */
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
/** 是否加载中 */
|
|
37
|
+
loading?: boolean;
|
|
38
|
+
/** 是否朴素按钮 */
|
|
39
|
+
plain?: boolean;
|
|
40
|
+
/** 计数显示 */
|
|
41
|
+
count?: Numeric;
|
|
42
|
+
/** 是否显示时间戳 */
|
|
43
|
+
showTimestamp?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export declare interface FormItem {
|
|
47
|
+
prop: string;
|
|
48
|
+
label: string;
|
|
49
|
+
required?: boolean;
|
|
50
|
+
rules?: FormRules[string];
|
|
51
|
+
customValidator?: (value: any) => ValidationResult;
|
|
52
|
+
slot?: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export declare interface FormProps<T> {
|
|
56
|
+
/** 表单数据 */
|
|
57
|
+
model: T;
|
|
58
|
+
/** 表单项配置 */
|
|
59
|
+
items: FormItem[];
|
|
60
|
+
/** 标签宽度 */
|
|
61
|
+
labelWidth?: string | number;
|
|
62
|
+
/** 是否显示操作按钮 */
|
|
63
|
+
showActions?: boolean;
|
|
64
|
+
/** 提交按钮文本 */
|
|
65
|
+
submitText?: string;
|
|
66
|
+
/** 重置按钮文本 */
|
|
67
|
+
resetText?: string;
|
|
68
|
+
/** 行内表单 */
|
|
69
|
+
inline?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export declare interface FormState<T> {
|
|
73
|
+
values: T;
|
|
74
|
+
errors: Partial<Record<keyof T, string>>;
|
|
75
|
+
touched: Partial<Record<keyof T, boolean>>;
|
|
76
|
+
valid: boolean;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export declare const MButton: DefineComponent<ButtonProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
80
|
+
click: (event: MouseEvent) => any;
|
|
81
|
+
}, string, PublicProps, Readonly<ButtonProps> & Readonly<{
|
|
82
|
+
onClick?: ((event: MouseEvent) => any) | undefined;
|
|
83
|
+
}>, {
|
|
84
|
+
label: string;
|
|
85
|
+
type: "primary" | "success" | "warning" | "danger" | "info" | "default";
|
|
86
|
+
size: "large" | "default" | "small";
|
|
87
|
+
disabled: boolean;
|
|
88
|
+
loading: boolean;
|
|
89
|
+
plain: boolean;
|
|
90
|
+
showTimestamp: boolean;
|
|
91
|
+
}, {}, {}, {}, string, ComponentProvideOptions, false, {}, any>;
|
|
92
|
+
|
|
93
|
+
export declare const MForm: <T extends Record<string, any>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
94
|
+
props: __VLS_PrettifyLocal<Pick<Partial<{}> & Omit<{
|
|
95
|
+
readonly onSubmit?: ((values: T) => any) | undefined;
|
|
96
|
+
readonly onReset?: (() => any) | undefined;
|
|
97
|
+
} & VNodeProps & AllowedComponentProps & ComponentCustomProps, never>, "onReset" | "onSubmit"> & FormProps<T> & Partial<{}>> & PublicProps;
|
|
98
|
+
expose(exposed: ShallowUnwrapRef< {
|
|
99
|
+
formRef: Ref<FormInstance | undefined, FormInstance | undefined>;
|
|
100
|
+
validate: () => FormValidationResult | undefined;
|
|
101
|
+
resetFields: () => void;
|
|
102
|
+
}>): void;
|
|
103
|
+
attrs: any;
|
|
104
|
+
slots: Partial<Record<string, (_: {
|
|
105
|
+
item: FormItem;
|
|
106
|
+
model: T;
|
|
107
|
+
}) => any>>;
|
|
108
|
+
emit: ((evt: "submit", values: T) => void) & ((evt: "reset") => void);
|
|
109
|
+
}>) => VNode & {
|
|
110
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export declare const MTable: <T extends Record<string, any>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal_2<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
114
|
+
props: __VLS_PrettifyLocal_2<Pick<Partial<{}> & Omit<{
|
|
115
|
+
readonly "onUpdate:currentPage"?: ((page: number) => any) | undefined;
|
|
116
|
+
readonly "onUpdate:pageSize"?: ((size: number) => any) | undefined;
|
|
117
|
+
readonly "onPage-change"?: ((page: number, pageSize: number) => any) | undefined;
|
|
118
|
+
} & VNodeProps & AllowedComponentProps & ComponentCustomProps, never>, "onUpdate:currentPage" | "onUpdate:pageSize" | "onPage-change"> & TableProps<T> & Partial<{}>> & PublicProps;
|
|
119
|
+
expose(exposed: ShallowUnwrapRef< {}>): void;
|
|
120
|
+
attrs: any;
|
|
121
|
+
slots: Partial<Record<string, (_: any) => any>>;
|
|
122
|
+
emit: ((evt: "update:currentPage", page: number) => void) & ((evt: "update:pageSize", size: number) => void) & ((evt: "page-change", page: number, pageSize: number) => void);
|
|
123
|
+
}>) => VNode & {
|
|
124
|
+
__ctx?: Awaited<typeof __VLS_setup>;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export declare interface TableColumn<T = any> {
|
|
128
|
+
prop?: string;
|
|
129
|
+
label: string;
|
|
130
|
+
width?: string | number;
|
|
131
|
+
minWidth?: string | number;
|
|
132
|
+
align?: "left" | "center" | "right";
|
|
133
|
+
fixed?: "left" | "right";
|
|
134
|
+
sortable?: boolean;
|
|
135
|
+
formatter?: (row: T, column: any, cellValue: any, index: number) => string;
|
|
136
|
+
slot?: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export declare interface TableProps<T> {
|
|
140
|
+
/** 表格数据 */
|
|
141
|
+
data: T[];
|
|
142
|
+
/** 列配置 */
|
|
143
|
+
columns: TableColumn<T>[];
|
|
144
|
+
/** 是否显示序号列 */
|
|
145
|
+
showIndex?: boolean;
|
|
146
|
+
/** 序号列标题 */
|
|
147
|
+
indexLabel?: string;
|
|
148
|
+
/** 加载状态 */
|
|
149
|
+
loading?: boolean;
|
|
150
|
+
/** 是否显示分页 */
|
|
151
|
+
showPagination?: boolean;
|
|
152
|
+
/** 当前页 */
|
|
153
|
+
currentPage?: number;
|
|
154
|
+
/** 每页条数 */
|
|
155
|
+
pageSize?: number;
|
|
156
|
+
/** 总条数 */
|
|
157
|
+
total?: number;
|
|
158
|
+
/** 分页尺寸 */
|
|
159
|
+
paginationSizes?: number[];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* useForm - 表单状态管理
|
|
164
|
+
* @param options - 配置选项
|
|
165
|
+
*/
|
|
166
|
+
export declare function useForm<T extends Record<string, any>>(options: UseFormOptions<T>): {
|
|
167
|
+
values: Reactive<T>;
|
|
168
|
+
errors: Reactive<Partial<Record<keyof T, string>>>;
|
|
169
|
+
touched: Reactive<Partial<Record<keyof T, boolean>>>;
|
|
170
|
+
valid: ComputedRef<boolean>;
|
|
171
|
+
setFieldValue: (field: keyof T, value: any) => void;
|
|
172
|
+
setFieldError: (field: keyof T, error: string | undefined) => void;
|
|
173
|
+
validateField: (field: keyof T) => boolean;
|
|
174
|
+
validateAll: () => boolean;
|
|
175
|
+
reset: () => void;
|
|
176
|
+
submit: (submitFn: (values: T) => Promise<void> | void) => Promise<boolean>;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export declare interface UseFormOptions<T> {
|
|
180
|
+
initialValues: T;
|
|
181
|
+
validators?: Partial<Record<keyof T, (value: any) => ValidationResult>>;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* useToggle - 布尔值切换 Hook
|
|
186
|
+
* @param initialValue - 初始值
|
|
187
|
+
*/
|
|
188
|
+
export declare function useToggle(initialValue?: boolean): {
|
|
189
|
+
value: ComputedRef<boolean>;
|
|
190
|
+
toggle: () => void;
|
|
191
|
+
setTrue: () => void;
|
|
192
|
+
setFalse: () => void;
|
|
193
|
+
setValue: (v: boolean) => void;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
export { }
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { defineComponent as S, openBlock as c, createBlock as b, unref as g, withCtx as m, createTextVNode as z, toDisplayString as k, createElementBlock as y, createCommentVNode as x, ref as V, reactive as w, Fragment as P, renderList as M, renderSlot as j, mergeProps as D, createVNode as B, resolveDirective as A, withDirectives as I, createSlots as R, computed as O } from "vue";
|
|
2
|
+
import { formatDate as Y } from "@awen-utils/shared";
|
|
3
|
+
import { ElButton as C, ElForm as L, ElFormItem as E, ElTable as N, ElTableColumn as F, ElPagination as W } from "element-plus";
|
|
4
|
+
const q = {
|
|
5
|
+
key: 0,
|
|
6
|
+
class: "m-button__count"
|
|
7
|
+
}, H = /* @__PURE__ */ S({
|
|
8
|
+
__name: "MButton",
|
|
9
|
+
props: {
|
|
10
|
+
label: { default: "Button" },
|
|
11
|
+
type: { default: "default" },
|
|
12
|
+
size: { default: "default" },
|
|
13
|
+
disabled: { type: Boolean, default: !1 },
|
|
14
|
+
loading: { type: Boolean, default: !1 },
|
|
15
|
+
plain: { type: Boolean, default: !1 },
|
|
16
|
+
count: {},
|
|
17
|
+
showTimestamp: { type: Boolean, default: !1 }
|
|
18
|
+
},
|
|
19
|
+
emits: ["click"],
|
|
20
|
+
setup(e, { emit: r }) {
|
|
21
|
+
const n = e, l = r, o = (i) => {
|
|
22
|
+
if (n.showTimestamp) {
|
|
23
|
+
const s = Y(/* @__PURE__ */ new Date(), "YYYY-MM-DD HH:mm:ss");
|
|
24
|
+
console.log("[MButton] Clicked at:", s);
|
|
25
|
+
}
|
|
26
|
+
l("click", i);
|
|
27
|
+
};
|
|
28
|
+
return (i, s) => (c(), b(g(C), {
|
|
29
|
+
type: e.type,
|
|
30
|
+
size: e.size,
|
|
31
|
+
disabled: e.disabled,
|
|
32
|
+
loading: e.loading,
|
|
33
|
+
plain: e.plain,
|
|
34
|
+
onClick: o
|
|
35
|
+
}, {
|
|
36
|
+
default: m(() => [
|
|
37
|
+
z(k(e.label) + " ", 1),
|
|
38
|
+
e.count !== void 0 ? (c(), y("span", q, "(" + k(e.count) + ")", 1)) : x("", !0)
|
|
39
|
+
]),
|
|
40
|
+
_: 1
|
|
41
|
+
}, 8, ["type", "size", "disabled", "loading", "plain"]));
|
|
42
|
+
}
|
|
43
|
+
}), $ = (e, r) => {
|
|
44
|
+
const n = e.__vccOpts || e;
|
|
45
|
+
for (const [l, o] of r)
|
|
46
|
+
n[l] = o;
|
|
47
|
+
return n;
|
|
48
|
+
}, Z = /* @__PURE__ */ $(H, [["__scopeId", "data-v-0d1ef3ba"]]), _ = /* @__PURE__ */ S({
|
|
49
|
+
__name: "MForm",
|
|
50
|
+
props: {
|
|
51
|
+
model: {},
|
|
52
|
+
items: {},
|
|
53
|
+
labelWidth: { default: "100px" },
|
|
54
|
+
showActions: { type: Boolean, default: !0 },
|
|
55
|
+
submitText: { default: "提交" },
|
|
56
|
+
resetText: { default: "重置" },
|
|
57
|
+
inline: { type: Boolean, default: !1 }
|
|
58
|
+
},
|
|
59
|
+
emits: ["submit", "reset"],
|
|
60
|
+
setup(e, { expose: r, emit: n }) {
|
|
61
|
+
const l = e, o = n, i = V(), s = w({}), p = async () => {
|
|
62
|
+
let u = !0;
|
|
63
|
+
for (const d of l.items)
|
|
64
|
+
if (d.customValidator) {
|
|
65
|
+
const t = l.model[d.prop], f = d.customValidator(t);
|
|
66
|
+
f.valid ? delete s[d.prop] : (s[d.prop] = f.message || "校验失败", u = !1);
|
|
67
|
+
}
|
|
68
|
+
return u;
|
|
69
|
+
}, v = async () => {
|
|
70
|
+
const u = await i.value?.validate().catch(() => !1), d = await p();
|
|
71
|
+
u && d && o("submit", l.model);
|
|
72
|
+
}, a = () => {
|
|
73
|
+
i.value?.resetFields(), Object.keys(s).forEach((u) => delete s[u]), o("reset");
|
|
74
|
+
}, h = (u) => {
|
|
75
|
+
const d = [];
|
|
76
|
+
return u.required && d.push({
|
|
77
|
+
required: !0,
|
|
78
|
+
message: `${u.label}不能为空`,
|
|
79
|
+
trigger: "blur"
|
|
80
|
+
}), u.rules && (Array.isArray(u.rules) ? d.push(...u.rules) : d.push(u.rules)), d;
|
|
81
|
+
};
|
|
82
|
+
return r({
|
|
83
|
+
formRef: i,
|
|
84
|
+
validate: () => i.value?.validate(),
|
|
85
|
+
resetFields: a
|
|
86
|
+
}), (u, d) => (c(), b(g(L), {
|
|
87
|
+
ref_key: "formRef",
|
|
88
|
+
ref: i,
|
|
89
|
+
model: e.model,
|
|
90
|
+
"label-width": e.labelWidth,
|
|
91
|
+
inline: e.inline
|
|
92
|
+
}, {
|
|
93
|
+
default: m(() => [
|
|
94
|
+
(c(!0), y(P, null, M(e.items, (t) => (c(), b(g(E), {
|
|
95
|
+
key: t.prop,
|
|
96
|
+
prop: t.prop,
|
|
97
|
+
label: t.label,
|
|
98
|
+
rules: h(t),
|
|
99
|
+
error: s[t.prop]
|
|
100
|
+
}, {
|
|
101
|
+
default: m(() => [
|
|
102
|
+
j(u.$slots, t.slot || t.prop, D({ ref_for: !0 }, { item: t, model: e.model }))
|
|
103
|
+
]),
|
|
104
|
+
_: 2
|
|
105
|
+
}, 1032, ["prop", "label", "rules", "error"]))), 128)),
|
|
106
|
+
e.showActions ? (c(), b(g(E), { key: 0 }, {
|
|
107
|
+
default: m(() => [
|
|
108
|
+
B(g(C), {
|
|
109
|
+
type: "primary",
|
|
110
|
+
onClick: v
|
|
111
|
+
}, {
|
|
112
|
+
default: m(() => [
|
|
113
|
+
z(k(e.submitText), 1)
|
|
114
|
+
]),
|
|
115
|
+
_: 1
|
|
116
|
+
}),
|
|
117
|
+
B(g(C), { onClick: a }, {
|
|
118
|
+
default: m(() => [
|
|
119
|
+
z(k(e.resetText), 1)
|
|
120
|
+
]),
|
|
121
|
+
_: 1
|
|
122
|
+
})
|
|
123
|
+
]),
|
|
124
|
+
_: 1
|
|
125
|
+
})) : x("", !0)
|
|
126
|
+
]),
|
|
127
|
+
_: 3
|
|
128
|
+
}, 8, ["model", "label-width", "inline"]));
|
|
129
|
+
}
|
|
130
|
+
}), U = { class: "m-table-wrapper" }, G = {
|
|
131
|
+
key: 0,
|
|
132
|
+
class: "m-table__pagination"
|
|
133
|
+
}, J = /* @__PURE__ */ S({
|
|
134
|
+
__name: "MTable",
|
|
135
|
+
props: {
|
|
136
|
+
data: {},
|
|
137
|
+
columns: {},
|
|
138
|
+
showIndex: { type: Boolean, default: !0 },
|
|
139
|
+
indexLabel: { default: "序号" },
|
|
140
|
+
loading: { type: Boolean, default: !1 },
|
|
141
|
+
showPagination: { type: Boolean, default: !0 },
|
|
142
|
+
currentPage: { default: 1 },
|
|
143
|
+
pageSize: { default: 10 },
|
|
144
|
+
total: { default: 0 },
|
|
145
|
+
paginationSizes: { default: () => [10, 20, 50, 100] }
|
|
146
|
+
},
|
|
147
|
+
emits: ["update:currentPage", "update:pageSize", "page-change"],
|
|
148
|
+
setup(e, { emit: r }) {
|
|
149
|
+
const n = e, l = r, o = (s) => {
|
|
150
|
+
l("update:currentPage", s), l("page-change", s, n.pageSize);
|
|
151
|
+
}, i = (s) => {
|
|
152
|
+
l("update:pageSize", s), l("page-change", 1, s);
|
|
153
|
+
};
|
|
154
|
+
return (s, p) => {
|
|
155
|
+
const v = A("loading");
|
|
156
|
+
return c(), y("div", U, [
|
|
157
|
+
I((c(), b(g(N), {
|
|
158
|
+
data: e.data,
|
|
159
|
+
style: { width: "100%" }
|
|
160
|
+
}, {
|
|
161
|
+
default: m(() => [
|
|
162
|
+
e.showIndex ? (c(), b(g(F), {
|
|
163
|
+
key: 0,
|
|
164
|
+
type: "index",
|
|
165
|
+
label: e.indexLabel,
|
|
166
|
+
width: "70",
|
|
167
|
+
align: "center"
|
|
168
|
+
}, null, 8, ["label"])) : x("", !0),
|
|
169
|
+
(c(!0), y(P, null, M(e.columns, (a) => (c(), b(g(F), {
|
|
170
|
+
key: a.prop || a.label,
|
|
171
|
+
prop: a.prop,
|
|
172
|
+
label: a.label,
|
|
173
|
+
width: a.width,
|
|
174
|
+
"min-width": a.minWidth,
|
|
175
|
+
align: a.align,
|
|
176
|
+
fixed: a.fixed,
|
|
177
|
+
sortable: a.sortable,
|
|
178
|
+
formatter: a.formatter
|
|
179
|
+
}, R({ _: 2 }, [
|
|
180
|
+
a.slot ? {
|
|
181
|
+
name: "default",
|
|
182
|
+
fn: m((h) => [
|
|
183
|
+
j(s.$slots, a.slot, D({ ref_for: !0 }, h), void 0, !0)
|
|
184
|
+
]),
|
|
185
|
+
key: "0"
|
|
186
|
+
} : void 0
|
|
187
|
+
]), 1032, ["prop", "label", "width", "min-width", "align", "fixed", "sortable", "formatter"]))), 128))
|
|
188
|
+
]),
|
|
189
|
+
_: 3
|
|
190
|
+
}, 8, ["data"])), [
|
|
191
|
+
[v, e.loading]
|
|
192
|
+
]),
|
|
193
|
+
e.showPagination ? (c(), y("div", G, [
|
|
194
|
+
B(g(W), {
|
|
195
|
+
"current-page": n.currentPage,
|
|
196
|
+
"onUpdate:currentPage": p[0] || (p[0] = (a) => n.currentPage = a),
|
|
197
|
+
"page-size": n.pageSize,
|
|
198
|
+
"onUpdate:pageSize": p[1] || (p[1] = (a) => n.pageSize = a),
|
|
199
|
+
"page-sizes": e.paginationSizes,
|
|
200
|
+
total: e.total,
|
|
201
|
+
layout: "total, sizes, prev, pager, next, jumper",
|
|
202
|
+
onCurrentChange: o,
|
|
203
|
+
onSizeChange: i
|
|
204
|
+
}, null, 8, ["current-page", "page-size", "page-sizes", "total"])
|
|
205
|
+
])) : x("", !0)
|
|
206
|
+
]);
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}), ee = /* @__PURE__ */ $(J, [["__scopeId", "data-v-fdd60079"]]);
|
|
210
|
+
function te(e) {
|
|
211
|
+
const { initialValues: r, validators: n } = e, l = w({ ...r }), o = w({}), i = w({}), s = O(() => Object.keys(o).length === 0), p = (t, f) => {
|
|
212
|
+
l[t] = f, i[t] = !0, delete o[t];
|
|
213
|
+
}, v = (t, f) => {
|
|
214
|
+
f ? o[t] = f : delete o[t];
|
|
215
|
+
}, a = (t) => {
|
|
216
|
+
if (!n || !n[t]) return !0;
|
|
217
|
+
const f = n[t], T = f(l[t]);
|
|
218
|
+
return T.valid ? (delete o[t], !0) : (o[t] = T.message || "校验失败", !1);
|
|
219
|
+
}, h = () => {
|
|
220
|
+
let t = !0;
|
|
221
|
+
for (const f of Object.keys(l))
|
|
222
|
+
a(f) || (t = !1);
|
|
223
|
+
return t;
|
|
224
|
+
};
|
|
225
|
+
return {
|
|
226
|
+
values: l,
|
|
227
|
+
errors: o,
|
|
228
|
+
touched: i,
|
|
229
|
+
valid: s,
|
|
230
|
+
setFieldValue: p,
|
|
231
|
+
setFieldError: v,
|
|
232
|
+
validateField: a,
|
|
233
|
+
validateAll: h,
|
|
234
|
+
reset: () => {
|
|
235
|
+
Object.assign(l, r), Object.keys(o).forEach((t) => delete o[t]), Object.keys(i).forEach((t) => delete i[t]);
|
|
236
|
+
},
|
|
237
|
+
submit: async (t) => h() ? (await t({ ...l }), !0) : !1
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
function ae(e = !1) {
|
|
241
|
+
const r = V(e), n = () => {
|
|
242
|
+
r.value = !r.value;
|
|
243
|
+
}, l = () => {
|
|
244
|
+
r.value = !0;
|
|
245
|
+
}, o = () => {
|
|
246
|
+
r.value = !1;
|
|
247
|
+
};
|
|
248
|
+
return {
|
|
249
|
+
value: O(() => r.value),
|
|
250
|
+
toggle: n,
|
|
251
|
+
setTrue: l,
|
|
252
|
+
setFalse: o,
|
|
253
|
+
setValue: (i) => {
|
|
254
|
+
r.value = i;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
export {
|
|
259
|
+
Z as MButton,
|
|
260
|
+
_ as MForm,
|
|
261
|
+
ee as MTable,
|
|
262
|
+
te as useForm,
|
|
263
|
+
ae as useToggle
|
|
264
|
+
};
|
|
265
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/MButton.vue","../src/components/MForm.vue","../src/components/MTable.vue","../src/composables/useForm.ts","../src/composables/useToggle.ts"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport type { Numeric } from \"@awen-utils/shared\";\r\nimport { formatDate } from \"@awen-utils/shared\";\r\nimport { ElButton } from \"element-plus\";\r\n\r\nexport interface ButtonProps {\r\n /** 按钮文本 */\r\n label?: string;\r\n /** 按钮类型 */\r\n type?: \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"default\";\r\n /** 按钮尺寸 */\r\n size?: \"large\" | \"default\" | \"small\";\r\n /** 是否禁用 */\r\n disabled?: boolean;\r\n /** 是否加载中 */\r\n loading?: boolean;\r\n /** 是否朴素按钮 */\r\n plain?: boolean;\r\n /** 计数显示 */\r\n count?: Numeric;\r\n /** 是否显示时间戳 */\r\n showTimestamp?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ButtonProps>(), {\r\n label: \"Button\",\r\n type: \"default\",\r\n size: \"default\",\r\n disabled: false,\r\n loading: false,\r\n plain: false,\r\n showTimestamp: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n click: [event: MouseEvent];\r\n}>();\r\n\r\nconst handleClick = (event: MouseEvent) => {\r\n if (props.showTimestamp) {\r\n const now = formatDate(new Date(), \"YYYY-MM-DD HH:mm:ss\");\r\n console.log(\"[MButton] Clicked at:\", now);\r\n }\r\n emit(\"click\", event);\r\n};\r\n</script>\r\n\r\n<template>\r\n <ElButton\r\n :type=\"type\"\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n :plain=\"plain\"\r\n @click=\"handleClick\"\r\n >\r\n {{ label }}\r\n <span v-if=\"count !== undefined\" class=\"m-button__count\"\r\n >({{ count }})</span\r\n >\r\n </ElButton>\r\n</template>\r\n\r\n<style scoped>\r\n.m-button__count {\r\n margin-left: 4px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\r\nimport { type ValidationResult } from \"@awen-utils/shared\";\r\nimport type { FormInstance, FormRules } from \"element-plus\";\r\nimport { ElButton, ElForm, ElFormItem } from \"element-plus\";\r\nimport { reactive, ref } from \"vue\";\r\n\r\nexport interface FormItem {\r\n prop: string;\r\n label: string;\r\n required?: boolean;\r\n rules?: FormRules[string];\r\n customValidator?: (value: any) => ValidationResult;\r\n slot?: string;\r\n}\r\n\r\nexport interface FormProps<T> {\r\n /** 表单数据 */\r\n model: T;\r\n /** 表单项配置 */\r\n items: FormItem[];\r\n /** 标签宽度 */\r\n labelWidth?: string | number;\r\n /** 是否显示操作按钮 */\r\n showActions?: boolean;\r\n /** 提交按钮文本 */\r\n submitText?: string;\r\n /** 重置按钮文本 */\r\n resetText?: string;\r\n /** 行内表单 */\r\n inline?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<FormProps<T>>(), {\r\n labelWidth: \"100px\",\r\n showActions: true,\r\n submitText: \"提交\",\r\n resetText: \"重置\",\r\n inline: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n submit: [values: T];\r\n reset: [];\r\n}>();\r\n\r\nconst formRef = ref<FormInstance>();\r\nconst customErrors = reactive<Partial<Record<string, string>>>({});\r\n\r\nconst validateCustom = async (): Promise<boolean> => {\r\n let isValid = true;\r\n\r\n for (const item of props.items) {\r\n if (item.customValidator) {\r\n const value = props.model[item.prop as keyof T];\r\n const result = item.customValidator(value);\r\n if (!result.valid) {\r\n customErrors[item.prop] = result.message || \"校验失败\";\r\n isValid = false;\r\n } else {\r\n delete customErrors[item.prop];\r\n }\r\n }\r\n }\r\n\r\n return isValid;\r\n};\r\n\r\nconst handleSubmit = async () => {\r\n const valid = await formRef.value?.validate().catch(() => false);\r\n const customValid = await validateCustom();\r\n\r\n if (valid && customValid) {\r\n emit(\"submit\", props.model);\r\n }\r\n};\r\n\r\nconst handleReset = () => {\r\n formRef.value?.resetFields();\r\n Object.keys(customErrors).forEach((key) => delete customErrors[key]);\r\n emit(\"reset\");\r\n};\r\n\r\nconst getRules = (item: FormItem): FormRules[string] => {\r\n const rules: FormRules[string] = [];\r\n\r\n if (item.required) {\r\n rules.push({\r\n required: true,\r\n message: `${item.label}不能为空`,\r\n trigger: \"blur\",\r\n });\r\n }\r\n\r\n if (item.rules) {\r\n if (Array.isArray(item.rules)) {\r\n rules.push(...item.rules);\r\n } else {\r\n rules.push(item.rules);\r\n }\r\n }\r\n\r\n return rules;\r\n};\r\n\r\ndefineExpose({\r\n formRef,\r\n validate: () => formRef.value?.validate(),\r\n resetFields: handleReset,\r\n});\r\n</script>\r\n\r\n<template>\r\n <ElForm\r\n ref=\"formRef\"\r\n :model=\"model\"\r\n :label-width=\"labelWidth\"\r\n :inline=\"inline\"\r\n >\r\n <ElFormItem\r\n v-for=\"item in items\"\r\n :key=\"item.prop\"\r\n :prop=\"item.prop\"\r\n :label=\"item.label\"\r\n :rules=\"getRules(item)\"\r\n :error=\"customErrors[item.prop]\"\r\n >\r\n <slot :name=\"item.slot || item.prop\" v-bind=\"{ item, model }\">\r\n <!-- 默认插槽内容 -->\r\n </slot>\r\n </ElFormItem>\r\n\r\n <ElFormItem v-if=\"showActions\">\r\n <ElButton type=\"primary\" @click=\"handleSubmit\">{{ submitText }}</ElButton>\r\n <ElButton @click=\"handleReset\">{{ resetText }}</ElButton>\r\n </ElFormItem>\r\n </ElForm>\r\n</template>\r\n","<script setup lang=\"ts\" generic=\"T extends Record<string, any>\">\r\nimport { ElPagination, ElTable, ElTableColumn } from \"element-plus\";\r\n\r\nexport interface TableColumn<T = any> {\r\n prop?: string;\r\n label: string;\r\n width?: string | number;\r\n minWidth?: string | number;\r\n align?: \"left\" | \"center\" | \"right\";\r\n fixed?: \"left\" | \"right\";\r\n sortable?: boolean;\r\n formatter?: (row: T, column: any, cellValue: any, index: number) => string;\r\n slot?: string;\r\n}\r\n\r\nexport interface TableProps<T> {\r\n /** 表格数据 */\r\n data: T[];\r\n /** 列配置 */\r\n columns: TableColumn<T>[];\r\n /** 是否显示序号列 */\r\n showIndex?: boolean;\r\n /** 序号列标题 */\r\n indexLabel?: string;\r\n /** 加载状态 */\r\n loading?: boolean;\r\n /** 是否显示分页 */\r\n showPagination?: boolean;\r\n /** 当前页 */\r\n currentPage?: number;\r\n /** 每页条数 */\r\n pageSize?: number;\r\n /** 总条数 */\r\n total?: number;\r\n /** 分页尺寸 */\r\n paginationSizes?: number[];\r\n}\r\n\r\nconst props = withDefaults(defineProps<TableProps<T>>(), {\r\n showIndex: true,\r\n indexLabel: \"序号\",\r\n loading: false,\r\n showPagination: true,\r\n currentPage: 1,\r\n pageSize: 10,\r\n total: 0,\r\n paginationSizes: () => [10, 20, 50, 100],\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:currentPage\": [page: number];\r\n \"update:pageSize\": [size: number];\r\n \"page-change\": [page: number, pageSize: number];\r\n}>();\r\n\r\nconst handleCurrentChange = (page: number) => {\r\n emit(\"update:currentPage\", page);\r\n emit(\"page-change\", page, props.pageSize);\r\n};\r\n\r\nconst handleSizeChange = (size: number) => {\r\n emit(\"update:pageSize\", size);\r\n emit(\"page-change\", 1, size);\r\n};\r\n</script>\r\n\r\n<template>\r\n <div class=\"m-table-wrapper\">\r\n <ElTable v-loading=\"loading\" :data=\"data\" style=\"width: 100%\">\r\n <!-- 序号列 -->\r\n <ElTableColumn\r\n v-if=\"showIndex\"\r\n type=\"index\"\r\n :label=\"indexLabel\"\r\n width=\"70\"\r\n align=\"center\"\r\n />\r\n\r\n <!-- 动态列 -->\r\n <ElTableColumn\r\n v-for=\"column in columns\"\r\n :key=\"column.prop || column.label\"\r\n :prop=\"column.prop\"\r\n :label=\"column.label\"\r\n :width=\"column.width\"\r\n :min-width=\"column.minWidth\"\r\n :align=\"column.align\"\r\n :fixed=\"column.fixed\"\r\n :sortable=\"column.sortable\"\r\n :formatter=\"column.formatter\"\r\n >\r\n <template v-if=\"column.slot\" #default=\"scope\">\r\n <slot :name=\"column.slot\" v-bind=\"scope\" />\r\n </template>\r\n </ElTableColumn>\r\n </ElTable>\r\n\r\n <!-- 分页 -->\r\n <div v-if=\"showPagination\" class=\"m-table__pagination\">\r\n <ElPagination\r\n v-model:current-page=\"props.currentPage\"\r\n v-model:page-size=\"props.pageSize\"\r\n :page-sizes=\"paginationSizes\"\r\n :total=\"total\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n @current-change=\"handleCurrentChange\"\r\n @size-change=\"handleSizeChange\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.m-table-wrapper {\r\n width: 100%;\r\n}\r\n\r\n.m-table__pagination {\r\n margin-top: 16px;\r\n display: flex;\r\n justify-content: flex-end;\r\n}\r\n</style>\r\n","import { type ValidationResult } from \"@awen-utils/shared\";\r\nimport { computed, reactive } from \"vue\";\r\n\r\nexport interface UseFormOptions<T> {\r\n initialValues: T;\r\n validators?: Partial<Record<keyof T, (value: any) => ValidationResult>>;\r\n}\r\n\r\nexport interface FormState<T> {\r\n values: T;\r\n errors: Partial<Record<keyof T, string>>;\r\n touched: Partial<Record<keyof T, boolean>>;\r\n valid: boolean;\r\n}\r\n\r\n/**\r\n * useForm - 表单状态管理\r\n * @param options - 配置选项\r\n */\r\nexport function useForm<T extends Record<string, any>>(\r\n options: UseFormOptions<T>,\r\n) {\r\n const { initialValues, validators } = options;\r\n\r\n const values = reactive<T>({ ...initialValues });\r\n const errors = reactive<Partial<Record<keyof T, string>>>({});\r\n const touched = reactive<Partial<Record<keyof T, boolean>>>({});\r\n\r\n const valid = computed(() => Object.keys(errors).length === 0);\r\n\r\n const setFieldValue = (field: keyof T, value: any) => {\r\n (values as any)[field] = value;\r\n (touched as any)[field] = true;\r\n // 清除错误\r\n delete (errors as any)[field];\r\n };\r\n\r\n const setFieldError = (field: keyof T, error: string | undefined) => {\r\n if (error) {\r\n (errors as any)[field] = error;\r\n } else {\r\n delete (errors as any)[field];\r\n }\r\n };\r\n\r\n const validateField = (field: keyof T): boolean => {\r\n if (!validators || !validators[field]) return true;\r\n\r\n const validator = validators[field]!;\r\n const result = validator((values as any)[field]);\r\n\r\n if (!result.valid) {\r\n (errors as any)[field] = result.message || \"校验失败\";\r\n return false;\r\n } else {\r\n delete (errors as any)[field];\r\n return true;\r\n }\r\n };\r\n\r\n const validateAll = (): boolean => {\r\n let isValid = true;\r\n for (const field of Object.keys(values) as Array<keyof T>) {\r\n if (!validateField(field)) {\r\n isValid = false;\r\n }\r\n }\r\n return isValid;\r\n };\r\n\r\n const reset = () => {\r\n Object.assign(values, initialValues);\r\n Object.keys(errors).forEach((key) => delete (errors as any)[key]);\r\n Object.keys(touched).forEach((key) => delete (touched as any)[key]);\r\n };\r\n\r\n const submit = async (\r\n submitFn: (values: T) => Promise<void> | void,\r\n ): Promise<boolean> => {\r\n if (!validateAll()) return false;\r\n await submitFn({ ...values } as T);\r\n return true;\r\n };\r\n\r\n return {\r\n values,\r\n errors,\r\n touched,\r\n valid,\r\n setFieldValue,\r\n setFieldError,\r\n validateField,\r\n validateAll,\r\n reset,\r\n submit,\r\n };\r\n}\r\n","import { computed, ref } from 'vue';\r\n\r\n/**\r\n * useToggle - 布尔值切换 Hook\r\n * @param initialValue - 初始值\r\n */\r\nexport function useToggle(initialValue: boolean = false) {\r\n const value = ref(initialValue);\r\n\r\n const toggle = () => {\r\n value.value = !value.value;\r\n };\r\n\r\n const setTrue = () => {\r\n value.value = true;\r\n };\r\n\r\n const setFalse = () => {\r\n value.value = false;\r\n };\r\n\r\n return {\r\n value: computed(() => value.value),\r\n toggle,\r\n setTrue,\r\n setFalse,\r\n setValue: (v: boolean) => {\r\n value.value = v;\r\n }\r\n };\r\n}\r\n"],"names":["props","__props","emit","__emit","handleClick","event","now","formatDate","_createBlock","_unref","ElButton","_createTextVNode","_toDisplayString","_openBlock","_createElementBlock","_hoisted_1","formRef","ref","customErrors","reactive","validateCustom","isValid","item","value","result","handleSubmit","valid","customValid","handleReset","key","getRules","rules","__expose","ElForm","_Fragment","_renderList","ElFormItem","_renderSlot","_ctx","_mergeProps","_createVNode","handleCurrentChange","page","handleSizeChange","size","ElTable","ElTableColumn","column","_withCtx","scope","_hoisted_2","ElPagination","_cache","$event","useForm","options","initialValues","validators","values","errors","touched","computed","setFieldValue","field","setFieldError","error","validateField","validator","validateAll","submitFn","useToggle","initialValue","toggle","setTrue","setFalse","v"],"mappings":"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"}
|