@sugarat/easypicker2-client 2.7.0-beta.0 → 2.7.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 (165) hide show
  1. package/dist/assets/{data-analysis-c8lgg0AB.js → data-analysis-CVdTnsNg.js} +2 -2
  2. package/dist/assets/{data-analysis-c8lgg0AB.js.map → data-analysis-CVdTnsNg.js.map} +1 -1
  3. package/dist/assets/{data-analysis-legacy-CW8BY_nY.js → data-analysis-legacy-CrjrJgyN.js} +2 -2
  4. package/dist/assets/{data-analysis-legacy-CW8BY_nY.js.map → data-analysis-legacy-CrjrJgyN.js.map} +1 -1
  5. package/dist/assets/{data-board-CfWZjPIl.js → data-board-CKaKy1IB.js} +2 -2
  6. package/dist/assets/{data-board-CfWZjPIl.js.map → data-board-CKaKy1IB.js.map} +1 -1
  7. package/dist/assets/{data-board-legacy-DDytbRz4.js → data-board-legacy-DfESxuEd.js} +2 -2
  8. package/dist/assets/{data-board-legacy-DDytbRz4.js.map → data-board-legacy-DfESxuEd.js.map} +1 -1
  9. package/dist/assets/{el-date-picker-CI8bdk_f.js → el-date-picker-cVKa-X4K.js} +2 -2
  10. package/dist/assets/{el-date-picker-CI8bdk_f.js.map → el-date-picker-cVKa-X4K.js.map} +1 -1
  11. package/dist/assets/{el-date-picker-legacy-CSDTG-yp.js → el-date-picker-legacy-CJ2heCkq.js} +2 -2
  12. package/dist/assets/{el-date-picker-legacy-CSDTG-yp.js.map → el-date-picker-legacy-CJ2heCkq.js.map} +1 -1
  13. package/dist/assets/{el-dialog-C8bI9VGw.js → el-dialog-U5Zmt3t3.js} +2 -2
  14. package/dist/assets/{el-dialog-C8bI9VGw.js.map → el-dialog-U5Zmt3t3.js.map} +1 -1
  15. package/dist/assets/{el-dialog-legacy-DfEb6k1B.js → el-dialog-legacy-u4KST5yo.js} +2 -2
  16. package/dist/assets/{el-dialog-legacy-DfEb6k1B.js.map → el-dialog-legacy-u4KST5yo.js.map} +1 -1
  17. package/dist/assets/{el-dropdown-item-febUKGk9.js → el-dropdown-item-flwUs2cH.js} +2 -2
  18. package/dist/assets/{el-dropdown-item-febUKGk9.js.map → el-dropdown-item-flwUs2cH.js.map} +1 -1
  19. package/dist/assets/{el-dropdown-item-legacy-Bi1TbzqG.js → el-dropdown-item-legacy-B2fmSGnI.js} +2 -2
  20. package/dist/assets/{el-dropdown-item-legacy-Bi1TbzqG.js.map → el-dropdown-item-legacy-B2fmSGnI.js.map} +1 -1
  21. package/dist/assets/{el-form-item-SCs-OERV.js → el-form-item-B08Ira7l.js} +2 -2
  22. package/dist/assets/{el-form-item-SCs-OERV.js.map → el-form-item-B08Ira7l.js.map} +1 -1
  23. package/dist/assets/{el-form-item-legacy-CNxAgkUf.js → el-form-item-legacy-CcX_hnMk.js} +2 -2
  24. package/dist/assets/{el-form-item-legacy-CNxAgkUf.js.map → el-form-item-legacy-CcX_hnMk.js.map} +1 -1
  25. package/dist/assets/{el-loading-DSlXrliU.js → el-loading-BMbhg8vq.js} +2 -2
  26. package/dist/assets/{el-loading-DSlXrliU.js.map → el-loading-BMbhg8vq.js.map} +1 -1
  27. package/dist/assets/{el-loading-legacy-CbNNE-qk.js → el-loading-legacy-CRJF51cp.js} +2 -2
  28. package/dist/assets/{el-loading-legacy-CbNNE-qk.js.map → el-loading-legacy-CRJF51cp.js.map} +1 -1
  29. package/dist/assets/{el-pagination-nfYZbPTI.js → el-pagination-D4Wuvfl8.js} +2 -2
  30. package/dist/assets/{el-pagination-nfYZbPTI.js.map → el-pagination-D4Wuvfl8.js.map} +1 -1
  31. package/dist/assets/{el-pagination-legacy-CeTPKkkI.js → el-pagination-legacy-C2E-fHif.js} +2 -2
  32. package/dist/assets/{el-pagination-legacy-CeTPKkkI.js.map → el-pagination-legacy-C2E-fHif.js.map} +1 -1
  33. package/dist/assets/{el-progress-BRTU4m5q.js → el-progress-ChbdZpVl.js} +2 -2
  34. package/dist/assets/{el-progress-BRTU4m5q.js.map → el-progress-ChbdZpVl.js.map} +1 -1
  35. package/dist/assets/{el-progress-legacy-B6EwNV6c.js → el-progress-legacy-zjlCtRh2.js} +2 -2
  36. package/dist/assets/{el-progress-legacy-B6EwNV6c.js.map → el-progress-legacy-zjlCtRh2.js.map} +1 -1
  37. package/dist/assets/{el-select-uDoCZCn5.js → el-select-DP5UYxt3.js} +2 -2
  38. package/dist/assets/{el-select-uDoCZCn5.js.map → el-select-DP5UYxt3.js.map} +1 -1
  39. package/dist/assets/{el-select-legacy-BFhy033s.js → el-select-legacy-D4o92tvp.js} +2 -2
  40. package/dist/assets/{el-select-legacy-BFhy033s.js.map → el-select-legacy-D4o92tvp.js.map} +1 -1
  41. package/dist/assets/{el-switch-B8IyK6ZR.js → el-switch-DAReoFaC.js} +2 -2
  42. package/dist/assets/{el-switch-B8IyK6ZR.js.map → el-switch-DAReoFaC.js.map} +1 -1
  43. package/dist/assets/{el-switch-legacy-LBGoMV4l.js → el-switch-legacy-D1AVOg2z.js} +2 -2
  44. package/dist/assets/{el-switch-legacy-LBGoMV4l.js.map → el-switch-legacy-D1AVOg2z.js.map} +1 -1
  45. package/dist/assets/{el-tab-pane-fWqYc0uG.js → el-tab-pane-6kk7HB4E.js} +2 -2
  46. package/dist/assets/{el-tab-pane-fWqYc0uG.js.map → el-tab-pane-6kk7HB4E.js.map} +1 -1
  47. package/dist/assets/{el-tab-pane-legacy-ChZdms4s.js → el-tab-pane-legacy-7aEB8qvn.js} +2 -2
  48. package/dist/assets/{el-tab-pane-legacy-ChZdms4s.js.map → el-tab-pane-legacy-7aEB8qvn.js.map} +1 -1
  49. package/dist/assets/{el-table-column-C3qC7HsW.js → el-table-column-DsGlAuX3.js} +2 -2
  50. package/dist/assets/{el-table-column-C3qC7HsW.js.map → el-table-column-DsGlAuX3.js.map} +1 -1
  51. package/dist/assets/{el-table-column-legacy-Wp8N0Zxv.js → el-table-column-legacy-C8A33Lav.js} +2 -2
  52. package/dist/assets/{el-table-column-legacy-Wp8N0Zxv.js.map → el-table-column-legacy-C8A33Lav.js.map} +1 -1
  53. package/dist/assets/index-BG1GuMIu.css +1 -0
  54. package/dist/assets/{index-CAbIiez7.js → index-BK3KKBAN.js} +2 -2
  55. package/dist/assets/{index-CAbIiez7.js.map → index-BK3KKBAN.js.map} +1 -1
  56. package/dist/assets/index-BMZu8UZ6.js +2 -0
  57. package/dist/assets/{index-E_UelRIx.js.map → index-BMZu8UZ6.js.map} +1 -1
  58. package/dist/assets/{index-B621FN6u.js → index-BVM3WMNO.js} +2 -2
  59. package/dist/assets/{index-B621FN6u.js.map → index-BVM3WMNO.js.map} +1 -1
  60. package/dist/assets/{index-D2jrbKvI.js → index-BdVQjSN6.js} +2 -2
  61. package/dist/assets/{index-D2jrbKvI.js.map → index-BdVQjSN6.js.map} +1 -1
  62. package/dist/assets/{index-Cbj5Qf1k.js → index-BnQi1XPn.js} +2 -2
  63. package/dist/assets/{index-Cbj5Qf1k.js.map → index-BnQi1XPn.js.map} +1 -1
  64. package/dist/assets/{index-DVHa0g7s.js → index-Caxtv5sl.js} +2 -2
  65. package/dist/assets/{index-DVHa0g7s.js.map → index-Caxtv5sl.js.map} +1 -1
  66. package/dist/assets/index-CeKw5v7N.js +2 -0
  67. package/dist/assets/index-CeKw5v7N.js.map +1 -0
  68. package/dist/assets/{index-CcPY3ZJk.js → index-D-JYypPJ.js} +2 -2
  69. package/dist/assets/{index-CcPY3ZJk.js.map → index-D-JYypPJ.js.map} +1 -1
  70. package/dist/assets/{index-DvM_o_Iw.js → index-D6LMez3u.js} +2 -2
  71. package/dist/assets/{index-DvM_o_Iw.js.map → index-D6LMez3u.js.map} +1 -1
  72. package/dist/assets/{index-AYz8tt3l.js → index-DcmA3tsY.js} +2 -2
  73. package/dist/assets/{index-AYz8tt3l.js.map → index-DcmA3tsY.js.map} +1 -1
  74. package/dist/assets/{index-UJqXhonq.js → index-Dczz94WX.js} +2 -2
  75. package/dist/assets/{index-UJqXhonq.js.map → index-Dczz94WX.js.map} +1 -1
  76. package/dist/assets/{index-BAFXwCno.js → index-DjTj_2YG.js} +2 -2
  77. package/dist/assets/{index-BAFXwCno.js.map → index-DjTj_2YG.js.map} +1 -1
  78. package/dist/assets/{index-Bp9D-Hzs.js → index-DkbS1z1O.js} +2 -2
  79. package/dist/assets/{index-Bp9D-Hzs.js.map → index-DkbS1z1O.js.map} +1 -1
  80. package/dist/assets/{index-BN8Mg9Y5.js → index-ITkwOdUc.js} +2 -2
  81. package/dist/assets/{index-BN8Mg9Y5.js.map → index-ITkwOdUc.js.map} +1 -1
  82. package/dist/assets/index-XNFQHmLL.css +1 -0
  83. package/dist/assets/{index-DIARiZcJ.js → index-ggQcjFPK.js} +2 -2
  84. package/dist/assets/{index-DIARiZcJ.js.map → index-ggQcjFPK.js.map} +1 -1
  85. package/dist/assets/{index-Lsr6KH3b.js → index-jSHW6lhR.js} +2 -2
  86. package/dist/assets/{index-Lsr6KH3b.js.map → index-jSHW6lhR.js.map} +1 -1
  87. package/dist/assets/{index-legacy-3jO8hk9z.js → index-legacy-2f3kE3Xe.js} +2 -2
  88. package/dist/assets/{index-legacy-3jO8hk9z.js.map → index-legacy-2f3kE3Xe.js.map} +1 -1
  89. package/dist/assets/{index-legacy-Bziat01y.js → index-legacy-6cMsZS3c.js} +2 -2
  90. package/dist/assets/{index-legacy-Bziat01y.js.map → index-legacy-6cMsZS3c.js.map} +1 -1
  91. package/dist/assets/{index-legacy-8ekXefFL.js → index-legacy-8BA9X4aO.js} +2 -2
  92. package/dist/assets/{index-legacy-8ekXefFL.js.map → index-legacy-8BA9X4aO.js.map} +1 -1
  93. package/dist/assets/{index-legacy-D93ANJJU.js → index-legacy-B4s89tRC.js} +2 -2
  94. package/dist/assets/{index-legacy-D93ANJJU.js.map → index-legacy-B4s89tRC.js.map} +1 -1
  95. package/dist/assets/{index-legacy-DiTQKLfl.js → index-legacy-BFfoAOF1.js} +2 -2
  96. package/dist/assets/{index-legacy-DiTQKLfl.js.map → index-legacy-BFfoAOF1.js.map} +1 -1
  97. package/dist/assets/{index-legacy-BaUX-zxP.js → index-legacy-BLKO-78a.js} +8 -13
  98. package/dist/assets/index-legacy-BLKO-78a.js.map +1 -0
  99. package/dist/assets/{index-legacy-BA8TBope.js → index-legacy-BezkAR3b.js} +2 -2
  100. package/dist/assets/{index-legacy-BA8TBope.js.map → index-legacy-BezkAR3b.js.map} +1 -1
  101. package/dist/assets/{index-legacy-GmcnXr6o.js → index-legacy-BqL3XK76.js} +2 -2
  102. package/dist/assets/{index-legacy-GmcnXr6o.js.map → index-legacy-BqL3XK76.js.map} +1 -1
  103. package/dist/assets/{index-legacy-BzCDv5Tg.js → index-legacy-CRq_O11N.js} +2 -2
  104. package/dist/assets/{index-legacy-BzCDv5Tg.js.map → index-legacy-CRq_O11N.js.map} +1 -1
  105. package/dist/assets/{index-legacy-Bwwm9nit.js → index-legacy-CUZgiMNa.js} +2 -2
  106. package/dist/assets/{index-legacy-Bwwm9nit.js.map → index-legacy-CUZgiMNa.js.map} +1 -1
  107. package/dist/assets/{index-legacy-DTtXpYbD.js → index-legacy-CW0OHQkF.js} +2 -2
  108. package/dist/assets/{index-legacy-DTtXpYbD.js.map → index-legacy-CW0OHQkF.js.map} +1 -1
  109. package/dist/assets/{index-legacy-D-yT7UP7.js → index-legacy-CqVgmAMA.js} +2 -2
  110. package/dist/assets/{index-legacy-D-yT7UP7.js.map → index-legacy-CqVgmAMA.js.map} +1 -1
  111. package/dist/assets/{index-legacy-D14E8pOh.js → index-legacy-CslCZVZ0.js} +2 -2
  112. package/dist/assets/{index-legacy-D14E8pOh.js.map → index-legacy-CslCZVZ0.js.map} +1 -1
  113. package/dist/assets/index-legacy-DD6zMGGT.js +2 -0
  114. package/dist/assets/{index-legacy-B8pZsXYp.js.map → index-legacy-DD6zMGGT.js.map} +1 -1
  115. package/dist/assets/{index-legacy-B865ACt-.js → index-legacy-DVOM8HaY.js} +2 -2
  116. package/dist/assets/{index-legacy-B865ACt-.js.map → index-legacy-DVOM8HaY.js.map} +1 -1
  117. package/dist/assets/{index-legacy-z4MDfS45.js → index-legacy-DasH54g3.js} +2 -2
  118. package/dist/assets/{index-legacy-z4MDfS45.js.map → index-legacy-DasH54g3.js.map} +1 -1
  119. package/dist/assets/{index-legacy-D8QuGa98.js → index-legacy-DcKfHHls.js} +2 -2
  120. package/dist/assets/{index-legacy-D8QuGa98.js.map → index-legacy-DcKfHHls.js.map} +1 -1
  121. package/dist/assets/index-legacy-Dt4Eky4l.js +2 -0
  122. package/dist/assets/index-legacy-Dt4Eky4l.js.map +1 -0
  123. package/dist/assets/{index-legacy-DqLKrBdr.js → index-legacy-bElvuK5I.js} +2 -2
  124. package/dist/assets/{index-legacy-DqLKrBdr.js.map → index-legacy-bElvuK5I.js.map} +1 -1
  125. package/dist/assets/{index-legacy-BWGaTIeh.js → index-legacy-pP3Pmgbs.js} +2 -2
  126. package/dist/assets/{index-legacy-BWGaTIeh.js.map → index-legacy-pP3Pmgbs.js.map} +1 -1
  127. package/dist/assets/{index-WblpVXQj.js → index-mKO4gpWB.js} +2 -2
  128. package/dist/assets/{index-WblpVXQj.js.map → index-mKO4gpWB.js.map} +1 -1
  129. package/dist/assets/{index-CYU98hsF.js → index-my4zFbcM.js} +2 -2
  130. package/dist/assets/{index-CYU98hsF.js.map → index-my4zFbcM.js.map} +1 -1
  131. package/dist/assets/{index-C1FTaXL2.js → index-q94vR-7W.js} +2 -2
  132. package/dist/assets/{index-C1FTaXL2.js.map → index-q94vR-7W.js.map} +1 -1
  133. package/dist/assets/index-yrncPnXk.js +36 -0
  134. package/dist/assets/index-yrncPnXk.js.map +1 -0
  135. package/dist/assets/{isEqual-a1R5cOCU.js → isEqual-DdkrQbjH.js} +2 -2
  136. package/dist/assets/{isEqual-a1R5cOCU.js.map → isEqual-DdkrQbjH.js.map} +1 -1
  137. package/dist/assets/{isEqual-legacy-D_cb03Zv.js → isEqual-legacy-4dmPHJnc.js} +2 -2
  138. package/dist/assets/{isEqual-legacy-D_cb03Zv.js.map → isEqual-legacy-4dmPHJnc.js.map} +1 -1
  139. package/dist/assets/{refresh-Bz5ULfz9.js → refresh-CCIG6-IB.js} +2 -2
  140. package/dist/assets/{refresh-Bz5ULfz9.js.map → refresh-CCIG6-IB.js.map} +1 -1
  141. package/dist/assets/{refresh-legacy-NT5iEzmI.js → refresh-legacy-CchIU9Mh.js} +2 -2
  142. package/dist/assets/{refresh-legacy-NT5iEzmI.js.map → refresh-legacy-CchIU9Mh.js.map} +1 -1
  143. package/dist/assets/{tip-BCCd4P_x.js → tip-BM0xMiq8.js} +2 -2
  144. package/dist/assets/{tip-BCCd4P_x.js.map → tip-BM0xMiq8.js.map} +1 -1
  145. package/dist/assets/{tip-legacy-Cm2JPa4-.js → tip-legacy-DpAPUNpm.js} +2 -2
  146. package/dist/assets/{tip-legacy-Cm2JPa4-.js.map → tip-legacy-DpAPUNpm.js.map} +1 -1
  147. package/dist/assets/validator-DG4_rB-x.js +2 -0
  148. package/dist/assets/{validator-BESrcCvQ.js.map → validator-DG4_rB-x.js.map} +1 -1
  149. package/dist/assets/validator-legacy-CN5REdqi.js +2 -0
  150. package/dist/assets/{validator-legacy-xarmcLjs.js.map → validator-legacy-CN5REdqi.js.map} +1 -1
  151. package/dist/index.html +2 -2
  152. package/package.json +3 -3
  153. package/dist/assets/index-BYEN2QaU.css +0 -1
  154. package/dist/assets/index-C0TTJR9g.js +0 -2
  155. package/dist/assets/index-C0TTJR9g.js.map +0 -1
  156. package/dist/assets/index-CvlaXQXr.js +0 -40
  157. package/dist/assets/index-CvlaXQXr.js.map +0 -1
  158. package/dist/assets/index-CwmiY_sv.css +0 -1
  159. package/dist/assets/index-E_UelRIx.js +0 -2
  160. package/dist/assets/index-legacy-B8pZsXYp.js +0 -2
  161. package/dist/assets/index-legacy-BaUX-zxP.js.map +0 -1
  162. package/dist/assets/index-legacy-DZC-JuD-.js +0 -2
  163. package/dist/assets/index-legacy-DZC-JuD-.js.map +0 -1
  164. package/dist/assets/validator-BESrcCvQ.js +0 -2
  165. package/dist/assets/validator-legacy-xarmcLjs.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index-legacy-B865ACt-.js","sources":["../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/card/src/card.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/card/index.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/card/src/card2.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/input-number/src/input-number.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/input-number/src/input-number2.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/input-number/index.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/circle-close-filled.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/circle-plus-filled.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/delete.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/edit.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/menu.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/plus.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/share.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/top.mjs","../../src/pages/dashboard/tasks/components/CategoryPanel.vue","../../src/pages/dashboard/tasks/components/CreateTask.vue","../../src/pages/dashboard/tasks/public.ts","../../src/pages/dashboard/tasks/components/infoPanel/ddl.vue","../../src/pages/dashboard/tasks/components/infoPanel/people.vue","../../src/pages/dashboard/tasks/components/infoPanel/template.vue","../../src/pages/dashboard/tasks/components/infoPanel/info.vue","../../src/pages/dashboard/tasks/components/infoPanel/tipInfo.vue","../../src/pages/dashboard/tasks/components/infoPanel/file.vue","../../src/pages/dashboard/tasks/index.vue"],"sourcesContent":["import '../../../utils/index.mjs';\nimport { buildProps, definePropType } from '../../../utils/vue/props/runtime.mjs';\n\nconst cardProps = buildProps({\n header: {\n type: String,\n default: \"\"\n },\n bodyStyle: {\n type: definePropType([String, Object, Array]),\n default: \"\"\n },\n shadow: {\n type: String,\n values: [\"always\", \"hover\", \"never\"],\n default: \"always\"\n }\n});\n\nexport { cardProps };\n//# sourceMappingURL=card.mjs.map\n","import '../../utils/index.mjs';\nimport Card from './src/card2.mjs';\nexport { cardProps } from './src/card.mjs';\nimport { withInstall } from '../../utils/vue/install.mjs';\n\nconst ElCard = withInstall(Card);\n\nexport { ElCard, ElCard as default };\n//# sourceMappingURL=index.mjs.map\n","import { defineComponent, openBlock, createElementBlock, normalizeClass, unref, renderSlot, createTextVNode, toDisplayString, createCommentVNode, createElementVNode, normalizeStyle } from 'vue';\nimport '../../../hooks/index.mjs';\nimport { cardProps } from './card.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\n\nconst __default__ = {\n name: \"ElCard\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: cardProps,\n setup(__props) {\n const ns = useNamespace(\"card\");\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([unref(ns).b(), unref(ns).is(`${_ctx.shadow}-shadow`)])\n }, [\n _ctx.$slots.header || _ctx.header ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: normalizeClass(unref(ns).e(\"header\"))\n }, [\n renderSlot(_ctx.$slots, \"header\", {}, () => [\n createTextVNode(toDisplayString(_ctx.header), 1)\n ])\n ], 2)) : createCommentVNode(\"v-if\", true),\n createElementVNode(\"div\", {\n class: normalizeClass(unref(ns).e(\"body\")),\n style: normalizeStyle(_ctx.bodyStyle)\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 6)\n ], 2);\n };\n }\n});\nvar Card = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/card/src/card.vue\"]]);\n\nexport { Card as default };\n//# sourceMappingURL=card2.mjs.map\n","import { isNil } from 'lodash-unified';\nimport '../../../hooks/index.mjs';\nimport '../../../utils/index.mjs';\nimport '../../../constants/index.mjs';\nimport { buildProps } from '../../../utils/vue/props/runtime.mjs';\nimport { useSizeProp } from '../../../hooks/use-common-props/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { CHANGE_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT } from '../../../constants/event.mjs';\n\nconst inputNumberProps = buildProps({\n id: {\n type: String,\n default: void 0\n },\n step: {\n type: Number,\n default: 1\n },\n stepStrictly: Boolean,\n max: {\n type: Number,\n default: Number.POSITIVE_INFINITY\n },\n min: {\n type: Number,\n default: Number.NEGATIVE_INFINITY\n },\n modelValue: Number,\n disabled: Boolean,\n size: useSizeProp,\n controls: {\n type: Boolean,\n default: true\n },\n controlsPosition: {\n type: String,\n default: \"\",\n values: [\"\", \"right\"]\n },\n valueOnClear: {\n type: [String, Number, null],\n validator: (val) => val === null || isNumber(val) || [\"min\", \"max\"].includes(val),\n default: null\n },\n name: String,\n label: String,\n placeholder: String,\n precision: {\n type: Number,\n validator: (val) => val >= 0 && val === Number.parseInt(`${val}`, 10)\n },\n validateEvent: {\n type: Boolean,\n default: true\n }\n});\nconst inputNumberEmits = {\n [CHANGE_EVENT]: (prev, cur) => prev !== cur,\n blur: (e) => e instanceof FocusEvent,\n focus: (e) => e instanceof FocusEvent,\n [INPUT_EVENT]: (val) => isNumber(val) || isNil(val),\n [UPDATE_MODEL_EVENT]: (val) => isNumber(val) || isNil(val)\n};\n\nexport { inputNumberEmits, inputNumberProps };\n//# sourceMappingURL=input-number.mjs.map\n","import { defineComponent, ref, reactive, computed, watch, onMounted, onUpdated, openBlock, createElementBlock, normalizeClass, unref, withModifiers, withDirectives, withKeys, createVNode, withCtx, createBlock, createCommentVNode } from 'vue';\nimport { isNil } from 'lodash-unified';\nimport { ElInput } from '../../input/index.mjs';\nimport { ElIcon } from '../../icon/index.mjs';\nimport '../../../directives/index.mjs';\nimport '../../../hooks/index.mjs';\nimport '../../../utils/index.mjs';\nimport { ArrowDown, Minus, ArrowUp, Plus } from '@element-plus/icons-vue';\nimport { inputNumberProps, inputNumberEmits } from './input-number.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useLocale } from '../../../hooks/use-locale/index.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\nimport { useFormItem } from '../../../hooks/use-form-item/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { isUndefined } from '../../../utils/types.mjs';\nimport { debugWarn } from '../../../utils/error.mjs';\nimport { useSize, useDisabled } from '../../../hooks/use-common-props/index.mjs';\nimport { isString } from '@vue/shared';\nimport RepeatClick from '../../../directives/repeat-click/index.mjs';\n\nconst _hoisted_1 = [\"aria-label\", \"onKeydown\"];\nconst _hoisted_2 = [\"aria-label\", \"onKeydown\"];\nconst __default__ = {\n name: \"ElInputNumber\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: inputNumberProps,\n emits: inputNumberEmits,\n setup(__props, { expose, emit }) {\n const props = __props;\n const { t } = useLocale();\n const ns = useNamespace(\"input-number\");\n const input = ref();\n const data = reactive({\n currentValue: props.modelValue,\n userInput: null\n });\n const { formItem } = useFormItem();\n const minDisabled = computed(() => isNumber(props.modelValue) && ensurePrecision(props.modelValue, -1) < props.min);\n const maxDisabled = computed(() => isNumber(props.modelValue) && ensurePrecision(props.modelValue) > props.max);\n const numPrecision = computed(() => {\n const stepPrecision = getPrecision(props.step);\n if (!isUndefined(props.precision)) {\n if (stepPrecision > props.precision) {\n debugWarn(\"InputNumber\", \"precision should not be less than the decimal places of step\");\n }\n return props.precision;\n } else {\n return Math.max(getPrecision(props.modelValue), stepPrecision);\n }\n });\n const controlsAtRight = computed(() => {\n return props.controls && props.controlsPosition === \"right\";\n });\n const inputNumberSize = useSize();\n const inputNumberDisabled = useDisabled();\n const displayValue = computed(() => {\n if (data.userInput !== null) {\n return data.userInput;\n }\n let currentValue = data.currentValue;\n if (isNil(currentValue))\n return \"\";\n if (isNumber(currentValue)) {\n if (Number.isNaN(currentValue))\n return \"\";\n if (!isUndefined(props.precision)) {\n currentValue = currentValue.toFixed(props.precision);\n }\n }\n return currentValue;\n });\n const toPrecision = (num, pre) => {\n if (isUndefined(pre))\n pre = numPrecision.value;\n if (pre === 0)\n return Math.round(num);\n let snum = String(num);\n const pointPos = snum.indexOf(\".\");\n if (pointPos === -1)\n return num;\n const nums = snum.replace(\".\", \"\").split(\"\");\n const datum = nums[pointPos + pre];\n if (!datum)\n return num;\n const length = snum.length;\n if (snum.charAt(length - 1) === \"5\") {\n snum = `${snum.slice(0, Math.max(0, length - 1))}6`;\n }\n return Number.parseFloat(Number(snum).toFixed(pre));\n };\n const getPrecision = (value) => {\n if (isNil(value))\n return 0;\n const valueString = value.toString();\n const dotPosition = valueString.indexOf(\".\");\n let precision = 0;\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1;\n }\n return precision;\n };\n const ensurePrecision = (val, coefficient = 1) => {\n if (!isNumber(val))\n return data.currentValue;\n return toPrecision(val + props.step * coefficient);\n };\n const increase = () => {\n if (inputNumberDisabled.value || maxDisabled.value)\n return;\n const value = props.modelValue || 0;\n const newVal = ensurePrecision(value);\n setCurrentValue(newVal);\n };\n const decrease = () => {\n if (inputNumberDisabled.value || minDisabled.value)\n return;\n const value = props.modelValue || 0;\n const newVal = ensurePrecision(value, -1);\n setCurrentValue(newVal);\n };\n const verifyValue = (value, update) => {\n const { max, min, step, precision, stepStrictly, valueOnClear } = props;\n let newVal = Number(value);\n if (isNil(value) || Number.isNaN(newVal)) {\n return null;\n }\n if (value === \"\") {\n if (valueOnClear === null) {\n return null;\n }\n newVal = isString(valueOnClear) ? { min, max }[valueOnClear] : valueOnClear;\n }\n if (stepStrictly) {\n newVal = toPrecision(Math.round(newVal / step) * step, precision);\n }\n if (!isUndefined(precision)) {\n newVal = toPrecision(newVal, precision);\n }\n if (newVal > max || newVal < min) {\n newVal = newVal > max ? max : min;\n update && emit(\"update:modelValue\", newVal);\n }\n return newVal;\n };\n const setCurrentValue = (value) => {\n var _a;\n const oldVal = data.currentValue;\n const newVal = verifyValue(value);\n if (oldVal === newVal)\n return;\n data.userInput = null;\n emit(\"update:modelValue\", newVal);\n emit(\"input\", newVal);\n emit(\"change\", newVal, oldVal);\n if (props.validateEvent) {\n (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, \"change\").catch((err) => debugWarn(err));\n }\n data.currentValue = newVal;\n };\n const handleInput = (value) => {\n return data.userInput = value;\n };\n const handleInputChange = (value) => {\n const newVal = value !== \"\" ? Number(value) : \"\";\n if (isNumber(newVal) && !Number.isNaN(newVal) || value === \"\") {\n setCurrentValue(newVal);\n }\n data.userInput = null;\n };\n const focus = () => {\n var _a, _b;\n (_b = (_a = input.value) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a);\n };\n const blur = () => {\n var _a, _b;\n (_b = (_a = input.value) == null ? void 0 : _a.blur) == null ? void 0 : _b.call(_a);\n };\n const handleFocus = (event) => {\n emit(\"focus\", event);\n };\n const handleBlur = (event) => {\n var _a;\n emit(\"blur\", event);\n if (props.validateEvent) {\n (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, \"blur\").catch((err) => debugWarn(err));\n }\n };\n watch(() => props.modelValue, (value) => {\n data.currentValue = verifyValue(value, true);\n data.userInput = null;\n }, { immediate: true });\n onMounted(() => {\n var _a;\n const { min, max, modelValue } = props;\n const innerInput = (_a = input.value) == null ? void 0 : _a.input;\n innerInput.setAttribute(\"role\", \"spinbutton\");\n if (Number.isFinite(max)) {\n innerInput.setAttribute(\"aria-valuemax\", String(max));\n } else {\n innerInput.removeAttribute(\"aria-valuemax\");\n }\n if (Number.isFinite(min)) {\n innerInput.setAttribute(\"aria-valuemin\", String(min));\n } else {\n innerInput.removeAttribute(\"aria-valuemin\");\n }\n innerInput.setAttribute(\"aria-valuenow\", String(data.currentValue));\n innerInput.setAttribute(\"aria-disabled\", String(inputNumberDisabled.value));\n if (!isNumber(modelValue) && modelValue != null) {\n let val = Number(modelValue);\n if (Number.isNaN(val)) {\n val = null;\n }\n emit(\"update:modelValue\", val);\n }\n });\n onUpdated(() => {\n var _a;\n const innerInput = (_a = input.value) == null ? void 0 : _a.input;\n innerInput == null ? void 0 : innerInput.setAttribute(\"aria-valuenow\", `${data.currentValue}`);\n });\n expose({\n focus,\n blur\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\n unref(ns).b(),\n unref(ns).m(unref(inputNumberSize)),\n unref(ns).is(\"disabled\", unref(inputNumberDisabled)),\n unref(ns).is(\"without-controls\", !_ctx.controls),\n unref(ns).is(\"controls-right\", unref(controlsAtRight))\n ]),\n onDragstart: _cache[0] || (_cache[0] = withModifiers(() => {\n }, [\"prevent\"]))\n }, [\n _ctx.controls ? withDirectives((openBlock(), createElementBlock(\"span\", {\n key: 0,\n role: \"button\",\n \"aria-label\": unref(t)(\"el.inputNumber.decrease\"),\n class: normalizeClass([unref(ns).e(\"decrease\"), unref(ns).is(\"disabled\", unref(minDisabled))]),\n onKeydown: withKeys(decrease, [\"enter\"])\n }, [\n createVNode(unref(ElIcon), null, {\n default: withCtx(() => [\n unref(controlsAtRight) ? (openBlock(), createBlock(unref(ArrowDown), { key: 0 })) : (openBlock(), createBlock(unref(Minus), { key: 1 }))\n ]),\n _: 1\n })\n ], 42, _hoisted_1)), [\n [unref(RepeatClick), decrease]\n ]) : createCommentVNode(\"v-if\", true),\n _ctx.controls ? withDirectives((openBlock(), createElementBlock(\"span\", {\n key: 1,\n role: \"button\",\n \"aria-label\": unref(t)(\"el.inputNumber.increase\"),\n class: normalizeClass([unref(ns).e(\"increase\"), unref(ns).is(\"disabled\", unref(maxDisabled))]),\n onKeydown: withKeys(increase, [\"enter\"])\n }, [\n createVNode(unref(ElIcon), null, {\n default: withCtx(() => [\n unref(controlsAtRight) ? (openBlock(), createBlock(unref(ArrowUp), { key: 0 })) : (openBlock(), createBlock(unref(Plus), { key: 1 }))\n ]),\n _: 1\n })\n ], 42, _hoisted_2)), [\n [unref(RepeatClick), increase]\n ]) : createCommentVNode(\"v-if\", true),\n createVNode(unref(ElInput), {\n id: _ctx.id,\n ref_key: \"input\",\n ref: input,\n type: \"number\",\n step: _ctx.step,\n \"model-value\": unref(displayValue),\n placeholder: _ctx.placeholder,\n disabled: unref(inputNumberDisabled),\n size: unref(inputNumberSize),\n max: _ctx.max,\n min: _ctx.min,\n name: _ctx.name,\n label: _ctx.label,\n \"validate-event\": false,\n onKeydown: [\n withKeys(withModifiers(increase, [\"prevent\"]), [\"up\"]),\n withKeys(withModifiers(decrease, [\"prevent\"]), [\"down\"])\n ],\n onBlur: handleBlur,\n onFocus: handleFocus,\n onInput: handleInput,\n onChange: handleInputChange\n }, null, 8, [\"id\", \"step\", \"model-value\", \"placeholder\", \"disabled\", \"size\", \"max\", \"min\", \"name\", \"label\", \"onKeydown\"])\n ], 34);\n };\n }\n});\nvar InputNumber = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/input-number/src/input-number.vue\"]]);\n\nexport { InputNumber as default };\n//# sourceMappingURL=input-number2.mjs.map\n","import '../../utils/index.mjs';\nimport InputNumber from './src/input-number2.mjs';\nexport { inputNumberEmits, inputNumberProps } from './src/input-number.mjs';\nimport { withInstall } from '../../utils/vue/install.mjs';\n\nconst ElInputNumber = withInstall(InputNumber);\n\nexport { ElInputNumber, ElInputNumber as default };\n//# sourceMappingURL=index.mjs.map\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"CircleCloseFilled\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336L512 457.664z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar circleCloseFilled = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { circleCloseFilled as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"CirclePlusFilled\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-38.4 409.6H326.4a38.4 38.4 0 1 0 0 76.8h147.2v147.2a38.4 38.4 0 0 0 76.8 0V550.4h147.2a38.4 38.4 0 0 0 0-76.8H550.4V326.4a38.4 38.4 0 1 0-76.8 0v147.2z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar circlePlusFilled = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { circlePlusFilled as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Delete\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar _delete = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { _delete as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Edit\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640V512z\"\n}, null, -1);\nconst _hoisted_3 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z\"\n}, null, -1);\nconst _hoisted_4 = [\n _hoisted_2,\n _hoisted_3\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_4);\n}\nvar edit = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { edit as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Menu\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M160 448a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H608zM160 896a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H608z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar menu = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { menu as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Plus\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64h352z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar plus = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { plus as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Share\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m679.872 348.8-301.76 188.608a127.808 127.808 0 0 1 5.12 52.16l279.936 104.96a128 128 0 1 1-22.464 59.904l-279.872-104.96a128 128 0 1 1-16.64-166.272l301.696-188.608a128 128 0 1 1 33.92 54.272z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar share = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { share as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Top\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M572.235 205.282v600.365a30.118 30.118 0 1 1-60.235 0V205.282L292.382 438.633a28.913 28.913 0 0 1-42.646 0 33.43 33.43 0 0 1 0-45.236l271.058-288.045a28.913 28.913 0 0 1 42.647 0L834.5 393.397a33.43 33.43 0 0 1 0 45.176 28.913 28.913 0 0 1-42.647 0l-219.618-233.23z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar top = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { top as default };\n","<template>\n <!-- 分类管理 -->\n <div class=\"panel\">\n <!-- 按钮 -->\n <div class=\"btn-area\">\n <h5>分类列表</h5>\n <h6 style=\"font-weight: lighter\">(点击分类可筛选任务)</h6>\n </div>\n <!-- 分类列表 -->\n <div style=\"margin-top: 15px\" class=\"category-list\">\n <div class=\"new-tag-wrap\">\n <!-- 新分类 -->\n <el-input\n class=\"input-new-tag el-tag\"\n v-if=\"isShowCreateCategory\"\n v-model=\"categoryName\"\n ref=\"saveTagInput\"\n placeholder=\"分类名称\"\n @keyup.enter=\"addCategory\"\n @focusout=\"addCategory\"\n ></el-input>\n <el-button\n v-else\n class=\"button-new-tag el-tag\"\n size=\"small\"\n @click=\"isShowCreateCategory = true\"\n >+ New 分类</el-button\n >\n <el-tag\n :effect=\"category === 'default' ? 'dark' : 'plain'\"\n @click=\"handleClickCategory('default')\"\n >默认{{ taskCount('default') }}</el-tag\n >\n <span class=\"list-tip\"\n ><el-tag\n type=\"danger\"\n :effect=\"category === 'trash' ? 'dark' : 'plain'\"\n @click=\"handleClickCategory('trash')\"\n ><el-icon><DeleteFilled /></el-icon> 回收站{{\n taskCount('trash')\n }}</el-tag\n ></span\n >\n </div>\n <div class=\"tag-wrap\">\n <div class=\"tag-list\">\n <el-tag\n v-for=\"tag in categorys\"\n :key=\"tag.k\"\n closable\n :effect=\"category === tag.k ? 'dark' : 'plain'\"\n @close=\"handleDeleteCategory(tag)\"\n @click=\"handleClickCategory(tag.k)\"\n >{{ tag.name }}{{ taskCount(tag.k) }}</el-tag\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, defineComponent, ref } from 'vue'\nimport { DeleteFilled } from '@element-plus/icons-vue'\nimport { useStore } from 'vuex'\n\nexport default defineComponent({\n name: 'categoryPanel',\n components: {\n DeleteFilled\n },\n props: {\n category: {\n type: String,\n required: true,\n default: 'default'\n }\n },\n setup(props, context) {\n const $store = useStore()\n // 分类相关\n const categorys = computed(() => $store.state.category.categoryList)\n const tasks = computed(() => $store.state.task.taskList)\n const taskCount = (c: string) => {\n const count = tasks.value.filter((t: any) => t.category === c).length\n return count === 0 ? '' : ` (${count})`\n }\n const isShowCreateCategory = ref(false)\n const categoryName = ref('')\n const addCategory = () => {\n isShowCreateCategory.value = false\n if (!categoryName.value.trim()) {\n // ElMessage.warning('不能为空')\n return\n }\n $store\n .dispatch('category/createCategory', categoryName.value)\n .then(() => {\n ElMessage.success('创建成功')\n })\n .catch((err) => {\n if (err.code === 2001) {\n ElMessage.warning('分类名称已存在')\n }\n })\n categoryName.value = ''\n }\n\n const handleClickCategory = (k: string) => {\n context.emit('update:category', k)\n }\n\n const handleDeleteCategory = (c: any) => {\n ElMessageBox.confirm('是否删除', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消'\n })\n .then(() => {\n $store.dispatch('category/deleteCategory', c.k).then(() => {\n // 删除后变动的默认选择\n handleClickCategory('default')\n ElMessage.success('删除成功')\n // 获取最新的任务\n $store.dispatch('task/getTask')\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n }\n\n return {\n categorys,\n isShowCreateCategory,\n categoryName,\n addCategory,\n handleDeleteCategory,\n handleClickCategory,\n taskCount\n }\n }\n})\n</script>\n<style scoped lang=\"scss\">\n.el-tag {\n margin-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n}\n.new-tag-wrap {\n display: flex;\n align-items: center;\n}\n.button-new-tag {\n margin-left: 10px;\n height: 32px;\n line-height: 30px;\n padding-top: 0;\n padding-bottom: 0;\n}\n.input-new-tag {\n width: 120px;\n padding: 0;\n margin-left: 10px;\n margin-bottom: 10px;\n vertical-align: bottom;\n}\n.panel {\n padding: 1em;\n background-color: #fff;\n margin: 10px auto;\n box-sizing: border-box;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n}\n.btn-area {\n display: flex;\n justify-content: center;\n}\n.list-tip {\n // color: #67c23a;\n // font-size: 10px;\n margin-right: 10px;\n flex: 1;\n text-align: right;\n}\n.tag-wrap {\n width: 100%;\n height: 150px;\n}\n.tag-list {\n height: 150px;\n overflow-x: hidden;\n overflow-y: scroll;\n display: flex;\n flex-wrap: wrap;\n :deep(.el-tag) {\n width: 140px;\n }\n :deep(.el-tag__content) {\n width: 100px;\n text-align: center;\n text-overflow: ellipsis;\n word-break: keep-all;\n overflow: hidden;\n }\n}\n</style>\n","<template>\n <div>\n <div class=\"btn-area\">\n <el-button size=\"large\" type=\"primary\" :plain=\"!isShowCreateTask\" @click=\"\n isShowCreateTask =\n !isShowCreateTask\n \">\n {{\n isShowCreateTask\n ? '关闭创建面板'\n : '创建收集任务'\n }}\n </el-button>\n </div>\n <!-- 新增区域 -->\n <div v-show=\"isShowCreateTask\">\n <div class=\"input-container\">\n <el-input placeholder=\"请输入任务名称(上述列表选择分类)\" v-model=\"taskName\"></el-input>\n <el-button @click=\"createTask\" :type=\"taskName?.length ? 'success' : 'default'\">确定</el-button>\n </div>\n </div>\n <tip class=\"p10\">\n 点击\n <el-icon>\n <Menu />\n </el-icon> 可以进一步的调整任务\n </tip>\n <tip>\n 设置截止时间,自动重命名,名单限制,批注,文件模板。。🚀\n </tip>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport {\n computed,\n ref,\n} from 'vue'\nimport { useStore } from 'vuex'\nimport { Menu } from '@element-plus/icons-vue'\nimport Tip from './infoPanel/tip.vue'\n\nconst props = defineProps({\n activeCategoryKey: {\n type: String,\n default: 'default',\n },\n})\nconst $store = useStore()\nconst categorys = computed(() => $store.state.category\n .categoryList)\nconst categoryName = computed(() => {\n if (props.activeCategoryKey\n === 'default') {\n return '默认'\n }\n return categorys.value.find((v: any) => v.k\n === props.activeCategoryKey).name\n})\n// 任务相关\nconst isShowCreateTask = ref(false)\nconst taskName = ref('')\nconst createTask = () => {\n if (!taskName.value.trim()) {\n ElMessage.warning('不能为空')\n return\n }\n $store\n .dispatch('task/createTask', {\n name: taskName.value,\n category: props.activeCategoryKey,\n })\n .then(() => {\n ElMessage.success('创建成功')\n })\n taskName.value = ''\n}\n\n</script>\n<style scoped>\n.btn-area {\n display: flex;\n justify-content: center;\n}\n\n.input-container {\n margin: 15px auto;\n max-width: 600px;\n background-color: #fff;\n display: flex;\n justify-content: space-around;\n}\n</style>\n","import { ElMessage } from 'element-plus'\nimport { TaskApi } from '@/apis'\nimport { debounce } from '@/utils/other'\n\nexport const updateTaskInfo: (\n key: string,\n options: TaskApiTypes.TaskInfo,\n successInfo?: boolean\n) => void = debounce(\n (key, options, successInfo = true) => {\n if (key) {\n TaskApi.updateTaskMoreInfo(key, options)\n .then(() => {\n if (successInfo) {\n ElMessage.success({\n message: '设置成功',\n zIndex: 4000,\n duration: 1000\n })\n }\n })\n .catch(() => {\n ElMessage.error({\n message: '设置失败',\n zIndex: 4000\n })\n })\n }\n },\n 1000,\n true\n)\n","<template>\n <div class=\"tc ddl\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTI4NjU5Nw==649149286597',\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTMxMDEyOQ==649149310129',\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTM3MzgxOA==649149373818'\n ]\"\n >设置截止日期,截止后将不能再提交文件。</tip\n >\n <div class=\"tc flex fc fac\">\n <el-date-picker\n :editable=\"false\"\n v-model=\"newDate\"\n type=\"datetime\"\n placeholder=\"点击设置新截止日期\"\n @change=\"updateDDL\"\n :default-time=\"new Date(ddl)\"\n ></el-date-picker>\n <el-button v-if=\"newDate\" @click=\"closeDDL\">取消</el-button>\n </div>\n <div style=\"margin-top: 10px\" v-if=\"newDate\">\n <tip>{{ isOver ? '已经截止' : `剩余时间: ${waitTimeStr}` }} </tip>\n </div>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, onMounted, ref, watchEffect } from 'vue'\nimport { formatDate } from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n ddl: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\n\nconst newDate = ref()\nwatchEffect(() => {\n if (props.ddl) {\n newDate.value = new Date(props.ddl)\n } else {\n newDate.value = null\n }\n})\n// 更新DDL\nconst updateDDL = () => {\n if (newDate.value) {\n const ddl = formatDate(\n new Date(newDate.value.getTime() - 1000 * 60 * 60 * 8)\n )\n updateTaskInfo(props.k, { ddl })\n }\n}\n// 关闭DDL\nconst closeDDL = () => {\n newDate.value = null\n updateTaskInfo(props.k, { ddl: null })\n}\n\nconst waitTime = ref(0)\nconst isOver = computed(() => waitTime.value <= 0)\nconst waitTimeStr = computed(() => {\n let seconds = ~~(waitTime.value / 1000)\n let hour = ~~(seconds / (60 * 60))\n const day = ~~(hour / 24)\n hour %= 24\n const minute = ~~((seconds % 3600) / 60)\n seconds %= 60\n return `剩余${day}天${hour}时${minute}分${seconds}秒`\n})\n\nconst refreshWaitTime = (loop = true) => {\n if (newDate.value) {\n waitTime.value = newDate.value.getTime() - Date.now()\n } else {\n waitTime.value = 0\n }\n if (loop) {\n setTimeout(() => {\n refreshWaitTime()\n }, 1000)\n }\n}\n\nonMounted(() => {\n refreshWaitTime()\n})\n</script>\n","<script lang=\"ts\" setup>\nimport type { UploadUserFile } from 'element-plus'\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, reactive, ref, watch, watchEffect } from 'vue'\nimport { useStore } from 'vuex'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { PeopleApi, TaskApi } from '@/apis'\nimport { tableToExcel, uploadFile } from '@/utils/networkUtil'\nimport { formatDate } from '@/utils/stringUtil'\nimport { useIsMobile } from '@/composables'\n\nconst props = defineProps({\n value: {\n type: Number,\n defalut: 0,\n },\n k: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: '',\n },\n field: {\n type: String,\n default: '姓名',\n },\n})\n\nconst activeTab = ref('手动添加')\nconst userInputName = ref('')\nconst importStatus = ref(false)\n\nfunction handAddName() {\n if (!userInputName.value) {\n return\n }\n importStatus.value = true\n PeopleApi.addPeopleByUser(userInputName.value, props.k)\n .then(() => {\n ElMessage.success(`添加 ${userInputName.value} 成功`)\n })\n .catch(() => {\n ElMessage.error(`${userInputName.value} 已存在`)\n })\n .finally(() => {\n importStatus.value = false\n userInputName.value = ''\n })\n}\nconst checkMore = ref(false)\n\nconst people = ref(0)\nwatchEffect(() => {\n people.value = props.value as number\n})\n// 限制提交人员\nfunction updateLimitPeople(limit: boolean) {\n updateTaskInfo(props.k, {\n people: +limit,\n })\n people.value = +limit\n}\n\n// 查看提交情况\nconst showPeopleList = ref(false)\nconst peopleList: any = reactive([])\nconst selectSubmitStatus = ref('all')\nconst searchName = ref('')\nconst filterPeopleBySearchWord = computed(() => {\n if (!searchName.value) {\n return peopleList\n }\n return peopleList.filter(v => v.name.includes(searchName.value))\n})\nconst peopleSubmitData = computed(() => {\n if (selectSubmitStatus.value === 'all') {\n return filterPeopleBySearchWord.value\n }\n return filterPeopleBySearchWord.value.filter(\n p => p.status === selectSubmitStatus.value,\n )\n})\nconst isLoadingPeopleData = ref(false)\nfunction refreshSubmitData() {\n isLoadingPeopleData.value = true\n PeopleApi.getPeople(props.k, `${+checkMore.value}`).then((res) => {\n peopleList.splice(0, peopleList.length)\n peopleList.push(...res.data.people)\n peopleList.forEach((p) => {\n if (!p.status && p.count === 0) {\n p.lastDate = '暂无记录'\n }\n else {\n p.lastDate = formatDate(new Date(p.lastDate), 'yyyy-MM-dd hh:mm:ss')\n }\n })\n isLoadingPeopleData.value = false\n })\n}\nfunction handleCheckMore() {\n checkMore.value = !checkMore.value\n if (checkMore.value) {\n refreshSubmitData()\n }\n}\nfunction checkPeople() {\n showPeopleList.value = true\n // 默认不展示提交数量\n checkMore.value = false\n refreshSubmitData()\n}\nfunction handleDeletePeople(item: any) {\n ElMessageBox.confirm('确认删除此人员吗', '数据无价,请谨慎操作')\n .then(() => {\n PeopleApi.deletePeople(props.k, item.id).then(() => {\n ElMessage.success('删除成功')\n peopleList.splice(\n peopleList.findIndex(v => v.id === item.id),\n 1,\n )\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n}\n// 文件上传\nconst peopleFileList = ref<UploadUserFile[]>([])\nconst peopleUpload = ref()\n// 超出选择的文件个数\nfunction handleExceedFile() {\n ElMessage.error('只能选择一个文件,可删除后重新选择')\n}\n// 清空文件\nfunction clearFiles() {\n peopleFileList.value.splice(0, peopleFileList.value.length)\n peopleUpload.value.clearFiles()\n}\n// 开始上传\nfunction submitUploadPeople() {\n peopleFileList.value.forEach((file) => {\n uploadFile(\n file.raw,\n `${import.meta.env.VITE_APP_AXIOS_BASE_URL}public/upload`,\n {\n success: (e: any) => {\n const { name, type } = e.data\n PeopleApi.importPeople(props.k, name, type).then((res) => {\n const { success, fail } = res.data\n ElMessage.success(`导入完成:${success}成功,${fail.length}失败`)\n if (fail.length > 0) {\n setTimeout(() => {\n ElMessage.info('自动开始下载未成功导入名单')\n tableToExcel(\n ['未成功导入名单'],\n fail.map((v: string) => [v]),\n `${props.name}_导入失败名单_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒',\n )}.xlsx`,\n )\n }, 1000)\n }\n clearFiles()\n })\n },\n },\n )\n })\n}\n// 添加文件\nfunction handleChangeFile(file: any) {\n if (file.raw.type !== 'text/plain') {\n ElMessage.warning({\n message: '只支持txt文件',\n zIndex: 4000,\n })\n clearFiles()\n }\n}\nfunction handleExportExcel() {\n if (peopleSubmitData.value.length === 0) {\n ElMessage.warning('表格中没有可导出数据')\n return\n }\n const headers = [\n '姓名',\n '提交状态',\n '提交数量',\n '最后操作时间',\n ...(checkMore.value ? ['现存数量', '提交次数'] : []),\n ]\n const body = peopleSubmitData.value.map((v) => {\n const { name, status, lastDate, submitCount, fileCount, count } = v\n return [\n name,\n status ? '✔' : 'x',\n submitCount,\n status ? formatDate(new Date(lastDate)) : '',\n ...(checkMore.value ? [fileCount, count] : []),\n ]\n })\n tableToExcel(\n headers,\n body,\n `${props.name}_提交情况_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒',\n )}.xlsx`,\n )\n ElMessage.success('导出成功')\n}\n\nconst isMobile = useIsMobile()\nconst importPanelInfo = reactive({\n taskList: [],\n type: 'override',\n taskValue: '',\n})\nconst showImportPanel = ref(false)\nasync function openImportPanel() {\n const taskKey = props.k\n // 通过任务Key获取可用任务列表,与概况信息\n const { data } = await PeopleApi.getUsefulTemplate(taskKey)\n importPanelInfo.taskList = data\n importPanelInfo.taskValue = data[0]?.taskKey || ''\n showImportPanel.value = true\n}\nconst ImportTaskTipMsg = computed(() => {\n const { taskList, taskValue } = importPanelInfo\n const task = taskList.find(v => v.taskKey === taskValue)\n if (!task) {\n return '无可用任务'\n }\n return `${task.count} 条数据`\n})\nfunction handleSaveImportInfo() {\n PeopleApi.importPeopleFromTpl(\n props.k,\n importPanelInfo.taskValue,\n importPanelInfo.type,\n ).then((res) => {\n showImportPanel.value = false\n const { success, fail } = res.data\n ElMessage.success(`导入成功${success}条,失败${fail.length}条`)\n\n if (fail.length > 0) {\n setTimeout(() => {\n ElMessage.info('自动开始下载未成功导入名单')\n tableToExcel(\n ['未成功导入名单'],\n fail.map((v: string) => [v]),\n `${props.name}_导入失败名单_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒',\n )}.xlsx`,\n )\n }, 1000)\n }\n })\n}\n\nconst importPanelFlexStyle = computed(() => (isMobile.value ? '0 0 auto' : 0.5))\n\nconst bindField = ref('姓名')\nwatch(\n () => props.field,\n (v) => {\n bindField.value = v\n },\n {\n immediate: true,\n },\n)\nfunction handleSureBind() {\n // 空值校验\n if (!bindField.value.trim().length) {\n ElMessage.warning('绑定的表单项不能为空')\n return\n }\n\n // 提交保存\n TaskApi.updateTaskMoreInfo(props.k, {\n bindField: bindField.value,\n }).then(() => {\n ElMessage.success('保存成功')\n })\n}\n</script>\n\n<template>\n <div class=\"tc info-panel\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzEwOTEzOQ==650183109139',\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjY3MTUyMw==651496671523',\n ]\"\n >\n 只有名单里的成员,才可提交文件\n </Tip>\n <el-button\n v-if=\"!people\"\n size=\"default\"\n round\n type=\"success\"\n @click=\"updateLimitPeople(true)\"\n >\n 开启\n </el-button>\n <el-button\n v-if=\"people\"\n size=\"default\"\n round\n type=\"danger\"\n @click=\"updateLimitPeople(false)\"\n >\n 关闭\n </el-button>\n <el-button\n v-if=\"people\"\n round\n size=\"default\"\n type=\"primary\"\n @click=\"checkPeople\"\n >\n 查看提交情况\n </el-button>\n <div v-if=\"people\" class=\"upload-people\">\n <el-radio-group v-model=\"activeTab\" size=\"small\">\n <el-radio-button label=\"文件导入\" />\n <el-radio-button label=\"任务导入\" />\n <el-radio-button label=\"手动添加\" />\n </el-radio-group>\n <div class=\"import-people-wrapper\">\n <div v-show=\"activeTab === '文件导入'\">\n <el-upload\n ref=\"peopleUpload\"\n v-model:file-list=\"peopleFileList\"\n accept=\"text/plain\"\n action=\"\"\n class=\"upload-demo\"\n :on-change=\"handleChangeFile\"\n :on-exceed=\"handleExceedFile\"\n :on-remove=\"clearFiles\"\n :auto-upload=\"false\"\n :limit=\"1\"\n >\n <template #trigger>\n <el-button size=\"small\" type=\"primary\">\n 选择文件\n </el-button>\n </template>\n <el-button\n style=\"margin-left: 10px\"\n size=\"small\"\n type=\"success\"\n :disabled=\"!peopleFileList.length\"\n @click=\"submitUploadPeople\"\n >\n 确定上传\n </el-button>\n <template #tip>\n <div class=\"el-upload__tip\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4Mjk2NjUxMA==650182966510',\n ]\"\n >\n 只能上传 .txt 文本文件,每行一个名字\n </Tip>\n <Tip>如名字有特殊字符,建议去除</Tip>\n <Tip>上传文件导入的方式,为追加导入,不会覆盖已存在数据</Tip>\n </div>\n </template>\n </el-upload>\n </div>\n <div v-show=\"activeTab === '任务导入'\">\n <!-- 从其它任务导入 -->\n <el-button size=\"small\" type=\"success\" @click=\"openImportPanel\">\n 选择任务\n </el-button>\n <div class=\"p10\">\n <Tip>支持从已有的任务直接导入名单</Tip>\n </div>\n </div>\n <div v-show=\"activeTab === '手动添加'\">\n <div style=\"max-width: 300px; margin: 0 auto\">\n <el-input\n v-model=\"userInputName\"\n :disabled=\"importStatus\"\n placeholder=\"请输入姓名\"\n >\n <template #append>\n <el-button @click=\"handAddName\">\n 确定\n </el-button>\n </template>\n </el-input>\n </div>\n <div class=\"p10\">\n <Tip>会自动判重,不会重复添加</Tip>\n <Tip>大量名单优先推荐使用文件导入</Tip>\n </div>\n </div>\n </div>\n <div style=\"max-width: 320px; margin: 0 auto\">\n <el-form label-width=\"120px\">\n <el-form-item label=\"绑定表单项\" style=\"margin-bottom: 6px\">\n <el-input v-model=\"bindField\" size=\"small\" clearable>\n <template #append>\n <el-button @click=\"handleSureBind\">\n 确定\n </el-button>\n </template>\n </el-input>\n </el-form-item>\n <Tip style=\"\">\n 和表单项同名字段,可以避免重复填写!!\n </Tip>\n </el-form>\n </div>\n </div>\n <el-dialog v-model=\"showPeopleList\" :fullscreen=\"isMobile\" title=\"提交情况\">\n <!-- 上部分的筛选菜单 -->\n <div class=\"nav\">\n <div class=\"item\">\n <el-button\n :disabled=\"peopleList.length === 0\"\n type=\"success\"\n size=\"default\"\n @click=\"handleExportExcel\"\n >\n 导出记录\n </el-button>\n </div>\n <div class=\"item\">\n <el-select\n v-model=\"selectSubmitStatus\"\n size=\"default\"\n placeholder=\"状态筛选\"\n >\n <el-option label=\"全部\" value=\"all\" />\n <el-option label=\"已提交\" :value=\"1\" />\n <el-option label=\"未提交\" :value=\"0\" />\n </el-select>\n </div>\n <div class=\"item\">\n <el-input\n v-model=\"searchName\"\n size=\"default\"\n placeholder=\"输入要查询的姓名\"\n />\n </div>\n <div class=\"item\">\n <el-button type=\"primary\" size=\"default\" @click=\"handleCheckMore\">\n {{ checkMore ? '隐藏' : '显示' }}详细提交情况\n </el-button>\n </div>\n </div>\n <!-- 概况信息 -->\n <div class=\"tc p10\">\n <span>共: {{ peopleSubmitData.length }} 条数据</span>,\n <span>已提交: {{ peopleSubmitData.filter((v) => v.status).length }}</span>,\n <span>未提交: {{ peopleSubmitData.filter((v) => !v.status).length }}</span>\n </div>\n <div class=\"tc p10\">\n <Tip>\"提交次数\" 用户实际的提交次数</Tip>\n <Tip>\"现存数量\" 还存在于服务器上的文件数 (不包含删除) --- 慢查询</Tip>\n <Tip>\"提交数量\" 用户实际提交的文件数 (不包含撤回) --- 慢查询</Tip>\n </div>\n <!-- 数据部分 -->\n <el-table\n v-loading=\"isLoadingPeopleData\"\n element-loading-text=\"Loading...\"\n stripe\n border\n :data=\"peopleSubmitData\"\n height=\"460px\"\n >\n <el-table-column label=\"序号\" width=\"60\">\n <template #default=\"scope\">\n <div style=\"text-align: center\">\n {{ scope.$index + 1 }}\n </div>\n </template>\n </el-table-column>\n <el-table-column property=\"name\" label=\"姓名\" />\n <el-table-column label=\"提交状态\" width=\"100\">\n <template #default=\"scope\">\n <span v-if=\"scope.row.status\" class=\"submit-ok\">已提交</span>\n <span v-else class=\"submit-fail\">未提交</span>\n </template>\n </el-table-column>\n <el-table-column\n property=\"count\"\n label=\"提交次数\"\n width=\"94\"\n />\n <el-table-column\n sortable\n property=\"lastDate\"\n label=\"最后操作时间\"\n width=\"120\"\n />\n <template v-if=\"checkMore\">\n <el-table-column\n property=\"fileCount\"\n label=\"现存数量\"\n width=\"94\"\n />\n <el-table-column\n sortable\n property=\"submitCount\"\n label=\"提交数量\"\n width=\"120\"\n />\n </template>\n <el-table-column label=\"操作\" width=\"100\">\n <template #default=\"scope\">\n <el-button\n type=\"primary\"\n text\n size=\"small\"\n @click=\"handleDeletePeople(scope.row)\"\n >\n 删除\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n </el-dialog>\n <el-dialog\n v-model=\"showImportPanel\"\n :fullscreen=\"isMobile\"\n title=\"人员列表导入\"\n >\n <el-form\n :model=\"importPanelInfo\"\n label-width=\"100px\"\n label-position=\"right\"\n >\n <el-form-item label=\"任务\">\n <el-select\n v-model=\"importPanelInfo.taskValue\"\n filterable\n placeholder=\"请选择\"\n no-data-text=\"无可用任务\"\n >\n <el-option\n v-for=\"t in importPanelInfo.taskList\"\n :key=\"t.taskKey\"\n :label=\"t.name\"\n :value=\"t.taskKey\"\n />\n </el-select>\n </el-form-item>\n <Tip>{{ ImportTaskTipMsg }}</Tip>\n <el-form-item label=\"任务\">\n <el-radio-group v-model=\"importPanelInfo.type\">\n <el-radio label=\"override\">\n 覆盖导入\n </el-radio>\n <el-radio label=\"add\">\n 追加导入\n </el-radio>\n </el-radio-group>\n </el-form-item>\n <Tip>\n {{\n importPanelInfo.type === 'override'\n ? '“覆盖导入” 将会覆盖原来的数据'\n : '“追加导入” 将只会导入不存在数据'\n }}\n </Tip>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showImportPanel = false\">取 消</el-button>\n <el-button\n :disabled=\"!importPanelInfo.taskValue\"\n type=\"primary\"\n @click=\"handleSaveImportInfo\"\n >确 定</el-button>\n </span>\n </template>\n </el-dialog>\n </div>\n</template>\n\n<style scoped>\n.upload-people {\n padding: 10px;\n}\n\n.import-people-wrapper {\n padding: 10px 0;\n}\n.submit-ok {\n color: #67c23a;\n}\n\n.submit-fail {\n color: #f56c6c;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n padding-bottom: 5px;\n}\n\n.nav .item {\n margin-left: 10px;\n margin-top: 5px;\n}\n\n.info-panel :deep(.el-form-item__label) {\n flex: v-bind(importPanelFlexStyle);\n}\n\n.info-panel :deep(.el-upload-list__item-name) {\n justify-content: center;\n}\n</style>\n","<template>\n <div class=\"tc info-panel\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MjY3MjUxNw==650182672517'\n ]\"\n >设置的模板文件,可供用户在提交页下载。</tip\n >\n <el-button\n v-if=\"template\"\n :disabled=\"!template\"\n @click=\"deleteTemplate\"\n size=\"default\"\n round\n type=\"danger\"\n >删除</el-button\n >\n <div class=\"p10\">{{ template || '尚未设置模板文件' }}</div>\n <div class=\"upload-file\" v-if=\"!template\">\n <el-upload\n action=\"\"\n ref=\"elUpload\"\n :on-exceed=\"handleExceedFile\"\n :on-remove=\"clearFiles\"\n :auto-upload=\"false\"\n :limit=\"1\"\n v-model:file-list=\"fileList\"\n >\n <template #trigger>\n <el-button size=\"small\" type=\"primary\">选取文件</el-button>\n </template>\n <el-button\n @click=\"submitUploadPeople\"\n style=\"margin-left: 10px\"\n size=\"small\"\n type=\"success\"\n >设为模板</el-button\n >\n <template #tip>\n <div class=\"el-upload__tip\">选择模板文件,然后点击上传</div>\n </template>\n </el-upload>\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport { ElMessage, UploadUserFile } from 'element-plus'\nimport { defineComponent, ref, watchEffect } from 'vue'\nimport { FileApi } from '@/apis'\nimport { qiniuUpload } from '@/utils/networkUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nexport default defineComponent({\n name: 'templatePanel',\n props: {\n value: {\n type: String,\n default: ''\n },\n k: {\n type: String,\n default: ''\n }\n },\n setup(props) {\n const template = ref()\n watchEffect(() => {\n if (props.value) {\n template.value = props.value\n } else {\n template.value = ''\n }\n })\n const percentage = ref(0)\n // 删除模板\n const deleteTemplate = () => {\n if (template.value) {\n // 移除文件,避免空间被长时间占用\n updateTaskInfo(props.k, { template: '' })\n template.value = ''\n percentage.value = 0\n }\n }\n // 文件上传\n const fileList = ref<UploadUserFile[]>([])\n const elUpload = ref()\n // 超出选择的文件个数\n const handleExceedFile = () => {\n ElMessage.error('只能选择一个文件,可删除后重新选择')\n }\n // 清空文件\n const clearFiles = () => {\n elUpload.value.clearFiles()\n }\n // 开始上传\n const submitUploadPeople = () => {\n fileList.value.forEach((file) => {\n if (!props.k) {\n return\n }\n const { name } = file\n const key = `easypicker2/${props.k}_template/${name}`\n if (file.status === 'ready') {\n file.status = 'uploading'\n // qiniu上传\n FileApi.getUploadToken().then((res) => {\n qiniuUpload(res.data.token, file.raw, key, {\n success() {\n ElMessage.success('上传成功')\n updateTaskInfo(props.k, { template: name })\n // 清理上传完成的\n clearFiles()\n template.value = name\n file.status = 'success'\n // hash,key\n // console.log(data)\n },\n process(per: number) {\n file.percentage = ~~per\n }\n })\n })\n }\n })\n }\n return {\n template,\n deleteTemplate,\n fileList,\n handleExceedFile,\n clearFiles,\n submitUploadPeople,\n elUpload,\n percentage\n }\n },\n components: { Tip }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.info-panel :deep(.el-upload-list__item-name) {\n justify-content: center;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, reactive, ref, watch, watchEffect } from 'vue'\nimport {\n CircleCloseFilled,\n CirclePlusFilled,\n Top,\n} from '@element-plus/icons-vue'\nimport { useStore } from 'vuex'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { TaskApi } from '@/apis'\nimport InfosForm from '@/components/InfosForm/index.vue'\nimport {\n getDefaultFormat,\n parseFileFormat,\n parseInfo,\n} from '@/utils/stringUtil'\nimport { useIsMobile, useSiteConfig } from '@/composables'\n\nconst props = defineProps({\n rewrite: {\n type: Number,\n default: 0,\n },\n info: {\n typs: String,\n default: '[]',\n },\n k: {\n type: String,\n default: '',\n },\n format: {\n type: String,\n default: '',\n required: false,\n },\n})\nconst formatData = reactive(getDefaultFormat())\nconst openPreview = ref(false)\nconst infoTypeList = reactive<{ label: string, value: InfoItemType }[]>([\n {\n label: '输入框',\n value: 'input',\n },\n {\n label: '固定内容',\n value: 'text',\n },\n {\n label: '单选框',\n value: 'radio',\n },\n {\n label: '下拉选择',\n value: 'select',\n },\n])\nfunction getTypeDes(type: string) {\n return infoTypeList.find(v => v.value === type)?.label\n}\n\nconst selectType = ref<InfoItemType>('input')\n\nconst { value: siteConfig } = useSiteConfig()\nconst maxInputLength = computed(() => siteConfig.value.maxInputLength)\n\nconst autoRewrite = ref(false)\nconst infos = reactive<InfoItem[]>([])\nconst needSave = ref(false)\n\nconst showAddInfo = computed(() => infos.length < siteConfig.value.formLength && !openPreview.value)\n// 负责清空&更新\nwatch(\n () => props.info,\n () => {\n infos.splice(0, infos.length)\n selectType.value = 'input'\n openPreview.value = false\n infos.push(...parseInfo(props.info))\n needSave.value = false\n },\n {\n immediate: true,\n },\n)\n\n// 预计格式\nconst resFormat = computed(\n () => `${infos.map(v => v.text).join(formatData.splitChar)}.后缀`,\n)\nwatchEffect(() => {\n autoRewrite.value = !!props.rewrite\n})\nfunction handleChange(v: boolean) {\n updateTaskInfo(props.k, {\n rewrite: +v,\n })\n}\n\nfunction addInfo(infoList?: InfoItem[], type?: InfoItemType) {\n const list = infoList || infos\n const t = type || selectType.value\n const item: InfoItem = { text: `标题${list.length + 1}`, type: t, value: '' }\n if (t === 'radio' || t === 'select') {\n item.children = [{ text: '选项1' }, { text: '选项2' }]\n }\n list.push(item)\n needSave.value = true\n}\nfunction deleteInfo(idx: number, infoList?: InfoItem[], minLen = 1) {\n const list = infoList || infos\n if (list.length <= minLen) {\n return\n }\n list.splice(idx, 1)\n needSave.value = true\n}\nfunction judgeInfoForm(items: InfoItem[]) {\n return items.every(v => v.text.trim() && judgeInfoForm(v.children || []))\n}\nfunction saveInfo() {\n if (!judgeInfoForm(infos)) {\n ElMessage.error('请完整填写表单信息')\n setTimeout(() => {\n ElMessage.warning('不能有空项')\n }, 100)\n return\n }\n updateTaskInfo(props.k, {\n info: JSON.stringify(\n infos.map((v) => {\n // 特殊处理固定值的内容\n if (v.type === 'text') {\n v.value = v.text\n }\n return v\n }),\n ),\n })\n needSave.value = false\n}\n\nfunction moveInfoUp(idx: number) {\n if (idx === 0)\n return\n const temp = infos[idx - 1]\n infos.splice(idx - 1, 1)\n infos.splice(idx, 0, temp)\n}\n\nconst importPanelInfo = reactive({ taskList: [], taskValue: '' })\nconst showImportPanel = ref(false)\nasync function openImportPanel() {\n const taskKey = props.k\n // 通过任务Key获取可用任务列表,与概况信息\n const { data } = await TaskApi.getUsefulTemplate(taskKey)\n importPanelInfo.taskList = data\n importPanelInfo.taskValue = data[0]?.taskKey || ''\n showImportPanel.value = true\n}\n\nfunction handleSaveImportInfo() {\n const usefulInfo = importPanelInfo.taskList.find(\n v => v.taskKey === importPanelInfo.taskValue,\n ).info\n infos.splice(0, infos.length)\n infos.push(...parseInfo(usefulInfo))\n showImportPanel.value = false\n needSave.value = true\n}\n\nconst isMobile = useIsMobile()\nconst importPanelFlexStyle = computed(() => (isMobile.value ? '0 0 auto' : 0.5))\n\nfunction showHelp() {\n ElMessageBox.alert(\n '<p>固定内容主要用于重命名中,固定的部分,如“活动名”,“班级名”</p><p>如要设置注意事项,请使用 <strong>批注</strong> 功能</p>',\n '注意事项',\n { dangerouslyUseHTMLString: true },\n )\n}\n\nfunction handleChangeSplitChar() {\n updateTaskInfo(props.k, {\n format: JSON.stringify(formatData),\n })\n}\nconst splitCharList = reactive(['-', '+', '_'])\nwatchEffect(() => {\n if (props.format !== null) {\n Object.assign(formatData, parseFileFormat(props.format))\n }\n})\n</script>\n\n<template>\n <div class=\"tc\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzM3NjUyNg==650183376526',\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjU2ODcyNg==651496568726',\n ]\"\n >\n 上传文件必填表单信息\n </Tip>\n <div class=\"auto-format\">\n <span>文件自动重命名:</span>\n <el-switch\n v-model=\"autoRewrite\"\n style=\"display: block\"\n active-color=\"#13ce66\"\n inactive-color=\"#ff4949\"\n active-text=\"开\"\n inactive-text=\"关\"\n @change=\"handleChange\"\n />\n </div>\n <div v-if=\"autoRewrite\" style=\"margin-bottom: 10px\">\n 预期格式:\n <span style=\"color: #409eff\">{{ resFormat }}</span>\n </div>\n <div v-if=\"autoRewrite\" style=\"margin-bottom: 10px\">\n 分割符:\n <el-select\n v-model=\"formatData.splitChar\"\n placeholder=\"分隔符\"\n style=\"width: 60px\"\n size=\"small\"\n @change=\"handleChangeSplitChar\"\n >\n <el-option v-for=\"v in splitCharList\" :key=\"v\" :label=\"v\" :value=\"v\" />\n </el-select>\n </div>\n <Tip v-if=\"autoRewrite\" style=\"color: red\">\n 开启自动重命名后,重点关注文件名格式是否符合预期\n </Tip>\n <div>\n 预览\n <el-switch\n v-model=\"openPreview\"\n inline-prompt\n active-text=\"是\"\n inactive-text=\"否\"\n active-color=\"#13ce66\"\n inactive-color=\"#ff4949\"\n />\n </div>\n <!-- 必填信息区域 -->\n <div class=\"form-wrapper\">\n <InfosForm v-if=\"openPreview\" :infos=\"infos\" :disabled=\"openPreview\" />\n <el-form v-else label-width=\"100px\">\n <el-form-item v-for=\"(item, idx) in infos\" :key=\"idx\">\n <template #label>\n <div class=\"flex fc fac\">\n <div class=\"num-wrapper\">\n <div>{{ idx + 1 }}</div>\n </div>\n <div class=\"form-item-type\" :class=\"item.type\">\n {{ getTypeDes(item.type) }}\n </div>\n </div>\n </template>\n <el-input\n v-model=\"item.text\"\n placeholder=\"输入内容\"\n :maxlength=\"maxInputLength\"\n clearable\n show-word-limit\n >\n <template #append>\n <div class=\"form-item-wrapper\">\n <el-icon\n :color=\"infos.length > 1 ? 'red' : 'grey'\"\n @click=\"deleteInfo(idx)\"\n >\n <CircleCloseFilled />\n </el-icon>\n <el-icon\n v-if=\"idx > 0\"\n color=\"#000\"\n style=\"margin-left: 6px\"\n @click=\"moveInfoUp(idx)\"\n >\n <Top />\n </el-icon>\n </div>\n </template>\n </el-input>\n <div\n v-if=\"item.type === 'radio' || item.type === 'select'\"\n class=\"radio-list\"\n >\n <el-input\n v-for=\"(v, idx2) in item.children\"\n :key=\"idx2\"\n v-model=\"v.text\"\n size=\"small\"\n placeholder=\"输入内容\"\n :maxlength=\"maxInputLength\"\n clearable\n show-word-limit\n >\n <template #append>\n <div class=\"form-item-wrapper\">\n <el-icon\n :color=\"item.children.length > 2 ? 'red' : 'grey'\"\n @click=\"deleteInfo(idx, item.children, 2)\"\n >\n <CircleCloseFilled />\n </el-icon>\n <template v-if=\"idx + 1 === item.children.length\">\n <el-icon\n style=\"margin-left: 10px\"\n color=\"#67C23A\"\n @click=\"addInfo(item.children, item.type)\"\n >\n <CirclePlusFilled />\n </el-icon>\n </template>\n </div>\n </template>\n </el-input>\n </div>\n </el-form-item>\n </el-form>\n </div>\n <div v-if=\"showAddInfo\" class=\"p10\">\n <el-button\n size=\"small\"\n type=\"primary\"\n round\n @click=\"\n () => {\n addInfo()\n }\n \"\n >\n 添加一项\n </el-button>\n <el-select\n v-model=\"selectType\"\n style=\"margin: 0 10px\"\n size=\"small\"\n placeholder=\"选择添加的类型\"\n >\n <el-option\n v-for=\"(v, idx) in infoTypeList\"\n :key=\"idx\"\n :label=\"v.label\"\n :value=\"v.value\"\n />\n </el-select>\n <el-button type=\"primary\" text @click=\"showHelp\">\n 提示❓\n </el-button>\n </div>\n <!-- 从其它任务导入 -->\n <el-button size=\"small\" type=\"warning\" @click=\"openImportPanel\">\n 从其它任务导入\n </el-button>\n <div class=\"p10\">\n <Tip>支持从已有的任务直接导入表单信息</Tip>\n <el-button type=\"success\" style=\"width: 200px\" @click=\"saveInfo\">\n 保存\n </el-button>\n </div>\n <div v-if=\"needSave\" style=\"color: red\">\n 有变动,请记得点击保存\n </div>\n <div class=\"info-panel\">\n <el-dialog\n v-model=\"showImportPanel\"\n :fullscreen=\"isMobile\"\n title=\"表单信息导入\"\n >\n <el-form\n :model=\"importPanelInfo\"\n label-width=\"100px\"\n label-position=\"right\"\n >\n <el-form-item label=\"任务\">\n <el-select\n v-model=\"importPanelInfo.taskValue\"\n filterable\n placeholder=\"请选择\"\n no-data-text=\"无可用任务\"\n >\n <el-option\n v-for=\"t in importPanelInfo.taskList\"\n :key=\"t.taskKey\"\n :label=\"t.name\"\n :value=\"t.taskKey\"\n />\n </el-select>\n </el-form-item>\n <Tip>{{ importPanelInfo.taskValue ? '' : '无可用任务' }}</Tip>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showImportPanel = false\">取 消</el-button>\n <el-button\n :disabled=\"!importPanelInfo.taskValue\"\n type=\"primary\"\n @click=\"handleSaveImportInfo\"\n >确 定\n </el-button>\n </span>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.auto-format {\n display: flex;\n justify-content: center;\n}\n\n:deep(.el-form-item__label) {\n display: flex;\n justify-content: center;\n align-items: flex-start;\n}\n\n.num-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 2px solid #000;\n text-align: center;\n font-size: 14px;\n}\n\n.info-panel :deep(.el-form-item__label) {\n flex: v-bind(importPanelFlexStyle);\n justify-content: flex-end;\n}\n\n.form-wrapper {\n max-width: 380px;\n margin: 0 auto;\n}\n\n.form-wrapper :deep(.el-input-group__append) {\n background-color: transparent;\n border: none;\n box-shadow: none;\n padding: 0;\n}\n\n.form-item-wrapper {\n width: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.form-item-type {\n margin-left: 10px;\n font-size: 12px;\n width: 48px;\n text-align: left;\n}\n\n.radio-list {\n padding-top: 10px;\n}\n\n.radio-list :deep(.el-input) {\n width: 80%;\n}\n</style>\n","<!-- eslint-disable ts/ban-ts-comment -->\n<script lang=\"ts\" setup>\nimport { computed, reactive, ref, watch } from 'vue'\nimport { Plus } from '@element-plus/icons-vue'\nimport type { UploadProps, UploadUserFile } from 'element-plus'\nimport { ElMessage } from 'element-plus'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { FileApi, PublicApi, TaskApi } from '@/apis'\nimport { qiniuUpload } from '@/utils/networkUtil'\nimport { getTipImageKey } from '@/utils/stringUtil'\n\nconst props = defineProps({\n tip: {\n type: String,\n default: '',\n required: false,\n },\n k: {\n type: String,\n default: '',\n },\n})\nconst textValue = ref('')\n\nconst tipData = reactive<{\n text: string\n imgs: {\n uid: number\n name: string\n }[]\n}>({\n text: '',\n imgs: [],\n})\nconst MaxImgCount = ref(3)\nconst imageList = ref<UploadUserFile[]>([])\nconst previewList = computed(() => {\n // @ts-expect-error\n return imageList.value.map(v => v!.preview || v.url)\n})\nconst previewIdx = ref(0)\n\nwatch(\n () => props.tip,\n () => {\n // 初始化\n try {\n const parseData = JSON.parse(props.tip)\n tipData.imgs = parseData.imgs\n tipData.text = parseData.text || ''\n imageList.value = tipData.imgs.map((v) => {\n return {\n ...v,\n url: 'https://img.cdn.sugarat.top/mdImg/MTY3NzkxMDI1NTU1Nw==20140524124237518.gif',\n }\n })\n if (imageList.value.length) {\n // 异步填充url\n PublicApi.getTipImageUrl(\n props.k,\n imageList.value.map(v => ({\n uid: v.uid,\n name: v.name,\n })),\n ).then((v) => {\n v.data.forEach((url, idx) => {\n imageList.value[idx].url = url.cover\n Object.assign(imageList.value[idx], {\n preview: url.preview,\n })\n })\n })\n }\n }\n catch {\n tipData.text = props.tip || ''\n tipData.imgs = []\n imageList.value = []\n }\n\n // 外部变动\n if (tipData.text) {\n textValue.value = tipData.text\n }\n else {\n textValue.value = ''\n }\n },\n {\n immediate: true,\n },\n)\nconst needSave = computed(() => tipData.text !== textValue.value)\n\n// 更新批注信息\nfunction updateTip(notify = true) {\n if (tipData.text !== textValue.value) {\n tipData.text = textValue.value\n }\n updateTaskInfo(props.k, { tip: JSON.stringify(tipData) }, notify)\n}\n\nconst imageViewerVisible = ref(false)\nfunction handleChangeFile(file: UploadUserFile) {\n if (!props.k) {\n return\n }\n const { name, uid } = file\n const key = getTipImageKey(props.k, name, uid)\n if (file.status === 'ready') {\n file.status = 'success'\n // qiniu上传\n FileApi.getUploadToken().then((res) => {\n qiniuUpload(res.data.token, file.raw, key, {\n success() {\n tipData.imgs.push({\n uid,\n name,\n })\n updateTip()\n },\n })\n })\n }\n}\nconst handleRemove: UploadProps['onRemove'] = (file) => {\n const { uid, name } = file\n const idx = tipData.imgs.findIndex(v => v.uid === uid)\n tipData.imgs.splice(idx, 1)\n updateTip()\n TaskApi.delTipImage(props.k, uid, name)\n}\n\nfunction handlePictureCardPreview(file) {\n imageViewerVisible.value = true\n const idx = imageList.value.findIndex(v => v.uid === file.uid)\n previewIdx.value = idx\n}\n// 超出选择的文件个数\nfunction handleExceedFile() {\n ElMessage.error(`只能选择${MaxImgCount.value}个图片,可删除后重新选择`)\n}\n</script>\n\n<template>\n <div class=\"tc ddl\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjI2OTI0MQ==651496269241',\n ]\"\n >\n 设置注意事项,供用户提交时查看\n </Tip>\n <Tip>注意控制字数和换行,避免展示异常,设置完记得预览一下,再投放</Tip>\n <div class=\"tc flex fc fac\">\n <el-input\n v-model=\"textValue\"\n :rows=\"5\"\n clearable\n :max=\"500\"\n show-word-limit\n type=\"textarea\"\n placeholder=\"请输入要展示的批注信息\"\n />\n </div>\n <div class=\"p10\">\n <el-button size=\"default\" type=\"success\" @click=\"updateTip\">\n 保存\n </el-button>\n <el-button size=\"default\" type=\"danger\" @click=\"textValue = ''\">\n 清空\n </el-button>\n </div>\n <Tip v-if=\"needSave\">\n 有变动记得保存\n </Tip>\n <Tip> 可以设置图片啦↓ 最多3张 </Tip>\n <el-upload\n v-model:file-list=\"imageList\"\n accept=\"image/*\"\n :limit=\"MaxImgCount\"\n action=\"\"\n list-type=\"picture-card\"\n :on-change=\"handleChangeFile\"\n :on-exceed=\"handleExceedFile\"\n :on-preview=\"handlePictureCardPreview\"\n :on-remove=\"handleRemove\"\n :auto-upload=\"false\"\n >\n <el-icon><Plus /></el-icon>\n </el-upload>\n <ElImageViewer\n v-if=\"imageViewerVisible\"\n hide-on-click-modal\n :initial-index=\"previewIdx\"\n :url-list=\"previewList\"\n teleported\n @close=\"imageViewerVisible = false\"\n />\n </div>\n</template>\n","<template>\n <div class=\"tc\">\n <tip class=\"title\"> ↓下方设置允许提交的文件类型↓ </tip>\n <tip>暂时只支持通过文件名后缀进行卡控,不区分大小写</tip>\n <tip>例如:txt,png,jpeg,webp</tip>\n <div class=\"tc\">\n <el-switch\n active-text=\"限制文件类型\"\n inactive-text=\"不限制文件类型\"\n @change=\"handleChange\"\n :value=\"formatData.status\"\n style=\"--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949\"\n />\n </div>\n <div v-show=\"formatData.status\">\n <tip>支持英文逗号\",\"分割,一次添加多个</tip>\n <div style=\"max-width: 300px; margin: 0 auto\">\n <el-input v-model=\"typeName\" placeholder=\"请输入文件类型(省略.)\">\n <template #append>\n <el-button @click=\"handleAddType\"> 确定 </el-button>\n </template>\n </el-input>\n </div>\n <el-tag\n v-for=\"(tag, idx) in formatData.format\"\n :key=\"idx\"\n class=\"type\"\n closable\n :disable-transitions=\"false\"\n @close=\"handleDelType(idx)\"\n >\n {{ tag }}\n </el-tag>\n <tip v-show=\"formatData.format.length\"\n >已添加: <span>{{ formatData.format.join(',') }}</span>\n <el-button type=\"primary\" text size=\"small\" @click=\"handleCopyType\"\n >一键复制</el-button\n >\n </tip>\n </div>\n <div class=\"split-line\"></div>\n <tip class=\"title\"\n >↓下方设置最大同时提交文件数量(16 >= x >=1 默认 10)↓</tip\n >\n <div class=\"tc\">\n <el-input-number\n :model-value=\"formatData.limit\"\n :min=\"1\"\n :max=\"16\"\n @change=\"handleChangeLimit\"\n />\n </div>\n <div class=\"split-line\"></div>\n <tip class=\"title\"> ↓下方设置文件最大的大小↓ </tip>\n <tip>1024B = 1KB, 1024KB = 1MB, 1024MB = 1GB</tip>\n <tip>0表示不限制</tip>\n <div class=\"tc\">\n <el-input-number\n :model-value=\"inputSize\"\n :min=\"0\"\n :max=\"1024\"\n @change=\"handleLimitSize\"\n />\n <el-select\n @change=\"handleChangeUnit\"\n v-model=\"formatData.sizeUnit\"\n placeholder=\"单位\"\n style=\"width: 100px\"\n >\n <el-option v-for=\"v in unitList\" :key=\"v\" :label=\"v\" :value=\"v\" />\n </el-select>\n </div>\n <div class=\"split-line\"></div>\n <tip :style=\"formatData.size === 0 ? 'color:grey' : 'color:red'\">{{\n formatData.size === 0\n ? '不限制大小'\n : `限制为不超过: ${formatSize(formatData.size)}`\n }}</tip>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport { reactive, ref, watchEffect } from 'vue'\nimport {\n copyRes,\n formatSize,\n getDefaultFormat,\n parseFileFormat\n} from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n format: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\n\nconst formatData = reactive(getDefaultFormat())\nconst typeName = ref('')\nconst updateInfo = () => {\n updateTaskInfo(props.k, {\n format: JSON.stringify(formatData)\n })\n}\nconst handleChange = (v: boolean) => {\n formatData.status = !!v\n updateInfo()\n}\n\nconst handleAddType = () => {\n const inputValue = typeName.value\n .split(',')\n // 转为小写\n .map((v) => v.trim().toLowerCase())\n for (const v of inputValue) {\n if (formatData.format.includes(v)) {\n ElMessage.error(`${v} 已存在`)\n return\n }\n }\n\n formatData.format.push(...inputValue)\n updateInfo()\n\n typeName.value = ''\n}\nconst handleDelType = (idx) => {\n formatData.format.splice(idx, 1)\n updateInfo()\n}\nconst handleCopyType = () => {\n copyRes(formatData.format.join(','))\n}\n\nconst handleChangeLimit = (limit: number) => {\n formatData.limit = limit\n updateInfo()\n}\n\nconst inputSize = ref(0)\nconst unitList = reactive(['B', 'KB', 'MB', 'GB'])\nconst handleChangeUnit = () => {\n const idx = unitList.findIndex((v) => v === formatData.sizeUnit)\n formatData.size = inputSize.value * 1024 ** idx\n updateInfo()\n}\nconst handleLimitSize = (limit: number) => {\n inputSize.value = limit\n const idx = unitList.findIndex((v) => v === formatData.sizeUnit)\n formatData.size = inputSize.value * 1024 ** idx\n updateInfo()\n}\n\nwatchEffect(() => {\n if (props.format !== null) {\n Object.assign(formatData, parseFileFormat(props.format))\n }\n})\n</script>\n<style scoped>\n.type {\n margin: 10px;\n}\n.split-line {\n margin-top: 10px;\n}\n.title {\n color: black;\n font-weight: bold;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, onMounted, reactive, ref, watchEffect } from 'vue'\nimport { useStore } from 'vuex'\nimport LinkDialog from '@components/linkDialog.vue'\nimport CategoryPanel from './components/CategoryPanel.vue'\nimport CreateTask from './components/CreateTask.vue'\nimport TaskInfo from './components/TaskInfo.vue'\nimport DDlPanel from './components/infoPanel/ddl.vue'\nimport PeoplePanel from './components/infoPanel/people.vue'\nimport TemplatePanel from './components/infoPanel/template.vue'\nimport InfoPanel from './components/infoPanel/info.vue'\nimport TipInfoPanel from './components/infoPanel/tipInfo.vue'\nimport FileInfoPanel from './components/infoPanel/file.vue'\nimport { copyRes } from '@/utils/stringUtil'\nimport { TaskApi } from '@/apis'\nimport { useIsMobile } from '@/composables'\n\nconst $store = useStore()\n\nconst isMobile = useIsMobile()\n// 分类相关\nconst categorys = computed(() => $store.state.category.categoryList)\n\n// 任务相关\nconst selectCategory = ref('default')\nconst tasks = computed<TaskApiTypes.TaskItem[]>(\n () => $store.state.task.taskList,\n)\nconst filterTasks = computed(() => {\n const t = tasks.value.filter(v => v.category === selectCategory.value)\n return t\n})\n\n// 删除任务\nfunction deleteTask(k: string, isTrash = false) {\n if (!k)\n return\n ElMessageBox.confirm(\n '确认删除此任务吗?',\n isTrash ? '!!回收站的删除后无法再恢复' : '数据无价,请谨慎操作',\n {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: isTrash ? 'error' : 'info',\n },\n )\n .then(() => {\n $store.dispatch('task/deleteTask', k).then(() => {\n ElMessage.success('删除成功')\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n}\n\n// 基本信息编辑\nconst showBaseInfoDialog = ref(false)\nconst taskBaseInfo = reactive({ name: '', category: '', key: '' })\nfunction editBaseInfo(task: any) {\n taskBaseInfo.name = task.name\n taskBaseInfo.category = task.category\n taskBaseInfo.key = task.key\n showBaseInfoDialog.value = true\n}\nfunction handleSaveEditInfo() {\n showBaseInfoDialog.value = false\n if (!taskBaseInfo.name.trim()) {\n ElMessage.warning('不能为空')\n return\n }\n $store.dispatch('task/updateTask', taskBaseInfo).then(() => {\n ElMessage.success('更新成功')\n })\n}\n\n// 生成分享链接\nconst shareTaskLink = ref('')\nconst showLinkModal = ref(false)\nfunction shareTask(k: string) {\n shareTaskLink.value = 'default'\n const { origin } = window.location\n shareTaskLink.value = `${origin}/task/${k}`\n copyRes(shareTaskLink.value, '收集链接已自动复制到粘贴板')\n showLinkModal.value = true\n}\n\n// 附加属性编辑\nconst taskInfo = reactive<TaskApiTypes.TaskInfo>({})\nconst showTaskInfoPanel = ref(false)\nconst activeInfo = ref('info')\nconst activeTask: TaskApiTypes.TaskItem = reactive({\n category: '',\n key: '',\n name: '',\n recentLog: [],\n})\nfunction editMore(item: any) {\n Object.assign(activeTask, item)\n TaskApi.getTaskMoreInfo(item.key).then((res) => {\n // 先初始化,再赋值\n taskInfo.info = '[]'\n taskInfo.ddl = ''\n taskInfo.tip = ''\n taskInfo.format = ''\n taskInfo.bindField = ''\n setTimeout(() => {\n Object.assign(taskInfo, res.data)\n showTaskInfoPanel.value = true\n })\n })\n}\n\n// TODO: 有需要再优化,目前像bug\n// 用于选择默认展示项目\n// const taskCount = (c: string) => {\n// const count = tasks.value.filter((t: any) => t.category === c).length\n// return count\n// }\n\n// 选中一个有任务数据的分类\n// watchEffect(() => {\n// if (taskCount('default') > 0) {\n// return\n// }\n// if (categorys.value.length > 0) {\n// for (const c of categorys.value) {\n// if (taskCount(c.k) > 0) {\n// selectCategory.value = c.k\n// break\n// }\n// }\n// }\n// })\n\nonMounted(() => {\n $store.dispatch('category/getCategory')\n $store.dispatch('task/getTask')\n})\n\nfunction openTaskPage() {\n window.open(`/task/${activeTask.key}`)\n}\n</script>\n\n<template>\n <div class=\"tasks\">\n <!-- 分类管理 -->\n <div class=\"categorys-area\">\n <CategoryPanel v-model:category=\"selectCategory\" />\n </div>\n\n <!-- 任务管理 -->\n <div class=\"panel task-panel\">\n <!-- 创建任务 -->\n <CreateTask :active-category-key=\"selectCategory\" />\n\n <!-- 任务列表 -->\n <div class=\"task-list\">\n <TaskInfo\n v-for=\"item in filterTasks\"\n :key=\"item.key\"\n :item=\"item\"\n @edit=\"editBaseInfo\"\n @delete=\"deleteTask\"\n @share=\"shareTask\"\n @more=\"editMore\"\n />\n <el-empty\n v-if=\"filterTasks.length === 0\"\n description=\"此分类下没有任务哟,快去创建吧\"\n />\n </div>\n </div>\n\n <!-- 任务基本信息维护弹窗 -->\n <el-dialog\n v-model=\"showBaseInfoDialog\"\n draggable\n :fullscreen=\"isMobile\"\n title=\"基本信息修改\"\n >\n <el-form :model=\"taskBaseInfo\">\n <el-form-item label=\"任务名称\" label-width=\"100px\">\n <el-input v-model=\"taskBaseInfo.name\" autocomplete=\"off\" />\n </el-form-item>\n <el-form-item label=\"新的分类\" label-width=\"100px\">\n <el-select v-model=\"taskBaseInfo.category\" placeholder=\"请选择新分类\">\n <el-option label=\"默认\" value=\"default\" />\n <el-option\n v-for=\"c in categorys\"\n :key=\"c.k\"\n :label=\"c.name\"\n :value=\"c.k\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showBaseInfoDialog = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"handleSaveEditInfo\">确 定</el-button>\n </span>\n </template>\n </el-dialog>\n\n <!-- 分享链接弹窗(二维码/链接/短链) -->\n <LinkDialog\n v-model:value=\"showLinkModal\"\n :download=\"false\"\n title=\"收取链接\"\n :link=\"shareTaskLink\"\n />\n <!-- 附加属性编辑弹窗 -->\n <el-dialog\n v-model=\"showTaskInfoPanel\"\n :fullscreen=\"isMobile\"\n title=\"更多设置\"\n center\n >\n <div>\n <h3 class=\"tc\" style=\"font-size: 14px; color: #9e9e9e\">\n 任务名:<strong style=\"color: #000000\">{{ activeTask.name }}</strong>,\n <el-button type=\"primary\" text @click=\"openTaskPage\">\n 去查看效果\n </el-button>\n </h3>\n <el-tabs v-model=\"activeInfo\">\n <el-tab-pane label=\"截止日期\" name=\"ddl\">\n <DDlPanel :ddl=\"taskInfo.ddl\" :k=\"activeTask.key\" />\n </el-tab-pane>\n <el-tab-pane label=\"批注信息\" name=\"tip\">\n <TipInfoPanel\n :rewrite=\"taskInfo.rewrite\"\n :tip=\"taskInfo.tip\"\n :k=\"activeTask.key\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"限制名单\" name=\"people\">\n <PeoplePanel\n :name=\"activeTask.name\"\n :value=\"taskInfo.people\"\n :k=\"activeTask.key\"\n :field=\"taskInfo.bindField\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"必填信息\" name=\"info\">\n <InfoPanel\n :rewrite=\"taskInfo.rewrite\"\n :info=\"taskInfo.info\"\n :k=\"activeTask.key\"\n :format=\"taskInfo.format\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"模板文件\" name=\"template\">\n <TemplatePanel :value=\"taskInfo.template\" :k=\"activeTask.key\" />\n </el-tab-pane>\n <el-tab-pane label=\"文件属性\" name=\"attr\">\n <FileInfoPanel :format=\"taskInfo.format\" :k=\"activeTask.key\" />\n </el-tab-pane>\n </el-tabs>\n </div>\n </el-dialog>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.tasks {\n max-width: 1024px;\n margin: 0 auto;\n padding-bottom: 2em;\n}\n\n.tasks :deep(.el-dialog__body) {\n padding-top: 10px;\n}\n\n.panel {\n padding: 1em;\n background-color: #fff;\n margin: 10px auto;\n box-sizing: border-box;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n}\n\n.task-list {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-around;\n}\n\n@media screen and (max-width: 700px) {\n .categorys-area {\n margin-top: 20px;\n }\n :deep(.el-tabs__nav-scroll) {\n overflow-x: scroll;\n &::-webkit-scrollbar {\n display: none; /* Chrome Safari */\n }\n }\n}\n</style>\n"],"names":["cardProps","buildProps","header","type","String","default","bodyStyle","definePropType","Object","Array","shadow","values","ElCard","withInstall","_export_sfc","defineComponent","name","props","setup","__props","ns","useNamespace","_ctx","_cache","openBlock","createElementBlock","class","normalizeClass","unref","b","is","$slots","key","e","renderSlot","createTextVNode","toDisplayString","createCommentVNode","createElementVNode","style","normalizeStyle","inputNumberProps","id","step","Number","stepStrictly","Boolean","max","POSITIVE_INFINITY","min","NEGATIVE_INFINITY","modelValue","disabled","size","useSizeProp","controls","controlsPosition","valueOnClear","validator","val","isNumber","includes","label","placeholder","precision","parseInt","validateEvent","_hoisted_1","_hoisted_2","ElInputNumber","emits","CHANGE_EVENT","prev","cur","blur","FocusEvent","focus","INPUT_EVENT","isNil","UPDATE_MODEL_EVENT","expose","emit","t","useLocale","input","ref","data","reactive","currentValue","userInput","formItem","useFormItem","minDisabled","computed","ensurePrecision","maxDisabled","numPrecision","stepPrecision","getPrecision","isUndefined","Math","controlsAtRight","inputNumberSize","useSize","inputNumberDisabled","useDisabled","displayValue","isNaN","toFixed","toPrecision","num","pre","value","round","snum","pointPos","indexOf","replace","split","length","charAt","slice","parseFloat","valueString","toString","dotPosition","coefficient","increase","newVal","setCurrentValue","decrease","verifyValue","update","isString","_a","oldVal","validate","call","catch","err","debugWarn","handleInput","handleInputChange","handleFocus","event","handleBlur","watch","immediate","onMounted","innerInput","setAttribute","isFinite","removeAttribute","onUpdated","_b","m","onDragstart","withModifiers","withDirectives","role","onKeydown","withKeys","createVNode","ElIcon","withCtx","createBlock","ArrowDown","Minus","_","RepeatClick","ArrowUp","Plus","ElInput","ref_key","onBlur","onFocus","onInput","onChange","_sfc_main","viewBox","xmlns","_hoisted_3","fill","d","circleCloseFilled","$props","$setup","$data","$options","circlePlusFilled","_delete","_hoisted_4","edit","menu","plus","share","top","_sfc_main$9","components","DeleteFilled","category","required","context","$store","useStore","categorys","state","categoryList","tasks","task","taskList","isShowCreateCategory","categoryName","handleClickCategory","k","addCategory","trim","dispatch","then","ElMessage","success","code","warning","handleDeleteCategory","c","ElMessageBox","confirm","confirmButtonText","cancelButtonText","info","taskCount","count","filter","n","_pushScopeId","_popScopeId","_withScopeId","_createElementVNode","_hoisted_5","_component_el_icon","__unplugin_components_3","_openBlock","_createElementBlock","_createBlock","_component_el_input","$event","onFocusout","_component_el_button","onClick","_createTextVNode","_createVNode","_component_el_tag","effect","_toDisplayString","_withCtx","_component_DeleteFilled","_hoisted_6","_hoisted_7","_Fragment","_renderList","tag","closable","activeCategoryKey","find","v","isShowCreateTask","taskName","createTask","updateTaskInfo","debounce","options","successInfo","TaskApi","updateTaskMoreInfo","message","zIndex","duration","error","newDate","watchEffect","ddl","Date","updateDDL","formatDate","getTime","closeDDL","waitTime","isOver","waitTimeStr","seconds","hour","day","minute","refreshWaitTime","loop","now","setTimeout","activeTab","userInputName","importStatus","handAddName","PeopleApi","addPeopleByUser","finally","checkMore","people","updateLimitPeople","limit","showPeopleList","peopleList","selectSubmitStatus","searchName","filterPeopleBySearchWord","peopleSubmitData","p","status","isLoadingPeopleData","refreshSubmitData","getPeople","res","splice","push","forEach","lastDate","handleCheckMore","checkPeople","peopleFileList","peopleUpload","handleExceedFile","clearFiles","submitUploadPeople","file","uploadFile","raw","importPeople","fail","tableToExcel","map","handleChangeFile","handleExportExcel","headers","body","submitCount","fileCount","isMobile","useIsMobile","importPanelInfo","taskValue","showImportPanel","async","openImportPanel","taskKey","getUsefulTemplate","ImportTaskTipMsg","handleSaveImportInfo","importPeopleFromTpl","importPanelFlexStyle","bindField","handleSureBind","field","item","deletePeople","findIndex","_sfc_main$4","template","percentage","fileList","elUpload","deleteTemplate","FileApi","getUploadToken","qiniuUpload","token","process","per","Tip","_component_el_upload","__unplugin_components_1","_component_tip","imgs","_createCommentVNode","action","formatData","getDefaultFormat","openPreview","infoTypeList","selectType","siteConfig","useSiteConfig","maxInputLength","autoRewrite","infos","needSave","showAddInfo","formLength","parseInfo","resFormat","text","join","splitChar","handleChange","rewrite","addInfo","infoList","list","children","deleteInfo","idx","minLen","judgeInfoForm","items","every","saveInfo","JSON","stringify","usefulInfo","showHelp","alert","dangerouslyUseHTMLString","handleChangeSplitChar","format","splitCharList","assign","parseFileFormat","temp","textValue","tipData","MaxImgCount","imageList","previewList","preview","url","previewIdx","tip","parseData","parse","PublicApi","getTipImageUrl","uid","cover","updateTip","notify","imageViewerVisible","getTipImageKey","handleRemove","delTipImage","handlePictureCardPreview","typeName","updateInfo","handleAddType","inputValue","toLowerCase","handleCopyType","copyRes","handleChangeLimit","inputSize","unitList","handleChangeUnit","sizeUnit","handleLimitSize","selectCategory","filterTasks","deleteTask","isTrash","showBaseInfoDialog","taskBaseInfo","editBaseInfo","handleSaveEditInfo","shareTaskLink","showLinkModal","shareTask","origin","window","location","taskInfo","showTaskInfoPanel","activeInfo","activeTask","recentLog","editMore","getTaskMoreInfo","openTaskPage","open"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}
1
+ {"version":3,"file":"index-legacy-DVOM8HaY.js","sources":["../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/card/src/card.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/card/index.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/card/src/card2.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/input-number/src/input-number.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/input-number/src/input-number2.mjs","../../node_modules/.pnpm/element-plus@2.2.13_vue@3.4.31_typescript@4.9.5_/node_modules/element-plus/es/components/input-number/index.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/circle-close-filled.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/circle-plus-filled.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/delete.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/edit.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/menu.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/plus.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/share.mjs","../../node_modules/.pnpm/@element-plus+icons-vue@1.1.4_vue@3.4.31_typescript@4.9.5_/node_modules/@element-plus/icons-vue/dist/es/top.mjs","../../src/pages/dashboard/tasks/components/CategoryPanel.vue","../../src/pages/dashboard/tasks/components/CreateTask.vue","../../src/pages/dashboard/tasks/public.ts","../../src/pages/dashboard/tasks/components/infoPanel/ddl.vue","../../src/pages/dashboard/tasks/components/infoPanel/people.vue","../../src/pages/dashboard/tasks/components/infoPanel/template.vue","../../src/pages/dashboard/tasks/components/infoPanel/info.vue","../../src/pages/dashboard/tasks/components/infoPanel/tipInfo.vue","../../src/pages/dashboard/tasks/components/infoPanel/file.vue","../../src/pages/dashboard/tasks/index.vue"],"sourcesContent":["import '../../../utils/index.mjs';\nimport { buildProps, definePropType } from '../../../utils/vue/props/runtime.mjs';\n\nconst cardProps = buildProps({\n header: {\n type: String,\n default: \"\"\n },\n bodyStyle: {\n type: definePropType([String, Object, Array]),\n default: \"\"\n },\n shadow: {\n type: String,\n values: [\"always\", \"hover\", \"never\"],\n default: \"always\"\n }\n});\n\nexport { cardProps };\n//# sourceMappingURL=card.mjs.map\n","import '../../utils/index.mjs';\nimport Card from './src/card2.mjs';\nexport { cardProps } from './src/card.mjs';\nimport { withInstall } from '../../utils/vue/install.mjs';\n\nconst ElCard = withInstall(Card);\n\nexport { ElCard, ElCard as default };\n//# sourceMappingURL=index.mjs.map\n","import { defineComponent, openBlock, createElementBlock, normalizeClass, unref, renderSlot, createTextVNode, toDisplayString, createCommentVNode, createElementVNode, normalizeStyle } from 'vue';\nimport '../../../hooks/index.mjs';\nimport { cardProps } from './card.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\n\nconst __default__ = {\n name: \"ElCard\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: cardProps,\n setup(__props) {\n const ns = useNamespace(\"card\");\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([unref(ns).b(), unref(ns).is(`${_ctx.shadow}-shadow`)])\n }, [\n _ctx.$slots.header || _ctx.header ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: normalizeClass(unref(ns).e(\"header\"))\n }, [\n renderSlot(_ctx.$slots, \"header\", {}, () => [\n createTextVNode(toDisplayString(_ctx.header), 1)\n ])\n ], 2)) : createCommentVNode(\"v-if\", true),\n createElementVNode(\"div\", {\n class: normalizeClass(unref(ns).e(\"body\")),\n style: normalizeStyle(_ctx.bodyStyle)\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 6)\n ], 2);\n };\n }\n});\nvar Card = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/card/src/card.vue\"]]);\n\nexport { Card as default };\n//# sourceMappingURL=card2.mjs.map\n","import { isNil } from 'lodash-unified';\nimport '../../../hooks/index.mjs';\nimport '../../../utils/index.mjs';\nimport '../../../constants/index.mjs';\nimport { buildProps } from '../../../utils/vue/props/runtime.mjs';\nimport { useSizeProp } from '../../../hooks/use-common-props/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { CHANGE_EVENT, INPUT_EVENT, UPDATE_MODEL_EVENT } from '../../../constants/event.mjs';\n\nconst inputNumberProps = buildProps({\n id: {\n type: String,\n default: void 0\n },\n step: {\n type: Number,\n default: 1\n },\n stepStrictly: Boolean,\n max: {\n type: Number,\n default: Number.POSITIVE_INFINITY\n },\n min: {\n type: Number,\n default: Number.NEGATIVE_INFINITY\n },\n modelValue: Number,\n disabled: Boolean,\n size: useSizeProp,\n controls: {\n type: Boolean,\n default: true\n },\n controlsPosition: {\n type: String,\n default: \"\",\n values: [\"\", \"right\"]\n },\n valueOnClear: {\n type: [String, Number, null],\n validator: (val) => val === null || isNumber(val) || [\"min\", \"max\"].includes(val),\n default: null\n },\n name: String,\n label: String,\n placeholder: String,\n precision: {\n type: Number,\n validator: (val) => val >= 0 && val === Number.parseInt(`${val}`, 10)\n },\n validateEvent: {\n type: Boolean,\n default: true\n }\n});\nconst inputNumberEmits = {\n [CHANGE_EVENT]: (prev, cur) => prev !== cur,\n blur: (e) => e instanceof FocusEvent,\n focus: (e) => e instanceof FocusEvent,\n [INPUT_EVENT]: (val) => isNumber(val) || isNil(val),\n [UPDATE_MODEL_EVENT]: (val) => isNumber(val) || isNil(val)\n};\n\nexport { inputNumberEmits, inputNumberProps };\n//# sourceMappingURL=input-number.mjs.map\n","import { defineComponent, ref, reactive, computed, watch, onMounted, onUpdated, openBlock, createElementBlock, normalizeClass, unref, withModifiers, withDirectives, withKeys, createVNode, withCtx, createBlock, createCommentVNode } from 'vue';\nimport { isNil } from 'lodash-unified';\nimport { ElInput } from '../../input/index.mjs';\nimport { ElIcon } from '../../icon/index.mjs';\nimport '../../../directives/index.mjs';\nimport '../../../hooks/index.mjs';\nimport '../../../utils/index.mjs';\nimport { ArrowDown, Minus, ArrowUp, Plus } from '@element-plus/icons-vue';\nimport { inputNumberProps, inputNumberEmits } from './input-number.mjs';\nimport _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs';\nimport { useLocale } from '../../../hooks/use-locale/index.mjs';\nimport { useNamespace } from '../../../hooks/use-namespace/index.mjs';\nimport { useFormItem } from '../../../hooks/use-form-item/index.mjs';\nimport { isNumber } from '@vueuse/core';\nimport { isUndefined } from '../../../utils/types.mjs';\nimport { debugWarn } from '../../../utils/error.mjs';\nimport { useSize, useDisabled } from '../../../hooks/use-common-props/index.mjs';\nimport { isString } from '@vue/shared';\nimport RepeatClick from '../../../directives/repeat-click/index.mjs';\n\nconst _hoisted_1 = [\"aria-label\", \"onKeydown\"];\nconst _hoisted_2 = [\"aria-label\", \"onKeydown\"];\nconst __default__ = {\n name: \"ElInputNumber\"\n};\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n ...__default__,\n props: inputNumberProps,\n emits: inputNumberEmits,\n setup(__props, { expose, emit }) {\n const props = __props;\n const { t } = useLocale();\n const ns = useNamespace(\"input-number\");\n const input = ref();\n const data = reactive({\n currentValue: props.modelValue,\n userInput: null\n });\n const { formItem } = useFormItem();\n const minDisabled = computed(() => isNumber(props.modelValue) && ensurePrecision(props.modelValue, -1) < props.min);\n const maxDisabled = computed(() => isNumber(props.modelValue) && ensurePrecision(props.modelValue) > props.max);\n const numPrecision = computed(() => {\n const stepPrecision = getPrecision(props.step);\n if (!isUndefined(props.precision)) {\n if (stepPrecision > props.precision) {\n debugWarn(\"InputNumber\", \"precision should not be less than the decimal places of step\");\n }\n return props.precision;\n } else {\n return Math.max(getPrecision(props.modelValue), stepPrecision);\n }\n });\n const controlsAtRight = computed(() => {\n return props.controls && props.controlsPosition === \"right\";\n });\n const inputNumberSize = useSize();\n const inputNumberDisabled = useDisabled();\n const displayValue = computed(() => {\n if (data.userInput !== null) {\n return data.userInput;\n }\n let currentValue = data.currentValue;\n if (isNil(currentValue))\n return \"\";\n if (isNumber(currentValue)) {\n if (Number.isNaN(currentValue))\n return \"\";\n if (!isUndefined(props.precision)) {\n currentValue = currentValue.toFixed(props.precision);\n }\n }\n return currentValue;\n });\n const toPrecision = (num, pre) => {\n if (isUndefined(pre))\n pre = numPrecision.value;\n if (pre === 0)\n return Math.round(num);\n let snum = String(num);\n const pointPos = snum.indexOf(\".\");\n if (pointPos === -1)\n return num;\n const nums = snum.replace(\".\", \"\").split(\"\");\n const datum = nums[pointPos + pre];\n if (!datum)\n return num;\n const length = snum.length;\n if (snum.charAt(length - 1) === \"5\") {\n snum = `${snum.slice(0, Math.max(0, length - 1))}6`;\n }\n return Number.parseFloat(Number(snum).toFixed(pre));\n };\n const getPrecision = (value) => {\n if (isNil(value))\n return 0;\n const valueString = value.toString();\n const dotPosition = valueString.indexOf(\".\");\n let precision = 0;\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1;\n }\n return precision;\n };\n const ensurePrecision = (val, coefficient = 1) => {\n if (!isNumber(val))\n return data.currentValue;\n return toPrecision(val + props.step * coefficient);\n };\n const increase = () => {\n if (inputNumberDisabled.value || maxDisabled.value)\n return;\n const value = props.modelValue || 0;\n const newVal = ensurePrecision(value);\n setCurrentValue(newVal);\n };\n const decrease = () => {\n if (inputNumberDisabled.value || minDisabled.value)\n return;\n const value = props.modelValue || 0;\n const newVal = ensurePrecision(value, -1);\n setCurrentValue(newVal);\n };\n const verifyValue = (value, update) => {\n const { max, min, step, precision, stepStrictly, valueOnClear } = props;\n let newVal = Number(value);\n if (isNil(value) || Number.isNaN(newVal)) {\n return null;\n }\n if (value === \"\") {\n if (valueOnClear === null) {\n return null;\n }\n newVal = isString(valueOnClear) ? { min, max }[valueOnClear] : valueOnClear;\n }\n if (stepStrictly) {\n newVal = toPrecision(Math.round(newVal / step) * step, precision);\n }\n if (!isUndefined(precision)) {\n newVal = toPrecision(newVal, precision);\n }\n if (newVal > max || newVal < min) {\n newVal = newVal > max ? max : min;\n update && emit(\"update:modelValue\", newVal);\n }\n return newVal;\n };\n const setCurrentValue = (value) => {\n var _a;\n const oldVal = data.currentValue;\n const newVal = verifyValue(value);\n if (oldVal === newVal)\n return;\n data.userInput = null;\n emit(\"update:modelValue\", newVal);\n emit(\"input\", newVal);\n emit(\"change\", newVal, oldVal);\n if (props.validateEvent) {\n (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, \"change\").catch((err) => debugWarn(err));\n }\n data.currentValue = newVal;\n };\n const handleInput = (value) => {\n return data.userInput = value;\n };\n const handleInputChange = (value) => {\n const newVal = value !== \"\" ? Number(value) : \"\";\n if (isNumber(newVal) && !Number.isNaN(newVal) || value === \"\") {\n setCurrentValue(newVal);\n }\n data.userInput = null;\n };\n const focus = () => {\n var _a, _b;\n (_b = (_a = input.value) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a);\n };\n const blur = () => {\n var _a, _b;\n (_b = (_a = input.value) == null ? void 0 : _a.blur) == null ? void 0 : _b.call(_a);\n };\n const handleFocus = (event) => {\n emit(\"focus\", event);\n };\n const handleBlur = (event) => {\n var _a;\n emit(\"blur\", event);\n if (props.validateEvent) {\n (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, \"blur\").catch((err) => debugWarn(err));\n }\n };\n watch(() => props.modelValue, (value) => {\n data.currentValue = verifyValue(value, true);\n data.userInput = null;\n }, { immediate: true });\n onMounted(() => {\n var _a;\n const { min, max, modelValue } = props;\n const innerInput = (_a = input.value) == null ? void 0 : _a.input;\n innerInput.setAttribute(\"role\", \"spinbutton\");\n if (Number.isFinite(max)) {\n innerInput.setAttribute(\"aria-valuemax\", String(max));\n } else {\n innerInput.removeAttribute(\"aria-valuemax\");\n }\n if (Number.isFinite(min)) {\n innerInput.setAttribute(\"aria-valuemin\", String(min));\n } else {\n innerInput.removeAttribute(\"aria-valuemin\");\n }\n innerInput.setAttribute(\"aria-valuenow\", String(data.currentValue));\n innerInput.setAttribute(\"aria-disabled\", String(inputNumberDisabled.value));\n if (!isNumber(modelValue) && modelValue != null) {\n let val = Number(modelValue);\n if (Number.isNaN(val)) {\n val = null;\n }\n emit(\"update:modelValue\", val);\n }\n });\n onUpdated(() => {\n var _a;\n const innerInput = (_a = input.value) == null ? void 0 : _a.input;\n innerInput == null ? void 0 : innerInput.setAttribute(\"aria-valuenow\", `${data.currentValue}`);\n });\n expose({\n focus,\n blur\n });\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([\n unref(ns).b(),\n unref(ns).m(unref(inputNumberSize)),\n unref(ns).is(\"disabled\", unref(inputNumberDisabled)),\n unref(ns).is(\"without-controls\", !_ctx.controls),\n unref(ns).is(\"controls-right\", unref(controlsAtRight))\n ]),\n onDragstart: _cache[0] || (_cache[0] = withModifiers(() => {\n }, [\"prevent\"]))\n }, [\n _ctx.controls ? withDirectives((openBlock(), createElementBlock(\"span\", {\n key: 0,\n role: \"button\",\n \"aria-label\": unref(t)(\"el.inputNumber.decrease\"),\n class: normalizeClass([unref(ns).e(\"decrease\"), unref(ns).is(\"disabled\", unref(minDisabled))]),\n onKeydown: withKeys(decrease, [\"enter\"])\n }, [\n createVNode(unref(ElIcon), null, {\n default: withCtx(() => [\n unref(controlsAtRight) ? (openBlock(), createBlock(unref(ArrowDown), { key: 0 })) : (openBlock(), createBlock(unref(Minus), { key: 1 }))\n ]),\n _: 1\n })\n ], 42, _hoisted_1)), [\n [unref(RepeatClick), decrease]\n ]) : createCommentVNode(\"v-if\", true),\n _ctx.controls ? withDirectives((openBlock(), createElementBlock(\"span\", {\n key: 1,\n role: \"button\",\n \"aria-label\": unref(t)(\"el.inputNumber.increase\"),\n class: normalizeClass([unref(ns).e(\"increase\"), unref(ns).is(\"disabled\", unref(maxDisabled))]),\n onKeydown: withKeys(increase, [\"enter\"])\n }, [\n createVNode(unref(ElIcon), null, {\n default: withCtx(() => [\n unref(controlsAtRight) ? (openBlock(), createBlock(unref(ArrowUp), { key: 0 })) : (openBlock(), createBlock(unref(Plus), { key: 1 }))\n ]),\n _: 1\n })\n ], 42, _hoisted_2)), [\n [unref(RepeatClick), increase]\n ]) : createCommentVNode(\"v-if\", true),\n createVNode(unref(ElInput), {\n id: _ctx.id,\n ref_key: \"input\",\n ref: input,\n type: \"number\",\n step: _ctx.step,\n \"model-value\": unref(displayValue),\n placeholder: _ctx.placeholder,\n disabled: unref(inputNumberDisabled),\n size: unref(inputNumberSize),\n max: _ctx.max,\n min: _ctx.min,\n name: _ctx.name,\n label: _ctx.label,\n \"validate-event\": false,\n onKeydown: [\n withKeys(withModifiers(increase, [\"prevent\"]), [\"up\"]),\n withKeys(withModifiers(decrease, [\"prevent\"]), [\"down\"])\n ],\n onBlur: handleBlur,\n onFocus: handleFocus,\n onInput: handleInput,\n onChange: handleInputChange\n }, null, 8, [\"id\", \"step\", \"model-value\", \"placeholder\", \"disabled\", \"size\", \"max\", \"min\", \"name\", \"label\", \"onKeydown\"])\n ], 34);\n };\n }\n});\nvar InputNumber = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__file\", \"/home/runner/work/element-plus/element-plus/packages/components/input-number/src/input-number.vue\"]]);\n\nexport { InputNumber as default };\n//# sourceMappingURL=input-number2.mjs.map\n","import '../../utils/index.mjs';\nimport InputNumber from './src/input-number2.mjs';\nexport { inputNumberEmits, inputNumberProps } from './src/input-number.mjs';\nimport { withInstall } from '../../utils/vue/install.mjs';\n\nconst ElInputNumber = withInstall(InputNumber);\n\nexport { ElInputNumber, ElInputNumber as default };\n//# sourceMappingURL=index.mjs.map\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"CircleCloseFilled\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336L512 457.664z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar circleCloseFilled = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { circleCloseFilled as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"CirclePlusFilled\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-38.4 409.6H326.4a38.4 38.4 0 1 0 0 76.8h147.2v147.2a38.4 38.4 0 0 0 76.8 0V550.4h147.2a38.4 38.4 0 0 0 0-76.8H550.4V326.4a38.4 38.4 0 1 0-76.8 0v147.2z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar circlePlusFilled = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { circlePlusFilled as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Delete\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar _delete = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { _delete as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Edit\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640V512z\"\n}, null, -1);\nconst _hoisted_3 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z\"\n}, null, -1);\nconst _hoisted_4 = [\n _hoisted_2,\n _hoisted_3\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_4);\n}\nvar edit = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { edit as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Menu\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M160 448a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V160.064a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32V416a32 32 0 0 1-32 32H608zM160 896a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H160zm448 0a32 32 0 0 1-32-32V608a32 32 0 0 1 32-32h255.936a32 32 0 0 1 32 32v256a32 32 0 0 1-32 32H608z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar menu = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { menu as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Plus\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64h352z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar plus = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { plus as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Share\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m679.872 348.8-301.76 188.608a127.808 127.808 0 0 1 5.12 52.16l279.936 104.96a128 128 0 1 1-22.464 59.904l-279.872-104.96a128 128 0 1 1-16.64-166.272l301.696-188.608a128 128 0 1 1 33.92 54.272z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar share = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { share as default };\n","import { defineComponent, openBlock, createElementBlock, createElementVNode } from 'vue';\nimport _export_sfc from './_virtual/plugin-vue_export-helper.mjs';\n\nconst _sfc_main = defineComponent({\n name: \"Top\"\n});\nconst _hoisted_1 = {\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\"\n};\nconst _hoisted_2 = /* @__PURE__ */ createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"M572.235 205.282v600.365a30.118 30.118 0 1 1-60.235 0V205.282L292.382 438.633a28.913 28.913 0 0 1-42.646 0 33.43 33.43 0 0 1 0-45.236l271.058-288.045a28.913 28.913 0 0 1 42.647 0L834.5 393.397a33.43 33.43 0 0 1 0 45.176 28.913 28.913 0 0 1-42.647 0l-219.618-233.23z\"\n}, null, -1);\nconst _hoisted_3 = [\n _hoisted_2\n];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", _hoisted_1, _hoisted_3);\n}\nvar top = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render]]);\n\nexport { top as default };\n","<template>\n <!-- 分类管理 -->\n <div class=\"panel\">\n <!-- 按钮 -->\n <div class=\"btn-area\">\n <h5>分类列表</h5>\n <h6 style=\"font-weight: lighter\">(点击分类可筛选任务)</h6>\n </div>\n <!-- 分类列表 -->\n <div style=\"margin-top: 15px\" class=\"category-list\">\n <div class=\"new-tag-wrap\">\n <!-- 新分类 -->\n <el-input\n class=\"input-new-tag el-tag\"\n v-if=\"isShowCreateCategory\"\n v-model=\"categoryName\"\n ref=\"saveTagInput\"\n placeholder=\"分类名称\"\n @keyup.enter=\"addCategory\"\n @focusout=\"addCategory\"\n ></el-input>\n <el-button\n v-else\n class=\"button-new-tag el-tag\"\n size=\"small\"\n @click=\"isShowCreateCategory = true\"\n >+ New 分类</el-button\n >\n <el-tag\n :effect=\"category === 'default' ? 'dark' : 'plain'\"\n @click=\"handleClickCategory('default')\"\n >默认{{ taskCount('default') }}</el-tag\n >\n <span class=\"list-tip\"\n ><el-tag\n type=\"danger\"\n :effect=\"category === 'trash' ? 'dark' : 'plain'\"\n @click=\"handleClickCategory('trash')\"\n ><el-icon><DeleteFilled /></el-icon> 回收站{{\n taskCount('trash')\n }}</el-tag\n ></span\n >\n </div>\n <div class=\"tag-wrap\">\n <div class=\"tag-list\">\n <el-tag\n v-for=\"tag in categorys\"\n :key=\"tag.k\"\n closable\n :effect=\"category === tag.k ? 'dark' : 'plain'\"\n @close=\"handleDeleteCategory(tag)\"\n @click=\"handleClickCategory(tag.k)\"\n >{{ tag.name }}{{ taskCount(tag.k) }}</el-tag\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, defineComponent, ref } from 'vue'\nimport { DeleteFilled } from '@element-plus/icons-vue'\nimport { useStore } from 'vuex'\n\nexport default defineComponent({\n name: 'categoryPanel',\n components: {\n DeleteFilled\n },\n props: {\n category: {\n type: String,\n required: true,\n default: 'default'\n }\n },\n setup(props, context) {\n const $store = useStore()\n // 分类相关\n const categorys = computed(() => $store.state.category.categoryList)\n const tasks = computed(() => $store.state.task.taskList)\n const taskCount = (c: string) => {\n const count = tasks.value.filter((t: any) => t.category === c).length\n return count === 0 ? '' : ` (${count})`\n }\n const isShowCreateCategory = ref(false)\n const categoryName = ref('')\n const addCategory = () => {\n isShowCreateCategory.value = false\n if (!categoryName.value.trim()) {\n // ElMessage.warning('不能为空')\n return\n }\n $store\n .dispatch('category/createCategory', categoryName.value)\n .then(() => {\n ElMessage.success('创建成功')\n })\n .catch((err) => {\n if (err.code === 2001) {\n ElMessage.warning('分类名称已存在')\n }\n })\n categoryName.value = ''\n }\n\n const handleClickCategory = (k: string) => {\n context.emit('update:category', k)\n }\n\n const handleDeleteCategory = (c: any) => {\n ElMessageBox.confirm('是否删除', '提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消'\n })\n .then(() => {\n $store.dispatch('category/deleteCategory', c.k).then(() => {\n // 删除后变动的默认选择\n handleClickCategory('default')\n ElMessage.success('删除成功')\n // 获取最新的任务\n $store.dispatch('task/getTask')\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n }\n\n return {\n categorys,\n isShowCreateCategory,\n categoryName,\n addCategory,\n handleDeleteCategory,\n handleClickCategory,\n taskCount\n }\n }\n})\n</script>\n<style scoped lang=\"scss\">\n.el-tag {\n margin-left: 10px;\n margin-bottom: 10px;\n cursor: pointer;\n}\n.new-tag-wrap {\n display: flex;\n align-items: center;\n}\n.button-new-tag {\n margin-left: 10px;\n height: 32px;\n line-height: 30px;\n padding-top: 0;\n padding-bottom: 0;\n}\n.input-new-tag {\n width: 120px;\n padding: 0;\n margin-left: 10px;\n margin-bottom: 10px;\n vertical-align: bottom;\n}\n.panel {\n padding: 1em;\n background-color: #fff;\n margin: 10px auto;\n box-sizing: border-box;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n}\n.btn-area {\n display: flex;\n justify-content: center;\n}\n.list-tip {\n // color: #67c23a;\n // font-size: 10px;\n margin-right: 10px;\n flex: 1;\n text-align: right;\n}\n.tag-wrap {\n width: 100%;\n height: 150px;\n}\n.tag-list {\n height: 150px;\n overflow-x: hidden;\n overflow-y: scroll;\n display: flex;\n flex-wrap: wrap;\n :deep(.el-tag) {\n width: 140px;\n }\n :deep(.el-tag__content) {\n width: 100px;\n text-align: center;\n text-overflow: ellipsis;\n word-break: keep-all;\n overflow: hidden;\n }\n}\n</style>\n","<template>\n <div>\n <div class=\"btn-area\">\n <el-button size=\"large\" type=\"primary\" :plain=\"!isShowCreateTask\" @click=\"\n isShowCreateTask =\n !isShowCreateTask\n \">\n {{\n isShowCreateTask\n ? '关闭创建面板'\n : '创建收集任务'\n }}\n </el-button>\n </div>\n <!-- 新增区域 -->\n <div v-show=\"isShowCreateTask\">\n <div class=\"input-container\">\n <el-input placeholder=\"请输入任务名称(上述列表选择分类)\" v-model=\"taskName\"></el-input>\n <el-button @click=\"createTask\" :type=\"taskName?.length ? 'success' : 'default'\">确定</el-button>\n </div>\n </div>\n <tip class=\"p10\">\n 点击\n <el-icon>\n <Menu />\n </el-icon> 可以进一步的调整任务\n </tip>\n <tip>\n 设置截止时间,自动重命名,名单限制,批注,文件模板。。🚀\n </tip>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport {\n computed,\n ref,\n} from 'vue'\nimport { useStore } from 'vuex'\nimport { Menu } from '@element-plus/icons-vue'\nimport Tip from './infoPanel/tip.vue'\n\nconst props = defineProps({\n activeCategoryKey: {\n type: String,\n default: 'default',\n },\n})\nconst $store = useStore()\nconst categorys = computed(() => $store.state.category\n .categoryList)\nconst categoryName = computed(() => {\n if (props.activeCategoryKey\n === 'default') {\n return '默认'\n }\n return categorys.value.find((v: any) => v.k\n === props.activeCategoryKey).name\n})\n// 任务相关\nconst isShowCreateTask = ref(false)\nconst taskName = ref('')\nconst createTask = () => {\n if (!taskName.value.trim()) {\n ElMessage.warning('不能为空')\n return\n }\n $store\n .dispatch('task/createTask', {\n name: taskName.value,\n category: props.activeCategoryKey,\n })\n .then(() => {\n ElMessage.success('创建成功')\n })\n taskName.value = ''\n}\n\n</script>\n<style scoped>\n.btn-area {\n display: flex;\n justify-content: center;\n}\n\n.input-container {\n margin: 15px auto;\n max-width: 600px;\n background-color: #fff;\n display: flex;\n justify-content: space-around;\n}\n</style>\n","import { ElMessage } from 'element-plus'\nimport { TaskApi } from '@/apis'\nimport { debounce } from '@/utils/other'\n\nexport const updateTaskInfo: (\n key: string,\n options: TaskApiTypes.TaskInfo,\n successInfo?: boolean\n) => void = debounce(\n (key, options, successInfo = true) => {\n if (key) {\n TaskApi.updateTaskMoreInfo(key, options)\n .then(() => {\n if (successInfo) {\n ElMessage.success({\n message: '设置成功',\n zIndex: 4000,\n duration: 1000\n })\n }\n })\n .catch(() => {\n ElMessage.error({\n message: '设置失败',\n zIndex: 4000\n })\n })\n }\n },\n 1000,\n true\n)\n","<template>\n <div class=\"tc ddl\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTI4NjU5Nw==649149286597',\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTMxMDEyOQ==649149310129',\n 'https://img.cdn.sugarat.top/mdImg/MTY0OTE0OTM3MzgxOA==649149373818'\n ]\"\n >设置截止日期,截止后将不能再提交文件。</tip\n >\n <div class=\"tc flex fc fac\">\n <el-date-picker\n :editable=\"false\"\n v-model=\"newDate\"\n type=\"datetime\"\n placeholder=\"点击设置新截止日期\"\n @change=\"updateDDL\"\n :default-time=\"new Date(ddl)\"\n ></el-date-picker>\n <el-button v-if=\"newDate\" @click=\"closeDDL\">取消</el-button>\n </div>\n <div style=\"margin-top: 10px\" v-if=\"newDate\">\n <tip>{{ isOver ? '已经截止' : `剩余时间: ${waitTimeStr}` }} </tip>\n </div>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { computed, onMounted, ref, watchEffect } from 'vue'\nimport { formatDate } from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n ddl: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\n\nconst newDate = ref()\nwatchEffect(() => {\n if (props.ddl) {\n newDate.value = new Date(props.ddl)\n } else {\n newDate.value = null\n }\n})\n// 更新DDL\nconst updateDDL = () => {\n if (newDate.value) {\n const ddl = formatDate(\n new Date(newDate.value.getTime() - 1000 * 60 * 60 * 8)\n )\n updateTaskInfo(props.k, { ddl })\n }\n}\n// 关闭DDL\nconst closeDDL = () => {\n newDate.value = null\n updateTaskInfo(props.k, { ddl: null })\n}\n\nconst waitTime = ref(0)\nconst isOver = computed(() => waitTime.value <= 0)\nconst waitTimeStr = computed(() => {\n let seconds = ~~(waitTime.value / 1000)\n let hour = ~~(seconds / (60 * 60))\n const day = ~~(hour / 24)\n hour %= 24\n const minute = ~~((seconds % 3600) / 60)\n seconds %= 60\n return `剩余${day}天${hour}时${minute}分${seconds}秒`\n})\n\nconst refreshWaitTime = (loop = true) => {\n if (newDate.value) {\n waitTime.value = newDate.value.getTime() - Date.now()\n } else {\n waitTime.value = 0\n }\n if (loop) {\n setTimeout(() => {\n refreshWaitTime()\n }, 1000)\n }\n}\n\nonMounted(() => {\n refreshWaitTime()\n})\n</script>\n","<script lang=\"ts\" setup>\nimport type { UploadUserFile } from 'element-plus'\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, reactive, ref, watch, watchEffect } from 'vue'\nimport { useStore } from 'vuex'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { PeopleApi, TaskApi } from '@/apis'\nimport { tableToExcel, uploadFile } from '@/utils/networkUtil'\nimport { formatDate } from '@/utils/stringUtil'\nimport { useIsMobile } from '@/composables'\n\nconst props = defineProps({\n value: {\n type: Number,\n defalut: 0,\n },\n k: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: '',\n },\n field: {\n type: String,\n default: '姓名',\n },\n})\n\nconst activeTab = ref('手动添加')\nconst userInputName = ref('')\nconst importStatus = ref(false)\n\nfunction handAddName() {\n if (!userInputName.value) {\n return\n }\n importStatus.value = true\n PeopleApi.addPeopleByUser(userInputName.value, props.k)\n .then(() => {\n ElMessage.success(`添加 ${userInputName.value} 成功`)\n })\n .catch(() => {\n ElMessage.error(`${userInputName.value} 已存在`)\n })\n .finally(() => {\n importStatus.value = false\n userInputName.value = ''\n })\n}\nconst checkMore = ref(false)\n\nconst people = ref(0)\nwatchEffect(() => {\n people.value = props.value as number\n})\n// 限制提交人员\nfunction updateLimitPeople(limit: boolean) {\n updateTaskInfo(props.k, {\n people: +limit,\n })\n people.value = +limit\n}\n\n// 查看提交情况\nconst showPeopleList = ref(false)\nconst peopleList: any = reactive([])\nconst selectSubmitStatus = ref('all')\nconst searchName = ref('')\nconst filterPeopleBySearchWord = computed(() => {\n if (!searchName.value) {\n return peopleList\n }\n return peopleList.filter(v => v.name.includes(searchName.value))\n})\nconst peopleSubmitData = computed(() => {\n if (selectSubmitStatus.value === 'all') {\n return filterPeopleBySearchWord.value\n }\n return filterPeopleBySearchWord.value.filter(\n p => p.status === selectSubmitStatus.value,\n )\n})\nconst isLoadingPeopleData = ref(false)\nfunction refreshSubmitData() {\n isLoadingPeopleData.value = true\n PeopleApi.getPeople(props.k, `${+checkMore.value}`).then((res) => {\n peopleList.splice(0, peopleList.length)\n peopleList.push(...res.data.people)\n peopleList.forEach((p) => {\n if (!p.status && p.count === 0) {\n p.lastDate = '暂无记录'\n }\n else {\n p.lastDate = formatDate(new Date(p.lastDate), 'yyyy-MM-dd hh:mm:ss')\n }\n })\n isLoadingPeopleData.value = false\n })\n}\nfunction handleCheckMore() {\n checkMore.value = !checkMore.value\n if (checkMore.value) {\n refreshSubmitData()\n }\n}\nfunction checkPeople() {\n showPeopleList.value = true\n // 默认不展示提交数量\n checkMore.value = false\n refreshSubmitData()\n}\nfunction handleDeletePeople(item: any) {\n ElMessageBox.confirm('确认删除此人员吗', '数据无价,请谨慎操作')\n .then(() => {\n PeopleApi.deletePeople(props.k, item.id).then(() => {\n ElMessage.success('删除成功')\n peopleList.splice(\n peopleList.findIndex(v => v.id === item.id),\n 1,\n )\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n}\n// 文件上传\nconst peopleFileList = ref<UploadUserFile[]>([])\nconst peopleUpload = ref()\n// 超出选择的文件个数\nfunction handleExceedFile() {\n ElMessage.error('只能选择一个文件,可删除后重新选择')\n}\n// 清空文件\nfunction clearFiles() {\n peopleFileList.value.splice(0, peopleFileList.value.length)\n peopleUpload.value.clearFiles()\n}\n// 开始上传\nfunction submitUploadPeople() {\n peopleFileList.value.forEach((file) => {\n uploadFile(\n file.raw,\n `${import.meta.env.VITE_APP_AXIOS_BASE_URL}public/upload`,\n {\n success: (e: any) => {\n const { name, type } = e.data\n PeopleApi.importPeople(props.k, name, type).then((res) => {\n const { success, fail } = res.data\n ElMessage.success(`导入完成:${success}成功,${fail.length}失败`)\n if (fail.length > 0) {\n setTimeout(() => {\n ElMessage.info('自动开始下载未成功导入名单')\n tableToExcel(\n ['未成功导入名单'],\n fail.map((v: string) => [v]),\n `${props.name}_导入失败名单_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒',\n )}.xlsx`,\n )\n }, 1000)\n }\n clearFiles()\n })\n },\n },\n )\n })\n}\n// 添加文件\nfunction handleChangeFile(file: any) {\n if (file.raw.type !== 'text/plain') {\n ElMessage.warning({\n message: '只支持txt文件',\n zIndex: 4000,\n })\n clearFiles()\n }\n}\nfunction handleExportExcel() {\n if (peopleSubmitData.value.length === 0) {\n ElMessage.warning('表格中没有可导出数据')\n return\n }\n const headers = [\n '姓名',\n '提交状态',\n '提交数量',\n '最后操作时间',\n ...(checkMore.value ? ['现存数量', '提交次数'] : []),\n ]\n const body = peopleSubmitData.value.map((v) => {\n const { name, status, lastDate, submitCount, fileCount, count } = v\n return [\n name,\n status ? '✔' : 'x',\n submitCount,\n status ? formatDate(new Date(lastDate)) : '',\n ...(checkMore.value ? [fileCount, count] : []),\n ]\n })\n tableToExcel(\n headers,\n body,\n `${props.name}_提交情况_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒',\n )}.xlsx`,\n )\n ElMessage.success('导出成功')\n}\n\nconst isMobile = useIsMobile()\nconst importPanelInfo = reactive({\n taskList: [],\n type: 'override',\n taskValue: '',\n})\nconst showImportPanel = ref(false)\nasync function openImportPanel() {\n const taskKey = props.k\n // 通过任务Key获取可用任务列表,与概况信息\n const { data } = await PeopleApi.getUsefulTemplate(taskKey)\n importPanelInfo.taskList = data\n importPanelInfo.taskValue = data[0]?.taskKey || ''\n showImportPanel.value = true\n}\nconst ImportTaskTipMsg = computed(() => {\n const { taskList, taskValue } = importPanelInfo\n const task = taskList.find(v => v.taskKey === taskValue)\n if (!task) {\n return '无可用任务'\n }\n return `${task.count} 条数据`\n})\nfunction handleSaveImportInfo() {\n PeopleApi.importPeopleFromTpl(\n props.k,\n importPanelInfo.taskValue,\n importPanelInfo.type,\n ).then((res) => {\n showImportPanel.value = false\n const { success, fail } = res.data\n ElMessage.success(`导入成功${success}条,失败${fail.length}条`)\n\n if (fail.length > 0) {\n setTimeout(() => {\n ElMessage.info('自动开始下载未成功导入名单')\n tableToExcel(\n ['未成功导入名单'],\n fail.map((v: string) => [v]),\n `${props.name}_导入失败名单_${formatDate(\n new Date(),\n 'yyyy年MM月日hh时mm分ss秒',\n )}.xlsx`,\n )\n }, 1000)\n }\n })\n}\n\nconst importPanelFlexStyle = computed(() => (isMobile.value ? '0 0 auto' : 0.5))\n\nconst bindField = ref('姓名')\nwatch(\n () => props.field,\n (v) => {\n bindField.value = v\n },\n {\n immediate: true,\n },\n)\nfunction handleSureBind() {\n // 空值校验\n if (!bindField.value.trim().length) {\n ElMessage.warning('绑定的表单项不能为空')\n return\n }\n\n // 提交保存\n TaskApi.updateTaskMoreInfo(props.k, {\n bindField: bindField.value,\n }).then(() => {\n ElMessage.success('保存成功')\n })\n}\n</script>\n\n<template>\n <div class=\"tc info-panel\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzEwOTEzOQ==650183109139',\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjY3MTUyMw==651496671523',\n ]\"\n >\n 只有名单里的成员,才可提交文件\n </Tip>\n <el-button\n v-if=\"!people\"\n size=\"default\"\n round\n type=\"success\"\n @click=\"updateLimitPeople(true)\"\n >\n 开启\n </el-button>\n <el-button\n v-if=\"people\"\n size=\"default\"\n round\n type=\"danger\"\n @click=\"updateLimitPeople(false)\"\n >\n 关闭\n </el-button>\n <el-button\n v-if=\"people\"\n round\n size=\"default\"\n type=\"primary\"\n @click=\"checkPeople\"\n >\n 查看提交情况\n </el-button>\n <div v-if=\"people\" class=\"upload-people\">\n <el-radio-group v-model=\"activeTab\" size=\"small\">\n <el-radio-button label=\"文件导入\" />\n <el-radio-button label=\"任务导入\" />\n <el-radio-button label=\"手动添加\" />\n </el-radio-group>\n <div class=\"import-people-wrapper\">\n <div v-show=\"activeTab === '文件导入'\">\n <el-upload\n ref=\"peopleUpload\"\n v-model:file-list=\"peopleFileList\"\n accept=\"text/plain\"\n action=\"\"\n class=\"upload-demo\"\n :on-change=\"handleChangeFile\"\n :on-exceed=\"handleExceedFile\"\n :on-remove=\"clearFiles\"\n :auto-upload=\"false\"\n :limit=\"1\"\n >\n <template #trigger>\n <el-button size=\"small\" type=\"primary\">\n 选择文件\n </el-button>\n </template>\n <el-button\n style=\"margin-left: 10px\"\n size=\"small\"\n type=\"success\"\n :disabled=\"!peopleFileList.length\"\n @click=\"submitUploadPeople\"\n >\n 确定上传\n </el-button>\n <template #tip>\n <div class=\"el-upload__tip\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4Mjk2NjUxMA==650182966510',\n ]\"\n >\n 只能上传 .txt 文本文件,每行一个名字\n </Tip>\n <Tip>如名字有特殊字符,建议去除</Tip>\n <Tip>上传文件导入的方式,为追加导入,不会覆盖已存在数据</Tip>\n </div>\n </template>\n </el-upload>\n </div>\n <div v-show=\"activeTab === '任务导入'\">\n <!-- 从其它任务导入 -->\n <el-button size=\"small\" type=\"success\" @click=\"openImportPanel\">\n 选择任务\n </el-button>\n <div class=\"p10\">\n <Tip>支持从已有的任务直接导入名单</Tip>\n </div>\n </div>\n <div v-show=\"activeTab === '手动添加'\">\n <div style=\"max-width: 300px; margin: 0 auto\">\n <el-input\n v-model=\"userInputName\"\n :disabled=\"importStatus\"\n placeholder=\"请输入姓名\"\n >\n <template #append>\n <el-button @click=\"handAddName\">\n 确定\n </el-button>\n </template>\n </el-input>\n </div>\n <div class=\"p10\">\n <Tip>会自动判重,不会重复添加</Tip>\n <Tip>大量名单优先推荐使用文件导入</Tip>\n </div>\n </div>\n </div>\n <div style=\"max-width: 320px; margin: 0 auto\">\n <el-form label-width=\"120px\">\n <el-form-item label=\"绑定表单项\" style=\"margin-bottom: 6px\">\n <el-input v-model=\"bindField\" size=\"small\" clearable>\n <template #append>\n <el-button @click=\"handleSureBind\">\n 确定\n </el-button>\n </template>\n </el-input>\n </el-form-item>\n <Tip style=\"\">\n 和表单项同名字段,可以避免重复填写!!\n </Tip>\n </el-form>\n </div>\n </div>\n <el-dialog v-model=\"showPeopleList\" :fullscreen=\"isMobile\" title=\"提交情况\">\n <!-- 上部分的筛选菜单 -->\n <div class=\"nav\">\n <div class=\"item\">\n <el-button\n :disabled=\"peopleList.length === 0\"\n type=\"success\"\n size=\"default\"\n @click=\"handleExportExcel\"\n >\n 导出记录\n </el-button>\n </div>\n <div class=\"item\">\n <el-select\n v-model=\"selectSubmitStatus\"\n size=\"default\"\n placeholder=\"状态筛选\"\n >\n <el-option label=\"全部\" value=\"all\" />\n <el-option label=\"已提交\" :value=\"1\" />\n <el-option label=\"未提交\" :value=\"0\" />\n </el-select>\n </div>\n <div class=\"item\">\n <el-input\n v-model=\"searchName\"\n size=\"default\"\n placeholder=\"输入要查询的姓名\"\n />\n </div>\n <div class=\"item\">\n <el-button type=\"primary\" size=\"default\" @click=\"handleCheckMore\">\n {{ checkMore ? '隐藏' : '显示' }}详细提交情况\n </el-button>\n </div>\n </div>\n <!-- 概况信息 -->\n <div class=\"tc p10\">\n <span>共: {{ peopleSubmitData.length }} 条数据</span>,\n <span>已提交: {{ peopleSubmitData.filter((v) => v.status).length }}</span>,\n <span>未提交: {{ peopleSubmitData.filter((v) => !v.status).length }}</span>\n </div>\n <div class=\"tc p10\">\n <Tip>\"提交次数\" 用户实际的提交次数</Tip>\n <Tip>\"现存数量\" 还存在于服务器上的文件数 (不包含删除) --- 慢查询</Tip>\n <Tip>\"提交数量\" 用户实际提交的文件数 (不包含撤回) --- 慢查询</Tip>\n </div>\n <!-- 数据部分 -->\n <el-table\n v-loading=\"isLoadingPeopleData\"\n element-loading-text=\"Loading...\"\n stripe\n border\n :data=\"peopleSubmitData\"\n height=\"460px\"\n >\n <el-table-column label=\"序号\" width=\"60\">\n <template #default=\"scope\">\n <div style=\"text-align: center\">\n {{ scope.$index + 1 }}\n </div>\n </template>\n </el-table-column>\n <el-table-column property=\"name\" label=\"姓名\" />\n <el-table-column label=\"提交状态\" width=\"100\">\n <template #default=\"scope\">\n <span v-if=\"scope.row.status\" class=\"submit-ok\">已提交</span>\n <span v-else class=\"submit-fail\">未提交</span>\n </template>\n </el-table-column>\n <el-table-column\n property=\"count\"\n label=\"提交次数\"\n width=\"94\"\n />\n <el-table-column\n sortable\n property=\"lastDate\"\n label=\"最后操作时间\"\n width=\"120\"\n />\n <template v-if=\"checkMore\">\n <el-table-column\n property=\"fileCount\"\n label=\"现存数量\"\n width=\"94\"\n />\n <el-table-column\n sortable\n property=\"submitCount\"\n label=\"提交数量\"\n width=\"120\"\n />\n </template>\n <el-table-column label=\"操作\" width=\"100\">\n <template #default=\"scope\">\n <el-button\n type=\"primary\"\n text\n size=\"small\"\n @click=\"handleDeletePeople(scope.row)\"\n >\n 删除\n </el-button>\n </template>\n </el-table-column>\n </el-table>\n </el-dialog>\n <el-dialog\n v-model=\"showImportPanel\"\n :fullscreen=\"isMobile\"\n title=\"人员列表导入\"\n >\n <el-form\n :model=\"importPanelInfo\"\n label-width=\"100px\"\n label-position=\"right\"\n >\n <el-form-item label=\"任务\">\n <el-select\n v-model=\"importPanelInfo.taskValue\"\n filterable\n placeholder=\"请选择\"\n no-data-text=\"无可用任务\"\n >\n <el-option\n v-for=\"t in importPanelInfo.taskList\"\n :key=\"t.taskKey\"\n :label=\"t.name\"\n :value=\"t.taskKey\"\n />\n </el-select>\n </el-form-item>\n <Tip>{{ ImportTaskTipMsg }}</Tip>\n <el-form-item label=\"任务\">\n <el-radio-group v-model=\"importPanelInfo.type\">\n <el-radio label=\"override\">\n 覆盖导入\n </el-radio>\n <el-radio label=\"add\">\n 追加导入\n </el-radio>\n </el-radio-group>\n </el-form-item>\n <Tip>\n {{\n importPanelInfo.type === 'override'\n ? '“覆盖导入” 将会覆盖原来的数据'\n : '“追加导入” 将只会导入不存在数据'\n }}\n </Tip>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showImportPanel = false\">取 消</el-button>\n <el-button\n :disabled=\"!importPanelInfo.taskValue\"\n type=\"primary\"\n @click=\"handleSaveImportInfo\"\n >确 定</el-button>\n </span>\n </template>\n </el-dialog>\n </div>\n</template>\n\n<style scoped>\n.upload-people {\n padding: 10px;\n}\n\n.import-people-wrapper {\n padding: 10px 0;\n}\n.submit-ok {\n color: #67c23a;\n}\n\n.submit-fail {\n color: #f56c6c;\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n padding-bottom: 5px;\n}\n\n.nav .item {\n margin-left: 10px;\n margin-top: 5px;\n}\n\n.info-panel :deep(.el-form-item__label) {\n flex: v-bind(importPanelFlexStyle);\n}\n\n.info-panel :deep(.el-upload-list__item-name) {\n justify-content: center;\n}\n</style>\n","<template>\n <div class=\"tc info-panel\">\n <tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MjY3MjUxNw==650182672517'\n ]\"\n >设置的模板文件,可供用户在提交页下载。</tip\n >\n <el-button\n v-if=\"template\"\n :disabled=\"!template\"\n @click=\"deleteTemplate\"\n size=\"default\"\n round\n type=\"danger\"\n >删除</el-button\n >\n <div class=\"p10\">{{ template || '尚未设置模板文件' }}</div>\n <div class=\"upload-file\" v-if=\"!template\">\n <el-upload\n action=\"\"\n ref=\"elUpload\"\n :on-exceed=\"handleExceedFile\"\n :on-remove=\"clearFiles\"\n :auto-upload=\"false\"\n :limit=\"1\"\n v-model:file-list=\"fileList\"\n >\n <template #trigger>\n <el-button size=\"small\" type=\"primary\">选取文件</el-button>\n </template>\n <el-button\n @click=\"submitUploadPeople\"\n style=\"margin-left: 10px\"\n size=\"small\"\n type=\"success\"\n >设为模板</el-button\n >\n <template #tip>\n <div class=\"el-upload__tip\">选择模板文件,然后点击上传</div>\n </template>\n </el-upload>\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport { ElMessage, UploadUserFile } from 'element-plus'\nimport { defineComponent, ref, watchEffect } from 'vue'\nimport { FileApi } from '@/apis'\nimport { qiniuUpload } from '@/utils/networkUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nexport default defineComponent({\n name: 'templatePanel',\n props: {\n value: {\n type: String,\n default: ''\n },\n k: {\n type: String,\n default: ''\n }\n },\n setup(props) {\n const template = ref()\n watchEffect(() => {\n if (props.value) {\n template.value = props.value\n } else {\n template.value = ''\n }\n })\n const percentage = ref(0)\n // 删除模板\n const deleteTemplate = () => {\n if (template.value) {\n // 移除文件,避免空间被长时间占用\n updateTaskInfo(props.k, { template: '' })\n template.value = ''\n percentage.value = 0\n }\n }\n // 文件上传\n const fileList = ref<UploadUserFile[]>([])\n const elUpload = ref()\n // 超出选择的文件个数\n const handleExceedFile = () => {\n ElMessage.error('只能选择一个文件,可删除后重新选择')\n }\n // 清空文件\n const clearFiles = () => {\n elUpload.value.clearFiles()\n }\n // 开始上传\n const submitUploadPeople = () => {\n fileList.value.forEach((file) => {\n if (!props.k) {\n return\n }\n const { name } = file\n const key = `easypicker2/${props.k}_template/${name}`\n if (file.status === 'ready') {\n file.status = 'uploading'\n // qiniu上传\n FileApi.getUploadToken().then((res) => {\n qiniuUpload(res.data.token, file.raw, key, {\n success() {\n ElMessage.success('上传成功')\n updateTaskInfo(props.k, { template: name })\n // 清理上传完成的\n clearFiles()\n template.value = name\n file.status = 'success'\n // hash,key\n // console.log(data)\n },\n process(per: number) {\n file.percentage = ~~per\n }\n })\n })\n }\n })\n }\n return {\n template,\n deleteTemplate,\n fileList,\n handleExceedFile,\n clearFiles,\n submitUploadPeople,\n elUpload,\n percentage\n }\n },\n components: { Tip }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.info-panel :deep(.el-upload-list__item-name) {\n justify-content: center;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, reactive, ref, watch, watchEffect } from 'vue'\nimport {\n CircleCloseFilled,\n CirclePlusFilled,\n Top,\n} from '@element-plus/icons-vue'\nimport { useStore } from 'vuex'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { TaskApi } from '@/apis'\nimport InfosForm from '@/components/InfosForm/index.vue'\nimport {\n getDefaultFormat,\n parseFileFormat,\n parseInfo,\n} from '@/utils/stringUtil'\nimport { useIsMobile, useSiteConfig } from '@/composables'\n\nconst props = defineProps({\n rewrite: {\n type: Number,\n default: 0,\n },\n info: {\n typs: String,\n default: '[]',\n },\n k: {\n type: String,\n default: '',\n },\n format: {\n type: String,\n default: '',\n required: false,\n },\n})\nconst formatData = reactive(getDefaultFormat())\nconst openPreview = ref(false)\nconst infoTypeList = reactive<{ label: string, value: InfoItemType }[]>([\n {\n label: '输入框',\n value: 'input',\n },\n {\n label: '固定内容',\n value: 'text',\n },\n {\n label: '单选框',\n value: 'radio',\n },\n {\n label: '下拉选择',\n value: 'select',\n },\n])\nfunction getTypeDes(type: string) {\n return infoTypeList.find(v => v.value === type)?.label\n}\n\nconst selectType = ref<InfoItemType>('input')\n\nconst { value: siteConfig } = useSiteConfig()\nconst maxInputLength = computed(() => siteConfig.value.maxInputLength)\n\nconst autoRewrite = ref(false)\nconst infos = reactive<InfoItem[]>([])\nconst needSave = ref(false)\n\nconst showAddInfo = computed(() => infos.length < siteConfig.value.formLength && !openPreview.value)\n// 负责清空&更新\nwatch(\n () => props.info,\n () => {\n infos.splice(0, infos.length)\n selectType.value = 'input'\n openPreview.value = false\n infos.push(...parseInfo(props.info))\n needSave.value = false\n },\n {\n immediate: true,\n },\n)\n\n// 预计格式\nconst resFormat = computed(\n () => `${infos.map(v => v.text).join(formatData.splitChar)}.后缀`,\n)\nwatchEffect(() => {\n autoRewrite.value = !!props.rewrite\n})\nfunction handleChange(v: boolean) {\n updateTaskInfo(props.k, {\n rewrite: +v,\n })\n}\n\nfunction addInfo(infoList?: InfoItem[], type?: InfoItemType) {\n const list = infoList || infos\n const t = type || selectType.value\n const item: InfoItem = { text: `标题${list.length + 1}`, type: t, value: '' }\n if (t === 'radio' || t === 'select') {\n item.children = [{ text: '选项1' }, { text: '选项2' }]\n }\n list.push(item)\n needSave.value = true\n}\nfunction deleteInfo(idx: number, infoList?: InfoItem[], minLen = 1) {\n const list = infoList || infos\n if (list.length <= minLen) {\n return\n }\n list.splice(idx, 1)\n needSave.value = true\n}\nfunction judgeInfoForm(items: InfoItem[]) {\n return items.every(v => v.text.trim() && judgeInfoForm(v.children || []))\n}\nfunction saveInfo() {\n if (!judgeInfoForm(infos)) {\n ElMessage.error('请完整填写表单信息')\n setTimeout(() => {\n ElMessage.warning('不能有空项')\n }, 100)\n return\n }\n updateTaskInfo(props.k, {\n info: JSON.stringify(\n infos.map((v) => {\n // 特殊处理固定值的内容\n if (v.type === 'text') {\n v.value = v.text\n }\n return v\n }),\n ),\n })\n needSave.value = false\n}\n\nfunction moveInfoUp(idx: number) {\n if (idx === 0)\n return\n const temp = infos[idx - 1]\n infos.splice(idx - 1, 1)\n infos.splice(idx, 0, temp)\n}\n\nconst importPanelInfo = reactive({ taskList: [], taskValue: '' })\nconst showImportPanel = ref(false)\nasync function openImportPanel() {\n const taskKey = props.k\n // 通过任务Key获取可用任务列表,与概况信息\n const { data } = await TaskApi.getUsefulTemplate(taskKey)\n importPanelInfo.taskList = data\n importPanelInfo.taskValue = data[0]?.taskKey || ''\n showImportPanel.value = true\n}\n\nfunction handleSaveImportInfo() {\n const usefulInfo = importPanelInfo.taskList.find(\n v => v.taskKey === importPanelInfo.taskValue,\n ).info\n infos.splice(0, infos.length)\n infos.push(...parseInfo(usefulInfo))\n showImportPanel.value = false\n needSave.value = true\n}\n\nconst isMobile = useIsMobile()\nconst importPanelFlexStyle = computed(() => (isMobile.value ? '0 0 auto' : 0.5))\n\nfunction showHelp() {\n ElMessageBox.alert(\n '<p>固定内容主要用于重命名中,固定的部分,如“活动名”,“班级名”</p><p>如要设置注意事项,请使用 <strong>批注</strong> 功能</p>',\n '注意事项',\n { dangerouslyUseHTMLString: true },\n )\n}\n\nfunction handleChangeSplitChar() {\n updateTaskInfo(props.k, {\n format: JSON.stringify(formatData),\n })\n}\nconst splitCharList = reactive(['-', '+', '_'])\nwatchEffect(() => {\n if (props.format !== null) {\n Object.assign(formatData, parseFileFormat(props.format))\n }\n})\n</script>\n\n<template>\n <div class=\"tc\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MDE4MzM3NjUyNg==650183376526',\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjU2ODcyNg==651496568726',\n ]\"\n >\n 上传文件必填表单信息\n </Tip>\n <div class=\"auto-format\">\n <span>文件自动重命名:</span>\n <el-switch\n v-model=\"autoRewrite\"\n style=\"display: block\"\n active-color=\"#13ce66\"\n inactive-color=\"#ff4949\"\n active-text=\"开\"\n inactive-text=\"关\"\n @change=\"handleChange\"\n />\n </div>\n <div v-if=\"autoRewrite\" style=\"margin-bottom: 10px\">\n 预期格式:\n <span style=\"color: #409eff\">{{ resFormat }}</span>\n </div>\n <div v-if=\"autoRewrite\" style=\"margin-bottom: 10px\">\n 分割符:\n <el-select\n v-model=\"formatData.splitChar\"\n placeholder=\"分隔符\"\n style=\"width: 60px\"\n size=\"small\"\n @change=\"handleChangeSplitChar\"\n >\n <el-option v-for=\"v in splitCharList\" :key=\"v\" :label=\"v\" :value=\"v\" />\n </el-select>\n </div>\n <Tip v-if=\"autoRewrite\" style=\"color: red\">\n 开启自动重命名后,重点关注文件名格式是否符合预期\n </Tip>\n <div>\n 预览\n <el-switch\n v-model=\"openPreview\"\n inline-prompt\n active-text=\"是\"\n inactive-text=\"否\"\n active-color=\"#13ce66\"\n inactive-color=\"#ff4949\"\n />\n </div>\n <!-- 必填信息区域 -->\n <div class=\"form-wrapper\">\n <InfosForm v-if=\"openPreview\" :infos=\"infos\" :disabled=\"openPreview\" />\n <el-form v-else label-width=\"100px\">\n <el-form-item v-for=\"(item, idx) in infos\" :key=\"idx\">\n <template #label>\n <div class=\"flex fc fac\">\n <div class=\"num-wrapper\">\n <div>{{ idx + 1 }}</div>\n </div>\n <div class=\"form-item-type\" :class=\"item.type\">\n {{ getTypeDes(item.type) }}\n </div>\n </div>\n </template>\n <el-input\n v-model=\"item.text\"\n placeholder=\"输入内容\"\n :maxlength=\"maxInputLength\"\n clearable\n show-word-limit\n >\n <template #append>\n <div class=\"form-item-wrapper\">\n <el-icon\n :color=\"infos.length > 1 ? 'red' : 'grey'\"\n @click=\"deleteInfo(idx)\"\n >\n <CircleCloseFilled />\n </el-icon>\n <el-icon\n v-if=\"idx > 0\"\n color=\"#000\"\n style=\"margin-left: 6px\"\n @click=\"moveInfoUp(idx)\"\n >\n <Top />\n </el-icon>\n </div>\n </template>\n </el-input>\n <div\n v-if=\"item.type === 'radio' || item.type === 'select'\"\n class=\"radio-list\"\n >\n <el-input\n v-for=\"(v, idx2) in item.children\"\n :key=\"idx2\"\n v-model=\"v.text\"\n size=\"small\"\n placeholder=\"输入内容\"\n :maxlength=\"maxInputLength\"\n clearable\n show-word-limit\n >\n <template #append>\n <div class=\"form-item-wrapper\">\n <el-icon\n :color=\"item.children.length > 2 ? 'red' : 'grey'\"\n @click=\"deleteInfo(idx, item.children, 2)\"\n >\n <CircleCloseFilled />\n </el-icon>\n <template v-if=\"idx + 1 === item.children.length\">\n <el-icon\n style=\"margin-left: 10px\"\n color=\"#67C23A\"\n @click=\"addInfo(item.children, item.type)\"\n >\n <CirclePlusFilled />\n </el-icon>\n </template>\n </div>\n </template>\n </el-input>\n </div>\n </el-form-item>\n </el-form>\n </div>\n <div v-if=\"showAddInfo\" class=\"p10\">\n <el-button\n size=\"small\"\n type=\"primary\"\n round\n @click=\"\n () => {\n addInfo()\n }\n \"\n >\n 添加一项\n </el-button>\n <el-select\n v-model=\"selectType\"\n style=\"margin: 0 10px\"\n size=\"small\"\n placeholder=\"选择添加的类型\"\n >\n <el-option\n v-for=\"(v, idx) in infoTypeList\"\n :key=\"idx\"\n :label=\"v.label\"\n :value=\"v.value\"\n />\n </el-select>\n <el-button type=\"primary\" text @click=\"showHelp\">\n 提示❓\n </el-button>\n </div>\n <!-- 从其它任务导入 -->\n <el-button size=\"small\" type=\"warning\" @click=\"openImportPanel\">\n 从其它任务导入\n </el-button>\n <div class=\"p10\">\n <Tip>支持从已有的任务直接导入表单信息</Tip>\n <el-button type=\"success\" style=\"width: 200px\" @click=\"saveInfo\">\n 保存\n </el-button>\n </div>\n <div v-if=\"needSave\" style=\"color: red\">\n 有变动,请记得点击保存\n </div>\n <div class=\"info-panel\">\n <el-dialog\n v-model=\"showImportPanel\"\n :fullscreen=\"isMobile\"\n title=\"表单信息导入\"\n >\n <el-form\n :model=\"importPanelInfo\"\n label-width=\"100px\"\n label-position=\"right\"\n >\n <el-form-item label=\"任务\">\n <el-select\n v-model=\"importPanelInfo.taskValue\"\n filterable\n placeholder=\"请选择\"\n no-data-text=\"无可用任务\"\n >\n <el-option\n v-for=\"t in importPanelInfo.taskList\"\n :key=\"t.taskKey\"\n :label=\"t.name\"\n :value=\"t.taskKey\"\n />\n </el-select>\n </el-form-item>\n <Tip>{{ importPanelInfo.taskValue ? '' : '无可用任务' }}</Tip>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showImportPanel = false\">取 消</el-button>\n <el-button\n :disabled=\"!importPanelInfo.taskValue\"\n type=\"primary\"\n @click=\"handleSaveImportInfo\"\n >确 定\n </el-button>\n </span>\n </template>\n </el-dialog>\n </div>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.auto-format {\n display: flex;\n justify-content: center;\n}\n\n:deep(.el-form-item__label) {\n display: flex;\n justify-content: center;\n align-items: flex-start;\n}\n\n.num-wrapper {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 2px solid #000;\n text-align: center;\n font-size: 14px;\n}\n\n.info-panel :deep(.el-form-item__label) {\n flex: v-bind(importPanelFlexStyle);\n justify-content: flex-end;\n}\n\n.form-wrapper {\n max-width: 380px;\n margin: 0 auto;\n}\n\n.form-wrapper :deep(.el-input-group__append) {\n background-color: transparent;\n border: none;\n box-shadow: none;\n padding: 0;\n}\n\n.form-item-wrapper {\n width: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.form-item-type {\n margin-left: 10px;\n font-size: 12px;\n width: 48px;\n text-align: left;\n}\n\n.radio-list {\n padding-top: 10px;\n}\n\n.radio-list :deep(.el-input) {\n width: 80%;\n}\n</style>\n","<!-- eslint-disable ts/ban-ts-comment -->\n<script lang=\"ts\" setup>\nimport { computed, reactive, ref, watch } from 'vue'\nimport { Plus } from '@element-plus/icons-vue'\nimport type { UploadProps, UploadUserFile } from 'element-plus'\nimport { ElMessage } from 'element-plus'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\nimport { FileApi, PublicApi, TaskApi } from '@/apis'\nimport { qiniuUpload } from '@/utils/networkUtil'\nimport { getTipImageKey } from '@/utils/stringUtil'\n\nconst props = defineProps({\n tip: {\n type: String,\n default: '',\n required: false,\n },\n k: {\n type: String,\n default: '',\n },\n})\nconst textValue = ref('')\n\nconst tipData = reactive<{\n text: string\n imgs: {\n uid: number\n name: string\n }[]\n}>({\n text: '',\n imgs: [],\n})\nconst MaxImgCount = ref(3)\nconst imageList = ref<UploadUserFile[]>([])\nconst previewList = computed(() => {\n // @ts-expect-error\n return imageList.value.map(v => v!.preview || v.url)\n})\nconst previewIdx = ref(0)\n\nwatch(\n () => props.tip,\n () => {\n // 初始化\n try {\n const parseData = JSON.parse(props.tip)\n tipData.imgs = parseData.imgs\n tipData.text = parseData.text || ''\n imageList.value = tipData.imgs.map((v) => {\n return {\n ...v,\n url: 'https://img.cdn.sugarat.top/mdImg/MTY3NzkxMDI1NTU1Nw==20140524124237518.gif',\n }\n })\n if (imageList.value.length) {\n // 异步填充url\n PublicApi.getTipImageUrl(\n props.k,\n imageList.value.map(v => ({\n uid: v.uid,\n name: v.name,\n })),\n ).then((v) => {\n v.data.forEach((url, idx) => {\n imageList.value[idx].url = url.cover\n Object.assign(imageList.value[idx], {\n preview: url.preview,\n })\n })\n })\n }\n }\n catch {\n tipData.text = props.tip || ''\n tipData.imgs = []\n imageList.value = []\n }\n\n // 外部变动\n if (tipData.text) {\n textValue.value = tipData.text\n }\n else {\n textValue.value = ''\n }\n },\n {\n immediate: true,\n },\n)\nconst needSave = computed(() => tipData.text !== textValue.value)\n\n// 更新批注信息\nfunction updateTip(notify = true) {\n if (tipData.text !== textValue.value) {\n tipData.text = textValue.value\n }\n updateTaskInfo(props.k, { tip: JSON.stringify(tipData) }, notify)\n}\n\nconst imageViewerVisible = ref(false)\nfunction handleChangeFile(file: UploadUserFile) {\n if (!props.k) {\n return\n }\n const { name, uid } = file\n const key = getTipImageKey(props.k, name, uid)\n if (file.status === 'ready') {\n file.status = 'success'\n // qiniu上传\n FileApi.getUploadToken().then((res) => {\n qiniuUpload(res.data.token, file.raw, key, {\n success() {\n tipData.imgs.push({\n uid,\n name,\n })\n updateTip()\n },\n })\n })\n }\n}\nconst handleRemove: UploadProps['onRemove'] = (file) => {\n const { uid, name } = file\n const idx = tipData.imgs.findIndex(v => v.uid === uid)\n tipData.imgs.splice(idx, 1)\n updateTip()\n TaskApi.delTipImage(props.k, uid, name)\n}\n\nfunction handlePictureCardPreview(file) {\n imageViewerVisible.value = true\n const idx = imageList.value.findIndex(v => v.uid === file.uid)\n previewIdx.value = idx\n}\n// 超出选择的文件个数\nfunction handleExceedFile() {\n ElMessage.error(`只能选择${MaxImgCount.value}个图片,可删除后重新选择`)\n}\n</script>\n\n<template>\n <div class=\"tc ddl\">\n <Tip\n :imgs=\"[\n 'https://img.cdn.sugarat.top/mdImg/MTY1MTQ5NjI2OTI0MQ==651496269241',\n ]\"\n >\n 设置注意事项,供用户提交时查看\n </Tip>\n <Tip>注意控制字数和换行,避免展示异常,设置完记得预览一下,再投放</Tip>\n <div class=\"tc flex fc fac\">\n <el-input\n v-model=\"textValue\"\n :rows=\"5\"\n clearable\n :max=\"500\"\n show-word-limit\n type=\"textarea\"\n placeholder=\"请输入要展示的批注信息\"\n />\n </div>\n <div class=\"p10\">\n <el-button size=\"default\" type=\"success\" @click=\"updateTip\">\n 保存\n </el-button>\n <el-button size=\"default\" type=\"danger\" @click=\"textValue = ''\">\n 清空\n </el-button>\n </div>\n <Tip v-if=\"needSave\">\n 有变动记得保存\n </Tip>\n <Tip> 可以设置图片啦↓ 最多3张 </Tip>\n <el-upload\n v-model:file-list=\"imageList\"\n accept=\"image/*\"\n :limit=\"MaxImgCount\"\n action=\"\"\n list-type=\"picture-card\"\n :on-change=\"handleChangeFile\"\n :on-exceed=\"handleExceedFile\"\n :on-preview=\"handlePictureCardPreview\"\n :on-remove=\"handleRemove\"\n :auto-upload=\"false\"\n >\n <el-icon><Plus /></el-icon>\n </el-upload>\n <ElImageViewer\n v-if=\"imageViewerVisible\"\n hide-on-click-modal\n :initial-index=\"previewIdx\"\n :url-list=\"previewList\"\n teleported\n @close=\"imageViewerVisible = false\"\n />\n </div>\n</template>\n","<template>\n <div class=\"tc\">\n <tip class=\"title\"> ↓下方设置允许提交的文件类型↓ </tip>\n <tip>暂时只支持通过文件名后缀进行卡控,不区分大小写</tip>\n <tip>例如:txt,png,jpeg,webp</tip>\n <div class=\"tc\">\n <el-switch\n active-text=\"限制文件类型\"\n inactive-text=\"不限制文件类型\"\n @change=\"handleChange\"\n :value=\"formatData.status\"\n style=\"--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949\"\n />\n </div>\n <div v-show=\"formatData.status\">\n <tip>支持英文逗号\",\"分割,一次添加多个</tip>\n <div style=\"max-width: 300px; margin: 0 auto\">\n <el-input v-model=\"typeName\" placeholder=\"请输入文件类型(省略.)\">\n <template #append>\n <el-button @click=\"handleAddType\"> 确定 </el-button>\n </template>\n </el-input>\n </div>\n <el-tag\n v-for=\"(tag, idx) in formatData.format\"\n :key=\"idx\"\n class=\"type\"\n closable\n :disable-transitions=\"false\"\n @close=\"handleDelType(idx)\"\n >\n {{ tag }}\n </el-tag>\n <tip v-show=\"formatData.format.length\"\n >已添加: <span>{{ formatData.format.join(',') }}</span>\n <el-button type=\"primary\" text size=\"small\" @click=\"handleCopyType\"\n >一键复制</el-button\n >\n </tip>\n </div>\n <div class=\"split-line\"></div>\n <tip class=\"title\"\n >↓下方设置最大同时提交文件数量(16 >= x >=1 默认 10)↓</tip\n >\n <div class=\"tc\">\n <el-input-number\n :model-value=\"formatData.limit\"\n :min=\"1\"\n :max=\"16\"\n @change=\"handleChangeLimit\"\n />\n </div>\n <div class=\"split-line\"></div>\n <tip class=\"title\"> ↓下方设置文件最大的大小↓ </tip>\n <tip>1024B = 1KB, 1024KB = 1MB, 1024MB = 1GB</tip>\n <tip>0表示不限制</tip>\n <div class=\"tc\">\n <el-input-number\n :model-value=\"inputSize\"\n :min=\"0\"\n :max=\"1024\"\n @change=\"handleLimitSize\"\n />\n <el-select\n @change=\"handleChangeUnit\"\n v-model=\"formatData.sizeUnit\"\n placeholder=\"单位\"\n style=\"width: 100px\"\n >\n <el-option v-for=\"v in unitList\" :key=\"v\" :label=\"v\" :value=\"v\" />\n </el-select>\n </div>\n <div class=\"split-line\"></div>\n <tip :style=\"formatData.size === 0 ? 'color:grey' : 'color:red'\">{{\n formatData.size === 0\n ? '不限制大小'\n : `限制为不超过: ${formatSize(formatData.size)}`\n }}</tip>\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { ElMessage } from 'element-plus'\nimport { reactive, ref, watchEffect } from 'vue'\nimport {\n copyRes,\n formatSize,\n getDefaultFormat,\n parseFileFormat\n} from '@/utils/stringUtil'\nimport { updateTaskInfo } from '../../public'\nimport Tip from './tip.vue'\n\nconst props = defineProps({\n format: {\n type: String,\n default: '',\n required: false\n },\n k: {\n type: String,\n default: ''\n }\n})\n\nconst formatData = reactive(getDefaultFormat())\nconst typeName = ref('')\nconst updateInfo = () => {\n updateTaskInfo(props.k, {\n format: JSON.stringify(formatData)\n })\n}\nconst handleChange = (v: boolean) => {\n formatData.status = !!v\n updateInfo()\n}\n\nconst handleAddType = () => {\n const inputValue = typeName.value\n .split(',')\n // 转为小写\n .map((v) => v.trim().toLowerCase())\n for (const v of inputValue) {\n if (formatData.format.includes(v)) {\n ElMessage.error(`${v} 已存在`)\n return\n }\n }\n\n formatData.format.push(...inputValue)\n updateInfo()\n\n typeName.value = ''\n}\nconst handleDelType = (idx) => {\n formatData.format.splice(idx, 1)\n updateInfo()\n}\nconst handleCopyType = () => {\n copyRes(formatData.format.join(','))\n}\n\nconst handleChangeLimit = (limit: number) => {\n formatData.limit = limit\n updateInfo()\n}\n\nconst inputSize = ref(0)\nconst unitList = reactive(['B', 'KB', 'MB', 'GB'])\nconst handleChangeUnit = () => {\n const idx = unitList.findIndex((v) => v === formatData.sizeUnit)\n formatData.size = inputSize.value * 1024 ** idx\n updateInfo()\n}\nconst handleLimitSize = (limit: number) => {\n inputSize.value = limit\n const idx = unitList.findIndex((v) => v === formatData.sizeUnit)\n formatData.size = inputSize.value * 1024 ** idx\n updateInfo()\n}\n\nwatchEffect(() => {\n if (props.format !== null) {\n Object.assign(formatData, parseFileFormat(props.format))\n }\n})\n</script>\n<style scoped>\n.type {\n margin: 10px;\n}\n.split-line {\n margin-top: 10px;\n}\n.title {\n color: black;\n font-weight: bold;\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ElMessage, ElMessageBox } from 'element-plus'\nimport { computed, onMounted, reactive, ref, watchEffect } from 'vue'\nimport { useStore } from 'vuex'\nimport LinkDialog from '@components/linkDialog.vue'\nimport CategoryPanel from './components/CategoryPanel.vue'\nimport CreateTask from './components/CreateTask.vue'\nimport TaskInfo from './components/TaskInfo.vue'\nimport DDlPanel from './components/infoPanel/ddl.vue'\nimport PeoplePanel from './components/infoPanel/people.vue'\nimport TemplatePanel from './components/infoPanel/template.vue'\nimport InfoPanel from './components/infoPanel/info.vue'\nimport TipInfoPanel from './components/infoPanel/tipInfo.vue'\nimport FileInfoPanel from './components/infoPanel/file.vue'\nimport { copyRes } from '@/utils/stringUtil'\nimport { TaskApi } from '@/apis'\nimport { useIsMobile } from '@/composables'\n\nconst $store = useStore()\n\nconst isMobile = useIsMobile()\n// 分类相关\nconst categorys = computed(() => $store.state.category.categoryList)\n\n// 任务相关\nconst selectCategory = ref('default')\nconst tasks = computed<TaskApiTypes.TaskItem[]>(\n () => $store.state.task.taskList,\n)\nconst filterTasks = computed(() => {\n const t = tasks.value.filter(v => v.category === selectCategory.value)\n return t\n})\n\n// 删除任务\nfunction deleteTask(k: string, isTrash = false) {\n if (!k)\n return\n ElMessageBox.confirm(\n '确认删除此任务吗?',\n isTrash ? '!!回收站的删除后无法再恢复' : '数据无价,请谨慎操作',\n {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: isTrash ? 'error' : 'info',\n },\n )\n .then(() => {\n $store.dispatch('task/deleteTask', k).then(() => {\n ElMessage.success('删除成功')\n })\n })\n .catch(() => {\n ElMessage.info('取消删除')\n })\n}\n\n// 基本信息编辑\nconst showBaseInfoDialog = ref(false)\nconst taskBaseInfo = reactive({ name: '', category: '', key: '' })\nfunction editBaseInfo(task: any) {\n taskBaseInfo.name = task.name\n taskBaseInfo.category = task.category\n taskBaseInfo.key = task.key\n showBaseInfoDialog.value = true\n}\nfunction handleSaveEditInfo() {\n showBaseInfoDialog.value = false\n if (!taskBaseInfo.name.trim()) {\n ElMessage.warning('不能为空')\n return\n }\n $store.dispatch('task/updateTask', taskBaseInfo).then(() => {\n ElMessage.success('更新成功')\n })\n}\n\n// 生成分享链接\nconst shareTaskLink = ref('')\nconst showLinkModal = ref(false)\nfunction shareTask(k: string) {\n shareTaskLink.value = 'default'\n const { origin } = window.location\n shareTaskLink.value = `${origin}/task/${k}`\n copyRes(shareTaskLink.value, '收集链接已自动复制到粘贴板')\n showLinkModal.value = true\n}\n\n// 附加属性编辑\nconst taskInfo = reactive<TaskApiTypes.TaskInfo>({})\nconst showTaskInfoPanel = ref(false)\nconst activeInfo = ref('info')\nconst activeTask: TaskApiTypes.TaskItem = reactive({\n category: '',\n key: '',\n name: '',\n recentLog: [],\n})\nfunction editMore(item: any) {\n Object.assign(activeTask, item)\n TaskApi.getTaskMoreInfo(item.key).then((res) => {\n // 先初始化,再赋值\n taskInfo.info = '[]'\n taskInfo.ddl = ''\n taskInfo.tip = ''\n taskInfo.format = ''\n taskInfo.bindField = ''\n setTimeout(() => {\n Object.assign(taskInfo, res.data)\n showTaskInfoPanel.value = true\n })\n })\n}\n\n// TODO: 有需要再优化,目前像bug\n// 用于选择默认展示项目\n// const taskCount = (c: string) => {\n// const count = tasks.value.filter((t: any) => t.category === c).length\n// return count\n// }\n\n// 选中一个有任务数据的分类\n// watchEffect(() => {\n// if (taskCount('default') > 0) {\n// return\n// }\n// if (categorys.value.length > 0) {\n// for (const c of categorys.value) {\n// if (taskCount(c.k) > 0) {\n// selectCategory.value = c.k\n// break\n// }\n// }\n// }\n// })\n\nonMounted(() => {\n $store.dispatch('category/getCategory')\n $store.dispatch('task/getTask')\n})\n\nfunction openTaskPage() {\n window.open(`/task/${activeTask.key}`)\n}\n</script>\n\n<template>\n <div class=\"tasks\">\n <!-- 分类管理 -->\n <div class=\"categorys-area\">\n <CategoryPanel v-model:category=\"selectCategory\" />\n </div>\n\n <!-- 任务管理 -->\n <div class=\"panel task-panel\">\n <!-- 创建任务 -->\n <CreateTask :active-category-key=\"selectCategory\" />\n\n <!-- 任务列表 -->\n <div class=\"task-list\">\n <TaskInfo\n v-for=\"item in filterTasks\"\n :key=\"item.key\"\n :item=\"item\"\n @edit=\"editBaseInfo\"\n @delete=\"deleteTask\"\n @share=\"shareTask\"\n @more=\"editMore\"\n />\n <el-empty\n v-if=\"filterTasks.length === 0\"\n description=\"此分类下没有任务哟,快去创建吧\"\n />\n </div>\n </div>\n\n <!-- 任务基本信息维护弹窗 -->\n <el-dialog\n v-model=\"showBaseInfoDialog\"\n draggable\n :fullscreen=\"isMobile\"\n title=\"基本信息修改\"\n >\n <el-form :model=\"taskBaseInfo\">\n <el-form-item label=\"任务名称\" label-width=\"100px\">\n <el-input v-model=\"taskBaseInfo.name\" autocomplete=\"off\" />\n </el-form-item>\n <el-form-item label=\"新的分类\" label-width=\"100px\">\n <el-select v-model=\"taskBaseInfo.category\" placeholder=\"请选择新分类\">\n <el-option label=\"默认\" value=\"default\" />\n <el-option\n v-for=\"c in categorys\"\n :key=\"c.k\"\n :label=\"c.name\"\n :value=\"c.k\"\n />\n </el-select>\n </el-form-item>\n </el-form>\n <template #footer>\n <span class=\"dialog-footer\">\n <el-button @click=\"showBaseInfoDialog = false\">取 消</el-button>\n <el-button type=\"primary\" @click=\"handleSaveEditInfo\">确 定</el-button>\n </span>\n </template>\n </el-dialog>\n\n <!-- 分享链接弹窗(二维码/链接/短链) -->\n <LinkDialog\n v-model:value=\"showLinkModal\"\n :download=\"false\"\n title=\"收取链接\"\n :link=\"shareTaskLink\"\n />\n <!-- 附加属性编辑弹窗 -->\n <el-dialog\n v-model=\"showTaskInfoPanel\"\n :fullscreen=\"isMobile\"\n title=\"更多设置\"\n center\n >\n <div>\n <h3 class=\"tc\" style=\"font-size: 14px; color: #9e9e9e\">\n 任务名:<strong style=\"color: #000000\">{{ activeTask.name }}</strong>,\n <el-button type=\"primary\" text @click=\"openTaskPage\">\n 去查看效果\n </el-button>\n </h3>\n <el-tabs v-model=\"activeInfo\">\n <el-tab-pane label=\"截止日期\" name=\"ddl\">\n <DDlPanel :ddl=\"taskInfo.ddl\" :k=\"activeTask.key\" />\n </el-tab-pane>\n <el-tab-pane label=\"批注信息\" name=\"tip\">\n <TipInfoPanel\n :rewrite=\"taskInfo.rewrite\"\n :tip=\"taskInfo.tip\"\n :k=\"activeTask.key\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"限制名单\" name=\"people\">\n <PeoplePanel\n :name=\"activeTask.name\"\n :value=\"taskInfo.people\"\n :k=\"activeTask.key\"\n :field=\"taskInfo.bindField\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"必填信息\" name=\"info\">\n <InfoPanel\n :rewrite=\"taskInfo.rewrite\"\n :info=\"taskInfo.info\"\n :k=\"activeTask.key\"\n :format=\"taskInfo.format\"\n />\n </el-tab-pane>\n <el-tab-pane label=\"模板文件\" name=\"template\">\n <TemplatePanel :value=\"taskInfo.template\" :k=\"activeTask.key\" />\n </el-tab-pane>\n <el-tab-pane label=\"文件属性\" name=\"attr\">\n <FileInfoPanel :format=\"taskInfo.format\" :k=\"activeTask.key\" />\n </el-tab-pane>\n </el-tabs>\n </div>\n </el-dialog>\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.tasks {\n max-width: 1024px;\n margin: 0 auto;\n padding-bottom: 2em;\n}\n\n.tasks :deep(.el-dialog__body) {\n padding-top: 10px;\n}\n\n.panel {\n padding: 1em;\n background-color: #fff;\n margin: 10px auto;\n box-sizing: border-box;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n}\n\n.task-list {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-around;\n}\n\n@media screen and (max-width: 700px) {\n .categorys-area {\n margin-top: 20px;\n }\n :deep(.el-tabs__nav-scroll) {\n overflow-x: scroll;\n &::-webkit-scrollbar {\n display: none; /* Chrome Safari */\n }\n }\n}\n</style>\n"],"names":["cardProps","buildProps","header","type","String","default","bodyStyle","definePropType","Object","Array","shadow","values","ElCard","withInstall","_export_sfc","defineComponent","name","props","setup","__props","ns","useNamespace","_ctx","_cache","openBlock","createElementBlock","class","normalizeClass","unref","b","is","$slots","key","e","renderSlot","createTextVNode","toDisplayString","createCommentVNode","createElementVNode","style","normalizeStyle","inputNumberProps","id","step","Number","stepStrictly","Boolean","max","POSITIVE_INFINITY","min","NEGATIVE_INFINITY","modelValue","disabled","size","useSizeProp","controls","controlsPosition","valueOnClear","validator","val","isNumber","includes","label","placeholder","precision","parseInt","validateEvent","_hoisted_1","_hoisted_2","ElInputNumber","emits","CHANGE_EVENT","prev","cur","blur","FocusEvent","focus","INPUT_EVENT","isNil","UPDATE_MODEL_EVENT","expose","emit","t","useLocale","input","ref","data","reactive","currentValue","userInput","formItem","useFormItem","minDisabled","computed","ensurePrecision","maxDisabled","numPrecision","stepPrecision","getPrecision","isUndefined","Math","controlsAtRight","inputNumberSize","useSize","inputNumberDisabled","useDisabled","displayValue","isNaN","toFixed","toPrecision","num","pre","value","round","snum","pointPos","indexOf","replace","split","length","charAt","slice","parseFloat","valueString","toString","dotPosition","coefficient","increase","newVal","setCurrentValue","decrease","verifyValue","update","isString","_a","oldVal","validate","call","catch","err","debugWarn","handleInput","handleInputChange","handleFocus","event","handleBlur","watch","immediate","onMounted","innerInput","setAttribute","isFinite","removeAttribute","onUpdated","_b","m","onDragstart","withModifiers","withDirectives","role","onKeydown","withKeys","createVNode","ElIcon","withCtx","createBlock","ArrowDown","Minus","_","RepeatClick","ArrowUp","Plus","ElInput","ref_key","onBlur","onFocus","onInput","onChange","_sfc_main","viewBox","xmlns","_hoisted_3","fill","d","circleCloseFilled","$props","$setup","$data","$options","circlePlusFilled","_delete","_hoisted_4","edit","menu","plus","share","top","_sfc_main$9","components","DeleteFilled","category","required","context","$store","useStore","categorys","state","categoryList","tasks","task","taskList","isShowCreateCategory","categoryName","handleClickCategory","k","addCategory","trim","dispatch","then","ElMessage","success","code","warning","handleDeleteCategory","c","ElMessageBox","confirm","confirmButtonText","cancelButtonText","info","taskCount","count","filter","n","_pushScopeId","_popScopeId","_withScopeId","_createElementVNode","_hoisted_5","_component_el_icon","__unplugin_components_3","_openBlock","_createElementBlock","_createBlock","_component_el_input","$event","onFocusout","_component_el_button","onClick","_createTextVNode","_createVNode","_component_el_tag","effect","_toDisplayString","_withCtx","_component_DeleteFilled","_hoisted_6","_hoisted_7","_Fragment","_renderList","tag","closable","activeCategoryKey","find","v","isShowCreateTask","taskName","createTask","updateTaskInfo","debounce","options","successInfo","TaskApi","updateTaskMoreInfo","message","zIndex","duration","error","newDate","watchEffect","ddl","Date","updateDDL","formatDate","getTime","closeDDL","waitTime","isOver","waitTimeStr","seconds","hour","day","minute","refreshWaitTime","loop","now","setTimeout","activeTab","userInputName","importStatus","handAddName","PeopleApi","addPeopleByUser","finally","checkMore","people","updateLimitPeople","limit","showPeopleList","peopleList","selectSubmitStatus","searchName","filterPeopleBySearchWord","peopleSubmitData","p","status","isLoadingPeopleData","refreshSubmitData","getPeople","res","splice","push","forEach","lastDate","handleCheckMore","checkPeople","peopleFileList","peopleUpload","handleExceedFile","clearFiles","submitUploadPeople","file","uploadFile","raw","importPeople","fail","tableToExcel","map","handleChangeFile","handleExportExcel","headers","body","submitCount","fileCount","isMobile","useIsMobile","importPanelInfo","taskValue","showImportPanel","async","openImportPanel","taskKey","getUsefulTemplate","ImportTaskTipMsg","handleSaveImportInfo","importPeopleFromTpl","importPanelFlexStyle","bindField","handleSureBind","field","item","deletePeople","findIndex","_sfc_main$4","template","percentage","fileList","elUpload","deleteTemplate","FileApi","getUploadToken","qiniuUpload","token","process","per","Tip","_component_el_upload","__unplugin_components_1","_component_tip","imgs","_createCommentVNode","action","formatData","getDefaultFormat","openPreview","infoTypeList","selectType","siteConfig","useSiteConfig","maxInputLength","autoRewrite","infos","needSave","showAddInfo","formLength","parseInfo","resFormat","text","join","splitChar","handleChange","rewrite","addInfo","infoList","list","children","deleteInfo","idx","minLen","judgeInfoForm","items","every","saveInfo","JSON","stringify","usefulInfo","showHelp","alert","dangerouslyUseHTMLString","handleChangeSplitChar","format","splitCharList","assign","parseFileFormat","temp","textValue","tipData","MaxImgCount","imageList","previewList","preview","url","previewIdx","tip","parseData","parse","PublicApi","getTipImageUrl","uid","cover","updateTip","notify","imageViewerVisible","getTipImageKey","handleRemove","delTipImage","handlePictureCardPreview","typeName","updateInfo","handleAddType","inputValue","toLowerCase","handleCopyType","copyRes","handleChangeLimit","inputSize","unitList","handleChangeUnit","sizeUnit","handleLimitSize","selectCategory","filterTasks","deleteTask","isTrash","showBaseInfoDialog","taskBaseInfo","editBaseInfo","handleSaveEditInfo","shareTaskLink","showLinkModal","shareTask","origin","window","location","taskInfo","showTaskInfoPanel","activeInfo","activeTask","recentLog","editMore","getTaskMoreInfo","openTaskPage","open"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]}