@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 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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"}
@@ -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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"}