@robot-admin/naive-ui-components 0.22.1 → 0.23.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.
Files changed (306) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +7 -5
  3. package/README_EN.md +7 -5
  4. package/dist/C_ActionBar.d.cts +2 -1
  5. package/dist/C_ActionBar.d.ts +2 -1
  6. package/dist/C_AntV2.cjs +3 -3
  7. package/dist/C_AntV2.js +3 -3
  8. package/dist/C_BatchResult.cjs +1 -0
  9. package/dist/C_BatchResult.css +32 -0
  10. package/dist/C_BatchResult.d.cts +2 -0
  11. package/dist/C_BatchResult.d.ts +2 -0
  12. package/dist/C_BatchResult.js +1 -0
  13. package/dist/C_BatchResult2.cjs +1 -0
  14. package/dist/C_BatchResult2.js +1 -0
  15. package/dist/C_Breadcrumb.d.cts +2 -2
  16. package/dist/C_Breadcrumb.d.ts +1 -1
  17. package/dist/C_Cascade.d.cts +1 -1
  18. package/dist/C_Cascade.d.ts +1 -1
  19. package/dist/C_Chat.d.cts +1 -1
  20. package/dist/C_Chat.d.ts +1 -1
  21. package/dist/C_City.d.cts +1 -1
  22. package/dist/C_City.d.ts +1 -1
  23. package/dist/C_Code.d.cts +1 -1
  24. package/dist/C_Code.d.ts +1 -1
  25. package/dist/C_ContextMenu.d.cts +1 -1
  26. package/dist/C_ContextMenu.d.ts +1 -1
  27. package/dist/C_DataPicker.cjs +1 -0
  28. package/dist/C_DataPicker.css +55 -0
  29. package/dist/C_DataPicker.d.cts +2 -0
  30. package/dist/C_DataPicker.d.ts +5 -0
  31. package/dist/C_DataPicker.js +1 -0
  32. package/dist/C_DataPicker2.cjs +1 -0
  33. package/dist/C_DataPicker2.js +1 -0
  34. package/dist/C_Date.d.cts +1 -1
  35. package/dist/C_Date.d.ts +1 -1
  36. package/dist/C_Density.cjs +1 -0
  37. package/dist/C_Density.css +1 -0
  38. package/dist/C_Density.d.cts +3 -0
  39. package/dist/C_Density.d.ts +3 -0
  40. package/dist/C_Density.js +1 -0
  41. package/dist/C_Density2.cjs +1 -0
  42. package/dist/C_Density2.js +1 -0
  43. package/dist/C_Editor.d.cts +1 -1
  44. package/dist/C_Editor.d.ts +1 -1
  45. package/dist/C_ErrorSummary.cjs +1 -0
  46. package/dist/C_ErrorSummary.css +29 -0
  47. package/dist/C_ErrorSummary.d.cts +3 -0
  48. package/dist/C_ErrorSummary.d.ts +3 -0
  49. package/dist/C_ErrorSummary.js +1 -0
  50. package/dist/C_ErrorSummary2.cjs +1 -0
  51. package/dist/C_ErrorSummary2.js +1 -0
  52. package/dist/C_Form.base.css +150 -148
  53. package/dist/C_Form.css +151 -253
  54. package/dist/C_Form.d.cts +1 -1
  55. package/dist/C_Form.d.ts +19 -2
  56. package/dist/C_FormModal.css +1 -2
  57. package/dist/C_FormModal.d.cts +1 -1
  58. package/dist/C_FormModal.d.ts +17 -2
  59. package/dist/C_FormSearch.cjs +1 -1
  60. package/dist/C_FormSearch.css +124 -52
  61. package/dist/C_FormSearch.d.cts +3 -3
  62. package/dist/C_FormSearch.d.ts +5 -4
  63. package/dist/C_FormSearch.js +1 -1
  64. package/dist/C_FormulaEditor.d.cts +1 -1
  65. package/dist/C_FormulaEditor.d.ts +1 -1
  66. package/dist/C_Guide.d.cts +1 -1
  67. package/dist/C_Guide.d.ts +1 -1
  68. package/dist/C_Icon.d.cts +1 -1
  69. package/dist/C_Icon.d.ts +1 -1
  70. package/dist/C_Language.d.cts +1 -1
  71. package/dist/C_Language.d.ts +1 -1
  72. package/dist/C_Loading.d.cts +1 -1
  73. package/dist/C_Loading.d.ts +1 -1
  74. package/dist/C_Login.d.cts +1 -1
  75. package/dist/C_Login.d.ts +1 -1
  76. package/dist/C_Markdown.d.cts +1 -1
  77. package/dist/C_Markdown.d.ts +1 -1
  78. package/dist/C_Menu.d.cts +2 -2
  79. package/dist/C_Menu.d.ts +1 -1
  80. package/dist/C_OrgChart.d.cts +1 -1
  81. package/dist/C_OrgChart.d.ts +1 -1
  82. package/dist/C_Progress.d.cts +1 -1
  83. package/dist/C_Progress.d.ts +1 -1
  84. package/dist/C_SectionNav.cjs +1 -0
  85. package/dist/C_SectionNav.css +46 -0
  86. package/dist/C_SectionNav.d.cts +2 -0
  87. package/dist/C_SectionNav.d.ts +2 -0
  88. package/dist/C_SectionNav.js +1 -0
  89. package/dist/C_SectionNav2.cjs +1 -0
  90. package/dist/C_SectionNav2.js +1 -0
  91. package/dist/C_Skeleton.d.cts +1 -1
  92. package/dist/C_Skeleton.d.ts +1 -1
  93. package/dist/C_SplitPane2.cjs +1 -1
  94. package/dist/C_SplitPane2.js +1 -1
  95. package/dist/C_Steps.d.cts +1 -1
  96. package/dist/C_Steps.d.ts +1 -1
  97. package/dist/C_Table.base.css +258 -256
  98. package/dist/C_Table.cjs +1 -1
  99. package/dist/C_Table.css +109 -1283
  100. package/dist/C_Table.d.cts +2 -1
  101. package/dist/C_Table.d.ts +9 -8
  102. package/dist/C_Table.js +1 -1
  103. package/dist/C_Table2.cjs +3 -0
  104. package/dist/C_Table2.js +3 -0
  105. package/dist/C_Tabs.cjs +1 -1
  106. package/dist/C_Tabs.d.cts +1 -1
  107. package/dist/C_Tabs.d.ts +1 -1
  108. package/dist/C_Tabs.js +1 -1
  109. package/dist/C_TagsView.d.cts +1 -1
  110. package/dist/C_Theme.d.cts +1 -1
  111. package/dist/C_Theme.d.ts +1 -1
  112. package/dist/C_Timeline.d.cts +1 -1
  113. package/dist/C_Timeline.d.ts +1 -1
  114. package/dist/C_Transfer.d.cts +1 -1
  115. package/dist/C_Transfer.d.ts +1 -1
  116. package/dist/C_Tree.d.cts +1 -1
  117. package/dist/C_Tree.d.ts +9 -8
  118. package/dist/C_Upload.d.cts +1 -1
  119. package/dist/C_Upload.d.ts +1 -1
  120. package/dist/C_WorkFlow2.cjs +1 -1
  121. package/dist/C_WorkFlow2.js +1 -1
  122. package/dist/Card.cjs +1 -1
  123. package/dist/Card.js +1 -1
  124. package/dist/Steps.cjs +1 -1
  125. package/dist/Steps.js +1 -1
  126. package/dist/Tabs.cjs +1 -1
  127. package/dist/Tabs.js +1 -1
  128. package/dist/batchPatch.cjs +1 -0
  129. package/dist/batchPatch.d.cts +26 -0
  130. package/dist/batchPatch.d.ts +26 -0
  131. package/dist/batchPatch.js +1 -0
  132. package/dist/config.cjs +1 -1
  133. package/dist/config.d.cts +4 -1
  134. package/dist/config.d.ts +6 -2
  135. package/dist/config.js +1 -1
  136. package/dist/config2.d.ts +1 -1
  137. package/dist/constants.d.cts +1 -1
  138. package/dist/constants.d.ts +1 -1
  139. package/dist/constants2.d.cts +402 -173
  140. package/dist/constants2.d.ts +402 -173
  141. package/dist/constants3.d.cts +3 -3
  142. package/dist/constants3.d.ts +3 -3
  143. package/dist/constants4.d.cts +173 -402
  144. package/dist/constants4.d.ts +173 -402
  145. package/dist/contracts.d.ts +24 -0
  146. package/dist/data.cjs +1 -1
  147. package/dist/data.d.cts +5 -108
  148. package/dist/data.d.ts +5 -108
  149. package/dist/data.js +1 -1
  150. package/dist/data2.cjs +1 -1
  151. package/dist/data2.d.cts +108 -0
  152. package/dist/data2.d.ts +108 -0
  153. package/dist/data2.js +1 -1
  154. package/dist/data3.cjs +1 -0
  155. package/dist/data3.js +1 -0
  156. package/dist/dateRange.d.cts +108 -13
  157. package/dist/dateRange.d.ts +110 -14
  158. package/dist/density.d.ts +15 -0
  159. package/dist/dictionary.cjs +1 -0
  160. package/dist/dictionary.d.cts +38 -0
  161. package/dist/dictionary.d.ts +38 -0
  162. package/dist/dictionary.js +1 -0
  163. package/dist/helpers.cjs +1 -1
  164. package/dist/helpers.js +1 -1
  165. package/dist/index.cjs +1 -1
  166. package/dist/index.d.cts +63 -52
  167. package/dist/index.d.ts +71 -57
  168. package/dist/index.js +1 -1
  169. package/dist/index.vue.d.cts +4 -4
  170. package/dist/index.vue.d.ts +4 -4
  171. package/dist/index10.vue.d.cts +37 -80
  172. package/dist/index10.vue.d.ts +77 -53
  173. package/dist/index11.vue.d.cts +77 -53
  174. package/dist/index11.vue.d.ts +1117 -45
  175. package/dist/index12.vue.d.cts +1117 -45
  176. package/dist/index12.vue.d.ts +17 -128
  177. package/dist/index13.vue.d.cts +17 -128
  178. package/dist/index13.vue.d.ts +57 -53
  179. package/dist/index14.vue.d.cts +57 -53
  180. package/dist/index14.vue.d.ts +16 -25
  181. package/dist/index15.vue.d.cts +16 -25
  182. package/dist/index15.vue.d.ts +52 -12
  183. package/dist/index16.vue.d.cts +52 -12
  184. package/dist/index16.vue.d.ts +13 -129
  185. package/dist/index17.vue.d.cts +13 -129
  186. package/dist/index17.vue.d.ts +123 -74
  187. package/dist/index18.vue.d.cts +123 -74
  188. package/dist/index18.vue.d.ts +48 -71
  189. package/dist/index19.vue.d.cts +40 -91
  190. package/dist/index19.vue.d.ts +36 -96
  191. package/dist/index2.vue.d.cts +2 -2
  192. package/dist/index2.vue.d.ts +2 -2
  193. package/dist/index20.vue.d.cts +38 -47
  194. package/dist/index20.vue.d.ts +13 -48
  195. package/dist/index21.vue.d.cts +12 -96
  196. package/dist/index21.vue.d.ts +25 -95
  197. package/dist/index22.vue.d.cts +20 -32
  198. package/dist/index22.vue.d.ts +75 -37
  199. package/dist/index23.vue.d.cts +77 -13
  200. package/dist/index23.vue.d.ts +71 -13
  201. package/dist/index24.vue.d.cts +1 -1
  202. package/dist/index25.vue.d.cts +116 -90
  203. package/dist/index25.vue.d.ts +116 -90
  204. package/dist/index26.vue.d.cts +94 -59
  205. package/dist/index26.vue.d.ts +94 -59
  206. package/dist/index27.vue.d.cts +75 -0
  207. package/dist/index27.vue.d.ts +75 -0
  208. package/dist/index28.vue.d.cts +103 -0
  209. package/dist/index28.vue.d.ts +103 -0
  210. package/dist/index29.vue.d.cts +105 -0
  211. package/dist/index29.vue.d.ts +105 -0
  212. package/dist/index3.vue.d.cts +4 -4
  213. package/dist/index3.vue.d.ts +4 -4
  214. package/dist/index30.vue.d.cts +28 -0
  215. package/dist/index30.vue.d.ts +28 -0
  216. package/dist/index4.vue.d.cts +19 -128
  217. package/dist/index4.vue.d.ts +17 -34
  218. package/dist/index5.vue.d.cts +127 -35
  219. package/dist/index5.vue.d.ts +30 -19
  220. package/dist/index6.vue.d.cts +30 -19
  221. package/dist/index6.vue.d.ts +22 -118
  222. package/dist/index7.vue.d.cts +22 -118
  223. package/dist/index7.vue.d.ts +112 -18
  224. package/dist/index8.vue.d.cts +112 -18
  225. package/dist/index8.vue.d.ts +24 -35
  226. package/dist/index9.vue.d.cts +24 -35
  227. package/dist/index9.vue.d.ts +37 -80
  228. package/dist/numberCodec.cjs +1 -0
  229. package/dist/numberCodec.d.cts +25 -0
  230. package/dist/numberCodec.d.ts +25 -0
  231. package/dist/numberCodec.js +1 -0
  232. package/dist/observer.cjs +1 -0
  233. package/dist/observer.js +1 -0
  234. package/dist/presets.d.cts +2 -65
  235. package/dist/presets.d.ts +2 -65
  236. package/dist/resolver.cjs +1 -1
  237. package/dist/resolver.d.cts +1 -1
  238. package/dist/resolver.d.ts +1 -1
  239. package/dist/resolver.js +1 -1
  240. package/dist/serializeSearch.cjs +1 -0
  241. package/dist/serializeSearch.js +1 -0
  242. package/dist/style.css +548 -308
  243. package/dist/types.d.cts +60 -103
  244. package/dist/types.d.ts +62 -52
  245. package/dist/types2.d.cts +104 -51
  246. package/dist/types2.d.ts +56 -0
  247. package/dist/types3.d.cts +56 -0
  248. package/dist/useCollapsePanel.d.cts +3 -3
  249. package/dist/useCollapsePanel.d.ts +3 -3
  250. package/dist/useComponentLocale.cjs +1 -1
  251. package/dist/useComponentLocale.js +1 -1
  252. package/dist/useCropperCore.d.cts +7 -7
  253. package/dist/useCropperCore.d.ts +7 -7
  254. package/dist/useDataResource.cjs +1 -0
  255. package/dist/useDataResource.js +1 -0
  256. package/dist/useDictionary.cjs +1 -0
  257. package/dist/useDictionary.js +1 -0
  258. package/dist/useDynamicFormState.d.cts +960 -10
  259. package/dist/useDynamicFormState.d.ts +951 -11
  260. package/dist/useEdgeInteraction.d.cts +2 -2
  261. package/dist/useEdgeInteraction.d.ts +2 -2
  262. package/dist/useFormArray.cjs +1 -0
  263. package/dist/useFormArray.d.cts +69 -0
  264. package/dist/useFormArray.d.ts +69 -0
  265. package/dist/useFormArray.js +1 -0
  266. package/dist/useFormConfig.d.cts +14 -0
  267. package/dist/useFormConfig.d.ts +17 -38
  268. package/dist/useGridWidth.cjs +1 -0
  269. package/dist/useGridWidth.js +1 -0
  270. package/dist/useInfiniteScroll.d.cts +1 -1
  271. package/dist/useInfiniteScroll.d.ts +1 -1
  272. package/dist/useQRCode.d.cts +4 -4
  273. package/dist/useQRCode.d.ts +4 -4
  274. package/dist/useSignatureHistory.d.cts +4 -4
  275. package/dist/useSignatureHistory.d.ts +4 -4
  276. package/dist/useSplitResize.d.cts +4 -4
  277. package/dist/useSplitResize.d.ts +4 -4
  278. package/dist/useTableGlobalConfig.cjs +1 -0
  279. package/dist/useTableGlobalConfig.js +1 -0
  280. package/dist/useTableQuery.cjs +1 -3
  281. package/dist/useTableQuery.js +1 -3
  282. package/dist/useWorkflowValidation.d.cts +2 -2
  283. package/dist/useWorkflowValidation.d.ts +2 -2
  284. package/dist/validation.cjs +1 -0
  285. package/dist/validation.d.cts +18 -0
  286. package/dist/validation.d.ts +18 -0
  287. package/dist/validation.js +1 -0
  288. package/dist/verification.d.cts +2 -2
  289. package/dist/verification.d.ts +3 -3
  290. package/dist/workflows.cjs +1 -0
  291. package/dist/workflows.d.cts +2 -0
  292. package/dist/workflows.d.ts +2 -0
  293. package/dist/workflows.js +1 -0
  294. package/docs/components.en.md +13 -1
  295. package/docs/components.md +13 -1
  296. package/docs/guides/batch-results.md +47 -0
  297. package/docs/guides/data-picker.md +65 -0
  298. package/docs/guides/data-workflows.md +123 -0
  299. package/docs/guides/form-density.en.md +39 -0
  300. package/docs/guides/form-density.md +39 -0
  301. package/docs/guides/search-workflows.md +164 -0
  302. package/package.json +21 -1
  303. package/dist/C_FormSearch2.cjs +0 -1
  304. package/dist/C_FormSearch2.js +0 -1
  305. package/dist/useTableQuery.d.cts +0 -1957
  306. package/dist/useTableQuery.d.ts +0 -1946
package/dist/Steps.cjs CHANGED
@@ -1 +1 @@
1
- require(`./chunk.cjs`);const e=require(`./C_Icon2.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`),r=require(`naive-ui`);const i={class:`c-form-steps`},a={key:0,class:`single-panel`},o={key:0,class:`step-header`},s={class:`step-title`},c={key:0,class:`step-description`},l={class:`step-form-items`},u={class:`steps-actions`},d=(0,n.defineComponent)({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeStepChange:{},validateStep:{},submitting:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:[`step-change`,`step-before-change`,`step-validate`],setup(t,{expose:d,emit:f}){let p=t,m=f,h=(0,n.ref)(0),g=(0,n.ref)(!1),_=!1,v=(0,n.reactive)({}),y=(0,n.computed)(()=>{let e=p.layoutConfig?.steps||{};return{steps:e.steps||[],vertical:e.vertical||!1,size:e.size||`medium`,showStepHeader:e.showStepHeader!==!1,validateBeforeNext:e.validateBeforeNext||!1,prevButtonText:e.prevButtonText||`上一步`,nextButtonText:e.nextButtonText||`下一步`,defaultStep:e.defaultStep||0}}),b=(0,n.computed)(()=>y.value.steps.length>0),x=(0,n.computed)(()=>{if(!b.value)return[];let e=new Map;return y.value.steps.forEach(t=>{e.set(t.key,[])}),p.formItems.forEach((t,n)=>{let r=(p.options?.[n])?.layout?.step||y.value.steps[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),y.value.steps.map(t=>({config:t,items:e.get(t.key)||[]})).filter(e=>e.items.length>0)}),S=(0,n.computed)(()=>{for(let e=0;e<=h.value;e++)if(v[e]===!1)return`error`;return`process`}),C=(0,n.computed)(()=>h.value===0),w=(0,n.computed)(()=>h.value===x.value.length-1),T=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?n.path:`step-item-${t}`},E=async()=>{let e=x.value[h.value]?.config.key;if(!e||_)return!1;try{let t=p.validateStep?await p.validateStep(h.value,e):!0;return _||x.value[h.value]?.config.key!==e?!1:(m(`step-validate`,h.value),v[h.value]=t,t)}catch{return v[h.value]=!1,!1}},D=(e,t)=>_||x.value[h.value]?.config.key!==e||!x.value.some(e=>e.config.key===t&&!e.config.disabled),O=async(e,t=!1)=>{if(_||g.value||p.submitting||p.disabled||e<0||e>=x.value.length)return!1;if(e===h.value)return!0;let n=x.value[h.value]?.config.key,r=x.value[e].config.key;if(!n||D(n,r))return!1;try{return g.value=!0,t&&y.value.validateBeforeNext&&!await E()||D(n,r)||await p.beforeStepChange?.(h.value,e)===!1||D(n,r)?!1:(m(`step-before-change`,h.value,e),h.value=x.value.findIndex(e=>e.config.key===r),m(`step-change`,h.value,x.value[h.value].config.key),!0)}catch{return!1}finally{g.value=!1}},k=async()=>{await O(h.value+1,!0)},A=()=>{O(h.value-1)},j=async e=>{x.value[e]?.config.disabled||await O(e,e>h.value)},M=()=>{if(!b.value||x.value.length===0)return;let{defaultStep:e}=y.value;h.value=e>=0&&e<x.value.length&&!x.value[e]?.config.disabled?e:0};return(0,n.watch)((0,n.computed)(()=>y.value.steps.map(e=>e.key).join(`,`)),()=>{M()}),(0,n.watch)(()=>x.value.map(e=>e.config.key),(e,t)=>{let n=t[h.value],r=e.indexOf(n);h.value=r>=0?r:Math.max(0,Math.min(h.value,e.length-1)),Object.keys(v).forEach(e=>{delete v[Number(e)]})}),(0,n.onMounted)(()=>{M()}),(0,n.onScopeDispose)(()=>{_=!0}),d({nextStep:k,previousStep:A,goToStep:j,validateCurrentStep:E,currentStep:(0,n.readonly)(h),totalSteps:(0,n.computed)(()=>x.value.length)}),(d,f)=>{let p=r.NStep,m=r.NSteps,_=r.NCard,v=r.NButton,E=r.NSpace;return(0,n.openBlock)(),(0,n.createElementBlock)(`div`,i,[(0,n.createCommentVNode)(` 无步骤配置时的单一面板模式 `),b.value?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[(0,n.createCommentVNode)(` 有步骤配置时的分步骤模式 `),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`steps-container`,{"is-vertical":y.value.vertical}])},[(0,n.createCommentVNode)(` 步骤指示器 `),(0,n.createVNode)(m,{current:h.value+1,status:S.value,size:y.value.size,vertical:y.value.vertical,class:`steps-indicator`},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(x.value,e=>((0,n.openBlock)(),(0,n.createBlock)(p,{key:e.config.key,title:e.config.title,description:e.config.description,disabled:e.config.disabled||g.value||t.submitting||t.disabled},null,8,[`title`,`description`,`disabled`]))),128))]),_:1},8,[`current`,`status`,`size`,`vertical`]),(0,n.createCommentVNode)(` 步骤内容区域 `),(0,n.createVNode)(_,{class:`steps-content`,bordered:!1},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(x.value,(e,t)=>(0,n.withDirectives)(((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:e.config.key,class:`step-panel`},[(0,n.createCommentVNode)(` 步骤标题和描述 `),y.value.showStepHeader?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,o,[(0,n.createElementVNode)(`h3`,s,(0,n.toDisplayString)(e.config.title),1),e.config.description?((0,n.openBlock)(),(0,n.createElementBlock)(`p`,c,(0,n.toDisplayString)(e.config.description),1)):(0,n.createCommentVNode)(`v-if`,!0)])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createCommentVNode)(` 步骤内的表单项 `),(0,n.createElementVNode)(`div`,l,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.items,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:T(e,t)}))),128))])])),[[n.vShow,h.value===t]])),128))]),_:1}),(0,n.createCommentVNode)(` 步骤操作按钮 `),(0,n.createElementVNode)(`div`,u,[(0,n.createVNode)(E,{justify:`space-between`},{default:(0,n.withCtx)(()=>[h.value>0?((0,n.openBlock)(),(0,n.createBlock)(v,{key:0,size:t.controlSize,disabled:g.value||t.submitting||t.disabled,onClick:A},{default:(0,n.withCtx)(()=>[(0,n.createVNode)(e.t,{name:`mdi:chevron-left-first`,size:16,style:{"margin-right":`4px`}}),(0,n.createTextVNode)(` `+(0,n.toDisplayString)(y.value.prevButtonText),1)]),_:1},8,[`size`,`disabled`])):(0,n.createCommentVNode)(`v-if`,!0),f[0]||=(0,n.createElementVNode)(`div`,null,null,-1),(0,n.createVNode)(E,null,{default:(0,n.withCtx)(()=>[h.value<x.value.length-1?((0,n.openBlock)(),(0,n.createBlock)(v,{key:0,size:t.controlSize,type:`primary`,loading:g.value,disabled:t.submitting||t.disabled,onClick:k},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)(y.value.nextButtonText)+` `,1),(0,n.createVNode)(e.t,{name:`mdi:chevron-right-last`,size:16,style:{"margin-left":`4px`}})]),_:1},8,[`size`,`loading`,`disabled`])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.renderSlot)(d.$slots,`step-actions`,{currentStep:h.value,totalSteps:x.value.length,isFirstStep:C.value,isLastStep:w.value,nextStep:k,previousStep:A,goToStep:j},void 0,!0)]),_:3})]),_:3})])],2)],2112)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.formItems,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:T(e,t)}))),128))]))])}}});var f=t.t(d,[[`__scopeId`,`data-v-8e183ba9`]]);exports.default=f;
1
+ require(`./chunk.cjs`);const e=require(`./C_Icon2.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`),r=require(`naive-ui`);const i={class:`c-form-steps`},a={key:0,class:`single-panel`},o={key:0,class:`step-header`},s={class:`step-title`},c={key:0,class:`step-description`},l={class:`step-form-items`},u={class:`steps-actions`},d=(0,n.defineComponent)({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeStepChange:{},validateStep:{},submitting:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:[`step-change`,`step-before-change`,`step-validate`],setup(t,{expose:d,emit:f}){let p=t,m=f,h=(0,n.ref)(0),g=(0,n.ref)(!1),_=!1,v=(0,n.reactive)({}),y=(0,n.computed)(()=>{let e=p.layoutConfig?.steps||{};return{steps:e.steps||[],vertical:e.vertical||!1,size:e.size||`medium`,showStepHeader:e.showStepHeader!==!1,validateBeforeNext:e.validateBeforeNext||!1,prevButtonText:e.prevButtonText||`上一步`,nextButtonText:e.nextButtonText||`下一步`,defaultStep:e.defaultStep||0}}),b=(0,n.computed)(()=>y.value.steps.length>0),x=(0,n.computed)(()=>{if(!b.value)return[];let e=new Map;return y.value.steps.forEach(t=>{e.set(t.key,[])}),p.formItems.forEach((t,n)=>{let r=(p.options?.[n])?.layout?.step||y.value.steps[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),y.value.steps.map(t=>({config:t,items:e.get(t.key)||[]})).filter(e=>e.items.length>0)}),S=(0,n.computed)(()=>{for(let e=0;e<=h.value;e++)if(v[e]===!1)return`error`;return`process`}),C=(0,n.computed)(()=>h.value===0),w=(0,n.computed)(()=>h.value===x.value.length-1),T=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?n.path:`step-item-${t}`},E=async()=>{let e=x.value[h.value]?.config.key;if(!e||_)return!1;try{let t=p.validateStep?await p.validateStep(h.value,e):!0;return _||x.value[h.value]?.config.key!==e?!1:(m(`step-validate`,h.value),v[h.value]=t,t)}catch{return v[h.value]=!1,!1}},D=(e,t)=>_||x.value[h.value]?.config.key!==e||!x.value.some(e=>e.config.key===t&&!e.config.disabled),O=async(e,t=!1,n=()=>!0)=>{if(_||g.value||p.submitting||p.disabled||!n()||e<0||e>=x.value.length)return!1;if(e===h.value)return!0;let r=x.value[h.value]?.config.key,i=x.value[e].config.key;if(!r||D(r,i))return!1;try{return g.value=!0,t&&y.value.validateBeforeNext&&!await E()||D(r,i)||!n()||await p.beforeStepChange?.(h.value,e)===!1||D(r,i)||!n()?!1:(m(`step-before-change`,h.value,e),h.value=x.value.findIndex(e=>e.config.key===i),m(`step-change`,h.value,x.value[h.value].config.key),!0)}catch{return!1}finally{g.value=!1}},k=async()=>{await O(h.value+1,!0)},A=()=>{O(h.value-1)},j=async e=>{x.value[e]?.config.disabled||await O(e,e>h.value)},M=()=>{if(!b.value||x.value.length===0)return;let{defaultStep:e}=y.value;h.value=e>=0&&e<x.value.length&&!x.value[e]?.config.disabled?e:0};return(0,n.watch)((0,n.computed)(()=>y.value.steps.map(e=>e.key).join(`,`)),()=>{M()}),(0,n.watch)(()=>x.value.map(e=>e.config.key),(e,t)=>{let n=t[h.value],r=e.indexOf(n);h.value=r>=0?r:Math.max(0,Math.min(h.value,e.length-1)),Object.keys(v).forEach(e=>{delete v[Number(e)]})}),(0,n.onMounted)(()=>{M()}),(0,n.onScopeDispose)(()=>{_=!0}),d({revealField:async(e,t=()=>!0)=>{if(!b.value)return t();let n=p.formItems.findIndex(t=>t.props?.path===e);if(n<0)return!1;let r=p.options[n]?.layout?.step||y.value.steps[0]?.key,i=x.value.findIndex(e=>e.config.key===r);return i<0||x.value[i].config.disabled?!1:O(i,i>h.value,t)},nextStep:k,previousStep:A,goToStep:j,validateCurrentStep:E,currentStep:(0,n.readonly)(h),totalSteps:(0,n.computed)(()=>x.value.length)}),(d,f)=>{let p=r.NStep,m=r.NSteps,_=r.NCard,v=r.NButton,E=r.NSpace;return(0,n.openBlock)(),(0,n.createElementBlock)(`div`,i,[(0,n.createCommentVNode)(` 无步骤配置时的单一面板模式 `),b.value?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[(0,n.createCommentVNode)(` 有步骤配置时的分步骤模式 `),(0,n.createElementVNode)(`div`,{class:(0,n.normalizeClass)([`steps-container`,{"is-vertical":y.value.vertical}])},[(0,n.createCommentVNode)(` 步骤指示器 `),(0,n.createVNode)(m,{current:h.value+1,status:S.value,size:y.value.size,vertical:y.value.vertical,class:`steps-indicator`},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(x.value,e=>((0,n.openBlock)(),(0,n.createBlock)(p,{key:e.config.key,title:e.config.title,description:e.config.description,disabled:e.config.disabled||g.value||t.submitting||t.disabled},null,8,[`title`,`description`,`disabled`]))),128))]),_:1},8,[`current`,`status`,`size`,`vertical`]),(0,n.createCommentVNode)(` 步骤内容区域 `),(0,n.createVNode)(_,{class:`steps-content`,bordered:!1},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(x.value,(e,t)=>(0,n.withDirectives)(((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{key:e.config.key,class:`step-panel`},[(0,n.createCommentVNode)(` 步骤标题和描述 `),y.value.showStepHeader?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,o,[(0,n.createElementVNode)(`h3`,s,(0,n.toDisplayString)(e.config.title),1),e.config.description?((0,n.openBlock)(),(0,n.createElementBlock)(`p`,c,(0,n.toDisplayString)(e.config.description),1)):(0,n.createCommentVNode)(`v-if`,!0)])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createCommentVNode)(` 步骤内的表单项 `),(0,n.createElementVNode)(`div`,l,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(e.items,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:T(e,t)}))),128))])])),[[n.vShow,h.value===t]])),128))]),_:1}),(0,n.createCommentVNode)(` 步骤操作按钮 `),(0,n.createElementVNode)(`div`,u,[(0,n.createVNode)(E,{justify:`space-between`},{default:(0,n.withCtx)(()=>[h.value>0?((0,n.openBlock)(),(0,n.createBlock)(v,{key:0,size:t.controlSize,disabled:g.value||t.submitting||t.disabled,onClick:A},{default:(0,n.withCtx)(()=>[(0,n.createVNode)(e.t,{name:`mdi:chevron-left-first`,size:16,style:{"margin-right":`4px`}}),(0,n.createTextVNode)(` `+(0,n.toDisplayString)(y.value.prevButtonText),1)]),_:1},8,[`size`,`disabled`])):(0,n.createCommentVNode)(`v-if`,!0),f[0]||=(0,n.createElementVNode)(`div`,null,null,-1),(0,n.createVNode)(E,null,{default:(0,n.withCtx)(()=>[h.value<x.value.length-1?((0,n.openBlock)(),(0,n.createBlock)(v,{key:0,size:t.controlSize,type:`primary`,loading:g.value,disabled:t.submitting||t.disabled,onClick:k},{default:(0,n.withCtx)(()=>[(0,n.createTextVNode)((0,n.toDisplayString)(y.value.nextButtonText)+` `,1),(0,n.createVNode)(e.t,{name:`mdi:chevron-right-last`,size:16,style:{"margin-left":`4px`}})]),_:1},8,[`size`,`loading`,`disabled`])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.renderSlot)(d.$slots,`step-actions`,{currentStep:h.value,totalSteps:x.value.length,isFirstStep:C.value,isLastStep:w.value,nextStep:k,previousStep:A,goToStep:j},void 0,!0)]),_:3})]),_:3})])],2)],2112)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.formItems,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:T(e,t)}))),128))]))])}}});var f=t.t(d,[[`__scopeId`,`data-v-52fc924a`]]);exports.default=f;
package/dist/Steps.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,normalizeClass as d,onMounted as f,onScopeDispose as p,openBlock as m,reactive as h,readonly as g,ref as _,renderList as v,renderSlot as ee,resolveComponent as y,resolveDynamicComponent as b,toDisplayString as x,vShow as S,watch as C,withCtx as w,withDirectives as T}from"vue";import{NButton as E,NCard as D,NSpace as O,NStep as k,NSteps as A}from"naive-ui";const j={class:`c-form-steps`},M={key:0,class:`single-panel`},N={key:0,class:`step-header`},te={class:`step-title`},ne={key:0,class:`step-description`},re={class:`step-form-items`},ie={class:`steps-actions`};var P=t(u({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeStepChange:{},validateStep:{},submitting:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:[`step-change`,`step-before-change`,`step-validate`],setup(t,{expose:u,emit:y}){let P=t,F=y,I=_(0),L=_(!1),R=!1,z=h({}),B=r(()=>{let e=P.layoutConfig?.steps||{};return{steps:e.steps||[],vertical:e.vertical||!1,size:e.size||`medium`,showStepHeader:e.showStepHeader!==!1,validateBeforeNext:e.validateBeforeNext||!1,prevButtonText:e.prevButtonText||`上一步`,nextButtonText:e.nextButtonText||`下一步`,defaultStep:e.defaultStep||0}}),V=r(()=>B.value.steps.length>0),H=r(()=>{if(!V.value)return[];let e=new Map;return B.value.steps.forEach(t=>{e.set(t.key,[])}),P.formItems.forEach((t,n)=>{let r=(P.options?.[n])?.layout?.step||B.value.steps[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),B.value.steps.map(t=>({config:t,items:e.get(t.key)||[]})).filter(e=>e.items.length>0)}),U=r(()=>{for(let e=0;e<=I.value;e++)if(z[e]===!1)return`error`;return`process`}),W=r(()=>I.value===0),G=r(()=>I.value===H.value.length-1),K=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?n.path:`step-item-${t}`},q=async()=>{let e=H.value[I.value]?.config.key;if(!e||R)return!1;try{let t=P.validateStep?await P.validateStep(I.value,e):!0;return R||H.value[I.value]?.config.key!==e?!1:(F(`step-validate`,I.value),z[I.value]=t,t)}catch{return z[I.value]=!1,!1}},J=(e,t)=>R||H.value[I.value]?.config.key!==e||!H.value.some(e=>e.config.key===t&&!e.config.disabled),Y=async(e,t=!1)=>{if(R||L.value||P.submitting||P.disabled||e<0||e>=H.value.length)return!1;if(e===I.value)return!0;let n=H.value[I.value]?.config.key,r=H.value[e].config.key;if(!n||J(n,r))return!1;try{return L.value=!0,t&&B.value.validateBeforeNext&&!await q()||J(n,r)||await P.beforeStepChange?.(I.value,e)===!1||J(n,r)?!1:(F(`step-before-change`,I.value,e),I.value=H.value.findIndex(e=>e.config.key===r),F(`step-change`,I.value,H.value[I.value].config.key),!0)}catch{return!1}finally{L.value=!1}},X=async()=>{await Y(I.value+1,!0)},Z=()=>{Y(I.value-1)},Q=async e=>{H.value[e]?.config.disabled||await Y(e,e>I.value)},$=()=>{if(!V.value||H.value.length===0)return;let{defaultStep:e}=B.value;I.value=e>=0&&e<H.value.length&&!H.value[e]?.config.disabled?e:0};return C(r(()=>B.value.steps.map(e=>e.key).join(`,`)),()=>{$()}),C(()=>H.value.map(e=>e.config.key),(e,t)=>{let n=t[I.value],r=e.indexOf(n);I.value=r>=0?r:Math.max(0,Math.min(I.value,e.length-1)),Object.keys(z).forEach(e=>{delete z[Number(e)]})}),f(()=>{$()}),p(()=>{R=!0}),u({nextStep:X,previousStep:Z,goToStep:Q,validateCurrentStep:q,currentStep:g(I),totalSteps:r(()=>H.value.length)}),(r,u)=>{let f=k,p=A,h=D,g=E,_=O;return m(),o(`div`,j,[a(` 无步骤配置时的单一面板模式 `),V.value?(m(),o(n,{key:1},[a(` 有步骤配置时的分步骤模式 `),s(`div`,{class:d([`steps-container`,{"is-vertical":B.value.vertical}])},[a(` 步骤指示器 `),l(p,{current:I.value+1,status:U.value,size:B.value.size,vertical:B.value.vertical,class:`steps-indicator`},{default:w(()=>[(m(!0),o(n,null,v(H.value,e=>(m(),i(f,{key:e.config.key,title:e.config.title,description:e.config.description,disabled:e.config.disabled||L.value||t.submitting||t.disabled},null,8,[`title`,`description`,`disabled`]))),128))]),_:1},8,[`current`,`status`,`size`,`vertical`]),a(` 步骤内容区域 `),l(h,{class:`steps-content`,bordered:!1},{default:w(()=>[(m(!0),o(n,null,v(H.value,(e,t)=>T((m(),o(`div`,{key:e.config.key,class:`step-panel`},[a(` 步骤标题和描述 `),B.value.showStepHeader?(m(),o(`div`,N,[s(`h3`,te,x(e.config.title),1),e.config.description?(m(),o(`p`,ne,x(e.config.description),1)):a(`v-if`,!0)])):a(`v-if`,!0),a(` 步骤内的表单项 `),s(`div`,re,[(m(!0),o(n,null,v(e.items,(e,t)=>(m(),i(b(e),{key:K(e,t)}))),128))])])),[[S,I.value===t]])),128))]),_:1}),a(` 步骤操作按钮 `),s(`div`,ie,[l(_,{justify:`space-between`},{default:w(()=>[I.value>0?(m(),i(g,{key:0,size:t.controlSize,disabled:L.value||t.submitting||t.disabled,onClick:Z},{default:w(()=>[l(e,{name:`mdi:chevron-left-first`,size:16,style:{"margin-right":`4px`}}),c(` `+x(B.value.prevButtonText),1)]),_:1},8,[`size`,`disabled`])):a(`v-if`,!0),u[0]||=s(`div`,null,null,-1),l(_,null,{default:w(()=>[I.value<H.value.length-1?(m(),i(g,{key:0,size:t.controlSize,type:`primary`,loading:L.value,disabled:t.submitting||t.disabled,onClick:X},{default:w(()=>[c(x(B.value.nextButtonText)+` `,1),l(e,{name:`mdi:chevron-right-last`,size:16,style:{"margin-left":`4px`}})]),_:1},8,[`size`,`loading`,`disabled`])):a(`v-if`,!0),ee(r.$slots,`step-actions`,{currentStep:I.value,totalSteps:H.value.length,isFirstStep:W.value,isLastStep:G.value,nextStep:X,previousStep:Z,goToStep:Q},void 0,!0)]),_:3})]),_:3})])],2)],2112)):(m(),o(`div`,M,[(m(!0),o(n,null,v(t.formItems,(e,t)=>(m(),i(b(e),{key:K(e,t)}))),128))]))])}}}),[[`__scopeId`,`data-v-8e183ba9`]]);export{P as default};
1
+ import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,normalizeClass as d,onMounted as f,onScopeDispose as p,openBlock as m,reactive as h,readonly as g,ref as _,renderList as v,renderSlot as ee,resolveComponent as y,resolveDynamicComponent as b,toDisplayString as x,vShow as S,watch as C,withCtx as w,withDirectives as T}from"vue";import{NButton as E,NCard as D,NSpace as O,NStep as k,NSteps as A}from"naive-ui";const j={class:`c-form-steps`},M={key:0,class:`single-panel`},N={key:0,class:`step-header`},te={class:`step-title`},ne={key:0,class:`step-description`},re={class:`step-form-items`},ie={class:`steps-actions`};var P=t(u({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeStepChange:{},validateStep:{},submitting:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1}},emits:[`step-change`,`step-before-change`,`step-validate`],setup(t,{expose:u,emit:y}){let P=t,F=y,I=_(0),L=_(!1),R=!1,z=h({}),B=r(()=>{let e=P.layoutConfig?.steps||{};return{steps:e.steps||[],vertical:e.vertical||!1,size:e.size||`medium`,showStepHeader:e.showStepHeader!==!1,validateBeforeNext:e.validateBeforeNext||!1,prevButtonText:e.prevButtonText||`上一步`,nextButtonText:e.nextButtonText||`下一步`,defaultStep:e.defaultStep||0}}),V=r(()=>B.value.steps.length>0),H=r(()=>{if(!V.value)return[];let e=new Map;return B.value.steps.forEach(t=>{e.set(t.key,[])}),P.formItems.forEach((t,n)=>{let r=(P.options?.[n])?.layout?.step||B.value.steps[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),B.value.steps.map(t=>({config:t,items:e.get(t.key)||[]})).filter(e=>e.items.length>0)}),U=r(()=>{for(let e=0;e<=I.value;e++)if(z[e]===!1)return`error`;return`process`}),W=r(()=>I.value===0),G=r(()=>I.value===H.value.length-1),K=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?n.path:`step-item-${t}`},q=async()=>{let e=H.value[I.value]?.config.key;if(!e||R)return!1;try{let t=P.validateStep?await P.validateStep(I.value,e):!0;return R||H.value[I.value]?.config.key!==e?!1:(F(`step-validate`,I.value),z[I.value]=t,t)}catch{return z[I.value]=!1,!1}},J=(e,t)=>R||H.value[I.value]?.config.key!==e||!H.value.some(e=>e.config.key===t&&!e.config.disabled),Y=async(e,t=!1,n=()=>!0)=>{if(R||L.value||P.submitting||P.disabled||!n()||e<0||e>=H.value.length)return!1;if(e===I.value)return!0;let r=H.value[I.value]?.config.key,i=H.value[e].config.key;if(!r||J(r,i))return!1;try{return L.value=!0,t&&B.value.validateBeforeNext&&!await q()||J(r,i)||!n()||await P.beforeStepChange?.(I.value,e)===!1||J(r,i)||!n()?!1:(F(`step-before-change`,I.value,e),I.value=H.value.findIndex(e=>e.config.key===i),F(`step-change`,I.value,H.value[I.value].config.key),!0)}catch{return!1}finally{L.value=!1}},X=async()=>{await Y(I.value+1,!0)},Z=()=>{Y(I.value-1)},Q=async e=>{H.value[e]?.config.disabled||await Y(e,e>I.value)},$=()=>{if(!V.value||H.value.length===0)return;let{defaultStep:e}=B.value;I.value=e>=0&&e<H.value.length&&!H.value[e]?.config.disabled?e:0};return C(r(()=>B.value.steps.map(e=>e.key).join(`,`)),()=>{$()}),C(()=>H.value.map(e=>e.config.key),(e,t)=>{let n=t[I.value],r=e.indexOf(n);I.value=r>=0?r:Math.max(0,Math.min(I.value,e.length-1)),Object.keys(z).forEach(e=>{delete z[Number(e)]})}),f(()=>{$()}),p(()=>{R=!0}),u({revealField:async(e,t=()=>!0)=>{if(!V.value)return t();let n=P.formItems.findIndex(t=>t.props?.path===e);if(n<0)return!1;let r=P.options[n]?.layout?.step||B.value.steps[0]?.key,i=H.value.findIndex(e=>e.config.key===r);return i<0||H.value[i].config.disabled?!1:Y(i,i>I.value,t)},nextStep:X,previousStep:Z,goToStep:Q,validateCurrentStep:q,currentStep:g(I),totalSteps:r(()=>H.value.length)}),(r,u)=>{let f=k,p=A,h=D,g=E,_=O;return m(),o(`div`,j,[a(` 无步骤配置时的单一面板模式 `),V.value?(m(),o(n,{key:1},[a(` 有步骤配置时的分步骤模式 `),s(`div`,{class:d([`steps-container`,{"is-vertical":B.value.vertical}])},[a(` 步骤指示器 `),l(p,{current:I.value+1,status:U.value,size:B.value.size,vertical:B.value.vertical,class:`steps-indicator`},{default:w(()=>[(m(!0),o(n,null,v(H.value,e=>(m(),i(f,{key:e.config.key,title:e.config.title,description:e.config.description,disabled:e.config.disabled||L.value||t.submitting||t.disabled},null,8,[`title`,`description`,`disabled`]))),128))]),_:1},8,[`current`,`status`,`size`,`vertical`]),a(` 步骤内容区域 `),l(h,{class:`steps-content`,bordered:!1},{default:w(()=>[(m(!0),o(n,null,v(H.value,(e,t)=>T((m(),o(`div`,{key:e.config.key,class:`step-panel`},[a(` 步骤标题和描述 `),B.value.showStepHeader?(m(),o(`div`,N,[s(`h3`,te,x(e.config.title),1),e.config.description?(m(),o(`p`,ne,x(e.config.description),1)):a(`v-if`,!0)])):a(`v-if`,!0),a(` 步骤内的表单项 `),s(`div`,re,[(m(!0),o(n,null,v(e.items,(e,t)=>(m(),i(b(e),{key:K(e,t)}))),128))])])),[[S,I.value===t]])),128))]),_:1}),a(` 步骤操作按钮 `),s(`div`,ie,[l(_,{justify:`space-between`},{default:w(()=>[I.value>0?(m(),i(g,{key:0,size:t.controlSize,disabled:L.value||t.submitting||t.disabled,onClick:Z},{default:w(()=>[l(e,{name:`mdi:chevron-left-first`,size:16,style:{"margin-right":`4px`}}),c(` `+x(B.value.prevButtonText),1)]),_:1},8,[`size`,`disabled`])):a(`v-if`,!0),u[0]||=s(`div`,null,null,-1),l(_,null,{default:w(()=>[I.value<H.value.length-1?(m(),i(g,{key:0,size:t.controlSize,type:`primary`,loading:L.value,disabled:t.submitting||t.disabled,onClick:X},{default:w(()=>[c(x(B.value.nextButtonText)+` `,1),l(e,{name:`mdi:chevron-right-last`,size:16,style:{"margin-left":`4px`}})]),_:1},8,[`size`,`loading`,`disabled`])):a(`v-if`,!0),ee(r.$slots,`step-actions`,{currentStep:I.value,totalSteps:H.value.length,isFirstStep:W.value,isLastStep:G.value,nextStep:X,previousStep:Z,goToStep:Q},void 0,!0)]),_:3})]),_:3})])],2)],2112)):(m(),o(`div`,M,[(m(!0),o(n,null,v(t.formItems,(e,t)=>(m(),i(b(e),{key:K(e,t)}))),128))]))])}}}),[[`__scopeId`,`data-v-52fc924a`]]);export{P as default};
package/dist/Tabs.cjs CHANGED
@@ -1 +1 @@
1
- require(`./chunk.cjs`);const e=require(`./C_Icon2.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`),r=require(`naive-ui`);const i={class:`c-form-tabs`},a={key:0,class:`single-panel`},o={class:`tabs-container`},s={key:0,class:`tab-header`},c={class:`tab-description`},l={class:`tab-form-items`},u={key:0,class:`tabs-actions`},d=(0,n.defineComponent)({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeTabChange:{},validateTab:{}},emits:[`tab-change`,`tab-before-change`,`tab-validate`,`tab-close`,`tab-add`],setup(t,{expose:d,emit:f}){let p=t,m=f,h=(0,n.ref)(``),g=(0,n.ref)(!1),_=!1,v=(0,n.reactive)({}),y=()=>({tabs:[],type:`line`,size:`medium`,placement:`top`,animated:!0,closable:!1,addable:!1,showTabHeader:!0,showActions:!1,showCount:!1,validateBeforeSwitch:!1,defaultTab:``}),b=(0,n.computed)(()=>{let e=y(),t=p.layoutConfig?.tabs||{};return{...e,...t}}),x=(0,n.computed)(()=>b.value.tabs.length>0),S=(0,n.computed)(()=>{if(!x.value)return[];let e=new Map;return b.value.tabs.forEach(t=>{e.set(t.key,[])}),p.formItems.forEach((t,n)=>{let r=(p.options?.[n])?.layout?.tab||b.value.tabs[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),b.value.tabs.map(t=>({config:t,items:e.get(t.key)||[]}))}),C=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?String(n.path):`tab-item-${t}`},w=async()=>{if(!h.value)return!0;try{let e=p.validateTab?await p.validateTab(h.value):!0;return m(`tab-validate`,h.value),v[h.value]=e,e}catch{return v[h.value]=!1,!1}},T=async e=>{if(_||g.value)return!1;if(!e||e===h.value)return!0;let t=S.value.find(t=>t.config.key===e);if(!t||t.config.disabled)return!1;let n=h.value;try{if(g.value=!0,b.value.validateBeforeSwitch&&h.value&&!await w()||_||h.value!==n)return!1;if(h.value){if(await p.beforeTabChange?.(h.value,e)===!1||_||h.value!==n)return!1;m(`tab-before-change`,h.value,e)}return S.value.some(t=>t.config.key===e&&!t.config.disabled)?(h.value=e,m(`tab-change`,e,S.value.findIndex(t=>t.config.key===e)),!0):!1}catch{return!1}finally{g.value=!1}},E=e=>{T(e)},D=e=>{m(`tab-close`,e)},O=()=>{m(`tab-add`)},k=()=>{if(!x.value||S.value.length===0){h.value=``;return}let{defaultTab:e}=b.value,t=S.value.find(t=>t.config.key===e&&!t.config.disabled)?.config.key||S.value.find(e=>!e.config.disabled)?.config.key;t&&t!==h.value&&(h.value=t,(0,n.nextTick)(()=>{let e=S.value.findIndex(e=>e.config.key===t);e>=0&&m(`tab-change`,t,e)}))};return(0,n.onMounted)(()=>{k()}),(0,n.onScopeDispose)(()=>{_=!0}),(0,n.watch)((0,n.computed)(()=>b.value.tabs.map(e=>e.key).join(`,`)),()=>{b.value.tabs.some(e=>e.key===h.value)||k()}),(0,n.watch)(()=>b.value.defaultTab,e=>{e&&e!==h.value&&T(e)}),d({switchToTab:T,validateCurrentTab:w,currentTab:(0,n.readonly)(h),totalTabs:(0,n.computed)(()=>S.value.length),tabsWithItems:(0,n.readonly)(S)}),(d,f)=>{let p=r.NBadge,m=r.NSpace,_=r.NEmpty,v=r.NTabPane,y=r.NTabs,k=r.NButton;return(0,n.openBlock)(),(0,n.createElementBlock)(`div`,i,[(0,n.createCommentVNode)(` 无标签配置时的单一面板模式 `),x.value?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[(0,n.createCommentVNode)(` 有标签配置时的分标签模式 `),(0,n.createElementVNode)(`div`,o,[(0,n.createVNode)(y,{value:h.value,type:b.value.type,size:b.value.size,placement:b.value.placement,animated:b.value.animated,closable:b.value.closable,addable:b.value.addable,class:`form-tabs`,"onUpdate:value":E,onClose:D,onAdd:O},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(S.value,t=>((0,n.openBlock)(),(0,n.createBlock)(v,{key:t.config.key,name:t.config.key,tab:t.config.title,disabled:t.config.disabled||g.value,closable:t.config.closable,"display-directive":`show`},{tab:(0,n.withCtx)(()=>[(0,n.createVNode)(m,{align:`center`,size:8},{default:(0,n.withCtx)(()=>[t.config.icon?((0,n.openBlock)(),(0,n.createBlock)(e.t,{key:0,name:t.config.icon,size:16,class:`tab-icon`},null,8,[`name`])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(t.config.title),1),b.value.showCount?((0,n.openBlock)(),(0,n.createBlock)(p,{key:1,value:t.items.length,max:99,show:t.items.length>0,type:`info`},null,8,[`value`,`show`])):(0,n.createCommentVNode)(`v-if`,!0)]),_:2},1024)]),default:(0,n.withCtx)(()=>[b.value.showTabHeader&&t.config.description?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,s,[(0,n.createElementVNode)(`p`,c,(0,n.toDisplayString)(t.config.description),1)])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,l,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.items,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:C(e,t)}))),128))]),t.items.length===0?((0,n.openBlock)(),(0,n.createBlock)(_,{key:1,description:`暂无表单项`,class:`tab-empty`})):(0,n.createCommentVNode)(`v-if`,!0)]),_:2},1032,[`name`,`tab`,`disabled`,`closable`]))),128))]),_:1},8,[`value`,`type`,`size`,`placement`,`animated`,`closable`,`addable`]),(0,n.createCommentVNode)(` 标签页操作按钮 `),b.value.showActions?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,u,[(0,n.createVNode)(m,{justify:`space-between`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)(m,null,{default:(0,n.withCtx)(()=>[b.value.validateBeforeSwitch?((0,n.openBlock)(),(0,n.createBlock)(k,{key:0,type:`primary`,size:t.controlSize??`small`,onClick:w},{default:(0,n.withCtx)(()=>[(0,n.createVNode)(e.t,{name:`carbon:star-check`,size:14,style:{"margin-right":`4px`}}),f[0]||=(0,n.createTextVNode)(` 验证当前标签 `,-1)]),_:1},8,[`size`])):(0,n.createCommentVNode)(`v-if`,!0)]),_:1}),(0,n.createVNode)(m,null,{default:(0,n.withCtx)(()=>[(0,n.renderSlot)(d.$slots,`tab-actions`,{currentTab:h.value,totalTabs:S.value.length,validateTab:w,switchToTab:T},void 0,!0)]),_:3})]),_:3})])):(0,n.createCommentVNode)(`v-if`,!0)])],2112)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.formItems,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:C(e,t)}))),128))]))])}}});var f=t.t(d,[[`__scopeId`,`data-v-d2ed671c`]]);exports.default=f;
1
+ require(`./chunk.cjs`);const e=require(`./C_Icon2.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`),r=require(`naive-ui`);const i={class:`c-form-tabs`},a={key:0,class:`single-panel`},o={class:`tabs-container`},s={key:0,class:`tab-header`},c={class:`tab-description`},l={class:`tab-form-items`},u={key:0,class:`tabs-actions`},d=(0,n.defineComponent)({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeTabChange:{},validateTab:{}},emits:[`tab-change`,`tab-before-change`,`tab-validate`,`tab-close`,`tab-add`],setup(t,{expose:d,emit:f}){let p=t,m=f,h=(0,n.ref)(``),g=(0,n.ref)(!1),_=!1,v=(0,n.reactive)({}),y=()=>({tabs:[],type:`line`,size:`medium`,placement:`top`,animated:!0,closable:!1,addable:!1,showTabHeader:!0,showActions:!1,showCount:!1,validateBeforeSwitch:!1,defaultTab:``}),b=(0,n.computed)(()=>{let e=y(),t=p.layoutConfig?.tabs||{};return{...e,...t}}),x=(0,n.computed)(()=>b.value.tabs.length>0),S=(0,n.computed)(()=>{if(!x.value)return[];let e=new Map;return b.value.tabs.forEach(t=>{e.set(t.key,[])}),p.formItems.forEach((t,n)=>{let r=(p.options?.[n])?.layout?.tab||b.value.tabs[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),b.value.tabs.map(t=>({config:t,items:e.get(t.key)||[]}))}),C=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?String(n.path):`tab-item-${t}`},w=async()=>{if(!h.value)return!0;try{let e=p.validateTab?await p.validateTab(h.value):!0;return m(`tab-validate`,h.value),v[h.value]=e,e}catch{return v[h.value]=!1,!1}},T=e=>S.value.find(t=>t.config.key===e&&!t.config.disabled),E=(e,t)=>!_&&h.value===e&&t(),D=(e,t,n)=>E(e,n)&&!!T(t),O=async(e,t,n)=>{if(b.value.validateBeforeSwitch&&e&&!await w()||!E(e,n))return!1;if(e){if(await p.beforeTabChange?.(e,t)===!1||!E(e,n))return!1;m(`tab-before-change`,e,t)}return!0},k=async(e,t=()=>!0)=>{let n=h.value;if(g.value||!E(n,t))return!1;if(!e||e===h.value)return!0;if(!T(e))return!1;try{return g.value=!0,!await O(n,e,t)||!D(n,e,t)?!1:(h.value=e,m(`tab-change`,e,S.value.findIndex(t=>t.config.key===e)),!0)}catch{return!1}finally{g.value=!1}},A=e=>{k(e)},j=e=>{m(`tab-close`,e)},M=()=>{m(`tab-add`)},N=()=>{if(!x.value||S.value.length===0){h.value=``;return}let{defaultTab:e}=b.value,t=S.value.find(t=>t.config.key===e&&!t.config.disabled)?.config.key||S.value.find(e=>!e.config.disabled)?.config.key;t&&t!==h.value&&(h.value=t,(0,n.nextTick)(()=>{let e=S.value.findIndex(e=>e.config.key===t);e>=0&&m(`tab-change`,t,e)}))};return(0,n.onMounted)(()=>{N()}),(0,n.onScopeDispose)(()=>{_=!0}),(0,n.watch)((0,n.computed)(()=>b.value.tabs.map(e=>e.key).join(`,`)),()=>{b.value.tabs.some(e=>e.key===h.value)||N()}),(0,n.watch)(()=>b.value.defaultTab,e=>{e&&e!==h.value&&k(e)}),d({revealField:async(e,t=()=>!0)=>{if(!x.value)return t();let n=p.options.find(t=>t.prop===e)?.layout?.tab||b.value.tabs[0]?.key,r=S.value.find(e=>e.config.key===n);return!r||r.config.disabled?!1:k(r.config.key,t)},switchToTab:k,validateCurrentTab:w,currentTab:(0,n.readonly)(h),totalTabs:(0,n.computed)(()=>S.value.length),tabsWithItems:(0,n.readonly)(S)}),(d,f)=>{let p=r.NBadge,m=r.NSpace,_=r.NEmpty,v=r.NTabPane,y=r.NTabs,T=r.NButton;return(0,n.openBlock)(),(0,n.createElementBlock)(`div`,i,[(0,n.createCommentVNode)(` 无标签配置时的单一面板模式 `),x.value?((0,n.openBlock)(),(0,n.createElementBlock)(n.Fragment,{key:1},[(0,n.createCommentVNode)(` 有标签配置时的分标签模式 `),(0,n.createElementVNode)(`div`,o,[(0,n.createVNode)(y,{value:h.value,type:b.value.type,size:b.value.size,placement:b.value.placement,animated:b.value.animated,closable:b.value.closable,addable:b.value.addable,class:`form-tabs`,"onUpdate:value":A,onClose:j,onAdd:M},{default:(0,n.withCtx)(()=>[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(S.value,t=>((0,n.openBlock)(),(0,n.createBlock)(v,{key:t.config.key,name:t.config.key,tab:t.config.title,disabled:t.config.disabled||g.value,closable:t.config.closable,"display-directive":`show`},{tab:(0,n.withCtx)(()=>[(0,n.createVNode)(m,{align:`center`,size:8},{default:(0,n.withCtx)(()=>[t.config.icon?((0,n.openBlock)(),(0,n.createBlock)(e.t,{key:0,name:t.config.icon,size:16,class:`tab-icon`},null,8,[`name`])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`span`,null,(0,n.toDisplayString)(t.config.title),1),b.value.showCount?((0,n.openBlock)(),(0,n.createBlock)(p,{key:1,value:t.items.length,max:99,show:t.items.length>0,type:`info`},null,8,[`value`,`show`])):(0,n.createCommentVNode)(`v-if`,!0)]),_:2},1024)]),default:(0,n.withCtx)(()=>[b.value.showTabHeader&&t.config.description?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,s,[(0,n.createElementVNode)(`p`,c,(0,n.toDisplayString)(t.config.description),1)])):(0,n.createCommentVNode)(`v-if`,!0),(0,n.createElementVNode)(`div`,l,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.items,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:C(e,t)}))),128))]),t.items.length===0?((0,n.openBlock)(),(0,n.createBlock)(_,{key:1,description:`暂无表单项`,class:`tab-empty`})):(0,n.createCommentVNode)(`v-if`,!0)]),_:2},1032,[`name`,`tab`,`disabled`,`closable`]))),128))]),_:1},8,[`value`,`type`,`size`,`placement`,`animated`,`closable`,`addable`]),(0,n.createCommentVNode)(` 标签页操作按钮 `),b.value.showActions?((0,n.openBlock)(),(0,n.createElementBlock)(`div`,u,[(0,n.createVNode)(m,{justify:`space-between`},{default:(0,n.withCtx)(()=>[(0,n.createVNode)(m,null,{default:(0,n.withCtx)(()=>[b.value.validateBeforeSwitch?((0,n.openBlock)(),(0,n.createBlock)(T,{key:0,type:`primary`,size:t.controlSize??`small`,onClick:w},{default:(0,n.withCtx)(()=>[(0,n.createVNode)(e.t,{name:`carbon:star-check`,size:14,style:{"margin-right":`4px`}}),f[0]||=(0,n.createTextVNode)(` 验证当前标签 `,-1)]),_:1},8,[`size`])):(0,n.createCommentVNode)(`v-if`,!0)]),_:1}),(0,n.createVNode)(m,null,{default:(0,n.withCtx)(()=>[(0,n.renderSlot)(d.$slots,`tab-actions`,{currentTab:h.value,totalTabs:S.value.length,validateTab:w,switchToTab:k},void 0,!0)]),_:3})]),_:3})])):(0,n.createCommentVNode)(`v-if`,!0)])],2112)):((0,n.openBlock)(),(0,n.createElementBlock)(`div`,a,[((0,n.openBlock)(!0),(0,n.createElementBlock)(n.Fragment,null,(0,n.renderList)(t.formItems,(e,t)=>((0,n.openBlock)(),(0,n.createBlock)((0,n.resolveDynamicComponent)(e),{key:C(e,t)}))),128))]))])}}});var f=t.t(d,[[`__scopeId`,`data-v-a597a3d1`]]);exports.default=f;
package/dist/Tabs.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,nextTick as d,onMounted as f,onScopeDispose as p,openBlock as m,reactive as h,readonly as g,ref as _,renderList as v,renderSlot as y,resolveComponent as b,resolveDynamicComponent as x,toDisplayString as S,watch as C,withCtx as w}from"vue";import{NBadge as T,NButton as E,NEmpty as D,NSpace as O,NTabPane as k,NTabs as A}from"naive-ui";const j={class:`c-form-tabs`},M={key:0,class:`single-panel`},N={class:`tabs-container`},P={key:0,class:`tab-header`},ee={class:`tab-description`},F={class:`tab-form-items`},I={key:0,class:`tabs-actions`};var L=t(u({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeTabChange:{},validateTab:{}},emits:[`tab-change`,`tab-before-change`,`tab-validate`,`tab-close`,`tab-add`],setup(t,{expose:u,emit:b}){let L=t,R=b,z=_(``),B=_(!1),V=!1,H=h({}),U=()=>({tabs:[],type:`line`,size:`medium`,placement:`top`,animated:!0,closable:!1,addable:!1,showTabHeader:!0,showActions:!1,showCount:!1,validateBeforeSwitch:!1,defaultTab:``}),W=r(()=>{let e=U(),t=L.layoutConfig?.tabs||{};return{...e,...t}}),G=r(()=>W.value.tabs.length>0),K=r(()=>{if(!G.value)return[];let e=new Map;return W.value.tabs.forEach(t=>{e.set(t.key,[])}),L.formItems.forEach((t,n)=>{let r=(L.options?.[n])?.layout?.tab||W.value.tabs[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),W.value.tabs.map(t=>({config:t,items:e.get(t.key)||[]}))}),q=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?String(n.path):`tab-item-${t}`},J=async()=>{if(!z.value)return!0;try{let e=L.validateTab?await L.validateTab(z.value):!0;return R(`tab-validate`,z.value),H[z.value]=e,e}catch{return H[z.value]=!1,!1}},Y=async e=>{if(V||B.value)return!1;if(!e||e===z.value)return!0;let t=K.value.find(t=>t.config.key===e);if(!t||t.config.disabled)return!1;let n=z.value;try{if(B.value=!0,W.value.validateBeforeSwitch&&z.value&&!await J()||V||z.value!==n)return!1;if(z.value){if(await L.beforeTabChange?.(z.value,e)===!1||V||z.value!==n)return!1;R(`tab-before-change`,z.value,e)}return K.value.some(t=>t.config.key===e&&!t.config.disabled)?(z.value=e,R(`tab-change`,e,K.value.findIndex(t=>t.config.key===e)),!0):!1}catch{return!1}finally{B.value=!1}},X=e=>{Y(e)},Z=e=>{R(`tab-close`,e)},Q=()=>{R(`tab-add`)},$=()=>{if(!G.value||K.value.length===0){z.value=``;return}let{defaultTab:e}=W.value,t=K.value.find(t=>t.config.key===e&&!t.config.disabled)?.config.key||K.value.find(e=>!e.config.disabled)?.config.key;t&&t!==z.value&&(z.value=t,d(()=>{let e=K.value.findIndex(e=>e.config.key===t);e>=0&&R(`tab-change`,t,e)}))};return f(()=>{$()}),p(()=>{V=!0}),C(r(()=>W.value.tabs.map(e=>e.key).join(`,`)),()=>{W.value.tabs.some(e=>e.key===z.value)||$()}),C(()=>W.value.defaultTab,e=>{e&&e!==z.value&&Y(e)}),u({switchToTab:Y,validateCurrentTab:J,currentTab:g(z),totalTabs:r(()=>K.value.length),tabsWithItems:g(K)}),(r,u)=>{let d=T,f=O,p=D,h=k,g=A,_=E;return m(),o(`div`,j,[a(` 无标签配置时的单一面板模式 `),G.value?(m(),o(n,{key:1},[a(` 有标签配置时的分标签模式 `),s(`div`,N,[l(g,{value:z.value,type:W.value.type,size:W.value.size,placement:W.value.placement,animated:W.value.animated,closable:W.value.closable,addable:W.value.addable,class:`form-tabs`,"onUpdate:value":X,onClose:Z,onAdd:Q},{default:w(()=>[(m(!0),o(n,null,v(K.value,t=>(m(),i(h,{key:t.config.key,name:t.config.key,tab:t.config.title,disabled:t.config.disabled||B.value,closable:t.config.closable,"display-directive":`show`},{tab:w(()=>[l(f,{align:`center`,size:8},{default:w(()=>[t.config.icon?(m(),i(e,{key:0,name:t.config.icon,size:16,class:`tab-icon`},null,8,[`name`])):a(`v-if`,!0),s(`span`,null,S(t.config.title),1),W.value.showCount?(m(),i(d,{key:1,value:t.items.length,max:99,show:t.items.length>0,type:`info`},null,8,[`value`,`show`])):a(`v-if`,!0)]),_:2},1024)]),default:w(()=>[W.value.showTabHeader&&t.config.description?(m(),o(`div`,P,[s(`p`,ee,S(t.config.description),1)])):a(`v-if`,!0),s(`div`,F,[(m(!0),o(n,null,v(t.items,(e,t)=>(m(),i(x(e),{key:q(e,t)}))),128))]),t.items.length===0?(m(),i(p,{key:1,description:`暂无表单项`,class:`tab-empty`})):a(`v-if`,!0)]),_:2},1032,[`name`,`tab`,`disabled`,`closable`]))),128))]),_:1},8,[`value`,`type`,`size`,`placement`,`animated`,`closable`,`addable`]),a(` 标签页操作按钮 `),W.value.showActions?(m(),o(`div`,I,[l(f,{justify:`space-between`},{default:w(()=>[l(f,null,{default:w(()=>[W.value.validateBeforeSwitch?(m(),i(_,{key:0,type:`primary`,size:t.controlSize??`small`,onClick:J},{default:w(()=>[l(e,{name:`carbon:star-check`,size:14,style:{"margin-right":`4px`}}),u[0]||=c(` 验证当前标签 `,-1)]),_:1},8,[`size`])):a(`v-if`,!0)]),_:1}),l(f,null,{default:w(()=>[y(r.$slots,`tab-actions`,{currentTab:z.value,totalTabs:K.value.length,validateTab:J,switchToTab:Y},void 0,!0)]),_:3})]),_:3})])):a(`v-if`,!0)])],2112)):(m(),o(`div`,M,[(m(!0),o(n,null,v(t.formItems,(e,t)=>(m(),i(x(e),{key:q(e,t)}))),128))]))])}}}),[[`__scopeId`,`data-v-d2ed671c`]]);export{L as default};
1
+ import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,nextTick as d,onMounted as f,onScopeDispose as p,openBlock as m,reactive as h,readonly as g,ref as _,renderList as v,renderSlot as y,resolveComponent as b,resolveDynamicComponent as x,toDisplayString as S,watch as C,withCtx as w}from"vue";import{NBadge as T,NButton as E,NEmpty as ee,NSpace as D,NTabPane as O,NTabs as k}from"naive-ui";const A={class:`c-form-tabs`},j={key:0,class:`single-panel`},M={class:`tabs-container`},N={key:0,class:`tab-header`},P={class:`tab-description`},F={class:`tab-form-items`},I={key:0,class:`tabs-actions`};var L=t(u({__name:`index`,props:{controlSize:{},formItems:{},layoutConfig:{default:()=>({})},options:{default:()=>[]},beforeTabChange:{},validateTab:{}},emits:[`tab-change`,`tab-before-change`,`tab-validate`,`tab-close`,`tab-add`],setup(t,{expose:u,emit:b}){let L=t,R=b,z=_(``),B=_(!1),V=!1,H=h({}),U=()=>({tabs:[],type:`line`,size:`medium`,placement:`top`,animated:!0,closable:!1,addable:!1,showTabHeader:!0,showActions:!1,showCount:!1,validateBeforeSwitch:!1,defaultTab:``}),W=r(()=>{let e=U(),t=L.layoutConfig?.tabs||{};return{...e,...t}}),G=r(()=>W.value.tabs.length>0),K=r(()=>{if(!G.value)return[];let e=new Map;return W.value.tabs.forEach(t=>{e.set(t.key,[])}),L.formItems.forEach((t,n)=>{let r=(L.options?.[n])?.layout?.tab||W.value.tabs[0]?.key||`default`;e.has(r)||e.set(r,[]),e.get(r).push(t)}),W.value.tabs.map(t=>({config:t,items:e.get(t.key)||[]}))}),q=(e,t)=>{if(e.key!=null)return String(e.key);let n=e.props;return n?.path?String(n.path):`tab-item-${t}`},J=async()=>{if(!z.value)return!0;try{let e=L.validateTab?await L.validateTab(z.value):!0;return R(`tab-validate`,z.value),H[z.value]=e,e}catch{return H[z.value]=!1,!1}},Y=e=>K.value.find(t=>t.config.key===e&&!t.config.disabled),X=(e,t)=>!V&&z.value===e&&t(),Z=(e,t,n)=>X(e,n)&&!!Y(t),te=async(e,t,n)=>{if(W.value.validateBeforeSwitch&&e&&!await J()||!X(e,n))return!1;if(e){if(await L.beforeTabChange?.(e,t)===!1||!X(e,n))return!1;R(`tab-before-change`,e,t)}return!0},Q=async(e,t=()=>!0)=>{let n=z.value;if(B.value||!X(n,t))return!1;if(!e||e===z.value)return!0;if(!Y(e))return!1;try{return B.value=!0,!await te(n,e,t)||!Z(n,e,t)?!1:(z.value=e,R(`tab-change`,e,K.value.findIndex(t=>t.config.key===e)),!0)}catch{return!1}finally{B.value=!1}},ne=e=>{Q(e)},re=e=>{R(`tab-close`,e)},ie=()=>{R(`tab-add`)},$=()=>{if(!G.value||K.value.length===0){z.value=``;return}let{defaultTab:e}=W.value,t=K.value.find(t=>t.config.key===e&&!t.config.disabled)?.config.key||K.value.find(e=>!e.config.disabled)?.config.key;t&&t!==z.value&&(z.value=t,d(()=>{let e=K.value.findIndex(e=>e.config.key===t);e>=0&&R(`tab-change`,t,e)}))};return f(()=>{$()}),p(()=>{V=!0}),C(r(()=>W.value.tabs.map(e=>e.key).join(`,`)),()=>{W.value.tabs.some(e=>e.key===z.value)||$()}),C(()=>W.value.defaultTab,e=>{e&&e!==z.value&&Q(e)}),u({revealField:async(e,t=()=>!0)=>{if(!G.value)return t();let n=L.options.find(t=>t.prop===e)?.layout?.tab||W.value.tabs[0]?.key,r=K.value.find(e=>e.config.key===n);return!r||r.config.disabled?!1:Q(r.config.key,t)},switchToTab:Q,validateCurrentTab:J,currentTab:g(z),totalTabs:r(()=>K.value.length),tabsWithItems:g(K)}),(r,u)=>{let d=T,f=D,p=ee,h=O,g=k,_=E;return m(),o(`div`,A,[a(` 无标签配置时的单一面板模式 `),G.value?(m(),o(n,{key:1},[a(` 有标签配置时的分标签模式 `),s(`div`,M,[l(g,{value:z.value,type:W.value.type,size:W.value.size,placement:W.value.placement,animated:W.value.animated,closable:W.value.closable,addable:W.value.addable,class:`form-tabs`,"onUpdate:value":ne,onClose:re,onAdd:ie},{default:w(()=>[(m(!0),o(n,null,v(K.value,t=>(m(),i(h,{key:t.config.key,name:t.config.key,tab:t.config.title,disabled:t.config.disabled||B.value,closable:t.config.closable,"display-directive":`show`},{tab:w(()=>[l(f,{align:`center`,size:8},{default:w(()=>[t.config.icon?(m(),i(e,{key:0,name:t.config.icon,size:16,class:`tab-icon`},null,8,[`name`])):a(`v-if`,!0),s(`span`,null,S(t.config.title),1),W.value.showCount?(m(),i(d,{key:1,value:t.items.length,max:99,show:t.items.length>0,type:`info`},null,8,[`value`,`show`])):a(`v-if`,!0)]),_:2},1024)]),default:w(()=>[W.value.showTabHeader&&t.config.description?(m(),o(`div`,N,[s(`p`,P,S(t.config.description),1)])):a(`v-if`,!0),s(`div`,F,[(m(!0),o(n,null,v(t.items,(e,t)=>(m(),i(x(e),{key:q(e,t)}))),128))]),t.items.length===0?(m(),i(p,{key:1,description:`暂无表单项`,class:`tab-empty`})):a(`v-if`,!0)]),_:2},1032,[`name`,`tab`,`disabled`,`closable`]))),128))]),_:1},8,[`value`,`type`,`size`,`placement`,`animated`,`closable`,`addable`]),a(` 标签页操作按钮 `),W.value.showActions?(m(),o(`div`,I,[l(f,{justify:`space-between`},{default:w(()=>[l(f,null,{default:w(()=>[W.value.validateBeforeSwitch?(m(),i(_,{key:0,type:`primary`,size:t.controlSize??`small`,onClick:J},{default:w(()=>[l(e,{name:`carbon:star-check`,size:14,style:{"margin-right":`4px`}}),u[0]||=c(` 验证当前标签 `,-1)]),_:1},8,[`size`])):a(`v-if`,!0)]),_:1}),l(f,null,{default:w(()=>[y(r.$slots,`tab-actions`,{currentTab:z.value,totalTabs:K.value.length,validateTab:J,switchToTab:Q},void 0,!0)]),_:3})]),_:3})])):a(`v-if`,!0)])],2112)):(m(),o(`div`,j,[(m(!0),o(n,null,v(t.formItems,(e,t)=>(m(),i(x(e),{key:q(e,t)}))),128))]))])}}}),[[`__scopeId`,`data-v-a597a3d1`]]);export{L as default};
@@ -0,0 +1 @@
1
+ const e=new Set([`__proto__`,`constructor`,`prototype`]);function t(t){let n={},r=new Set;for(let i of t){if(e.has(i.field)||r.has(i.field))throw TypeError(`批改字段必须安全且唯一:${i.field}`);if(r.add(i.field),i.operation===`keep`)continue;let t=i.operation===`clear`?null:i.value;if(t!==null&&![`string`,`number`,`boolean`].includes(typeof t))throw TypeError(`批改只支持显式标量值`);if(typeof t==`number`&&!Number.isFinite(t))throw TypeError(`批改数值必须有限`);Object.defineProperty(n,i.field,{value:t,enumerable:!0,configurable:!0,writable:!0})}return n}function n(e){return[...new Map(e.map(e=>[e.key,e])).values()].filter(e=>e.retryable&&(e.status===`failure`||e.status===`conflict`)).map(e=>e.key)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t}});
@@ -0,0 +1,26 @@
1
+ //#region src/core/batchPatch.d.ts
2
+ /** 批改只表达显式标量变更,预览和后端事务由使用方组合。 */
3
+ type PatchScalar = string | number | boolean | null;
4
+ type BatchFieldChange<T extends object> = { [K in Extract<keyof T, string>]: NonNullable<T[K]> extends Exclude<PatchScalar, null> ? {
5
+ field: K;
6
+ operation: 'keep';
7
+ } | {
8
+ field: K;
9
+ operation: 'set';
10
+ value: Exclude<T[K], undefined>;
11
+ } | (null extends T[K] ? {
12
+ field: K;
13
+ operation: 'clear';
14
+ } : never) : never }[Extract<keyof T, string>];
15
+ /** keep 不发送,clear 发送 null,set 保留 0/false/空串;不会修改原记录。 */
16
+ declare function createBatchPatch<T extends object>(changes: readonly BatchFieldChange<T>[]): Partial<T>;
17
+ interface BatchOperationResult<K extends string | number = string | number> {
18
+ key: K;
19
+ status: 'success' | 'failure' | 'conflict' | 'skipped';
20
+ message?: string;
21
+ retryable?: boolean;
22
+ }
23
+ /** 失败重试仅包含后端明确允许的行,不把成功行再次提交。 */
24
+ declare function getRetryableKeys<K extends string | number>(results: readonly BatchOperationResult<K>[]): K[];
25
+ //#endregion
26
+ export { getRetryableKeys as a, createBatchPatch as i, BatchOperationResult as n, PatchScalar as r, BatchFieldChange as t };
@@ -0,0 +1,26 @@
1
+ //#region src/core/batchPatch.d.ts
2
+ /** 批改只表达显式标量变更,预览和后端事务由使用方组合。 */
3
+ type PatchScalar = string | number | boolean | null;
4
+ type BatchFieldChange<T extends object> = { [K in Extract<keyof T, string>]: NonNullable<T[K]> extends Exclude<PatchScalar, null> ? {
5
+ field: K;
6
+ operation: 'keep';
7
+ } | {
8
+ field: K;
9
+ operation: 'set';
10
+ value: Exclude<T[K], undefined>;
11
+ } | (null extends T[K] ? {
12
+ field: K;
13
+ operation: 'clear';
14
+ } : never) : never }[Extract<keyof T, string>];
15
+ /** keep 不发送,clear 发送 null,set 保留 0/false/空串;不会修改原记录。 */
16
+ declare function createBatchPatch<T extends object>(changes: readonly BatchFieldChange<T>[]): Partial<T>;
17
+ interface BatchOperationResult<K extends string | number = string | number> {
18
+ key: K;
19
+ status: 'success' | 'failure' | 'conflict' | 'skipped';
20
+ message?: string;
21
+ retryable?: boolean;
22
+ }
23
+ /** 失败重试仅包含后端明确允许的行,不把成功行再次提交。 */
24
+ declare function getRetryableKeys<K extends string | number>(results: readonly BatchOperationResult<K>[]): K[];
25
+ //#endregion
26
+ export { getRetryableKeys as a, createBatchPatch as i, BatchOperationResult as n, PatchScalar as r, BatchFieldChange as t };
@@ -0,0 +1 @@
1
+ const e=new Set([`__proto__`,`constructor`,`prototype`]);function t(t){let n={},r=new Set;for(let i of t){if(e.has(i.field)||r.has(i.field))throw TypeError(`批改字段必须安全且唯一:${i.field}`);if(r.add(i.field),i.operation===`keep`)continue;let t=i.operation===`clear`?null:i.value;if(t!==null&&![`string`,`number`,`boolean`].includes(typeof t))throw TypeError(`批改只支持显式标量值`);if(typeof t==`number`&&!Number.isFinite(t))throw TypeError(`批改数值必须有限`);Object.defineProperty(n,i.field,{value:t,enumerable:!0,configurable:!0,writable:!0})}return n}function n(e){return[...new Map(e.map(e=>[e.key,e])).values()].filter(e=>e.retryable&&(e.status===`failure`||e.status===`conflict`)).map(e=>e.key)}export{n,t};
package/dist/config.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=Symbol(`robot-component-feedback`),t=Symbol(`robot-component-locale`),n=Symbol(`c-form-global-config`);exports.COMPONENT_FEEDBACK_KEY=e,exports.COMPONENT_LOCALE_KEY=t,exports.FORM_GLOBAL_CONFIG_KEY=n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./dictionary.cjs`),t=Symbol(`robot-dictionary-provider`),n=Symbol(`robot-component-feedback`),r=Symbol(`robot-component-locale`),i=Symbol(`c-form-global-config`);exports.COMPONENT_FEEDBACK_KEY=n,exports.COMPONENT_LOCALE_KEY=r,exports.DICTIONARY_PROVIDER_KEY=t,exports.FORM_GLOBAL_CONFIG_KEY=i,exports.createDictionaryLabelResolver=e.t,exports.getDictionaryLabel=e.i,exports.parseDictionaryValue=e.a;
package/dist/config.d.cts CHANGED
@@ -1,11 +1,14 @@
1
1
  import { i as ConfirmOptions, n as ComponentLocale, r as ComponentLocaleName, t as ComponentFeedback } from "./contracts.cjs";
2
2
  import { n as FormConfig } from "./useFormConfig.cjs";
3
+ import { a as DictionarySource, c as getDictionaryLabel, i as DictionaryProvider, l as parseDictionaryValue, n as DictionaryOption, o as DictionaryValue, r as DictionaryParseResult, s as createDictionaryLabelResolver, t as DictionaryBinding } from "./dictionary.cjs";
3
4
  import { InjectionKey } from "vue";
4
5
 
5
6
  //#region src/context.d.ts
7
+ /** 应用作用域字典源;与表单/搜索/表格共享,不引入数据缓存或固定后端。 */
8
+ declare const DICTIONARY_PROVIDER_KEY: InjectionKey<DictionaryProvider>;
6
9
  declare const COMPONENT_FEEDBACK_KEY: InjectionKey<ComponentFeedback>;
7
10
  declare const COMPONENT_LOCALE_KEY: InjectionKey<ComponentLocale>;
8
11
  /** 按需接入与全量安装共享同一个表单默认配置,不引入表单渲染依赖。 */
9
12
  declare const FORM_GLOBAL_CONFIG_KEY: InjectionKey<FormConfig>;
10
13
  //#endregion
11
- export { COMPONENT_FEEDBACK_KEY, COMPONENT_LOCALE_KEY, type ComponentFeedback, type ComponentLocale, type ComponentLocaleName, type ConfirmOptions, FORM_GLOBAL_CONFIG_KEY, type FormConfig };
14
+ export { COMPONENT_FEEDBACK_KEY, COMPONENT_LOCALE_KEY, type ComponentFeedback, type ComponentLocale, type ComponentLocaleName, type ConfirmOptions, DICTIONARY_PROVIDER_KEY, type DictionaryBinding, type DictionaryOption, type DictionaryParseResult, type DictionaryProvider, type DictionarySource, type DictionaryValue, FORM_GLOBAL_CONFIG_KEY, type FormConfig, createDictionaryLabelResolver, getDictionaryLabel, parseDictionaryValue };
package/dist/config.d.ts CHANGED
@@ -1,10 +1,14 @@
1
- import { Q as ConfirmOptions, X as ComponentLocale, Y as ComponentFeedback, Z as ComponentLocaleName, n as FormConfig } from "./useFormConfig.js";
1
+ import { i as ConfirmOptions, n as ComponentLocale, r as ComponentLocaleName, t as ComponentFeedback } from "./contracts.js";
2
+ import { n as FormConfig } from "./useFormConfig.js";
3
+ import { a as DictionarySource, c as getDictionaryLabel, i as DictionaryProvider, l as parseDictionaryValue, n as DictionaryOption, o as DictionaryValue, r as DictionaryParseResult, s as createDictionaryLabelResolver, t as DictionaryBinding } from "./dictionary.js";
2
4
  import { InjectionKey } from "vue";
3
5
 
4
6
  //#region src/context.d.ts
7
+ /** 应用作用域字典源;与表单/搜索/表格共享,不引入数据缓存或固定后端。 */
8
+ declare const DICTIONARY_PROVIDER_KEY: InjectionKey<DictionaryProvider>;
5
9
  declare const COMPONENT_FEEDBACK_KEY: InjectionKey<ComponentFeedback>;
6
10
  declare const COMPONENT_LOCALE_KEY: InjectionKey<ComponentLocale>;
7
11
  /** 按需接入与全量安装共享同一个表单默认配置,不引入表单渲染依赖。 */
8
12
  declare const FORM_GLOBAL_CONFIG_KEY: InjectionKey<FormConfig>;
9
13
  //#endregion
10
- export { COMPONENT_FEEDBACK_KEY, COMPONENT_LOCALE_KEY, type ComponentFeedback, type ComponentLocale, type ComponentLocaleName, type ConfirmOptions, FORM_GLOBAL_CONFIG_KEY, type FormConfig };
14
+ export { COMPONENT_FEEDBACK_KEY, COMPONENT_LOCALE_KEY, type ComponentFeedback, type ComponentLocale, type ComponentLocaleName, type ConfirmOptions, DICTIONARY_PROVIDER_KEY, type DictionaryBinding, type DictionaryOption, type DictionaryParseResult, type DictionaryProvider, type DictionarySource, type DictionaryValue, FORM_GLOBAL_CONFIG_KEY, type FormConfig, createDictionaryLabelResolver, getDictionaryLabel, parseDictionaryValue };
package/dist/config.js CHANGED
@@ -1 +1 @@
1
- const e=Symbol(`robot-component-feedback`),t=Symbol(`robot-component-locale`),n=Symbol(`c-form-global-config`);export{e as COMPONENT_FEEDBACK_KEY,t as COMPONENT_LOCALE_KEY,n as FORM_GLOBAL_CONFIG_KEY};
1
+ import{a as e,i as t,t as n}from"./dictionary.js";const r=Symbol(`robot-dictionary-provider`),i=Symbol(`robot-component-feedback`),a=Symbol(`robot-component-locale`),o=Symbol(`c-form-global-config`);export{i as COMPONENT_FEEDBACK_KEY,a as COMPONENT_LOCALE_KEY,r as DICTIONARY_PROVIDER_KEY,o as FORM_GLOBAL_CONFIG_KEY,n as createDictionaryLabelResolver,t as getDictionaryLabel,e as parseDictionaryValue};
package/dist/config2.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { X as ComponentLocale, Y as ComponentFeedback } from "./useFormConfig.js";
1
+ import { n as ComponentLocale, t as ComponentFeedback } from "./contracts.js";
2
2
  import { MaybeRefOrGetter } from "vue";
3
3
 
4
4
  //#region src/composables/useComponentLocale.d.ts
@@ -117,8 +117,8 @@ declare const __VLS_export: vue.DefineComponent<CronProps, CronExpose, {}, {}, {
117
117
  "onValidation-change"?: ((result: CronValidation) => any) | undefined;
118
118
  }>, {
119
119
  disabled: boolean;
120
- showTemplates: boolean;
121
120
  showPreview: boolean;
121
+ showTemplates: boolean;
122
122
  showSecond: boolean;
123
123
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
124
124
  declare const _default: typeof __VLS_export;
@@ -117,8 +117,8 @@ declare const __VLS_export: vue.DefineComponent<CronProps, CronExpose, {}, {}, {
117
117
  "onValidation-change"?: ((result: CronValidation) => any) | undefined;
118
118
  }>, {
119
119
  disabled: boolean;
120
- showTemplates: boolean;
121
120
  showPreview: boolean;
121
+ showTemplates: boolean;
122
122
  showSecond: boolean;
123
123
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
124
124
  declare const _default: typeof __VLS_export;