@robot-admin/naive-ui-components 0.3.0

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 (352) hide show
  1. package/README.md +257 -0
  2. package/dist/C_ActionBar-DWN-woTc.css.map +1 -0
  3. package/dist/C_ActionBar.cjs +5 -0
  4. package/dist/C_ActionBar.d.cts +2 -0
  5. package/dist/C_ActionBar.d.ts +2 -0
  6. package/dist/C_ActionBar.js +4 -0
  7. package/dist/C_ActionBar2.js +196 -0
  8. package/dist/C_ActionBar2.js.map +1 -0
  9. package/dist/C_AntV-AFKyK6hH.css.map +1 -0
  10. package/dist/C_AntV.cjs +8 -0
  11. package/dist/C_AntV.d.cts +2 -0
  12. package/dist/C_AntV.d.ts +2 -0
  13. package/dist/C_AntV.js +4 -0
  14. package/dist/C_AntV2.js +3150 -0
  15. package/dist/C_AntV2.js.map +1 -0
  16. package/dist/C_Barcode-P_EFj8dC.css.map +1 -0
  17. package/dist/C_Barcode.cjs +4 -0
  18. package/dist/C_Barcode.d.cts +2 -0
  19. package/dist/C_Barcode.d.ts +2 -0
  20. package/dist/C_Barcode.js +3 -0
  21. package/dist/C_Barcode2.js +68 -0
  22. package/dist/C_Barcode2.js.map +1 -0
  23. package/dist/C_Captcha-C-ef41xw.css.map +1 -0
  24. package/dist/C_Captcha.cjs +4 -0
  25. package/dist/C_Captcha.d.cts +2 -0
  26. package/dist/C_Captcha.d.ts +2 -0
  27. package/dist/C_Captcha.js +3 -0
  28. package/dist/C_Captcha2.js +155 -0
  29. package/dist/C_Captcha2.js.map +1 -0
  30. package/dist/C_Cascade-D9kNsjsV.css.map +1 -0
  31. package/dist/C_Cascade.cjs +4 -0
  32. package/dist/C_Cascade.d.cts +2 -0
  33. package/dist/C_Cascade.d.ts +2 -0
  34. package/dist/C_Cascade.js +3 -0
  35. package/dist/C_Cascade2.js +103 -0
  36. package/dist/C_Cascade2.js.map +1 -0
  37. package/dist/C_City-BCQ4ipiK.css.map +1 -0
  38. package/dist/C_City.cjs +4 -0
  39. package/dist/C_City.d.cts +2 -0
  40. package/dist/C_City.d.ts +2 -0
  41. package/dist/C_City.js +3 -0
  42. package/dist/C_City2.js +841 -0
  43. package/dist/C_City2.js.map +1 -0
  44. package/dist/C_Code-C9kvvEmO.css.map +1 -0
  45. package/dist/C_Code.cjs +5 -0
  46. package/dist/C_Code.d.cts +2 -0
  47. package/dist/C_Code.d.ts +2 -0
  48. package/dist/C_Code.js +4 -0
  49. package/dist/C_Code2.js +346 -0
  50. package/dist/C_Code2.js.map +1 -0
  51. package/dist/C_CollapsePanel-BUJHuYcU.css.map +1 -0
  52. package/dist/C_CollapsePanel.cjs +6 -0
  53. package/dist/C_CollapsePanel.d.cts +2 -0
  54. package/dist/C_CollapsePanel.d.ts +2 -0
  55. package/dist/C_CollapsePanel.js +4 -0
  56. package/dist/C_CollapsePanel2.js +319 -0
  57. package/dist/C_CollapsePanel2.js.map +1 -0
  58. package/dist/C_Cron-yx2Ob4Jl.css.map +1 -0
  59. package/dist/C_Cron.cjs +15 -0
  60. package/dist/C_Cron.d.cts +2 -0
  61. package/dist/C_Cron.d.ts +2 -0
  62. package/dist/C_Cron.js +4 -0
  63. package/dist/C_Cron2.js +1209 -0
  64. package/dist/C_Cron2.js.map +1 -0
  65. package/dist/C_Date.cjs +4 -0
  66. package/dist/C_Date.d.cts +2 -0
  67. package/dist/C_Date.d.ts +2 -0
  68. package/dist/C_Date.js +3 -0
  69. package/dist/C_Date2.js +219 -0
  70. package/dist/C_Date2.js.map +1 -0
  71. package/dist/C_Draggable-C483syRC.css.map +1 -0
  72. package/dist/C_Draggable.cjs +5 -0
  73. package/dist/C_Draggable.d.cts +2 -0
  74. package/dist/C_Draggable.d.ts +2 -0
  75. package/dist/C_Draggable.js +3 -0
  76. package/dist/C_Draggable2.js +295 -0
  77. package/dist/C_Draggable2.js.map +1 -0
  78. package/dist/C_Editor-Bp0SyIEw.css.map +1 -0
  79. package/dist/C_Editor.cjs +4 -0
  80. package/dist/C_Editor.d.cts +2 -0
  81. package/dist/C_Editor.d.ts +2 -0
  82. package/dist/C_Editor.js +3 -0
  83. package/dist/C_Editor2.js +160 -0
  84. package/dist/C_Editor2.js.map +1 -0
  85. package/dist/C_FilePreview-CPqvhoCy.css.map +1 -0
  86. package/dist/C_FilePreview.cjs +6 -0
  87. package/dist/C_FilePreview.d.cts +2 -0
  88. package/dist/C_FilePreview.d.ts +2 -0
  89. package/dist/C_FilePreview.js +3 -0
  90. package/dist/C_FilePreview2.js +1031 -0
  91. package/dist/C_FilePreview2.js.map +1 -0
  92. package/dist/C_Form-Jx7PY3sT.css.map +1 -0
  93. package/dist/C_Form.cjs +15 -0
  94. package/dist/C_Form.d.cts +2 -0
  95. package/dist/C_Form.d.ts +2 -0
  96. package/dist/C_Form.js +4 -0
  97. package/dist/C_Form2.js +2510 -0
  98. package/dist/C_Form2.js.map +1 -0
  99. package/dist/C_FormSearch-DvRgxlRn.css.map +1 -0
  100. package/dist/C_FormSearch.cjs +6 -0
  101. package/dist/C_FormSearch.d.cts +2 -0
  102. package/dist/C_FormSearch.d.ts +2 -0
  103. package/dist/C_FormSearch.js +3 -0
  104. package/dist/C_FormSearch2.js +356 -0
  105. package/dist/C_FormSearch2.js.map +1 -0
  106. package/dist/C_FormulaEditor-DtGkt4T_.css.map +1 -0
  107. package/dist/C_FormulaEditor.cjs +13 -0
  108. package/dist/C_FormulaEditor.d.cts +2 -0
  109. package/dist/C_FormulaEditor.d.ts +2 -0
  110. package/dist/C_FormulaEditor.js +4 -0
  111. package/dist/C_FormulaEditor2.js +1433 -0
  112. package/dist/C_FormulaEditor2.js.map +1 -0
  113. package/dist/C_FullCalendar-BF7H0YIx.css.map +1 -0
  114. package/dist/C_FullCalendar.cjs +9 -0
  115. package/dist/C_FullCalendar.d.cts +2 -0
  116. package/dist/C_FullCalendar.d.ts +2 -0
  117. package/dist/C_FullCalendar.js +3 -0
  118. package/dist/C_FullCalendar2.js +377 -0
  119. package/dist/C_FullCalendar2.js.map +1 -0
  120. package/dist/C_Guide.cjs +4 -0
  121. package/dist/C_Guide.d.cts +2 -0
  122. package/dist/C_Guide.d.ts +2 -0
  123. package/dist/C_Guide.js +3 -0
  124. package/dist/C_Guide2.js +58 -0
  125. package/dist/C_Guide2.js.map +1 -0
  126. package/dist/C_Icon.cjs +4 -0
  127. package/dist/C_Icon.d.cts +2 -0
  128. package/dist/C_Icon.d.ts +2 -0
  129. package/dist/C_Icon.js +3 -0
  130. package/dist/C_Icon2.js +286 -0
  131. package/dist/C_Icon2.js.map +1 -0
  132. package/dist/C_ImageCropper-BVJfUufl.css.map +1 -0
  133. package/dist/C_ImageCropper.cjs +6 -0
  134. package/dist/C_ImageCropper.d.cts +2 -0
  135. package/dist/C_ImageCropper.d.ts +2 -0
  136. package/dist/C_ImageCropper.js +4 -0
  137. package/dist/C_ImageCropper2.js +723 -0
  138. package/dist/C_ImageCropper2.js.map +1 -0
  139. package/dist/C_Language.cjs +4 -0
  140. package/dist/C_Language.d.cts +2 -0
  141. package/dist/C_Language.d.ts +2 -0
  142. package/dist/C_Language.js +3 -0
  143. package/dist/C_Language2.js +72 -0
  144. package/dist/C_Language2.js.map +1 -0
  145. package/dist/C_Map-DpzeuWdX.css.map +1 -0
  146. package/dist/C_Map.cjs +7 -0
  147. package/dist/C_Map.d.cts +2 -0
  148. package/dist/C_Map.d.ts +2 -0
  149. package/dist/C_Map.js +3 -0
  150. package/dist/C_Map2.js +199 -0
  151. package/dist/C_Map2.js.map +1 -0
  152. package/dist/C_Markdown-BEjxknqd.css.map +1 -0
  153. package/dist/C_Markdown.cjs +4 -0
  154. package/dist/C_Markdown.d.cts +2 -0
  155. package/dist/C_Markdown.d.ts +2 -0
  156. package/dist/C_Markdown.js +3 -0
  157. package/dist/C_Markdown2.js +186 -0
  158. package/dist/C_Markdown2.js.map +1 -0
  159. package/dist/C_NotificationCenter-0l3TY2Gn.css.map +1 -0
  160. package/dist/C_NotificationCenter.cjs +20 -0
  161. package/dist/C_NotificationCenter.d.cts +2 -0
  162. package/dist/C_NotificationCenter.d.ts +2 -0
  163. package/dist/C_NotificationCenter.js +4 -0
  164. package/dist/C_NotificationCenter2.js +1383 -0
  165. package/dist/C_NotificationCenter2.js.map +1 -0
  166. package/dist/C_Progress.cjs +4 -0
  167. package/dist/C_Progress.d.cts +2 -0
  168. package/dist/C_Progress.d.ts +2 -0
  169. package/dist/C_Progress.js +3 -0
  170. package/dist/C_Progress2.js +103 -0
  171. package/dist/C_Progress2.js.map +1 -0
  172. package/dist/C_QRCode-DbdiAIPg.css.map +1 -0
  173. package/dist/C_QRCode.cjs +5 -0
  174. package/dist/C_QRCode.d.cts +2 -0
  175. package/dist/C_QRCode.d.ts +2 -0
  176. package/dist/C_QRCode.js +3 -0
  177. package/dist/C_QRCode2.js +218 -0
  178. package/dist/C_QRCode2.js.map +1 -0
  179. package/dist/C_Signature-zhHCbra9.css.map +1 -0
  180. package/dist/C_Signature.cjs +8 -0
  181. package/dist/C_Signature.d.cts +2 -0
  182. package/dist/C_Signature.d.ts +2 -0
  183. package/dist/C_Signature.js +4 -0
  184. package/dist/C_Signature2.js +618 -0
  185. package/dist/C_Signature2.js.map +1 -0
  186. package/dist/C_SplitPane-C6sBsfKY.css.map +1 -0
  187. package/dist/C_SplitPane.cjs +6 -0
  188. package/dist/C_SplitPane.d.cts +2 -0
  189. package/dist/C_SplitPane.d.ts +2 -0
  190. package/dist/C_SplitPane.js +4 -0
  191. package/dist/C_SplitPane2.js +356 -0
  192. package/dist/C_SplitPane2.js.map +1 -0
  193. package/dist/C_Steps-CODHN5Hs.css.map +1 -0
  194. package/dist/C_Steps.cjs +4 -0
  195. package/dist/C_Steps.d.cts +2 -0
  196. package/dist/C_Steps.d.ts +2 -0
  197. package/dist/C_Steps.js +3 -0
  198. package/dist/C_Steps2.js +82 -0
  199. package/dist/C_Steps2.js.map +1 -0
  200. package/dist/C_Table-DSNsntmT.css.map +1 -0
  201. package/dist/C_Table.cjs +19 -0
  202. package/dist/C_Table.d.cts +2 -0
  203. package/dist/C_Table.d.ts +2 -0
  204. package/dist/C_Table.js +5 -0
  205. package/dist/C_Table2.js +3009 -0
  206. package/dist/C_Table2.js.map +1 -0
  207. package/dist/C_Theme.cjs +4 -0
  208. package/dist/C_Theme.d.cts +2 -0
  209. package/dist/C_Theme.d.ts +2 -0
  210. package/dist/C_Theme.js +3 -0
  211. package/dist/C_Theme2.js +60 -0
  212. package/dist/C_Theme2.js.map +1 -0
  213. package/dist/C_Time-BvZLYraL.css.map +1 -0
  214. package/dist/C_Time.cjs +5 -0
  215. package/dist/C_Time.d.cts +2 -0
  216. package/dist/C_Time.d.ts +2 -0
  217. package/dist/C_Time.js +3 -0
  218. package/dist/C_Time2.js +199 -0
  219. package/dist/C_Time2.js.map +1 -0
  220. package/dist/C_Tree-0GDv--jX.css.map +1 -0
  221. package/dist/C_Tree.cjs +7 -0
  222. package/dist/C_Tree.d.cts +2 -0
  223. package/dist/C_Tree.d.ts +2 -0
  224. package/dist/C_Tree.js +4 -0
  225. package/dist/C_Tree2.js +441 -0
  226. package/dist/C_Tree2.js.map +1 -0
  227. package/dist/C_Upload-BXd3YYLx.css.map +1 -0
  228. package/dist/C_Upload.cjs +12 -0
  229. package/dist/C_Upload.d.cts +2 -0
  230. package/dist/C_Upload.d.ts +2 -0
  231. package/dist/C_Upload.js +4 -0
  232. package/dist/C_Upload2.js +1388 -0
  233. package/dist/C_Upload2.js.map +1 -0
  234. package/dist/C_VideoPlayer-DYG3RL0Q.css.map +1 -0
  235. package/dist/C_VideoPlayer.cjs +23 -0
  236. package/dist/C_VideoPlayer.d.cts +2 -0
  237. package/dist/C_VideoPlayer.d.ts +2 -0
  238. package/dist/C_VideoPlayer.js +3 -0
  239. package/dist/C_VideoPlayer2.js +1932 -0
  240. package/dist/C_VideoPlayer2.js.map +1 -0
  241. package/dist/C_VtableGantt-fhItIiHE.css.map +1 -0
  242. package/dist/C_VtableGantt.cjs +6 -0
  243. package/dist/C_VtableGantt.d.cts +2 -0
  244. package/dist/C_VtableGantt.d.ts +2 -0
  245. package/dist/C_VtableGantt.js +4 -0
  246. package/dist/C_VtableGantt2.js +873 -0
  247. package/dist/C_VtableGantt2.js.map +1 -0
  248. package/dist/C_WaterFall-8sQDFXKg.css.map +1 -0
  249. package/dist/C_WaterFall.cjs +13 -0
  250. package/dist/C_WaterFall.d.cts +2 -0
  251. package/dist/C_WaterFall.d.ts +2 -0
  252. package/dist/C_WaterFall.js +3 -0
  253. package/dist/C_WaterFall2.js +365 -0
  254. package/dist/C_WaterFall2.js.map +1 -0
  255. package/dist/C_WorkFlow-J-dyIuh9.css.map +1 -0
  256. package/dist/C_WorkFlow.cjs +8 -0
  257. package/dist/C_WorkFlow.d.cts +2 -0
  258. package/dist/C_WorkFlow.d.ts +2 -0
  259. package/dist/C_WorkFlow.js +4 -0
  260. package/dist/C_WorkFlow2.js +1984 -0
  261. package/dist/C_WorkFlow2.js.map +1 -0
  262. package/dist/chunk.js +22 -0
  263. package/dist/city.js +4817 -0
  264. package/dist/city.js.map +1 -0
  265. package/dist/constants.d.ts +273 -0
  266. package/dist/constants.d.ts.map +1 -0
  267. package/dist/constants2.d.ts +178 -0
  268. package/dist/constants2.d.ts.map +1 -0
  269. package/dist/constants3.d.ts +475 -0
  270. package/dist/constants3.d.ts.map +1 -0
  271. package/dist/constants4.d.ts +430 -0
  272. package/dist/constants4.d.ts.map +1 -0
  273. package/dist/constants5.d.ts +4283 -0
  274. package/dist/constants5.d.ts.map +1 -0
  275. package/dist/data.d.ts +67 -0
  276. package/dist/data.d.ts.map +1 -0
  277. package/dist/export-helper.js +9 -0
  278. package/dist/index.cjs +409 -0
  279. package/dist/index.d.cts +96 -0
  280. package/dist/index.d.cts.map +1 -0
  281. package/dist/index.d.ts +103 -0
  282. package/dist/index.d.ts.map +1 -0
  283. package/dist/index.js +230 -0
  284. package/dist/index.js.map +1 -0
  285. package/dist/index.vue.d.ts +80 -0
  286. package/dist/index.vue.d.ts.map +1 -0
  287. package/dist/index10.vue.d.ts +72 -0
  288. package/dist/index10.vue.d.ts.map +1 -0
  289. package/dist/index11.vue.d.ts +26 -0
  290. package/dist/index11.vue.d.ts.map +1 -0
  291. package/dist/index12.vue.d.ts +81 -0
  292. package/dist/index12.vue.d.ts.map +1 -0
  293. package/dist/index13.vue.d.ts +55 -0
  294. package/dist/index13.vue.d.ts.map +1 -0
  295. package/dist/index14.vue.d.ts +33 -0
  296. package/dist/index14.vue.d.ts.map +1 -0
  297. package/dist/index15.vue.d.ts +18 -0
  298. package/dist/index15.vue.d.ts.map +1 -0
  299. package/dist/index16.vue.d.ts +662 -0
  300. package/dist/index16.vue.d.ts.map +1 -0
  301. package/dist/index2.vue.d.ts +38 -0
  302. package/dist/index2.vue.d.ts.map +1 -0
  303. package/dist/index3.vue.d.ts +45 -0
  304. package/dist/index3.vue.d.ts.map +1 -0
  305. package/dist/index4.vue.d.ts +31 -0
  306. package/dist/index4.vue.d.ts.map +1 -0
  307. package/dist/index5.vue.d.ts +35 -0
  308. package/dist/index5.vue.d.ts.map +1 -0
  309. package/dist/index6.vue.d.ts +48 -0
  310. package/dist/index6.vue.d.ts.map +1 -0
  311. package/dist/index7.vue.d.ts +56 -0
  312. package/dist/index7.vue.d.ts.map +1 -0
  313. package/dist/index8.vue.d.ts +41 -0
  314. package/dist/index8.vue.d.ts.map +1 -0
  315. package/dist/index9.vue.d.ts +30 -0
  316. package/dist/index9.vue.d.ts.map +1 -0
  317. package/dist/storage.js +31 -0
  318. package/dist/storage.js.map +1 -0
  319. package/dist/style.css +7725 -0
  320. package/dist/useCalendarEvents.d.ts +148 -0
  321. package/dist/useCalendarEvents.d.ts.map +1 -0
  322. package/dist/useCollapsePanel.d.ts +132 -0
  323. package/dist/useCollapsePanel.d.ts.map +1 -0
  324. package/dist/useCropperCore.d.ts +102 -0
  325. package/dist/useCropperCore.d.ts.map +1 -0
  326. package/dist/useDraggableLayout.d.ts +194 -0
  327. package/dist/useDraggableLayout.d.ts.map +1 -0
  328. package/dist/useDynamicFormState.d.ts +4248 -0
  329. package/dist/useDynamicFormState.d.ts.map +1 -0
  330. package/dist/useEdgeInteraction.d.ts +7614 -0
  331. package/dist/useEdgeInteraction.d.ts.map +1 -0
  332. package/dist/useFullscreen.d.ts +166 -0
  333. package/dist/useFullscreen.d.ts.map +1 -0
  334. package/dist/useInfiniteScroll.d.ts +169 -0
  335. package/dist/useInfiniteScroll.d.ts.map +1 -0
  336. package/dist/useModalEdit.d.ts +960 -0
  337. package/dist/useModalEdit.d.ts.map +1 -0
  338. package/dist/useQRCode.d.ts +87 -0
  339. package/dist/useQRCode.d.ts.map +1 -0
  340. package/dist/useSearchState.d.ts +180 -0
  341. package/dist/useSearchState.d.ts.map +1 -0
  342. package/dist/useSignatureHistory.d.ts +189 -0
  343. package/dist/useSignatureHistory.d.ts.map +1 -0
  344. package/dist/useSplitResize.d.ts +158 -0
  345. package/dist/useSplitResize.d.ts.map +1 -0
  346. package/dist/useTimeSelection.d.ts +105 -0
  347. package/dist/useTimeSelection.d.ts.map +1 -0
  348. package/dist/useTreeOperations.d.ts +183 -0
  349. package/dist/useTreeOperations.d.ts.map +1 -0
  350. package/dist/useWorkflowValidation.d.ts +1052 -0
  351. package/dist/useWorkflowValidation.d.ts.map +1 -0
  352. package/package.json +342 -0
@@ -0,0 +1,1031 @@
1
+ import { t as export_helper_default } from "./export-helper.js";
2
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, isRef, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, ref, renderList, resolveComponent, toDisplayString, toRefs, unref, vShow, watch, withCtx, withDirectives } from "vue";
3
+ import { NButton, NDivider, NEllipsis, NEmpty, NInputNumber, NModal, NPagination, NResult, NSpin, NTabPane, NTabs, NTag, NText } from "naive-ui";
4
+ import * as XLSX from "xlsx";
5
+ import mammoth from "mammoth";
6
+
7
+ //#region src/components/C_FilePreview/data.ts
8
+ const FILE_TYPE_MAP = {
9
+ pdf: "pdf",
10
+ doc: "word",
11
+ docx: "word",
12
+ xls: "excel",
13
+ xlsx: "excel"
14
+ };
15
+ const FILE_CONFIGS = {
16
+ pdf: {
17
+ tagType: "error",
18
+ icon: "ic:outline-picture-as-pdf",
19
+ color: "#dc2626"
20
+ },
21
+ word: {
22
+ tagType: "info",
23
+ icon: "ic:outline-description",
24
+ color: "#2563eb"
25
+ },
26
+ excel: {
27
+ tagType: "success",
28
+ icon: "ic:outline-grid-on",
29
+ color: "#16a34a"
30
+ },
31
+ unknown: {
32
+ tagType: "default",
33
+ icon: "ic:outline-insert-drive-file",
34
+ color: "#6b7280"
35
+ }
36
+ };
37
+ const ZOOM_CONFIGS = {
38
+ pdf: {
39
+ min: .5,
40
+ max: 3,
41
+ step: .25,
42
+ default: 1
43
+ },
44
+ word: {
45
+ min: 50,
46
+ max: 200,
47
+ step: 10,
48
+ default: 100
49
+ }
50
+ };
51
+ const PAGE_SIZE_OPTIONS = [
52
+ 20,
53
+ 50,
54
+ 100,
55
+ 200
56
+ ];
57
+ const FULLSCREEN_EVENTS = [
58
+ "fullscreenchange",
59
+ "webkitfullscreenchange",
60
+ "mozfullscreenchange",
61
+ "MSFullscreenChange"
62
+ ];
63
+ const extractFileNameFromUrl = (url) => {
64
+ try {
65
+ const urlPath = url.split("/").pop() || url.split("\\").pop();
66
+ if (urlPath?.includes(".")) {
67
+ const decodedName = decodeURIComponent(urlPath.split("?")[0]);
68
+ if (decodedName && decodedName !== url) return decodedName;
69
+ }
70
+ } catch (error) {
71
+ console.warn("解析URL文件名失败:", error);
72
+ }
73
+ return "未知文件";
74
+ };
75
+ const formatFileSize = (bytes) => {
76
+ if (bytes === 0) return "0 B";
77
+ const k = 1024;
78
+ const sizes = [
79
+ "B",
80
+ "KB",
81
+ "MB",
82
+ "GB"
83
+ ];
84
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
85
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + " " + sizes[i];
86
+ };
87
+ const getFileType = (fileName) => {
88
+ if (!fileName || fileName === "未知文件") return "unknown";
89
+ const ext = fileName.toLowerCase().split(".").pop();
90
+ if (!ext) return "unknown";
91
+ return FILE_TYPE_MAP[ext] || "unknown";
92
+ };
93
+ const getFileConfig = (fileType) => {
94
+ return FILE_CONFIGS[fileType] || FILE_CONFIGS.unknown;
95
+ };
96
+ const createZoomHandler = (valueRef, config) => {
97
+ return (action) => {
98
+ const { min, max, step, default: defaultValue } = config;
99
+ switch (action) {
100
+ case "reset":
101
+ valueRef.value = defaultValue;
102
+ break;
103
+ case "in":
104
+ if (valueRef.value < max) valueRef.value += step;
105
+ break;
106
+ case "out":
107
+ if (valueRef.value > min) valueRef.value -= step;
108
+ break;
109
+ }
110
+ };
111
+ };
112
+ const getColumnLetter = (index) => {
113
+ let result = "";
114
+ while (index >= 0) {
115
+ result = String.fromCharCode(65 + index % 26) + result;
116
+ index = Math.floor(index / 26) - 1;
117
+ }
118
+ return result;
119
+ };
120
+ const formatCellValue = (value) => {
121
+ if (!value) return "";
122
+ const strValue = String(value).trim();
123
+ if (!isNaN(Number(strValue)) && strValue !== "" && strValue.length < 15) {
124
+ const num = Number(strValue);
125
+ return Number.isInteger(num) ? num.toLocaleString() : num.toLocaleString(void 0, { maximumFractionDigits: 2 });
126
+ }
127
+ return strValue;
128
+ };
129
+ const getCellClass = (value) => {
130
+ if (!value) return "cell-empty";
131
+ const strValue = String(value).trim();
132
+ if (!isNaN(Number(strValue)) && strValue !== "") return "cell-number";
133
+ if (strValue.match(/[■▬▪▫─━]/)) return "cell-gantt";
134
+ if (strValue.match(/^\d{4}[-/]\d{2}[-/]\d{2}/) || strValue.match(/^\d{2}[-/]\d{2}[-/]\d{4}/)) return "cell-date";
135
+ if (["true", "false"].includes(strValue.toLowerCase())) return "cell-boolean";
136
+ return strValue.length > 20 ? "cell-text cell-long" : "cell-text";
137
+ };
138
+ const processExcelSheet = (worksheet, merges) => {
139
+ const { c: maxCol, r: maxRow } = XLSX.utils.decode_range(worksheet["!ref"] || "A1:A1").e;
140
+ const columns = Array.from({ length: maxCol + 1 }, (_, c) => {
141
+ const cell = worksheet[XLSX.utils.encode_cell({
142
+ r: 0,
143
+ c
144
+ })];
145
+ const columnName = cell ? String(cell.v || "").trim() : `列${c + 1}`;
146
+ return {
147
+ title: columnName || `列${c + 1}`,
148
+ key: `col_${c}`,
149
+ width: Math.min(Math.max(columnName.length * 12, 80), 200)
150
+ };
151
+ });
152
+ const mergeMap = /* @__PURE__ */ new Map();
153
+ merges.forEach(({ s: { r: sRow, c: sCol }, e: { r: eRow, c: eCol } }) => {
154
+ for (let r = sRow; r <= eRow; r++) for (let c = sCol; c <= eCol; c++) mergeMap.set(`${r}-${c}`, {
155
+ isMain: r === sRow && c === sCol,
156
+ rowspan: eRow - sRow + 1,
157
+ colspan: eCol - sCol + 1
158
+ });
159
+ });
160
+ return {
161
+ data: Array.from({ length: maxRow + 1 }, (_, r) => {
162
+ const row = {};
163
+ for (let c = 0; c <= maxCol; c++) {
164
+ const cell = worksheet[XLSX.utils.encode_cell({
165
+ r,
166
+ c
167
+ })];
168
+ const mergeInfo = mergeMap.get(`${r}-${c}`);
169
+ row[`col_${c}`] = {
170
+ value: cell ? cell.v || "" : "",
171
+ merged: !!mergeInfo,
172
+ hidden: mergeInfo && !mergeInfo.isMain,
173
+ rowspan: mergeInfo?.isMain ? mergeInfo.rowspan : 1,
174
+ colspan: mergeInfo?.isMain ? mergeInfo.colspan : 1
175
+ };
176
+ }
177
+ return row;
178
+ }),
179
+ columns
180
+ };
181
+ };
182
+ async function loadPdf(file) {
183
+ return {
184
+ url: URL.createObjectURL(file) + "#toolbar=1&navpanes=1&scrollbar=1&view=FitH",
185
+ totalPages: 1
186
+ };
187
+ }
188
+ async function loadWord(file) {
189
+ const arrayBuffer = await file.arrayBuffer();
190
+ let content = (await mammoth.convertToHtml({
191
+ arrayBuffer,
192
+ styleMap: [
193
+ "p[style-name='Heading 1'] => h1:fresh",
194
+ "p[style-name='Heading 2'] => h2:fresh",
195
+ "p[style-name='Heading 3'] => h3:fresh",
196
+ "p[style-name='Title'] => h1.title:fresh"
197
+ ]
198
+ })).value;
199
+ const headings = [];
200
+ const tempDiv = document.createElement("div");
201
+ tempDiv.innerHTML = content;
202
+ const headingElements = tempDiv.querySelectorAll("h1, h2, h3, h4, h5, h6");
203
+ Array.from(headingElements).forEach((el, index) => {
204
+ const id = `heading-${index}`;
205
+ const level = parseInt(el.tagName.charAt(1));
206
+ const text = el.textContent || "";
207
+ content = content.replace(el.outerHTML, el.outerHTML.replace(el.tagName.toLowerCase(), `${el.tagName.toLowerCase()} id="${id}"`));
208
+ headings.push({
209
+ id,
210
+ text,
211
+ level
212
+ });
213
+ });
214
+ return {
215
+ content,
216
+ headings
217
+ };
218
+ }
219
+ async function loadExcel(file) {
220
+ const arrayBuffer = await file.arrayBuffer();
221
+ const workbook = XLSX.read(arrayBuffer, {
222
+ type: "array",
223
+ cellStyles: true,
224
+ cellFormula: true,
225
+ cellDates: true
226
+ });
227
+ if (!workbook.SheetNames.length) throw new Error("Excel文件中没有找到工作表");
228
+ return { sheets: workbook.SheetNames.map((name) => {
229
+ const worksheet = workbook.Sheets[name];
230
+ const merges = worksheet["!merges"] || [];
231
+ const { data, columns } = processExcelSheet(worksheet, merges);
232
+ return {
233
+ name,
234
+ data,
235
+ merges,
236
+ columns
237
+ };
238
+ }) };
239
+ }
240
+
241
+ //#endregion
242
+ //#region src/components/C_FilePreview/components/PdfViewer/index.vue?vue&type=script&setup=true&lang.ts
243
+ const _hoisted_1$3 = { class: "file-container pdf-container" };
244
+ const _hoisted_2$3 = { class: "file-toolbar" };
245
+ const _hoisted_3$3 = { class: "flex justify-between items-center" };
246
+ const _hoisted_4$3 = { class: "flex gap-2 items-center" };
247
+ const _hoisted_5$3 = { class: "text-sm text-gray-600" };
248
+ const _hoisted_6$3 = { class: "flex gap-2 items-center" };
249
+ const _hoisted_7$3 = { class: "text-sm text-gray-600 min-w-12 text-center" };
250
+ const _hoisted_8$3 = { class: "file-viewer" };
251
+ const _hoisted_9$3 = ["src"];
252
+ var index_vue_vue_type_script_setup_true_lang_default$3 = /* @__PURE__ */ defineComponent({
253
+ __name: "index",
254
+ props: {
255
+ pdfUrl: {},
256
+ totalPages: {}
257
+ },
258
+ setup(__props) {
259
+ const props = __props;
260
+ const currentPage = ref(1);
261
+ const scale = ref(1);
262
+ const adjustZoom = createZoomHandler(scale, ZOOM_CONFIGS.pdf);
263
+ const changePage = (action) => {
264
+ if (typeof action === "number") currentPage.value = Math.max(1, Math.min(action, props.totalPages));
265
+ else {
266
+ const delta = action === "prev" ? -1 : 1;
267
+ currentPage.value = Math.max(1, Math.min(currentPage.value + delta, props.totalPages));
268
+ }
269
+ };
270
+ return (_ctx, _cache) => {
271
+ const _component_C_Icon = resolveComponent("C_Icon");
272
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [createElementVNode("div", _hoisted_2$3, [createElementVNode("div", _hoisted_3$3, [
273
+ createCommentVNode(" 翻页控制 "),
274
+ createElementVNode("div", _hoisted_4$3, [
275
+ createVNode(unref(NButton), {
276
+ size: "small",
277
+ disabled: currentPage.value <= 1,
278
+ onClick: _cache[0] || (_cache[0] = ($event) => changePage("prev"))
279
+ }, {
280
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-chevron-left" })]),
281
+ _: 1
282
+ }, 8, ["disabled"]),
283
+ createVNode(unref(NInputNumber), {
284
+ value: currentPage.value,
285
+ "onUpdate:value": [_cache[1] || (_cache[1] = ($event) => currentPage.value = $event), changePage],
286
+ size: "small",
287
+ min: 1,
288
+ max: _ctx.totalPages,
289
+ style: { "width": "80px" }
290
+ }, null, 8, ["value", "max"]),
291
+ createElementVNode("span", _hoisted_5$3, "/ " + toDisplayString(_ctx.totalPages), 1),
292
+ createVNode(unref(NButton), {
293
+ size: "small",
294
+ disabled: currentPage.value >= _ctx.totalPages,
295
+ onClick: _cache[2] || (_cache[2] = ($event) => changePage("next"))
296
+ }, {
297
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-chevron-right" })]),
298
+ _: 1
299
+ }, 8, ["disabled"])
300
+ ]),
301
+ createCommentVNode(" 缩放控制 "),
302
+ createElementVNode("div", _hoisted_6$3, [
303
+ createVNode(unref(NButton), {
304
+ size: "small",
305
+ disabled: scale.value <= .5,
306
+ onClick: _cache[3] || (_cache[3] = ($event) => unref(adjustZoom)("out"))
307
+ }, {
308
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-zoom-out" })]),
309
+ _: 1
310
+ }, 8, ["disabled"]),
311
+ createElementVNode("span", _hoisted_7$3, toDisplayString(Math.round(scale.value * 100)) + "% ", 1),
312
+ createVNode(unref(NButton), {
313
+ size: "small",
314
+ disabled: scale.value >= 3,
315
+ onClick: _cache[4] || (_cache[4] = ($event) => unref(adjustZoom)("in"))
316
+ }, {
317
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-zoom-in" })]),
318
+ _: 1
319
+ }, 8, ["disabled"]),
320
+ createVNode(unref(NButton), {
321
+ size: "small",
322
+ onClick: _cache[5] || (_cache[5] = ($event) => unref(adjustZoom)("reset"))
323
+ }, {
324
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-fit-screen" })]),
325
+ default: withCtx(() => [_cache[6] || (_cache[6] = createTextVNode(" 适应 ", -1))]),
326
+ _: 1,
327
+ __: [6]
328
+ })
329
+ ])
330
+ ])]), createElementVNode("div", _hoisted_8$3, [_ctx.pdfUrl ? (openBlock(), createElementBlock("iframe", {
331
+ key: 0,
332
+ src: _ctx.pdfUrl,
333
+ class: "w-full h-full border-0",
334
+ title: "PDF预览",
335
+ frameborder: "0",
336
+ allowfullscreen: ""
337
+ }, null, 8, _hoisted_9$3)) : createCommentVNode("v-if", true)])]);
338
+ };
339
+ }
340
+ });
341
+
342
+ //#endregion
343
+ //#region src/components/C_FilePreview/components/PdfViewer/index.vue
344
+ var PdfViewer_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default$3, [["__scopeId", "data-v-ebf0149e"]]);
345
+
346
+ //#endregion
347
+ //#region src/components/C_FilePreview/components/WordViewer/index.vue?vue&type=script&setup=true&lang.ts
348
+ const _hoisted_1$2 = { class: "file-container word-container" };
349
+ const _hoisted_2$2 = { class: "file-toolbar" };
350
+ const _hoisted_3$2 = { class: "flex gap-2 items-center" };
351
+ const _hoisted_4$2 = { class: "text-sm text-gray-600 min-w-12 text-center" };
352
+ const _hoisted_5$2 = { class: "word-layout" };
353
+ const _hoisted_6$2 = { class: "word-main" };
354
+ const _hoisted_7$2 = {
355
+ key: 0,
356
+ class: "word-outline"
357
+ };
358
+ const _hoisted_8$2 = { class: "outline-content" };
359
+ const _hoisted_9$2 = ["onClick"];
360
+ const _hoisted_10$2 = { class: "word-content" };
361
+ const _hoisted_11$2 = ["innerHTML"];
362
+ var index_vue_vue_type_script_setup_true_lang_default$2 = /* @__PURE__ */ defineComponent({
363
+ __name: "index",
364
+ props: {
365
+ content: {},
366
+ headings: {}
367
+ },
368
+ setup(__props) {
369
+ const showOutline = ref(true);
370
+ const wordZoom = ref(100);
371
+ const adjustWordZoom = createZoomHandler(wordZoom, ZOOM_CONFIGS.word);
372
+ const scrollToHeading = (headingId) => {
373
+ document.getElementById(headingId)?.scrollIntoView({
374
+ behavior: "smooth",
375
+ block: "start"
376
+ });
377
+ };
378
+ return (_ctx, _cache) => {
379
+ const _component_C_Icon = resolveComponent("C_Icon");
380
+ return openBlock(), createElementBlock("div", _hoisted_1$2, [createElementVNode("div", _hoisted_2$2, [createElementVNode("div", _hoisted_3$2, [
381
+ createVNode(unref(NButton), {
382
+ size: "small",
383
+ onClick: _cache[0] || (_cache[0] = ($event) => showOutline.value = !showOutline.value)
384
+ }, {
385
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-list" })]),
386
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(showOutline.value ? "隐藏" : "显示") + "目录 ", 1)]),
387
+ _: 1
388
+ }),
389
+ createVNode(unref(NDivider), { vertical: "" }),
390
+ createVNode(unref(NButton), {
391
+ size: "small",
392
+ disabled: wordZoom.value <= 50,
393
+ onClick: _cache[1] || (_cache[1] = ($event) => unref(adjustWordZoom)("out"))
394
+ }, {
395
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-zoom-out" })]),
396
+ _: 1
397
+ }, 8, ["disabled"]),
398
+ createElementVNode("span", _hoisted_4$2, toDisplayString(wordZoom.value) + "% ", 1),
399
+ createVNode(unref(NButton), {
400
+ size: "small",
401
+ disabled: wordZoom.value >= 200,
402
+ onClick: _cache[2] || (_cache[2] = ($event) => unref(adjustWordZoom)("in"))
403
+ }, {
404
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-zoom-in" })]),
405
+ _: 1
406
+ }, 8, ["disabled"]),
407
+ createVNode(unref(NButton), {
408
+ size: "small",
409
+ onClick: _cache[3] || (_cache[3] = ($event) => unref(adjustWordZoom)("reset"))
410
+ }, {
411
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-fit-screen" })]),
412
+ default: withCtx(() => [_cache[4] || (_cache[4] = createTextVNode(" 重置 ", -1))]),
413
+ _: 1,
414
+ __: [4]
415
+ })
416
+ ])]), createElementVNode("div", _hoisted_5$2, [createElementVNode("div", _hoisted_6$2, [
417
+ createCommentVNode(" 侧边栏目录 "),
418
+ showOutline.value ? (openBlock(), createElementBlock("div", _hoisted_7$2, [_cache[5] || (_cache[5] = createElementVNode("div", { class: "outline-header" }, [createElementVNode("h3", { class: "text-sm font-semibold" }, "文档目录")], -1)), createElementVNode("div", _hoisted_8$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.headings, (heading, index) => {
419
+ return openBlock(), createElementBlock("div", {
420
+ key: index,
421
+ class: normalizeClass(["outline-item", `level-${heading.level}`]),
422
+ onClick: ($event) => scrollToHeading(heading.id)
423
+ }, toDisplayString(heading.text), 11, _hoisted_9$2);
424
+ }), 128))])])) : createCommentVNode("v-if", true),
425
+ createCommentVNode(" 主要内容区域 "),
426
+ createElementVNode("div", _hoisted_10$2, [createElementVNode("div", {
427
+ class: "word-document",
428
+ style: normalizeStyle({
429
+ transform: `scale(${wordZoom.value / 100})`,
430
+ transformOrigin: "top center"
431
+ }),
432
+ innerHTML: _ctx.content
433
+ }, null, 12, _hoisted_11$2)])
434
+ ])])]);
435
+ };
436
+ }
437
+ });
438
+
439
+ //#endregion
440
+ //#region src/components/C_FilePreview/components/WordViewer/index.vue
441
+ var WordViewer_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default$2, [["__scopeId", "data-v-c870ce93"]]);
442
+
443
+ //#endregion
444
+ //#region src/components/C_FilePreview/components/ExcelViewer/index.vue?vue&type=script&setup=true&lang.ts
445
+ const _hoisted_1$1 = { class: "file-container excel-container" };
446
+ const _hoisted_2$1 = { class: "file-toolbar" };
447
+ const _hoisted_3$1 = { class: "flex justify-between items-center" };
448
+ const _hoisted_4$1 = { class: "flex gap-2 items-center" };
449
+ const _hoisted_5$1 = {
450
+ key: 1,
451
+ class: "text-sm text-gray-600"
452
+ };
453
+ const _hoisted_6$1 = { class: "flex gap-2 items-center" };
454
+ const _hoisted_7$1 = { class: "excel-viewer" };
455
+ const _hoisted_8$1 = {
456
+ key: 0,
457
+ class: "excel-info"
458
+ };
459
+ const _hoisted_9$1 = { class: "excel-table-container" };
460
+ const _hoisted_10$1 = {
461
+ key: 0,
462
+ class: "excel-table"
463
+ };
464
+ const _hoisted_11$1 = { class: "header-content" };
465
+ const _hoisted_12$1 = { class: "column-letter" };
466
+ const _hoisted_13$1 = { class: "column-title" };
467
+ const _hoisted_14$1 = { class: "row-number" };
468
+ const _hoisted_15$1 = [
469
+ "rowspan",
470
+ "colspan",
471
+ "title"
472
+ ];
473
+ const _hoisted_16$1 = {
474
+ key: 1,
475
+ class: "excel-empty"
476
+ };
477
+ const _hoisted_17$1 = {
478
+ key: 0,
479
+ class: "excel-pagination"
480
+ };
481
+ var index_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ defineComponent({
482
+ __name: "index",
483
+ props: { sheets: {} },
484
+ emits: ["reload"],
485
+ setup(__props) {
486
+ const props = __props;
487
+ const activeSheet = ref("");
488
+ const showExcelFormat = ref(false);
489
+ const currentExcelPage = ref(1);
490
+ const pageSize = ref(50);
491
+ const currentData = ref([]);
492
+ const currentColumns = ref([]);
493
+ const totalExcelPages = computed(() => Math.ceil(currentData.value.length / pageSize.value));
494
+ const paginatedData = computed(() => {
495
+ const start = (currentExcelPage.value - 1) * pageSize.value;
496
+ return currentData.value.slice(start, start + pageSize.value);
497
+ });
498
+ const handlePageSizeChange = (newPageSize) => {
499
+ pageSize.value = newPageSize;
500
+ currentExcelPage.value = 1;
501
+ };
502
+ const syncSheetData = (sheetName) => {
503
+ const sheet = props.sheets.find((s) => s.name === sheetName);
504
+ if (sheet) {
505
+ currentData.value = sheet.data;
506
+ currentColumns.value = sheet.columns;
507
+ currentExcelPage.value = 1;
508
+ }
509
+ };
510
+ watch(activeSheet, (newSheet) => {
511
+ syncSheetData(newSheet);
512
+ });
513
+ watch(() => props.sheets, (newSheets) => {
514
+ if (newSheets.length > 0) {
515
+ const [firstSheet] = newSheets;
516
+ activeSheet.value = firstSheet.name;
517
+ currentData.value = firstSheet.data;
518
+ currentColumns.value = firstSheet.columns;
519
+ currentExcelPage.value = 1;
520
+ }
521
+ }, { immediate: true });
522
+ return (_ctx, _cache) => {
523
+ const _component_C_Icon = resolveComponent("C_Icon");
524
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
525
+ createCommentVNode(" 工具栏 "),
526
+ createElementVNode("div", _hoisted_2$1, [createElementVNode("div", _hoisted_3$1, [createElementVNode("div", _hoisted_4$1, [_ctx.sheets.length > 1 ? (openBlock(), createBlock(unref(NTabs), {
527
+ key: 0,
528
+ value: activeSheet.value,
529
+ "onUpdate:value": _cache[0] || (_cache[0] = ($event) => activeSheet.value = $event),
530
+ type: "card",
531
+ size: "small"
532
+ }, {
533
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.sheets, (sheet) => {
534
+ return openBlock(), createBlock(unref(NTabPane), {
535
+ key: sheet.name,
536
+ name: sheet.name,
537
+ tab: sheet.name
538
+ }, null, 8, ["name", "tab"]);
539
+ }), 128))]),
540
+ _: 1
541
+ }, 8, ["value"])) : (openBlock(), createElementBlock("span", _hoisted_5$1, " 工作表: " + toDisplayString(activeSheet.value), 1))]), createElementVNode("div", _hoisted_6$1, [createVNode(unref(NButton), {
542
+ size: "small",
543
+ onClick: _cache[1] || (_cache[1] = ($event) => showExcelFormat.value = !showExcelFormat.value)
544
+ }, {
545
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-format-paint" })]),
546
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(showExcelFormat.value ? "紧凑视图" : "完整格式"), 1)]),
547
+ _: 1
548
+ })])])]),
549
+ createElementVNode("div", _hoisted_7$1, [
550
+ createCommentVNode(" 信息面板 "),
551
+ currentData.value.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_8$1, [createVNode(unref(NText), {
552
+ depth: "3",
553
+ class: "text-sm"
554
+ }, {
555
+ default: withCtx(() => [createTextVNode(" 当前工作表: " + toDisplayString(activeSheet.value) + " | 总行数: " + toDisplayString(currentData.value.length) + " | 总列数: " + toDisplayString(currentColumns.value.length) + " | 当前页: " + toDisplayString(currentExcelPage.value) + "/" + toDisplayString(totalExcelPages.value), 1)]),
556
+ _: 1
557
+ })])) : createCommentVNode("v-if", true),
558
+ createCommentVNode(" 表格 "),
559
+ createElementVNode("div", _hoisted_9$1, [
560
+ createElementVNode("div", { class: normalizeClass(["excel-table-wrapper", { "simple-mode": !showExcelFormat.value }]) }, [currentData.value.length > 0 ? (openBlock(), createElementBlock("table", _hoisted_10$1, [createElementVNode("thead", null, [createElementVNode("tr", null, [_cache[4] || (_cache[4] = createElementVNode("th", { class: "row-number" }, "行号", -1)), (openBlock(true), createElementBlock(Fragment, null, renderList(currentColumns.value, (col, index) => {
561
+ return openBlock(), createElementBlock("th", {
562
+ key: col.key,
563
+ class: "excel-header",
564
+ style: normalizeStyle({ minWidth: col.width + "px" })
565
+ }, [createElementVNode("div", _hoisted_11$1, [createElementVNode("span", _hoisted_12$1, toDisplayString(unref(getColumnLetter)(index)), 1), createElementVNode("span", _hoisted_13$1, toDisplayString(col.title), 1)])], 4);
566
+ }), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(paginatedData.value, (row, rowIndex) => {
567
+ return openBlock(), createElementBlock("tr", {
568
+ key: rowIndex,
569
+ class: "excel-row"
570
+ }, [createElementVNode("td", _hoisted_14$1, toDisplayString((currentExcelPage.value - 1) * pageSize.value + rowIndex + 1), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(currentColumns.value, (col) => {
571
+ return withDirectives((openBlock(), createElementBlock("td", {
572
+ key: col.key,
573
+ class: normalizeClass(["excel-cell", [
574
+ unref(getCellClass)(row[col.key]?.value),
575
+ row[col.key]?.merged ? "merged-cell" : "",
576
+ !showExcelFormat.value ? "compact-cell" : ""
577
+ ]]),
578
+ rowspan: row[col.key]?.rowspan || 1,
579
+ colspan: row[col.key]?.colspan || 1,
580
+ title: row[col.key]?.value
581
+ }, toDisplayString(unref(formatCellValue)(row[col.key]?.value)), 11, _hoisted_15$1)), [[vShow, !row[col.key]?.hidden]]);
582
+ }), 128))]);
583
+ }), 128))])])) : (openBlock(), createElementBlock("div", _hoisted_16$1, [createVNode(unref(NEmpty), { description: "该工作表没有数据或解析失败" }, {
584
+ extra: withCtx(() => [createVNode(unref(NButton), {
585
+ size: "small",
586
+ onClick: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("reload"))
587
+ }, {
588
+ default: withCtx(() => _cache[5] || (_cache[5] = [createTextVNode(" 重新解析 ", -1)])),
589
+ _: 1,
590
+ __: [5]
591
+ })]),
592
+ _: 1
593
+ })]))], 2),
594
+ createCommentVNode(" 分页 "),
595
+ totalExcelPages.value > 1 ? (openBlock(), createElementBlock("div", _hoisted_17$1, [createVNode(unref(NPagination), {
596
+ page: currentExcelPage.value,
597
+ "onUpdate:page": _cache[3] || (_cache[3] = ($event) => currentExcelPage.value = $event),
598
+ "page-count": totalExcelPages.value,
599
+ "page-size": pageSize.value,
600
+ "show-size-picker": "",
601
+ "page-sizes": unref(PAGE_SIZE_OPTIONS),
602
+ "onUpdate:pageSize": handlePageSizeChange
603
+ }, null, 8, [
604
+ "page",
605
+ "page-count",
606
+ "page-size",
607
+ "page-sizes"
608
+ ])])) : createCommentVNode("v-if", true)
609
+ ])
610
+ ])
611
+ ]);
612
+ };
613
+ }
614
+ });
615
+
616
+ //#endregion
617
+ //#region src/components/C_FilePreview/components/ExcelViewer/index.vue
618
+ var ExcelViewer_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default$1, [["__scopeId", "data-v-2748efab"]]);
619
+
620
+ //#endregion
621
+ //#region src/components/C_FilePreview/composables/useFilePreview.ts
622
+ /**
623
+ * useFilePreview — 文件预览核心 composable
624
+ * 管理:文件状态、加载、类型检测、下载
625
+ */
626
+ /**
627
+ * 文件预览核心 composable — 管理文件状态、加载、类型检测、下载
628
+ * @param options - 文件源配置(file / url / fileName)
629
+ * @param emit - 组件事件发射器
630
+ */
631
+ function useFilePreview(options, emit) {
632
+ const { file, url, fileName } = options;
633
+ const loading = ref(false);
634
+ const error = ref("");
635
+ const fileSize = ref(0);
636
+ const showModal = ref(false);
637
+ const pdfUrl = ref("");
638
+ const pdfTotalPages = ref(0);
639
+ const wordContent = ref("");
640
+ const wordHeadings = ref([]);
641
+ const excelSheets = ref([]);
642
+ const displayFileName = computed(() => {
643
+ if (fileName.value && fileName.value !== "未知文件") return fileName.value;
644
+ if (file.value?.name) return file.value.name;
645
+ if (url.value) return extractFileNameFromUrl(url.value);
646
+ return "未知文件";
647
+ });
648
+ const fileType = computed(() => getFileType(displayFileName.value));
649
+ const fileConfig = computed(() => getFileConfig(fileType.value));
650
+ const clearState = () => {
651
+ error.value = "";
652
+ loading.value = false;
653
+ pdfUrl.value = "";
654
+ pdfTotalPages.value = 0;
655
+ wordContent.value = "";
656
+ wordHeadings.value = [];
657
+ excelSheets.value = [];
658
+ };
659
+ const setError = (msg) => {
660
+ error.value = msg;
661
+ loading.value = false;
662
+ };
663
+ const resolveFile = async () => {
664
+ if (file.value) {
665
+ fileSize.value = file.value.size;
666
+ return file.value;
667
+ }
668
+ if (url.value) {
669
+ const response = await fetch(url.value);
670
+ if (!response.ok) throw new Error(`HTTP ${response.status}: ${response.statusText}`);
671
+ const blob = await response.blob();
672
+ const resolved = new File([blob], displayFileName.value, { type: blob.type });
673
+ fileSize.value = resolved.size;
674
+ return resolved;
675
+ }
676
+ throw new Error("未提供文件或URL");
677
+ };
678
+ const loadByType = async (currentFile, type) => {
679
+ switch (type) {
680
+ case "pdf": {
681
+ const result = await loadPdf(currentFile);
682
+ pdfUrl.value = result.url;
683
+ pdfTotalPages.value = result.totalPages;
684
+ break;
685
+ }
686
+ case "word": {
687
+ const result = await loadWord(currentFile);
688
+ wordContent.value = result.content;
689
+ wordHeadings.value = result.headings;
690
+ break;
691
+ }
692
+ case "excel":
693
+ excelSheets.value = (await loadExcel(currentFile)).sheets;
694
+ break;
695
+ default: throw new Error("不支持的文件格式");
696
+ }
697
+ };
698
+ const loadFile = async () => {
699
+ if (!file.value && !url.value) {
700
+ setError("未提供文件或URL");
701
+ return;
702
+ }
703
+ clearState();
704
+ loading.value = true;
705
+ try {
706
+ await loadByType(await resolveFile(), fileType.value);
707
+ loading.value = false;
708
+ } catch (err) {
709
+ const errorMessage = err instanceof Error ? err.message : "未知错误";
710
+ setError(`${fileType.value.toUpperCase()}文件加载失败: ${errorMessage}`);
711
+ }
712
+ };
713
+ const openPreview = async () => {
714
+ showModal.value = true;
715
+ await loadFile();
716
+ emit("preview", file.value || url.value);
717
+ };
718
+ const downloadFile = () => {
719
+ if (file.value) {
720
+ const downloadUrl = URL.createObjectURL(file.value);
721
+ Object.assign(document.createElement("a"), {
722
+ href: downloadUrl,
723
+ download: displayFileName.value
724
+ }).click();
725
+ URL.revokeObjectURL(downloadUrl);
726
+ } else if (url.value) window.open(url.value, "_blank");
727
+ emit("download", file.value || url.value);
728
+ };
729
+ watch(() => file.value?.size, (newSize) => {
730
+ fileSize.value = newSize || 0;
731
+ }, { immediate: true });
732
+ onUnmounted(() => {
733
+ if (pdfUrl.value?.startsWith("blob:")) URL.revokeObjectURL(pdfUrl.value.split("#")[0]);
734
+ });
735
+ return {
736
+ loading,
737
+ error,
738
+ fileSize,
739
+ showModal,
740
+ pdfUrl,
741
+ pdfTotalPages,
742
+ wordContent,
743
+ wordHeadings,
744
+ excelSheets,
745
+ displayFileName,
746
+ fileType,
747
+ fileConfig,
748
+ loadFile,
749
+ openPreview,
750
+ downloadFile
751
+ };
752
+ }
753
+
754
+ //#endregion
755
+ //#region src/components/C_FilePreview/composables/useFullscreen.ts
756
+ /**
757
+ * useFullscreen — 全屏切换 composable
758
+ */
759
+ /**
760
+ * 全屏切换 composable — 管理全屏状态与跨浏览器兼容
761
+ * @param containerRef - 需要全屏的容器元素引用
762
+ */
763
+ function useFullscreen(containerRef) {
764
+ const isFullscreen = ref(false);
765
+ const handleFullscreenChange = () => {
766
+ isFullscreen.value = !!document.fullscreenElement;
767
+ };
768
+ const tryMethods = (methods, index = 0) => {
769
+ if (index >= methods.length) {
770
+ console.warn("无法切换全屏状态");
771
+ return Promise.resolve();
772
+ }
773
+ return methods[index]().catch(() => tryMethods(methods, index + 1));
774
+ };
775
+ const toggleFullscreen = async () => {
776
+ const element = containerRef.value;
777
+ if (!element) return;
778
+ await tryMethods(!!document.fullscreenElement ? [
779
+ () => document.exitFullscreen(),
780
+ () => document.webkitExitFullscreen(),
781
+ () => document.mozCancelFullScreen(),
782
+ () => document.msExitFullscreen()
783
+ ] : [
784
+ () => element.requestFullscreen(),
785
+ () => element.webkitRequestFullscreen(),
786
+ () => element.mozRequestFullScreen(),
787
+ () => element.msRequestFullscreen()
788
+ ]);
789
+ };
790
+ const exitFullscreen = async () => {
791
+ if (document.fullscreenElement) try {
792
+ await document.exitFullscreen();
793
+ } catch {}
794
+ isFullscreen.value = false;
795
+ };
796
+ onMounted(() => {
797
+ FULLSCREEN_EVENTS.forEach((event) => document.addEventListener(event, handleFullscreenChange));
798
+ });
799
+ onUnmounted(() => {
800
+ FULLSCREEN_EVENTS.forEach((event) => document.removeEventListener(event, handleFullscreenChange));
801
+ });
802
+ return {
803
+ isFullscreen,
804
+ toggleFullscreen,
805
+ exitFullscreen
806
+ };
807
+ }
808
+
809
+ //#endregion
810
+ //#region src/components/C_FilePreview/index.vue?vue&type=script&setup=true&lang.ts
811
+ const _hoisted_1 = { class: "c-file-preview-wrapper" };
812
+ const _hoisted_2 = {
813
+ key: 0,
814
+ class: "file-info-card"
815
+ };
816
+ const _hoisted_3 = { class: "file-info" };
817
+ const _hoisted_4 = { class: "file-icon" };
818
+ const _hoisted_5 = { class: "file-details" };
819
+ const _hoisted_6 = { class: "file-name" };
820
+ const _hoisted_7 = { class: "file-meta" };
821
+ const _hoisted_8 = { class: "file-size" };
822
+ const _hoisted_9 = { class: "file-actions" };
823
+ const _hoisted_10 = { class: "modal-header" };
824
+ const _hoisted_11 = { class: "modal-title" };
825
+ const _hoisted_12 = { class: "modal-actions" };
826
+ const _hoisted_13 = { class: "modal-content" };
827
+ const _hoisted_14 = { class: "preview-header" };
828
+ const _hoisted_15 = { class: "flex justify-between items-center" };
829
+ const _hoisted_16 = { class: "flex items-center gap-3" };
830
+ const _hoisted_17 = { class: "text-sm text-gray-500" };
831
+ const _hoisted_18 = { class: "flex gap-2" };
832
+ const _hoisted_19 = { class: "preview-content" };
833
+ const _hoisted_20 = {
834
+ key: 0,
835
+ class: "status-container"
836
+ };
837
+ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
838
+ name: "C_FilePreview",
839
+ __name: "index",
840
+ props: {
841
+ file: {},
842
+ url: {},
843
+ fileName: { default: "未知文件" },
844
+ autoPreview: {
845
+ type: Boolean,
846
+ default: false
847
+ }
848
+ },
849
+ emits: ["preview", "download"],
850
+ setup(__props, { emit: __emit }) {
851
+ const { file, url, fileName: propFileName, autoPreview } = toRefs(__props);
852
+ const { loading, error, fileSize, showModal, pdfUrl, pdfTotalPages, wordContent, wordHeadings, excelSheets, displayFileName, fileType, fileConfig, loadFile, openPreview, downloadFile } = useFilePreview({
853
+ file,
854
+ url,
855
+ fileName: propFileName
856
+ }, __emit);
857
+ const modalContainer = ref();
858
+ const { isFullscreen, toggleFullscreen, exitFullscreen } = useFullscreen(modalContainer);
859
+ watch(showModal, (isShow) => {
860
+ if (!isShow) exitFullscreen();
861
+ });
862
+ return (_ctx, _cache) => {
863
+ const _component_C_Icon = resolveComponent("C_Icon");
864
+ return openBlock(), createElementBlock("div", _hoisted_1, [
865
+ createCommentVNode(" 文件信息卡片模式 "),
866
+ !unref(autoPreview) ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("div", _hoisted_3, [
867
+ createElementVNode("div", _hoisted_4, [createVNode(_component_C_Icon, {
868
+ name: unref(fileConfig).icon,
869
+ size: 40,
870
+ color: unref(fileConfig).color
871
+ }, null, 8, ["name", "color"])]),
872
+ createElementVNode("div", _hoisted_5, [createElementVNode("div", _hoisted_6, [createVNode(unref(NEllipsis), { style: { "max-width": "250px" } }, {
873
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(displayFileName)), 1)]),
874
+ _: 1
875
+ }), createVNode(unref(NTag), {
876
+ type: unref(fileConfig).tagType,
877
+ size: "small"
878
+ }, {
879
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(fileType).toUpperCase()), 1)]),
880
+ _: 1
881
+ }, 8, ["type"])]), createElementVNode("div", _hoisted_7, [createElementVNode("span", _hoisted_8, toDisplayString(unref(formatFileSize)(unref(fileSize))), 1)])]),
882
+ createElementVNode("div", _hoisted_9, [createVNode(unref(NButton), {
883
+ type: "primary",
884
+ onClick: unref(openPreview)
885
+ }, {
886
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-visibility" })]),
887
+ default: withCtx(() => [_cache[2] || (_cache[2] = createTextVNode(" 预览 ", -1))]),
888
+ _: 1,
889
+ __: [2]
890
+ }, 8, ["onClick"]), createVNode(unref(NButton), {
891
+ type: "tertiary",
892
+ onClick: unref(downloadFile)
893
+ }, {
894
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-download" })]),
895
+ default: withCtx(() => [_cache[3] || (_cache[3] = createTextVNode(" 下载 ", -1))]),
896
+ _: 1,
897
+ __: [3]
898
+ }, 8, ["onClick"])])
899
+ ])])) : createCommentVNode("v-if", true),
900
+ createCommentVNode(" 模态框预览 "),
901
+ createVNode(unref(NModal), {
902
+ show: unref(showModal),
903
+ "onUpdate:show": _cache[1] || (_cache[1] = ($event) => isRef(showModal) ? showModal.value = $event : null),
904
+ "mask-closable": false,
905
+ closable: false,
906
+ "auto-focus": false,
907
+ "transform-origin": "center",
908
+ style: {
909
+ "width": "85vw",
910
+ "max-width": "1200px",
911
+ "min-width": "800px",
912
+ "height": "75vh",
913
+ "max-height": "700px",
914
+ "min-height": "500px"
915
+ }
916
+ }, {
917
+ default: withCtx(() => [createElementVNode("div", {
918
+ ref_key: "modalContainer",
919
+ ref: modalContainer,
920
+ class: "modal-container"
921
+ }, [
922
+ createCommentVNode(" 自定义头部 "),
923
+ createElementVNode("div", _hoisted_10, [createElementVNode("div", _hoisted_11, [createVNode(_component_C_Icon, {
924
+ name: unref(fileConfig).icon,
925
+ size: 20,
926
+ color: unref(fileConfig).color
927
+ }, null, 8, ["name", "color"]), createElementVNode("span", null, toDisplayString(unref(displayFileName)), 1)]), createElementVNode("div", _hoisted_12, [createVNode(unref(NButton), {
928
+ size: "small",
929
+ type: "tertiary",
930
+ onClick: unref(downloadFile)
931
+ }, {
932
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-download" })]),
933
+ default: withCtx(() => [_cache[4] || (_cache[4] = createTextVNode(" 下载 ", -1))]),
934
+ _: 1,
935
+ __: [4]
936
+ }, 8, ["onClick"]), createVNode(unref(NButton), {
937
+ size: "small",
938
+ type: "tertiary",
939
+ onClick: _cache[0] || (_cache[0] = ($event) => showModal.value = false)
940
+ }, {
941
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-close" })]),
942
+ _: 1
943
+ })])]),
944
+ createCommentVNode(" 预览内容 "),
945
+ createElementVNode("div", _hoisted_13, [
946
+ createCommentVNode(" 文件信息头部 "),
947
+ createElementVNode("div", _hoisted_14, [createElementVNode("div", _hoisted_15, [createElementVNode("div", _hoisted_16, [
948
+ createVNode(unref(NTag), {
949
+ type: unref(fileConfig).tagType,
950
+ size: "small"
951
+ }, {
952
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: unref(fileConfig).icon }, null, 8, ["name"])]),
953
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(fileType).toUpperCase()), 1)]),
954
+ _: 1
955
+ }, 8, ["type"]),
956
+ createVNode(unref(NEllipsis), { style: { "max-width": "300px" } }, {
957
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(displayFileName)), 1)]),
958
+ _: 1
959
+ }),
960
+ createElementVNode("span", _hoisted_17, toDisplayString(unref(formatFileSize)(unref(fileSize))), 1)
961
+ ]), createElementVNode("div", _hoisted_18, [createVNode(unref(NButton), {
962
+ size: "small",
963
+ type: "tertiary",
964
+ disabled: unref(loading),
965
+ onClick: unref(loadFile)
966
+ }, {
967
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: "ic:outline-refresh" })]),
968
+ default: withCtx(() => [_cache[5] || (_cache[5] = createTextVNode(" 刷新 ", -1))]),
969
+ _: 1,
970
+ __: [5]
971
+ }, 8, ["disabled", "onClick"]), createVNode(unref(NButton), {
972
+ size: "small",
973
+ type: "primary",
974
+ onClick: unref(toggleFullscreen)
975
+ }, {
976
+ icon: withCtx(() => [createVNode(_component_C_Icon, { name: unref(isFullscreen) ? "ic:outline-fullscreen-exit" : "ic:outline-fullscreen" }, null, 8, ["name"])]),
977
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(unref(isFullscreen) ? "退出全屏" : "全屏"), 1)]),
978
+ _: 1
979
+ }, 8, ["onClick"])])])]),
980
+ createCommentVNode(" 预览内容区域 "),
981
+ createElementVNode("div", _hoisted_19, [createCommentVNode(" 加载和错误状态 "), unref(loading) || unref(error) ? (openBlock(), createElementBlock("div", _hoisted_20, [unref(loading) ? (openBlock(), createBlock(unref(NSpin), {
982
+ key: 0,
983
+ size: "large"
984
+ }, {
985
+ description: withCtx(() => [createTextVNode(" 正在加载" + toDisplayString(unref(fileType).toUpperCase()) + "文件... ", 1)]),
986
+ _: 1
987
+ })) : (openBlock(), createBlock(unref(NResult), {
988
+ key: 1,
989
+ status: "error",
990
+ title: "预览失败",
991
+ description: unref(error)
992
+ }, {
993
+ footer: withCtx(() => [createVNode(unref(NButton), { onClick: unref(loadFile) }, {
994
+ default: withCtx(() => _cache[6] || (_cache[6] = [createTextVNode("重试", -1)])),
995
+ _: 1,
996
+ __: [6]
997
+ }, 8, ["onClick"])]),
998
+ _: 1
999
+ }, 8, ["description"]))])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createCommentVNode(" 文件预览 — 委托给子组件 "), unref(fileType) === "pdf" ? (openBlock(), createBlock(PdfViewer_default, {
1000
+ key: 0,
1001
+ "pdf-url": unref(pdfUrl),
1002
+ "total-pages": unref(pdfTotalPages)
1003
+ }, null, 8, ["pdf-url", "total-pages"])) : unref(fileType) === "word" ? (openBlock(), createBlock(WordViewer_default, {
1004
+ key: 1,
1005
+ content: unref(wordContent),
1006
+ headings: unref(wordHeadings)
1007
+ }, null, 8, ["content", "headings"])) : unref(fileType) === "excel" ? (openBlock(), createBlock(ExcelViewer_default, {
1008
+ key: 2,
1009
+ sheets: unref(excelSheets),
1010
+ onReload: unref(loadFile)
1011
+ }, null, 8, ["sheets", "onReload"])) : (openBlock(), createElementBlock(Fragment, { key: 3 }, [createCommentVNode(" 不支持的文件类型 "), createVNode(unref(NResult), {
1012
+ status: "warning",
1013
+ title: "不支持的文件格式",
1014
+ description: `暂不支持预览 ${unref(fileType).toUpperCase()} 格式文件`
1015
+ }, null, 8, ["description"])], 2112))], 64))])
1016
+ ])
1017
+ ], 512)]),
1018
+ _: 1
1019
+ }, 8, ["show"])
1020
+ ]);
1021
+ };
1022
+ }
1023
+ });
1024
+
1025
+ //#endregion
1026
+ //#region src/components/C_FilePreview/index.vue
1027
+ var C_FilePreview_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-1a63259a"]]);
1028
+
1029
+ //#endregion
1030
+ export { useFullscreen as n, useFilePreview as r, C_FilePreview_default as t };
1031
+ //# sourceMappingURL=C_FilePreview2.js.map