@robot-admin/naive-ui-components 0.4.3 → 0.4.4

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