fmode-ng 0.0.113 → 0.0.115

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 (275) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +37 -37
  3. package/esm2022/fmode-ng.mjs +10 -5
  4. package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
  5. package/esm2022/lib/aigc/agent/index.mjs +10 -3
  6. package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
  9. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
  10. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
  11. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
  12. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
  13. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
  14. package/esm2022/lib/aigc/avatar/index.mjs +10 -8
  15. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
  16. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
  17. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
  18. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
  19. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
  20. package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
  21. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
  22. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
  23. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
  24. package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
  25. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
  26. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
  27. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
  28. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
  29. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
  30. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
  31. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
  32. package/esm2022/lib/aigc/chat/index.mjs +10 -8
  33. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
  34. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
  35. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
  36. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
  37. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
  38. package/esm2022/lib/aigc/index.mjs +10 -14
  39. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
  40. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
  41. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
  42. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
  43. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
  44. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
  45. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
  46. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
  47. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
  48. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
  49. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
  50. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
  51. package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
  52. package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
  53. package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
  54. package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
  55. package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
  56. package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
  57. package/esm2022/lib/aigc/story/index.mjs +10 -6
  58. package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
  59. package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
  60. package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
  61. package/esm2022/lib/aigc/story/story.service.mjs +10 -35
  62. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
  63. package/esm2022/lib/aigc/voice/index.mjs +10 -7
  64. package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
  65. package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
  66. package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
  67. package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
  68. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
  69. package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
  70. package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
  71. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
  72. package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
  73. package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
  74. package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
  75. package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
  76. package/esm2022/lib/code/index.mjs +10 -2
  77. package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
  78. package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
  79. package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
  80. package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
  81. package/esm2022/lib/core/agent/chat/index.mjs +10 -4
  82. package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
  83. package/esm2022/lib/core/agent/index.mjs +10 -6
  84. package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
  85. package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
  86. package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
  87. package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
  88. package/esm2022/lib/core/agent/story/index.mjs +10 -2
  89. package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
  90. package/esm2022/lib/core/agent/task/index.mjs +10 -2
  91. package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
  92. package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
  93. package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
  94. package/esm2022/lib/core/index.mjs +10 -4
  95. package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
  96. package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
  97. package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
  98. package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
  99. package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
  100. package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
  101. package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
  102. package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
  103. package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
  104. package/esm2022/lib/core/parse/index.mjs +10 -5
  105. package/esm2022/lib/core/parse/types.mjs +10 -2
  106. package/esm2022/lib/core/voice/index.mjs +10 -3
  107. package/esm2022/lib/core/voice/tts/index.mjs +10 -2
  108. package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
  109. package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
  110. package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
  111. package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
  112. package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
  113. package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
  114. package/esm2022/lib/icon/filetype/index.mjs +10 -12
  115. package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
  116. package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
  117. package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
  118. package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
  119. package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
  120. package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
  121. package/esm2022/lib/icon/index.mjs +10 -2
  122. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
  123. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
  124. package/esm2022/lib/map/index.mjs +10 -4
  125. package/esm2022/lib/map/map.module.mjs +10 -61
  126. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
  127. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
  128. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
  129. package/esm2022/lib/nova-cloud/index.mjs +10 -3
  130. package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
  131. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
  132. package/esm2022/lib/payment/index.mjs +10 -2
  133. package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
  134. package/esm2022/lib/payment/payment.service.mjs +10 -202
  135. package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
  136. package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
  137. package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
  138. package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
  139. package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
  140. package/esm2022/lib/person/index.mjs +10 -5
  141. package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
  142. package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
  143. package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
  144. package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
  145. package/esm2022/lib/person/person.service.mjs +8 -193
  146. package/esm2022/lib/platform/cross.service.mjs +10 -62
  147. package/esm2022/lib/platform/index.mjs +10 -2
  148. package/esm2022/lib/social/index.mjs +10 -2
  149. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
  150. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
  151. package/esm2022/lib/storage/index.mjs +10 -5
  152. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
  153. package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
  154. package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
  155. package/esm2022/lib/storage/service-upload/index.mjs +10 -2
  156. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
  157. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
  158. package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
  159. package/esm2022/lib/storage/storage.module.mjs +10 -42
  160. package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
  161. package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
  162. package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
  163. package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
  164. package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
  165. package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
  166. package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
  167. package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
  168. package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
  169. package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
  170. package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
  171. package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
  172. package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
  173. package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
  174. package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
  175. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
  176. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
  177. package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
  178. package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
  179. package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
  180. package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
  181. package/esm2022/lib/text/index.mjs +10 -4
  182. package/esm2022/lib/user/account/account.service.mjs +10 -222
  183. package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
  184. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
  185. package/esm2022/lib/user/index.mjs +10 -17
  186. package/esm2022/lib/user/login/auth.guard.mjs +10 -28
  187. package/esm2022/lib/user/login/auth.service.mjs +8 -433
  188. package/esm2022/lib/user/login/login.component.mjs +10 -916
  189. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
  190. package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
  191. package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
  192. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
  193. package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
  194. package/esm2022/lib/user/profile/profile.module.mjs +10 -54
  195. package/esm2022/lib/user/staff/index.mjs +10 -4
  196. package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
  197. package/esm2022/lib/user/staff/staff.module.mjs +10 -18
  198. package/esm2022/lib/user/staff/staff.service.mjs +10 -85
  199. package/esm2022/lib/user/user-name.pipe.mjs +10 -29
  200. package/esm2022/lib/user/user.module.mjs +10 -102
  201. package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
  202. package/esm2022/lib/video/index.mjs +10 -2
  203. package/esm2022/public-api.mjs +10 -21
  204. package/fesm2022/fmode-ng.mjs +7 -19788
  205. package/fesm2022/fmode-ng.mjs.map +1 -1
  206. package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
  207. package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
  208. package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
  209. package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
  210. package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
  211. package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
  212. package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
  213. package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
  214. package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
  215. package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
  216. package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
  217. package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
  218. package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
  219. package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
  220. package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
  221. package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
  222. package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
  223. package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
  224. package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
  225. package/lib/aigc/story/story.service.d.ts +3 -2
  226. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
  227. package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
  228. package/lib/core/agent/story/agent.story.d.ts +8 -8
  229. package/lib/core/parse/datatype/geopoint.d.ts +5 -1
  230. package/lib/core/parse/fmode.cloud.d.ts +32 -0
  231. package/lib/core/parse/fmode.object.d.ts +2 -2
  232. package/lib/core/parse/fmode.parse.d.ts +15 -9
  233. package/lib/core/parse/fmode.query.d.ts +41 -2
  234. package/lib/core/parse/fmode.user.d.ts +1 -0
  235. package/lib/core/parse/index.d.ts +1 -0
  236. package/lib/core/parse/types.d.ts +2 -0
  237. package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
  238. package/lib/payment/payment/payment.component.d.ts +3 -3
  239. package/lib/payment/payment.service.d.ts +4 -4
  240. package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
  241. package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
  242. package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
  243. package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
  244. package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
  245. package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
  246. package/lib/person/person-detail/person-detail.component.d.ts +4 -4
  247. package/lib/person/person.service.d.ts +7 -7
  248. package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
  249. package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
  250. package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
  251. package/lib/text/fm-article-editor/article.service.d.ts +12 -12
  252. package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
  253. package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
  254. package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
  255. package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
  256. package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
  257. package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
  258. package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
  259. package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
  260. package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
  261. package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
  262. package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
  263. package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
  264. package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
  265. package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
  266. package/lib/user/account/account.service.d.ts +2 -2
  267. package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
  268. package/lib/user/login/auth.service.d.ts +5 -5
  269. package/lib/user/login/login.component.d.ts +3 -3
  270. package/lib/user/profile/auth-profile.service.d.ts +8 -8
  271. package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
  272. package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
  273. package/lib/user/staff/staff.service.d.ts +3 -3
  274. package/lib/user/user-name.pipe.d.ts +2 -2
  275. package/package.json +12 -18
@@ -1,414 +1,10 @@
1
- import Parse from "parse";
2
- import * as plupload from "plupload";
3
- import { Component, EventEmitter, Input, Output } from '@angular/core';
4
- // 七牛云上传相关
5
- import { NovaUploadService } from "../../storage/service-upload/nova-upload.service";
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../storage/service-upload/nova-upload.service";
8
- import * as i2 from "@angular/common";
9
- import * as i3 from "ng-zorro-antd/button";
10
- import * as i4 from "ng-zorro-antd/core/transition-patch";
11
- import * as i5 from "ng-zorro-antd/core/wave";
12
- import * as i6 from "ng-zorro-antd/icon";
13
- export class EditUploadComponent {
14
- get file() {
15
- return this._file;
16
- }
17
- set file(v) {
18
- this._file = v;
19
- this.fileChange.emit(v);
20
- }
21
- addToFileList(url) {
22
- if (!this.fileList)
23
- this.fileList = [];
24
- let exists = this.fileList.find(item => item == url);
25
- if (!exists)
26
- this.fileList.push(url);
27
- this.fileListChange.emit(this.fileList);
28
- }
29
- get files() {
30
- return this._files;
31
- }
32
- set files(v) {
33
- this._files = v;
34
- }
35
- async queryDomain() {
36
- let Company = new Parse.Query('Company');
37
- let company = await Company.get(this.getBelongId());
38
- if (company.get("configQiniu") && company.get("configQiniu").domain) {
39
- console.log(company.get("configQiniu").domain);
40
- this.qiniuDomain = company.get("configQiniu").domain;
41
- }
42
- else {
43
- this.qiniuDomain = 'https://file-cloud.fmode.cn';
44
- }
45
- }
46
- constructor(uploadServ) {
47
- this.uploadServ = uploadServ;
48
- this.dragdrop = false;
49
- this.multi = false;
50
- this.max_file_size = 100;
51
- /**
52
- * 上传文件类型
53
- * @type 'image' | 'attachment' | 'video'
54
- * @description "空"仅显示附件列表无上传、image仅图片类型、attachment图片及文档及压缩包类型、video视频类型
55
- * @default image
56
- */
57
- this.type = "image"; //
58
- this.onFilesChange = new EventEmitter();
59
- this.avatarType = '';
60
- this.inputType = null;
61
- this.fileChange = new EventEmitter();
62
- this.fileList = [];
63
- this.fileListChange = new EventEmitter();
64
- /** 设备上传文件途径
65
- * @path camera:相机 local:本地
66
- */
67
- this.path = 'camera';
68
- this.isCapacitor = false;
69
- this.zoneUrl = "https://upload-z2.qiniup.com/";
70
- // 七牛云上传
71
- this.hashid = this.uuid();
72
- //uploader.files 为上传队列 将其赋值 [] 后 即可 再次上传相同文件
73
- this.mime_types = [{ title: "", extensions: "jpg,gif,png,bmp,jpeg" }];
74
- this.imgShowing = false;
75
- this.isCapacitor = this.uploadServ.isCapacitor();
76
- this.local = window.location.pathname;
77
- this.listenToUploader();
78
- }
79
- ngOnInit() {
80
- this.queryDomain();
81
- if (this.avatarType == 'more') { //是否支持多文件上传
82
- this.multi = true;
83
- }
84
- // console.log('mb',this.max_file_size)
85
- console.log(this._files);
86
- }
1
+
87
2
  /**
88
- * 从摄像机获取数据
89
- * @desc
90
- * isCapacitor=true移动设备中,从摄像机获取照片/视频
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/person/edit-upload/edit-upload.component.mjs
91
7
  */
92
- async takeFromCamera() {
93
- let conf = await this.getUptoken();
94
- if (this.type == "image") {
95
- try {
96
- let file = await this.uploadServ.takePicture(conf);
97
- this.currentKey = file.key;
98
- await this.setFiles(file);
99
- }
100
- catch (err) {
101
- console.error(err);
102
- console.error(JSON.stringify(err));
103
- }
104
- }
105
- if (this.type == "video") {
106
- let file = await this.uploadServ.captureVideo(conf);
107
- this.currentKey = file.key;
108
- await this.setFiles(file);
109
- }
110
- }
111
- ngAfterViewInit() {
112
- if (this.files == undefined) {
113
- this.files = [];
114
- }
115
- // 判断上传文件类型
116
- // console.log('上传', this.type)
117
- this.uploaderType();
118
- if (this.upable()) {
119
- this.getUptoken().then(data => {
120
- // console.log(data)
121
- this.uptoken = data.uptoken;
122
- this.domain = data.domain;
123
- this.initUploader(data.uptoken, data.domain);
124
- });
125
- }
126
- }
127
- async getUptoken() {
128
- if (this.qiniuConf?.uptoken) {
129
- return this.qiniuConf;
130
- }
131
- this.qiniuConf = await Parse.Cloud.run('qiniu_uptoken', { company: this.getBelongId() });
132
- this.zoneUrl = this.qiniuConf?.zoneUrl;
133
- return this.qiniuConf;
134
- }
135
- checkFileType(url) {
136
- if (url && typeof url == "string") {
137
- if (url.endsWith("png")) {
138
- return "image";
139
- }
140
- if (url.endsWith("jpg")) {
141
- return "image";
142
- }
143
- if (url.endsWith("jpeg")) {
144
- return "image";
145
- }
146
- if (url.endsWith("gif")) {
147
- return "image";
148
- }
149
- }
150
- if (url && typeof url == "string") {
151
- if (url.endsWith("mp4")) {
152
- return "video";
153
- }
154
- if (url.endsWith("webm")) {
155
- return "video";
156
- }
157
- if (url.endsWith("ogg")) {
158
- return "video";
159
- }
160
- }
161
- return "file";
162
- }
163
- upable() {
164
- if (this.type == "") {
165
- return false;
166
- }
167
- else {
168
- return true;
169
- }
170
- }
171
- showFile(file) {
172
- console.log(123);
173
- this.fileUrl = file;
174
- this.imgShowing = true;
175
- }
176
- closeShowModal() {
177
- this.imgShowing = false;
178
- }
179
- async setFiles(file) {
180
- if (this._files && this._files.length == 0 || this.multi) {
181
- if (file && file.url) {
182
- let fileUrl = file.url;
183
- // 上传地址,传值给files变量及父级组件
184
- // console.log("上传地址,传值给files变量及父级组件",fileUrl)
185
- if (file.url.indexOf('undefined') > -1) {
186
- // console.log(file.url);
187
- fileUrl = (this.qiniuDomain
188
- ? this.qiniuDomain
189
- : "https://file-cloud.fmode.cn/") +
190
- file.url.replace("undefined/", "");
191
- }
192
- this.files = fileUrl;
193
- this.file = fileUrl;
194
- this.addToFileList(fileUrl);
195
- // 上传成功,保存文件信息
196
- // console.log("上传成功,保存文件信息",this.currentKey)
197
- if (this.currentKey) {
198
- await this.uploadServ.saveAttachment(file, this.qiniuDomain, null, this.getBelongId());
199
- }
200
- this.dragdrop = false;
201
- }
202
- }
203
- return;
204
- }
205
- deleteFile(id) {
206
- let idx1 = this._files?.length && this._files?.findIndex && this._files?.findIndex(item => item == id);
207
- if (idx1 != -1) {
208
- this._files?.splice && this._files?.splice(idx1, 1);
209
- }
210
- let idx2 = this.fileList?.findIndex(item => item == id);
211
- if (idx2 != -1) {
212
- this.fileList.splice(idx2, 1);
213
- this.fileListChange.emit(this.fileList);
214
- }
215
- this.file = undefined;
216
- }
217
- listenToUploader() {
218
- console.log(123);
219
- document.addEventListener("uploader" + this.hashid + ".onprogress", (event) => {
220
- console.log(123);
221
- this.setFiles(event.detail.file);
222
- this.setFiles(event.detail.file.percent);
223
- }, false);
224
- document.addEventListener("uploader" + this.hashid + ".fileuploaded", (event) => {
225
- this.setFiles(event.detail.file);
226
- }, false);
227
- }
228
- uploaderType() {
229
- console.log(this.type);
230
- switch (this.type) {
231
- case "image":
232
- this.mime_types = [
233
- { title: "Image files", extensions: "jpg,gif,png,webp,jpeg" }, // 限定jpg,gif,png后缀上传
234
- ];
235
- break;
236
- case "attachment":
237
- this.mime_types = [
238
- { title: "Image files", extensions: "jpg,gif,png,webp,jpeg" }, // 限定jpg,gif,png后缀上传
239
- { title: "Attachment files", extensions: "pdf,doc,docx,xls,md,txt,json" }, // 限定pdf,doc,docx,xls,md,txt后缀上传
240
- { title: "Zip files", extensions: "zip,7z,tar.gz,rar" } // 限定zip,7z,tar.gz,rar后缀上传
241
- ];
242
- break;
243
- case "video":
244
- this.mime_types = [
245
- // { title: "Video files", extensions: "flv,mp4,avi" },
246
- { title: "Video files", extensions: "flv,mpg,mpeg,avi,wmv,mov,asf,rm,rmvb,mkv,m4v,mp4" }, // 限定flv,mpg,mpeg,avi,wmv,mov,asf,rm,rmvb,mkv,m4v,mp4后缀格式上传
247
- ];
248
- break;
249
- default:
250
- break;
251
- }
252
- }
253
- getBelongId() {
254
- // 获取公司ID,或无指定值,则获取localStorage中company
255
- if (this.company) {
256
- return this.company;
257
- }
258
- let id = window.localStorage.getItem("company");
259
- return id;
260
- }
261
- initUploader(uptoken, domain) {
262
- let that = this;
263
- let hashid = this.hashid;
264
- //引入Plupload 、qiniu.js后
265
- this.uploader = new plupload.Uploader({
266
- runtimes: 'html5,html4', //上传模式,依次退化
267
- browse_button: 'pickfiles_button_' + this.hashid, //上传选择的点选按钮,**必需**
268
- // uptoken_url: '/token', //Ajax请求upToken的Url,**强烈建议设置**(服务端提供)
269
- // uptoken: uptoken,
270
- url: this.zoneUrl,
271
- multipart_params: {
272
- // token从服务端获取,没有token无法上传
273
- token: uptoken
274
- },
275
- //若未指定uptoken_url,则必须指定 uptoken ,uptoken由其他程序生成
276
- // unique_names: true, // 默认 false,key为文件名。若开启该选项,SDK为自动生成上传成功后的key(文件名)。
277
- // save_key: true, // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK会忽略对key的处理
278
- // domain: domain, //bucket 域名,下载资源时用到,**必需**
279
- // get_new_uptoken: true, //设置上传文件的时候是否每次都重新获取新的token
280
- container: 'dragdrop_container_' + this.hashid, //上传区域DOM ID,默认是browser_button的父元素,
281
- filters: {
282
- max_file_size: this.max_file_size + 'mb', //最大文件体积限制
283
- prevent_duplicates: true,
284
- mime_types: this.mime_types
285
- },
286
- max_retries: 3, //上传失败最大重试次数
287
- // dragdrop: this.dragdrop, //开启可拖曳上传
288
- // dragdrop: true,
289
- multi_selection: this.multi,
290
- drop_element: 'dragdrop_container_' + this.hashid, //拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传
291
- chunk_size: '4mb', //分块上传时,每片的体积
292
- // auto_start: true, //选择文件后自动上传,若关闭需要自己绑定事件触发上传
293
- init: {
294
- 'BeforeUpload': function (up, file) {
295
- if (that.avatarType == 'more') { //支持多张上传时, 支持分次上传.
296
- that.files.push(file);
297
- }
298
- else {
299
- that.files = [];
300
- }
301
- // 每个文件上传前,处理相关的事情
302
- // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
303
- // 该配置必须要在 unique_names: false , save_key: false 时才生效
304
- let key = that.uploadServ.genFileKey(file, that.getBelongId());
305
- that.currentKey = key;
306
- // do something with key here
307
- // return key
308
- that.uploader.setOption({
309
- // multipart: true,
310
- multipart_params: {
311
- token: uptoken,
312
- key: key
313
- }
314
- });
315
- },
316
- 'UploadProgress': function (up, file) {
317
- // 每个文件上传时,处理相关的事情
318
- let ev = new CustomEvent("uploader" + hashid + ".onprogress", { detail: { "up": up, "file": file } });
319
- document.dispatchEvent(ev);
320
- },
321
- 'FileUploaded': function (up, file, info) {
322
- console.log('成功', up, file, info);
323
- // 每个文件上传成功后,处理相关的事情
324
- // 其中 info 是文件上传成功后,服务端返回的json,形式如
325
- // {
326
- // "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
327
- // "key": "gogopher.jpg"
328
- // }
329
- // 参考http://developer.qiniu.com/docs/v6/api/overview/up/response/simple-response.html
330
- let domain = up.getOption('domain');
331
- let res = JSON.parse(info.response);
332
- let sourceLink = domain + "/" + res.key;
333
- file.url = sourceLink;
334
- let ev = new CustomEvent("uploader" + hashid + ".fileuploaded", { detail: { "up": up, "file": file, "info": info } });
335
- document.dispatchEvent(ev);
336
- console.log(that.files);
337
- },
338
- // 'Error': function (up, err, errTip) {
339
- // console.log('失败', up, err, errTip)
340
- // //上传出错时,处理相关的事情
341
- // },
342
- 'UploadComplete': function () {
343
- //队列文件处理完毕后,处理相关的事情
344
- if (that.avatarType != 'more') {
345
- that.uploader.files = [];
346
- }
347
- }
348
- }
349
- });
350
- // domain 为七牛空间(bucket)对应的域名,选择某个空间后,可通过"空间设置->基本设置->域名设置"查看获取
351
- // uploader 为一个plupload对象,继承了所有plupload的方法,参考http://plupload.com/docs
352
- this.uploader.init();
353
- this.uploader.bind('FilesAdded', function (up, files) {
354
- // plupload.each(files, function (file) {
355
- // // 文件添加进队列后,处理相关的事情
356
- // });
357
- console.log(123);
358
- that.uploader.start();
359
- });
360
- this.uploader.bind('FilesAdded', function (up, files) {
361
- });
362
- // this.uploader.refresh()
363
- }
364
- uuid() {
365
- let s = [];
366
- let hexDigits = "0123456789abcdef";
367
- for (let i = 0; i < 36; i++) {
368
- s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
369
- }
370
- s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
371
- s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
372
- s[8] = s[13] = s[18] = s[23] = "-";
373
- let uuid = s.join("");
374
- return uuid;
375
- }
376
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditUploadComponent, deps: [{ token: i1.NovaUploadService }], target: i0.ɵɵFactoryTarget.Component }); }
377
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditUploadComponent, selector: "fm-edit-upload", inputs: { _files: ["files", "_files"], dragdrop: "dragdrop", multi: "multi", max_file_size: "max_file_size", type: "type", avatarType: "avatarType", company: "company", _file: ["file", "_file"], fileList: "fileList", path: "path" }, outputs: { onFilesChange: "filesChange", fileChange: "fileChange", fileListChange: "fileListChange" }, ngImport: i0, template: "<!-- \u9884\u89C8\u56FE\u7247\uFF1A\u884C\u5185\u5217\u8868 -->\r\n<ng-container *ngFor=\"let f of fileList\">\r\n <div class=\"file-item\" [ngSwitch]=\"checkFileType(f)\">\r\n <!-- \u56FE\u7247\u663E\u793A -->\r\n <div class=\"item\" *ngSwitchCase=\"'image'\">\r\n <img (click)=\"showFile(f)\" style=\"width:100px;height:100px;\" *ngIf=\"f\" [src]=\"f+'?imageView2/1/w/200/h/200'\"\r\n alt=\"\" />\r\n <button (click)=\"deleteFile(f)\" *ngIf=\"upable()\" nzSize='small' nz-button nzType=\"danger\" nzShape=\"circle\">\r\n <i style=\"width: 10px; height: 10px;\" nz-icon nzType=\"close\"></i>\r\n </button>\r\n </div>\r\n <!-- \u89C6\u9891\u663E\u793A -->\r\n <div class=\"item\" *ngSwitchCase=\"'video'\">\r\n <video (click)=\"showFile(f)\" style=\"width:100px;height:100px;\" autoplay *ngIf=\"f\" [src]=\"f\"\r\n alt=\"\">\r\n </video>\r\n <button (click)=\"deleteFile(f)\" *ngIf=\"upable()\" nzSize='small' nz-button nzType=\"danger\" nzShape=\"circle\">\r\n <i style=\"width: 10px; height: 10px;\" nz-icon nzType=\"close\"></i>\r\n </button>\r\n </div>\r\n <!-- \u6587\u4EF6\u663E\u793A -->\r\n <div *ngSwitchDefault>\r\n <i style=\"width:100px;height:100px;\" nz-icon [nzType]=\"'file'\" [nzTheme]=\"'twotone'\" style=\"font-size: 4.4em;\"></i>\r\n </div>\r\n\r\n <!-- \u5220\u9664\u6309\u94AE -->\r\n \r\n </div>\r\n</ng-container>\r\n\r\n<!-- \u4E0A\u4F20\u63A7\u4EF6\uFF1A\u76F8\u673A/\u62CD\u6444 \uFF08Capacitor\u7AEF\uFF09 -->\r\n<div (click)=\"takeFromCamera()\" [ngStyle]=\"{'display':isCapacitor && path == 'camera' ?'flex':'none','width':(fileList?.length==0 || multi)?'100px':'0%'}\" class=\"divupload file-item\">\r\n <div [ngStyle]=\"{'width':(fileList?.length==0 || multi)?'100%':'0%'}\">\r\n <div class=\"plus\" [class.capacitor]=\"isCapacitor\">\r\n <span *ngIf=\"fileList?.length==0 || multi\" nz-icon nzType=\"plus\" nzTheme=\"outline\"></span>\r\n </div>\r\n </div>\r\n</div>\r\n<!-- \u4E0A\u4F20\u63A7\u4EF6\uFF1A\u70B9\u51FB/\u62D6\u62FD \uFF08Web\u7AEF\uFF09 -->\r\n<!-- \u901A\u8FC7\u6837\u5F0F\u5207\u6362\u663E\u793A\uFF0C\u4E0D\u53EF\u7528ngIf\u4F1A\u5BFC\u81F4id\u7ED1\u5B9A\u4E0A\u4F20\u51FD\u6570\u5931\u6548 -->\r\n<div [ngStyle]=\"{'display':isCapacitor && path == 'camera' ?'none':'flex','width':(fileList?.length==0 || multi)?'100px':'0%'}\" id=\"dragdrop_container_{{hashid}}\" class=\"divupload file-item\">\r\n <div [ngStyle]=\"{'width':(fileList?.length==0 || multi)?'100%':'0%'}\" id=\"pickfiles_button_{{hashid}}\">\r\n <div class=\"plus\">\r\n <span *ngIf=\"fileList?.length==0 || multi\" nz-icon nzType=\"plus\" nzTheme=\"outline\"></span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \u9884\u89C8\u533A\u57DF\uFF1A\u56FE\u7247\u653E\u5927 -->\r\n<div *ngIf=\"imgShowing\" (click)=\"closeShowModal()\"\r\nstyle=\"position:fixed;top:0px;left:0px;width:100%;height:100%;z-index:65535;\r\n background-color: rgba(0,0,0,0.6);text-align: center;\">\r\n <div style=\"width:90%;margin-left:5%;margin-top:1%;color:#fff;\r\n font-size:30px;border:1px #FFF solid;border-radius: 5px;\">\u9000\u51FA\u9884\u89C8</div>\r\n\r\n <img *ngIf=\"checkFileType(fileUrl)=='image'\" style=\"height:90%;margin-left:5%;margin-top:1%;background:#fff;\" [src]=\"fileUrl?fileUrl:'assets/icon/nouser.png'\" alt=\"\">\r\n <video *ngIf=\"fileUrl&&checkFileType(fileUrl)=='video'\" autoplay style=\"max-height:90%;max-width: 80%;margin-left:5%;margin-top:1%;background:#fff;\" [src]=\"fileUrl\" alt=\"\"></video>\r\n \r\n</div>", styles: [".file-item{float:left;height:100px;display:flex}.file-item .plus{width:100px;height:100px;display:flex;justify-content:center;align-items:center;align-content:center}.file-item .plus span{flex:100%;align-items:center;align-content:center}.file-item .capacitor{display:flex;justify-content:center}.file-item .capacitor span{position:relative;margin-left:-70px;margin-top:-70px}.file-item .item{position:relative}.file-item .item button{position:absolute;top:-11px;left:82px;display:flex;justify-content:center;align-items:center}.divupload{height:100px;width:100px;background-color:#ededed}.divupload div{height:100%}.divupload span{color:#909090;font-size:30px;position:absolute;left:35px;top:35px}.img{height:100px;width:100px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i4.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i5.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: i6.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }] }); }
378
- }
379
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditUploadComponent, decorators: [{
380
- type: Component,
381
- args: [{ selector: 'fm-edit-upload', template: "<!-- \u9884\u89C8\u56FE\u7247\uFF1A\u884C\u5185\u5217\u8868 -->\r\n<ng-container *ngFor=\"let f of fileList\">\r\n <div class=\"file-item\" [ngSwitch]=\"checkFileType(f)\">\r\n <!-- \u56FE\u7247\u663E\u793A -->\r\n <div class=\"item\" *ngSwitchCase=\"'image'\">\r\n <img (click)=\"showFile(f)\" style=\"width:100px;height:100px;\" *ngIf=\"f\" [src]=\"f+'?imageView2/1/w/200/h/200'\"\r\n alt=\"\" />\r\n <button (click)=\"deleteFile(f)\" *ngIf=\"upable()\" nzSize='small' nz-button nzType=\"danger\" nzShape=\"circle\">\r\n <i style=\"width: 10px; height: 10px;\" nz-icon nzType=\"close\"></i>\r\n </button>\r\n </div>\r\n <!-- \u89C6\u9891\u663E\u793A -->\r\n <div class=\"item\" *ngSwitchCase=\"'video'\">\r\n <video (click)=\"showFile(f)\" style=\"width:100px;height:100px;\" autoplay *ngIf=\"f\" [src]=\"f\"\r\n alt=\"\">\r\n </video>\r\n <button (click)=\"deleteFile(f)\" *ngIf=\"upable()\" nzSize='small' nz-button nzType=\"danger\" nzShape=\"circle\">\r\n <i style=\"width: 10px; height: 10px;\" nz-icon nzType=\"close\"></i>\r\n </button>\r\n </div>\r\n <!-- \u6587\u4EF6\u663E\u793A -->\r\n <div *ngSwitchDefault>\r\n <i style=\"width:100px;height:100px;\" nz-icon [nzType]=\"'file'\" [nzTheme]=\"'twotone'\" style=\"font-size: 4.4em;\"></i>\r\n </div>\r\n\r\n <!-- \u5220\u9664\u6309\u94AE -->\r\n \r\n </div>\r\n</ng-container>\r\n\r\n<!-- \u4E0A\u4F20\u63A7\u4EF6\uFF1A\u76F8\u673A/\u62CD\u6444 \uFF08Capacitor\u7AEF\uFF09 -->\r\n<div (click)=\"takeFromCamera()\" [ngStyle]=\"{'display':isCapacitor && path == 'camera' ?'flex':'none','width':(fileList?.length==0 || multi)?'100px':'0%'}\" class=\"divupload file-item\">\r\n <div [ngStyle]=\"{'width':(fileList?.length==0 || multi)?'100%':'0%'}\">\r\n <div class=\"plus\" [class.capacitor]=\"isCapacitor\">\r\n <span *ngIf=\"fileList?.length==0 || multi\" nz-icon nzType=\"plus\" nzTheme=\"outline\"></span>\r\n </div>\r\n </div>\r\n</div>\r\n<!-- \u4E0A\u4F20\u63A7\u4EF6\uFF1A\u70B9\u51FB/\u62D6\u62FD \uFF08Web\u7AEF\uFF09 -->\r\n<!-- \u901A\u8FC7\u6837\u5F0F\u5207\u6362\u663E\u793A\uFF0C\u4E0D\u53EF\u7528ngIf\u4F1A\u5BFC\u81F4id\u7ED1\u5B9A\u4E0A\u4F20\u51FD\u6570\u5931\u6548 -->\r\n<div [ngStyle]=\"{'display':isCapacitor && path == 'camera' ?'none':'flex','width':(fileList?.length==0 || multi)?'100px':'0%'}\" id=\"dragdrop_container_{{hashid}}\" class=\"divupload file-item\">\r\n <div [ngStyle]=\"{'width':(fileList?.length==0 || multi)?'100%':'0%'}\" id=\"pickfiles_button_{{hashid}}\">\r\n <div class=\"plus\">\r\n <span *ngIf=\"fileList?.length==0 || multi\" nz-icon nzType=\"plus\" nzTheme=\"outline\"></span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \u9884\u89C8\u533A\u57DF\uFF1A\u56FE\u7247\u653E\u5927 -->\r\n<div *ngIf=\"imgShowing\" (click)=\"closeShowModal()\"\r\nstyle=\"position:fixed;top:0px;left:0px;width:100%;height:100%;z-index:65535;\r\n background-color: rgba(0,0,0,0.6);text-align: center;\">\r\n <div style=\"width:90%;margin-left:5%;margin-top:1%;color:#fff;\r\n font-size:30px;border:1px #FFF solid;border-radius: 5px;\">\u9000\u51FA\u9884\u89C8</div>\r\n\r\n <img *ngIf=\"checkFileType(fileUrl)=='image'\" style=\"height:90%;margin-left:5%;margin-top:1%;background:#fff;\" [src]=\"fileUrl?fileUrl:'assets/icon/nouser.png'\" alt=\"\">\r\n <video *ngIf=\"fileUrl&&checkFileType(fileUrl)=='video'\" autoplay style=\"max-height:90%;max-width: 80%;margin-left:5%;margin-top:1%;background:#fff;\" [src]=\"fileUrl\" alt=\"\"></video>\r\n \r\n</div>", styles: [".file-item{float:left;height:100px;display:flex}.file-item .plus{width:100px;height:100px;display:flex;justify-content:center;align-items:center;align-content:center}.file-item .plus span{flex:100%;align-items:center;align-content:center}.file-item .capacitor{display:flex;justify-content:center}.file-item .capacitor span{position:relative;margin-left:-70px;margin-top:-70px}.file-item .item{position:relative}.file-item .item button{position:absolute;top:-11px;left:82px;display:flex;justify-content:center;align-items:center}.divupload{height:100px;width:100px;background-color:#ededed}.divupload div{height:100%}.divupload span{color:#909090;font-size:30px;position:absolute;left:35px;top:35px}.img{height:100px;width:100px;cursor:pointer}\n"] }]
382
- }], ctorParameters: () => [{ type: i1.NovaUploadService }], propDecorators: { _files: [{
383
- type: Input,
384
- args: ['files']
385
- }], dragdrop: [{
386
- type: Input
387
- }], multi: [{
388
- type: Input
389
- }], max_file_size: [{
390
- type: Input,
391
- args: ['max_file_size']
392
- }], type: [{
393
- type: Input
394
- }], onFilesChange: [{
395
- type: Output,
396
- args: ['filesChange']
397
- }], avatarType: [{
398
- type: Input,
399
- args: ['avatarType']
400
- }], company: [{
401
- type: Input
402
- }], _file: [{
403
- type: Input,
404
- args: ["file"]
405
- }], fileChange: [{
406
- type: Output
407
- }], fileList: [{
408
- type: Input
409
- }], fileListChange: [{
410
- type: Output
411
- }], path: [{
412
- type: Input
413
- }] } });
414
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9wZXJzb24vZWRpdC11cGxvYWQvZWRpdC11cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9wZXJzb24vZWRpdC11cGxvYWQvZWRpdC11cGxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFBO0FBRXBDLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsVUFBVTtBQUNWLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7OztBQU9yRixNQUFNLE9BQU8sbUJBQW1CO0lBaUM5QixJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUE7SUFDbkIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFLRCxhQUFhLENBQUMsR0FBRztRQUNmLElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUMsRUFBRSxDQUFBO1FBQ25DLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQSxFQUFFLENBQUEsSUFBSSxJQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ2hELElBQUcsQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLFFB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QUM7SUFDZCxDQUFDOytHQXhZVSxtQkFBbUI7bUdBQW5CLG1CQUFtQixzWUNaaEMsZ21IQTBETTs7NEZEOUNPLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7c0ZBYVYsTUFBTTtzQkFBckIsS0FBSzt1QkFBQyxPQUFPO2dCQUNMLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNrQixhQUFhO3NCQUFwQyxLQUFLO3VCQUFDLGVBQWU7Z0JBUWIsSUFBSTtzQkFBWixLQUFLO2dCQUNpQixhQUFhO3NCQUFuQyxNQUFNO3VCQUFDLGFBQWE7Z0JBQ0EsVUFBVTtzQkFBOUIsS0FBSzt1QkFBQyxZQUFZO2dCQU9WLE9BQU87c0JBQWYsS0FBSztnQkFFUyxLQUFLO3NCQUFuQixLQUFLO3VCQUFDLE1BQU07Z0JBQ0gsVUFBVTtzQkFBbkIsTUFBTTtnQkFTRSxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU07Z0JBMkJFLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZSBmcm9tIFwicGFyc2VcIjtcclxuaW1wb3J0ICogYXMgcGx1cGxvYWQgZnJvbSBcInBsdXBsb2FkXCJcclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuLy8g5LiD54mb5LqR5LiK5Lyg55u45YWzXHJcbmltcG9ydCB7IE5vdmFVcGxvYWRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2Uvc2VydmljZS11cGxvYWQvbm92YS11cGxvYWQuc2VydmljZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmbS1lZGl0LXVwbG9hZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXQtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0LXVwbG9hZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0VXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBsb2NhbDogYW55XHJcbiAgLyoqIOagh+etvue7hOS7tiA8VGFnPiBFZGl0VXBsb2FkXHJcbiAgICAgQHBhcmFtIHtBcnJheSB8IHN0cmluZ30gZmlsZXMg5b+F5aGrIOe7keWumuaWh+S7tuWIl+ihqOWPguaVsFxyXG4gICAgIEBwYXJhbSB7Ym9vbGVhbn0gZHJhZ2Ryb3Ag6YCJ5aGrIOm7mOiupGZhbHNlIOaYr+WQpuaUr+aMgeaLluaLveS4iuS8oFxyXG4gICAgIEBwYXJhbSB7c3RyaW5nfSBtdWx0aSDpgInloasg6buY6K6kZmFsc2Ug5piv5ZCm5pSv5oyB5aSa5paH5Lu25LiK5LygXHJcbiAgICAgQHBhcmFtIHtzdHJpbmd9IHR5cGUg6YCJ5aGrIOm7mOiupGltYWdlIOiuvue9ruS4iuS8oOmZhOS7tuexu+Wei1xyXG4gICAgIEBwYXJhbSB7bnVtYmVyfSBtYXhfZmlsZV9zaXplIOmAieWhqyDmlofku7bkuIrkvKDnmoTmnIDlpKfkvZPnp68g5Y2V5L2NbWIg6buY6K6kIDEwMCBtYlxyXG4gICAgICoqL1xyXG4gIEBJbnB1dCgnZmlsZXMnKSBfZmlsZXM6IGFueTtcclxuICBASW5wdXQoKSBkcmFnZHJvcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG11bHRpOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCdtYXhfZmlsZV9zaXplJykgbWF4X2ZpbGVfc2l6ZTogbnVtYmVyID0gMTAwO1xyXG5cclxuICAvKipcclxuICAgKiDkuIrkvKDmlofku7bnsbvlnotcclxuICAgKiBAdHlwZSAnaW1hZ2UnIHwgJ2F0dGFjaG1lbnQnIHwgJ3ZpZGVvJ1xyXG4gICAqIEBkZXNjcmlwdGlvbiBcIuepulwi5LuF5pi+56S66ZmE5Lu25YiX6KGo5peg5LiK5Lyg44CBaW1hZ2Xku4Xlm77niYfnsbvlnovjgIFhdHRhY2htZW505Zu+54mH5Y+K5paH5qGj5Y+K5Y6L57yp5YyF57G75Z6L44CBdmlkZW/op4bpopHnsbvlnotcclxuICAgKiBAZGVmYXVsdCBpbWFnZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHR5cGU6IHN0cmluZyA9IFwiaW1hZ2VcIjsgLy8gXHJcbiAgQE91dHB1dCgnZmlsZXNDaGFuZ2UnKSBvbkZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQElucHV0KCdhdmF0YXJUeXBlJykgYXZhdGFyVHlwZTogc3RyaW5nID0gJydcclxuXHJcbiAgaW5wdXRUeXBlOnN0cmluZyA9IG51bGxcclxuICB1cHRva2VuOnN0cmluZ1xyXG4gIGRvbWFpbjogc3RyaW5nXHJcbiAgcWluaXVEb21haW46c3RyaW5nXHJcblxyXG4gIEBJbnB1dCgpIGNvbXBhbnk6c3RyaW5nXHJcblxyXG4gIEBJbnB1dChcImZpbGVcIikgX2ZpbGU6c3RyaW5nXHJcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2U6RXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBnZXQgZmlsZSgpe1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbGVcclxuICB9XHJcbiAgc2V0IGZpbGUodil7XHJcbiAgICB0aGlzLl9maWxlPXZcclxuICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHYpXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBmaWxlTGlzdDpzdHJpbmdbXSA9IFtdXHJcbiAgQE91dHB1dCgpIGZpbGVMaXN0Q2hhbmdlOkV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xyXG5cclxuICBhZGRUb0ZpbGVMaXN0KHVybCl7XHJcbiAgICBpZighdGhpcy5maWxlTGlzdCkgdGhpcy5maWxlTGlzdD1bXVxyXG4gICAgbGV0IGV4aXN0cyA9IHRoaXMuZmlsZUxpc3QuZmluZChpdGVtPT5pdGVtPT11cmwpXHJcbiAgICBpZighZXhpc3RzKSB0aGlzLmZpbGVMaXN0LnB1c2godXJsKVxyXG4gICAgdGhpcy5maWxlTGlzdENoYW5nZS5lbWl0KHRoaXMuZmlsZUxpc3QpXHJcbiAgfVxyXG4gIGdldCBmaWxlcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9maWxlc1xyXG4gIH1cclxuICBzZXQgZmlsZXModjphbnkpIHtcclxuICAgIHRoaXMuX2ZpbGVzID0gdlxyXG4gIH1cclxuICBhc3luYyBxdWVyeURvbWFpbigpIHtcclxuICAgIGxldCBDb21wYW55ID0gbmV3IFBhcnNlLlF1ZXJ5KCdDb21wYW55JylcclxuICAgIGxldCBjb21wYW55ID0gYXdhaXQgQ29tcGFueS5nZXQodGhpcy5nZXRCZWxvbmdJZCgpKVxyXG4gICAgaWYgKGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikgJiYgY29tcGFueS5nZXQoXCJjb25maWdRaW5pdVwiKS5kb21haW4pIHtcclxuICAgICAgY29uc29sZS5sb2coY29tcGFueS5nZXQoXCJjb25maWdRaW5pdVwiKS5kb21haW4pXHJcbiAgICAgIHRoaXMucWluaXVEb21haW4gPSBjb21wYW55LmdldChcImNvbmZpZ1Fpbml1XCIpLmRvbWFpbjtcclxuICAgIH0gZWxzZXtcclxuICAgICAgdGhpcy5xaW5pdURvbWFpbiA9ICdodHRwczovL2ZpbGUtY2xvdWQuZm1vZGUuY24nO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKiog6K6+5aSH5LiK5Lyg5paH5Lu26YCU5b6EXHJcbiAgKiBAcGF0aCAgY2FtZXJh77ya55u45py6IGxvY2Fs77ya5pys5ZywXHJcbiAgKi9cclxuICBASW5wdXQoKSBwYXRoOnN0cmluZyA9ICdjYW1lcmEnXHJcblxyXG4gIGlzQ2FwYWNpdG9yOmJvb2xlYW4gPSBmYWxzZTtcclxuICB6b25lVXJsOnN0cmluZyA9IFwiaHR0cHM6Ly91cGxvYWQtejIucWluaXVwLmNvbS9cIlxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHVwbG9hZFNlcnY6Tm92YVVwbG9hZFNlcnZpY2UpIHtcclxuICAgIHRoaXMuaXNDYXBhY2l0b3IgPSB0aGlzLnVwbG9hZFNlcnYuaXNDYXBhY2l0b3IoKTtcclxuICAgIHRoaXMubG9jYWwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWVcclxuICAgIHRoaXMubGlzdGVuVG9VcGxvYWRlcigpXHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5xdWVyeURvbWFpbigpO1xyXG4gICAgaWYgKHRoaXMuYXZhdGFyVHlwZSA9PSAnbW9yZScpIHsgLy/mmK/lkKbmlK/mjIHlpJrmlofku7bkuIrkvKBcclxuICAgICAgdGhpcy5tdWx0aSA9IHRydWVcclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUubG9nKCdtYicsdGhpcy5tYXhfZmlsZV9zaXplKVxyXG4gICAgY29uc29sZS5sb2codGhpcy5fZmlsZXMpXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIOS7juaRhOWDj+acuuiOt+WPluaVsOaNrlxyXG4gICAqIEBkZXNjXHJcbiAgICogaXNDYXBhY2l0b3I9dHJ1Zeenu+WKqOiuvuWkh+S4re+8jOS7juaRhOWDj+acuuiOt+WPlueFp+eJhy/op4bpopFcclxuICAgKi9cclxuICBhc3luYyB0YWtlRnJvbUNhbWVyYSgpe1xyXG4gICAgbGV0IGNvbmYgPSBhd2FpdCB0aGlzLmdldFVwdG9rZW4oKTtcclxuXHJcbiAgICBpZih0aGlzLnR5cGU9PVwiaW1hZ2VcIil7XHJcbiAgICAgIHRyeXtcclxuICAgICAgICBsZXQgZmlsZTphbnkgPSBhd2FpdCB0aGlzLnVwbG9hZFNlcnYudGFrZVBpY3R1cmUoY29uZik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50S2V5ID0gZmlsZS5rZXk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRGaWxlcyhmaWxlKVxyXG4gICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KGVycikpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLnR5cGU9PVwidmlkZW9cIil7XHJcbiAgICAgIGxldCBmaWxlOmFueSA9IGF3YWl0IHRoaXMudXBsb2FkU2Vydi5jYXB0dXJlVmlkZW8oY29uZik7XHJcbiAgICAgIHRoaXMuY3VycmVudEtleSA9IGZpbGUua2V5O1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEZpbGVzKGZpbGUpXHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmZpbGVzID09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmZpbGVzID0gW11cclxuICAgIH1cclxuICAgIC8vIOWIpOaWreS4iuS8oOaWh+S7tuexu+Wei1xyXG4gICAgLy8gY29uc29sZS5sb2coJ+S4iuS8oCcsIHRoaXMudHlwZSlcclxuICAgIHRoaXMudXBsb2FkZXJUeXBlKClcclxuXHJcbiAgICBpZiAodGhpcy51cGFibGUoKSkge1xyXG4gICAgICB0aGlzLmdldFVwdG9rZW4oKS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpXHJcbiAgICAgICAgdGhpcy51cHRva2VuID0gZGF0YS51cHRva2VuXHJcbiAgICAgICAgdGhpcy5kb21haW4gPSBkYXRhLmRvbWFpblxyXG4gICAgICAgIHRoaXMuaW5pdFVwbG9hZGVyKGRhdGEudXB0b2tlbiwgZGF0YS5kb21haW4pXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgfVxyXG4gIC8vIOS4g+eJm+S6keS4iuS8oFxyXG4gIGhhc2hpZDogc3RyaW5nID0gdGhpcy51dWlkKClcclxuICB1cGxvYWRlcjogYW55ICAvL3VwbG9hZGVy5Li65a6e5L6L5YyW5LiK5Lyg57uE5Lu2IFxyXG4gIC8vdXBsb2FkZXIuZmlsZXMg5Li65LiK5Lyg6Zif5YiXIOWwhuWFtui1i+WAvCBbXSDlkI4g5Y2z5Y+vIOWGjeasoeS4iuS8oOebuOWQjOaWh+S7tlxyXG4gIG1pbWVfdHlwZXMgPSBbeyB0aXRsZSA6IFwiXCIsIGV4dGVuc2lvbnMgOiBcImpwZyxnaWYscG5nLGJtcCxqcGVnXCIgfV1cclxuICBxaW5pdUNvbmY6YW55IFxyXG4gIGFzeW5jIGdldFVwdG9rZW4oKSB7XHJcbiAgICBpZih0aGlzLnFpbml1Q29uZj8udXB0b2tlbil7XHJcbiAgICAgIHJldHVybiB0aGlzLnFpbml1Q29uZlxyXG4gICAgfVxyXG4gICAgdGhpcy5xaW5pdUNvbmYgPSBhd2FpdCBQYXJzZS5DbG91ZC5ydW4oJ3Fpbml1X3VwdG9rZW4nLHsgY29tcGFueTogdGhpcy5nZXRCZWxvbmdJZCgpIH0pXHJcbiAgICB0aGlzLnpvbmVVcmwgPSB0aGlzLnFpbml1Q29uZj8uem9uZVVybFxyXG4gICAgcmV0dXJuIHRoaXMucWluaXVDb25mXHJcbiAgfVxyXG4gIGNoZWNrRmlsZVR5cGUodXJsOiBzdHJpbmcpIHtcclxuICAgIGlmKHVybCAmJiB0eXBlb2YgdXJsID09IFwic3RyaW5nXCIpe1xyXG4gICAgICBpZiAodXJsLmVuZHNXaXRoKFwicG5nXCIpKSB7IHJldHVybiBcImltYWdlXCIgfVxyXG4gICAgICBpZiAodXJsLmVuZHNXaXRoKFwianBnXCIpKSB7IHJldHVybiBcImltYWdlXCIgfVxyXG4gICAgICBpZiAodXJsLmVuZHNXaXRoKFwianBlZ1wiKSkgeyByZXR1cm4gXCJpbWFnZVwiIH1cclxuICAgICAgaWYgKHVybC5lbmRzV2l0aChcImdpZlwiKSkgeyByZXR1cm4gXCJpbWFnZVwiIH1cclxuICAgIH1cclxuICAgIGlmKHVybCAmJiB0eXBlb2YgdXJsID09IFwic3RyaW5nXCIpe1xyXG4gICAgICBpZiAodXJsLmVuZHNXaXRoKFwibXA0XCIpKSB7IHJldHVybiBcInZpZGVvXCIgfVxyXG4gICAgICBpZiAodXJsLmVuZHNXaXRoKFwid2VibVwiKSkgeyByZXR1cm4gXCJ2aWRlb1wiIH1cclxuICAgICAgaWYgKHVybC5lbmRzV2l0aChcIm9nZ1wiKSkgeyByZXR1cm4gXCJ2aWRlb1wiIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcImZpbGVcIlxyXG4gIH1cclxuICB1cGFibGUoKSB7XHJcbiAgICBpZiAodGhpcy50eXBlID09IFwiXCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW1nU2hvd2luZzpib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsZVVybDpzdHJpbmc7XHJcbiAgc2hvd0ZpbGUoZmlsZSkge1xyXG4gICAgY29uc29sZS5sb2coMTIzKVxyXG4gICAgdGhpcy5maWxlVXJsID0gZmlsZTtcclxuICAgIHRoaXMuaW1nU2hvd2luZyA9IHRydWU7XHJcbiAgfVxyXG4gIGNsb3NlU2hvd01vZGFsKCl7XHJcbiAgICB0aGlzLmltZ1Nob3dpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gXHJcbmN1cnJlbnRLZXk7XHJcbiAgYXN5bmMgc2V0RmlsZXMoZmlsZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fZmlsZXMmJnRoaXMuX2ZpbGVzLmxlbmd0aCA9PSAwIHx8IHRoaXMubXVsdGkpIHtcclxuICAgICAgaWYoZmlsZSYmZmlsZS51cmwpe1xyXG4gICAgICAgIGxldCBmaWxlVXJsID0gZmlsZS51cmxcclxuICAgICAgICAgIC8vIOS4iuS8oOWcsOWdgO+8jOS8oOWAvOe7mWZpbGVz5Y+Y6YeP5Y+K54i257qn57uE5Lu2XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuS4iuS8oOWcsOWdgO+8jOS8oOWAvOe7mWZpbGVz5Y+Y6YeP5Y+K54i257qn57uE5Lu2XCIsZmlsZVVybClcclxuICAgICAgICAgIGlmKGZpbGUudXJsLmluZGV4T2YoJ3VuZGVmaW5lZCcpPi0xKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhmaWxlLnVybCk7XHJcbiAgICAgICAgICAgIGZpbGVVcmwgPSAodGhpcy5xaW5pdURvbWFpblxyXG4gICAgICAgICAgICAgID8gdGhpcy5xaW5pdURvbWFpblxyXG4gICAgICAgICAgICAgIDogXCJodHRwczovL2ZpbGUtY2xvdWQuZm1vZGUuY24vXCIpICtcclxuICAgICAgICAgICAgICAgIGZpbGUudXJsLnJlcGxhY2UoXCJ1bmRlZmluZWQvXCIsIFwiXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVVcmxcclxuXHJcbiAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlVXJsXHJcbiAgICAgICAgICB0aGlzLmFkZFRvRmlsZUxpc3QoZmlsZVVybClcclxuICAgICAgICAgIC8vIOS4iuS8oOaIkOWKn++8jOS/neWtmOaWh+S7tuS/oeaBr1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCLkuIrkvKDmiJDlip/vvIzkv53lrZjmlofku7bkv6Hmga9cIix0aGlzLmN1cnJlbnRLZXkpXHJcbiAgICAgICAgICBpZih0aGlzLmN1cnJlbnRLZXkpe1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwbG9hZFNlcnYuc2F2ZUF0dGFjaG1lbnQoZmlsZSx0aGlzLnFpbml1RG9tYWluLG51bGwsdGhpcy5nZXRCZWxvbmdJZCgpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5kcmFnZHJvcCA9IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVyblxyXG4gIH1cclxuICBkZWxldGVGaWxlKGlkKSB7XHJcblxyXG4gICAgbGV0IGlkeDEgPSB0aGlzLl9maWxlcz8ubGVuZ3RoJiZ0aGlzLl9maWxlcz8uZmluZEluZGV4JiZ0aGlzLl9maWxlcz8uZmluZEluZGV4KGl0ZW09Pml0ZW09PWlkKVxyXG4gICAgaWYoaWR4MSE9LTEpe1xyXG4gICAgICB0aGlzLl9maWxlcz8uc3BsaWNlJiZ0aGlzLl9maWxlcz8uc3BsaWNlKGlkeDEsMSlcclxuICAgIH1cclxuICAgIGxldCBpZHgyID0gdGhpcy5maWxlTGlzdD8uZmluZEluZGV4KGl0ZW09Pml0ZW09PWlkKVxyXG4gICAgaWYoaWR4MiE9LTEpe1xyXG4gICAgICB0aGlzLmZpbGVMaXN0LnNwbGljZShpZHgyLDEpXHJcbiAgICAgIHRoaXMuZmlsZUxpc3RDaGFuZ2UuZW1pdCh0aGlzLmZpbGVMaXN0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5maWxlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBsaXN0ZW5Ub1VwbG9hZGVyKCkge1xyXG4gICAgY29uc29sZS5sb2coMTIzKVxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwbG9hZGVyXCIgKyB0aGlzLmhhc2hpZCArIFwiLm9ucHJvZ3Jlc3NcIiwgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coMTIzKVxyXG4gICAgICB0aGlzLnNldEZpbGVzKGV2ZW50LmRldGFpbC5maWxlKVxyXG4gICAgICB0aGlzLnNldEZpbGVzKGV2ZW50LmRldGFpbC5maWxlLnBlcmNlbnQpXHJcbiAgICB9LCBmYWxzZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBsb2FkZXJcIiArIHRoaXMuaGFzaGlkICsgXCIuZmlsZXVwbG9hZGVkXCIsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0RmlsZXMoZXZlbnQuZGV0YWlsLmZpbGUpXHJcbiAgICB9LCBmYWxzZSk7XHJcbiAgfVxyXG4gIHVwbG9hZGVyVHlwZSgpIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMudHlwZSlcclxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJpbWFnZVwiOlxyXG4gICAgICAgIHRoaXMubWltZV90eXBlcyA9IFtcclxuICAgICAgICAgIHsgdGl0bGU6IFwiSW1hZ2UgZmlsZXNcIiwgZXh0ZW5zaW9uczogXCJqcGcsZ2lmLHBuZyx3ZWJwLGpwZWdcIiB9LCAvLyDpmZDlrppqcGcsZ2lmLHBuZ+WQjue8gOS4iuS8oFxyXG4gICAgICAgIF1cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIFwiYXR0YWNobWVudFwiOlxyXG4gICAgICAgIHRoaXMubWltZV90eXBlcyA9IFtcclxuICAgICAgICAgIHsgdGl0bGU6IFwiSW1hZ2UgZmlsZXNcIiwgZXh0ZW5zaW9uczogXCJqcGcsZ2lmLHBuZyx3ZWJwLGpwZWdcIiB9LCAvLyDpmZDlrppqcGcsZ2lmLHBuZ+WQjue8gOS4iuS8oFxyXG4gICAgICAgICAgeyB0aXRsZTogXCJBdHRhY2htZW50IGZpbGVzXCIsIGV4dGVuc2lvbnM6IFwicGRmLGRvYyxkb2N4LHhscyxtZCx0eHQsanNvblwiIH0sIC8vIOmZkOWumnBkZixkb2MsZG9jeCx4bHMsbWQsdHh05ZCO57yA5LiK5LygXHJcbiAgICAgICAgICB7IHRpdGxlOiBcIlppcCBmaWxlc1wiLCBleHRlbnNpb25zOiBcInppcCw3eix0YXIuZ3oscmFyXCIgfSAvLyDpmZDlrpp6aXAsN3osdGFyLmd6LHJhcuWQjue8gOS4iuS8oFxyXG4gICAgICAgIF1cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIFwidmlkZW9cIjpcclxuICAgICAgICB0aGlzLm1pbWVfdHlwZXMgPSBbXHJcbiAgICAgICAgICAvLyB7IHRpdGxlOiBcIlZpZGVvIGZpbGVzXCIsIGV4dGVuc2lvbnM6IFwiZmx2LG1wNCxhdmlcIiB9LFxyXG4gICAgICAgICAgeyB0aXRsZTogXCJWaWRlbyBmaWxlc1wiLCBleHRlbnNpb25zOiBcImZsdixtcGcsbXBlZyxhdmksd212LG1vdixhc2Yscm0scm12Yixta3YsbTR2LG1wNFwiIH0sIC8vIOmZkOWummZsdixtcGcsbXBlZyxhdmksd212LG1vdixhc2Yscm0scm12Yixta3YsbTR2LG1wNOWQjue8gOagvOW8j+S4iuS8oFxyXG4gICAgICAgIF1cclxuICAgICAgICBicmVha1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEJlbG9uZ0lkKCkge1xyXG4gICAgLy8g6I635Y+W5YWs5Y+4SUTvvIzmiJbml6DmjIflrprlgLzvvIzliJnojrflj5Zsb2NhbFN0b3JhZ2XkuK1jb21wYW55XHJcbiAgICBpZih0aGlzLmNvbXBhbnkpe1xyXG4gICAgICByZXR1cm4gdGhpcy5jb21wYW55XHJcbiAgICB9XHJcbiAgICBsZXQgaWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXHJcbiAgICByZXR1cm4gaWRcclxuICB9XHJcbiAgXHJcbiAgaW5pdFVwbG9hZGVyKHVwdG9rZW4sIGRvbWFpbikge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzXHJcbiAgICBsZXQgaGFzaGlkID0gdGhpcy5oYXNoaWRcclxuICAgIC8v5byV5YWlUGx1cGxvYWQg44CBcWluaXUuanPlkI5cclxuICAgIHRoaXMudXBsb2FkZXIgPSBuZXcgcGx1cGxvYWQuVXBsb2FkZXIoe1xyXG4gICAgICBydW50aW1lczogJ2h0bWw1LGh0bWw0JywgICAgLy/kuIrkvKDmqKHlvI8s5L6d5qyh6YCA5YyWXHJcbiAgICAgIGJyb3dzZV9idXR0b246ICdwaWNrZmlsZXNfYnV0dG9uXycgKyB0aGlzLmhhc2hpZCwgICAgICAgLy/kuIrkvKDpgInmi6nnmoTngrnpgInmjInpkq7vvIwqKuW/hemcgCoqXHJcbiAgICAgIC8vIHVwdG9rZW5fdXJsOiAnL3Rva2VuJywgICAgICAgICAgICAvL0FqYXjor7fmsYJ1cFRva2Vu55qEVXJs77yMKirlvLrng4jlu7rorq7orr7nva4qKu+8iOacjeWKoeerr+aPkOS+m++8iVxyXG4gICAgICAvLyB1cHRva2VuOiB1cHRva2VuLFxyXG4gICAgICB1cmw6dGhpcy56b25lVXJsLFxyXG4gICAgICBtdWx0aXBhcnRfcGFyYW1zOiB7XHJcbiAgICAgICAgLy8gdG9rZW7ku47mnI3liqHnq6/ojrflj5bvvIzmsqHmnIl0b2tlbuaXoOazleS4iuS8oFxyXG4gICAgICAgIHRva2VuOiB1cHRva2VuXHJcbiAgICAgIH0sXHJcbiAgICAgIC8v6Iul5pyq5oyH5a6adXB0b2tlbl91cmws5YiZ5b+F6aG75oyH5a6aIHVwdG9rZW4gLHVwdG9rZW7nlLHlhbbku5bnqIvluo/nlJ/miJBcclxuICAgICAgLy8gdW5pcXVlX25hbWVzOiB0cnVlLCAvLyDpu5jorqQgZmFsc2XvvIxrZXnkuLrmlofku7blkI3jgILoi6XlvIDlkK/or6XpgInpobnvvIxTREvkuLroh6rliqjnlJ/miJDkuIrkvKDmiJDlip/lkI7nmoRrZXnvvIjmlofku7blkI3vvInjgIJcclxuICAgICAgLy8gc2F2ZV9rZXk6IHRydWUsICAgLy8g6buY6K6kIGZhbHNl44CC6Iul5Zyo5pyN5Yqh56uv55Sf5oiQdXB0b2tlbueahOS4iuS8oOetlueVpeS4reaMh+WumuS6hiBgc2F2YV9rZXlg77yM5YiZ5byA5ZCv77yMU0RL5Lya5b+955Wl5a+5a2V555qE5aSE55CGXHJcbiAgICAgIC8vIGRvbWFpbjogZG9tYWluLCAgIC8vYnVja2V0IOWfn+WQje+8jOS4i+i9vei1hOa6kOaXtueUqOWIsO+8jCoq5b+F6ZyAKipcclxuICAgICAgLy8gZ2V0X25ld191cHRva2VuOiB0cnVlLCAgLy/orr7nva7kuIrkvKDmlofku7bnmoTml7blgJnmmK/lkKbmr4/mrKHpg73ph43mlrDojrflj5bmlrDnmoR0b2tlblxyXG4gICAgICBjb250YWluZXI6ICdkcmFnZHJvcF9jb250YWluZXJfJyArIHRoaXMuaGFzaGlkLCAgICAgICAgICAgLy/kuIrkvKDljLrln59ET00gSUTvvIzpu5jorqTmmK9icm93c2VyX2J1dHRvbueahOeItuWFg+e0oO+8jFxyXG4gICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgbWF4X2ZpbGVfc2l6ZTogdGhpcy5tYXhfZmlsZV9zaXplICsgJ21iJywgICAgICAgICAgIC8v5pyA5aSn5paH5Lu25L2T56ev6ZmQ5Yi2XHJcbiAgICAgICAgcHJldmVudF9kdXBsaWNhdGVzOiB0cnVlLFxyXG4gICAgICAgIG1pbWVfdHlwZXM6IHRoaXMubWltZV90eXBlc1xyXG4gICAgICB9LFxyXG4gICAgICBtYXhfcmV0cmllczogMywgICAgICAgICAgICAgICAgICAgLy/kuIrkvKDlpLHotKXmnIDlpKfph43or5XmrKHmlbBcclxuICAgICAgLy8gZHJhZ2Ryb3A6IHRoaXMuZHJhZ2Ryb3AsICAgICAgICAgICAgICAgICAgIC8v5byA5ZCv5Y+v5ouW5puz5LiK5LygXHJcbiAgICAgIC8vIGRyYWdkcm9wOiB0cnVlLFxyXG4gICAgICBtdWx0aV9zZWxlY3Rpb246IHRoaXMubXVsdGksXHJcbiAgICAgIGRyb3BfZWxlbWVudDogJ2RyYWdkcm9wX2NvbnRhaW5lcl8nICsgdGhpcy5oYXNoaWQsICAgICAgICAvL+aLluabs+S4iuS8oOWMuuWfn+WFg+e0oOeahElE77yM5ouW5puz5paH5Lu25oiW5paH5Lu25aS55ZCO5Y+v6Kem5Y+R5LiK5LygXHJcbiAgICAgIGNodW5rX3NpemU6ICc0bWInLCAgICAgICAgICAgICAgICAvL+WIhuWdl+S4iuS8oOaXtu+8jOavj+eJh+eahOS9k+enr1xyXG4gICAgICAvLyBhdXRvX3N0YXJ0OiB0cnVlLCAgICAgICAgICAgICAgICAgLy/pgInmi6nmlofku7blkI7oh6rliqjkuIrkvKDvvIzoi6XlhbPpl63pnIDopoHoh6rlt7Hnu5Hlrprkuovku7bop6blj5HkuIrkvKBcclxuICAgICAgaW5pdDoge1xyXG4gICAgICAgICdCZWZvcmVVcGxvYWQnOiBmdW5jdGlvbiAodXAsIGZpbGUpIHtcclxuICAgICAgICAgIGlmICh0aGF0LmF2YXRhclR5cGUgPT0gJ21vcmUnKSB7ICAvL+aUr+aMgeWkmuW8oOS4iuS8oOaXtiwg5pSv5oyB5YiG5qyh5LiK5LygLiBcclxuICAgICAgICAgICAgdGhhdC5maWxlcy5wdXNoKGZpbGUpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGF0LmZpbGVzID0gW11cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIOavj+S4quaWh+S7tuS4iuS8oOWJjSzlpITnkIbnm7jlhbPnmoTkuovmg4VcclxuXHJcbiAgICAgICAgICAvLyDoi6Xmg7PlnKjliY3nq6/lr7nmr4/kuKrmlofku7bnmoRrZXnov5vooYzkuKrmgKfljJblpITnkIbvvIzlj6/ku6XphY3nva7or6Xlh73mlbBcclxuICAgICAgICAgIC8vIOivpemFjee9ruW/hemhu+imgeWcqCB1bmlxdWVfbmFtZXM6IGZhbHNlICwgc2F2ZV9rZXk6IGZhbHNlIOaXtuaJjeeUn+aViFxyXG5cclxuICAgICAgICAgIGxldCBrZXkgPSB0aGF0LnVwbG9hZFNlcnYuZ2VuRmlsZUtleShmaWxlLHRoYXQuZ2V0QmVsb25nSWQoKSlcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgdGhhdC5jdXJyZW50S2V5ID0ga2V5O1xyXG4gICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGgga2V5IGhlcmVcclxuICAgICAgICAgIC8vIHJldHVybiBrZXlcclxuICAgICAgICAgIHRoYXQudXBsb2FkZXIuc2V0T3B0aW9uKHtcclxuICAgICAgICAgICAgLy8gbXVsdGlwYXJ0OiB0cnVlLFxyXG4gICAgICAgICAgICBtdWx0aXBhcnRfcGFyYW1zOiB7XHJcbiAgICAgICAgICAgICAgdG9rZW46IHVwdG9rZW4sXHJcbiAgICAgICAgICAgICAga2V5OmtleVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICdVcGxvYWRQcm9ncmVzcyc6IGZ1bmN0aW9uICh1cCwgZmlsZSkge1xyXG4gICAgICAgICAgLy8g5q+P5Liq5paH5Lu25LiK5Lyg5pe2LOWkhOeQhuebuOWFs+eahOS6i+aDhVxyXG4gICAgICAgICAgbGV0IGV2ID0gbmV3IEN1c3RvbUV2ZW50KFwidXBsb2FkZXJcIiArIGhhc2hpZCArIFwiLm9ucHJvZ3Jlc3NcIiwgeyBkZXRhaWw6IHsgXCJ1cFwiOiB1cCwgXCJmaWxlXCI6IGZpbGUgfSB9KVxyXG4gICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldilcclxuICAgICAgICB9LFxyXG4gICAgICAgICdGaWxlVXBsb2FkZWQnOiBmdW5jdGlvbiAodXAsIGZpbGUsIGluZm8pIHtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygn5oiQ5YqfJywgdXAsIGZpbGUsIGluZm8pO1xyXG4gICAgICAgXHJcbiAgICAgICAgICAvLyDmr4/kuKrmlofku7bkuIrkvKDmiJDlip/lkI4s5aSE55CG55u45YWz55qE5LqL5oOFXHJcbiAgICAgICAgICAvLyDlhbbkuK0gaW5mbyDmmK/mlofku7bkuIrkvKDmiJDlip/lkI7vvIzmnI3liqHnq6/ov5Tlm57nmoRqc29u77yM5b2i5byP5aaCXHJcbiAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAvLyAgICBcImhhc2hcIjogXCJGaDh4VnFvZDJNUTFtb2NmSTRTNEtwUkw2RDk4XCIsXHJcbiAgICAgICAgICAvLyAgICBcImtleVwiOiBcImdvZ29waGVyLmpwZ1wiXHJcbiAgICAgICAgICAvLyAgfVxyXG5cclxuICAgICAgICAgIC8vIOWPguiAg2h0dHA6Ly9kZXZlbG9wZXIucWluaXUuY29tL2RvY3MvdjYvYXBpL292ZXJ2aWV3L3VwL3Jlc3BvbnNlL3NpbXBsZS1yZXNwb25zZS5odG1sXHJcblxyXG4gICAgICAgICAgbGV0IGRvbWFpbiA9IHVwLmdldE9wdGlvbignZG9tYWluJyk7XHJcbiAgICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShpbmZvLnJlc3BvbnNlKTtcclxuICAgICAgICAgIGxldCBzb3VyY2VMaW5rID0gZG9tYWluICsgXCIvXCIgKyByZXMua2V5O1xyXG4gICAgICAgICAgZmlsZS51cmwgPSBzb3VyY2VMaW5rO1xyXG4gICAgICAgICAgbGV0IGV2ID0gbmV3IEN1c3RvbUV2ZW50KFwidXBsb2FkZXJcIiArIGhhc2hpZCArIFwiLmZpbGV1cGxvYWRlZFwiLCB7IGRldGFpbDogeyBcInVwXCI6IHVwLCBcImZpbGVcIjogZmlsZSwgXCJpbmZvXCI6IGluZm8gfSB9KTtcclxuICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXYpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2codGhhdC5maWxlcylcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vICdFcnJvcic6IGZ1bmN0aW9uICh1cCwgZXJyLCBlcnJUaXApIHtcclxuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCflpLHotKUnLCB1cCwgZXJyLCBlcnJUaXApXHJcbiAgICAgICAgLy8gICAvL+S4iuS8oOWHuumUmeaXtizlpITnkIbnm7jlhbPnmoTkuovmg4VcclxuICAgICAgICAvLyB9LFxyXG4gICAgICAgICdVcGxvYWRDb21wbGV0ZSc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIC8v6Zif5YiX5paH5Lu25aSE55CG5a6M5q+V5ZCOLOWkhOeQhuebuOWFs+eahOS6i+aDhVxyXG4gICAgICAgICAgaWYgKHRoYXQuYXZhdGFyVHlwZSAhPSAnbW9yZScpIHtcclxuICAgICAgICAgICAgdGhhdC51cGxvYWRlci5maWxlcyA9IFtdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBkb21haW4g5Li65LiD54mb56m66Ze077yIYnVja2V0KeWvueW6lOeahOWfn+WQje+8jOmAieaLqeafkOS4quepuumXtOWQju+8jOWPr+mAmui/h1wi56m66Ze06K6+572uLT7ln7rmnKzorr7nva4tPuWfn+WQjeiuvue9rlwi5p+l55yL6I635Y+WXHJcblxyXG4gICAgLy8gdXBsb2FkZXIg5Li65LiA5LiqcGx1cGxvYWTlr7nosaHvvIznu6fmib/kuobmiYDmnIlwbHVwbG9hZOeahOaWueazle+8jOWPguiAg2h0dHA6Ly9wbHVwbG9hZC5jb20vZG9jc1xyXG4gICAgdGhpcy51cGxvYWRlci5pbml0KClcclxuXHJcbiAgICB0aGlzLnVwbG9hZGVyLmJpbmQoJ0ZpbGVzQWRkZWQnLGZ1bmN0aW9uICh1cCwgZmlsZXMpIHtcclxuICAgICAgLy8gcGx1cGxvYWQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGZpbGUpIHtcclxuICAgICAgLy8gICAvLyDmlofku7bmt7vliqDov5vpmJ/liJflkI4s5aSE55CG55u45YWz55qE5LqL5oOFXHJcbiAgICAgIC8vIH0pO1xyXG4gICAgICBjb25zb2xlLmxvZygxMjMpXHJcbiAgICAgIHRoYXQudXBsb2FkZXIuc3RhcnQoKTtcclxuICAgIH0pXHJcbiAgICB0aGlzLnVwbG9hZGVyLmJpbmQoJ0ZpbGVzQWRkZWQnLGZ1bmN0aW9uICh1cCwgZmlsZXMpIHtcclxuICAgIH0pXHJcbiAgICAvLyB0aGlzLnVwbG9hZGVyLnJlZnJlc2goKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1dWlkKCkgeyAvLyDnoa7kv53lpJrkuKpwbHVwbG9hZOaOp+S7tuS4jeWGsueqgVxyXG4gICAgbGV0IHMgPSBbXTtcclxuICAgIGxldCBoZXhEaWdpdHMgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzY7IGkrKykge1xyXG4gICAgICBzW2ldID0gaGV4RGlnaXRzLnN1YnN0cihNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAweDEwKSwgMSk7XHJcbiAgICB9XHJcbiAgICBzWzE0XSA9IFwiNFwiOyAgLy8gYml0cyAxMi0xNSBvZiB0aGUgdGltZV9oaV9hbmRfdmVyc2lvbiBmaWVsZCB0byAwMDEwXHJcbiAgICBzWzE5XSA9IGhleERpZ2l0cy5zdWJzdHIoKHNbMTldICYgMHgzKSB8IDB4OCwgMSk7ICAvLyBiaXRzIDYtNyBvZiB0aGUgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZCB0byAwMVxyXG4gICAgc1s4XSA9IHNbMTNdID0gc1sxOF0gPSBzWzIzXSA9IFwiLVwiO1xyXG5cclxuICAgIGxldCB1dWlkID0gcy5qb2luKFwiXCIpO1xyXG4gICAgcmV0dXJuIHV1aWQ7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0g6aKE6KeI5Zu+54mH77ya6KGM5YaF5YiX6KGoIC0tPlxyXG48bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmIG9mIGZpbGVMaXN0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtXCIgW25nU3dpdGNoXT1cImNoZWNrRmlsZVR5cGUoZilcIj5cclxuICAgICAgPCEtLSDlm77niYfmmL7npLogLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCIgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIj5cclxuICAgICAgICAgIDxpbWcgKGNsaWNrKT1cInNob3dGaWxlKGYpXCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHg7XCIgKm5nSWY9XCJmXCIgW3NyY109XCJmKyc/aW1hZ2VWaWV3Mi8xL3cvMjAwL2gvMjAwJ1wiXHJcbiAgICAgICAgICAgIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImRlbGV0ZUZpbGUoZilcIiAqbmdJZj1cInVwYWJsZSgpXCIgbnpTaXplPSdzbWFsbCcgIG56LWJ1dHRvbiBuelR5cGU9XCJkYW5nZXJcIiBuelNoYXBlPVwiY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgPGkgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiIG56LWljb24gbnpUeXBlPVwiY2xvc2VcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSDop4bpopHmmL7npLogLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCIgKm5nU3dpdGNoQ2FzZT1cIid2aWRlbydcIj5cclxuICAgICAgICA8dmlkZW8gKGNsaWNrKT1cInNob3dGaWxlKGYpXCIgc3R5bGU9XCJ3aWR0aDoxMDBweDtoZWlnaHQ6MTAwcHg7XCIgYXV0b3BsYXkgKm5nSWY9XCJmXCIgW3NyY109XCJmXCJcclxuICAgICAgICAgIGFsdD1cIlwiPlxyXG4gICAgICAgIDwvdmlkZW8+XHJcbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkZWxldGVGaWxlKGYpXCIgKm5nSWY9XCJ1cGFibGUoKVwiIG56U2l6ZT0nc21hbGwnICBuei1idXR0b24gbnpUeXBlPVwiZGFuZ2VyXCIgbnpTaGFwZT1cImNpcmNsZVwiPlxyXG4gICAgICAgICAgICA8aSBzdHlsZT1cIndpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7XCIgbnotaWNvbiBuelR5cGU9XCJjbG9zZVwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSDmlofku7bmmL7npLogLS0+XHJcbiAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICA8aSBzdHlsZT1cIndpZHRoOjEwMHB4O2hlaWdodDoxMDBweDtcIiBuei1pY29uIFtuelR5cGVdPVwiJ2ZpbGUnXCIgW256VGhlbWVdPVwiJ3R3b3RvbmUnXCIgc3R5bGU9XCJmb250LXNpemU6IDQuNGVtO1wiPjwvaT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIOWIoOmZpOaMiemSriAtLT5cclxuICAgICAgXHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48IS0tIOS4iuS8oOaOp+S7tu+8muebuOacui/mi43mkYQg77yIQ2FwYWNpdG9y56uv77yJIC0tPlxyXG48ZGl2IChjbGljayk9XCJ0YWtlRnJvbUNhbWVyYSgpXCIgW25nU3R5bGVdPVwieydkaXNwbGF5Jzppc0NhcGFjaXRvciAmJiBwYXRoID09ICdjYW1lcmEnID8nZmxleCc6J25vbmUnLCd3aWR0aCc6KGZpbGVMaXN0Py5sZW5ndGg9PTAgfHwgbXVsdGkpPycxMDBweCc6JzAlJ31cIiBjbGFzcz1cImRpdnVwbG9hZCBmaWxlLWl0ZW1cIj5cclxuICA8ZGl2IFtuZ1N0eWxlXT1cInsnd2lkdGgnOihmaWxlTGlzdD8ubGVuZ3RoPT0wIHx8IG11bHRpKT8nMTAwJSc6JzAlJ31cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwbHVzXCIgW2NsYXNzLmNhcGFjaXRvcl09XCJpc0NhcGFjaXRvclwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImZpbGVMaXN0Py5sZW5ndGg9PTAgfHwgbXVsdGlcIiBuei1pY29uIG56VHlwZT1cInBsdXNcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPCEtLSDkuIrkvKDmjqfku7bvvJrngrnlh7sv5ouW5ou9IO+8iFdlYuerr++8iSAtLT5cclxuPCEtLSDpgJrov4fmoLflvI/liIfmjaLmmL7npLrvvIzkuI3lj6/nlKhuZ0lm5Lya5a+86Ie0aWTnu5HlrprkuIrkvKDlh73mlbDlpLHmlYggLS0+XHJcbjxkaXYgW25nU3R5bGVdPVwieydkaXNwbGF5Jzppc0NhcGFjaXRvciAmJiBwYXRoID09ICdjYW1lcmEnID8nbm9uZSc6J2ZsZXgnLCd3aWR0aCc6KGZpbGVMaXN0Py5sZW5ndGg9PTAgfHwgbXVsdGkpPycxMDBweCc6JzAlJ31cIiBpZD1cImRyYWdkcm9wX2NvbnRhaW5lcl97e2hhc2hpZH19XCIgY2xhc3M9XCJkaXZ1cGxvYWQgZmlsZS1pdGVtXCI+XHJcbiAgPGRpdiBbbmdTdHlsZV09XCJ7J3dpZHRoJzooZmlsZUxpc3Q/Lmxlbmd0aD09MCB8fCBtdWx0aSk/JzEwMCUnOicwJSd9XCIgaWQ9XCJwaWNrZmlsZXNfYnV0dG9uX3t7aGFzaGlkfX1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwbHVzXCI+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZmlsZUxpc3Q/Lmxlbmd0aD09MCB8fCBtdWx0aVwiIG56LWljb24gbnpUeXBlPVwicGx1c1wiIG56VGhlbWU9XCJvdXRsaW5lXCI+PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSDpooTop4jljLrln5/vvJrlm77niYfmlL7lpKcgLS0+XHJcbjxkaXYgKm5nSWY9XCJpbWdTaG93aW5nXCIgKGNsaWNrKT1cImNsb3NlU2hvd01vZGFsKClcIlxyXG5zdHlsZT1cInBvc2l0aW9uOmZpeGVkO3RvcDowcHg7bGVmdDowcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjY1NTM1O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNik7dGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gIDxkaXYgc3R5bGU9XCJ3aWR0aDo5MCU7bWFyZ2luLWxlZnQ6NSU7bWFyZ2luLXRvcDoxJTtjb2xvcjojZmZmO1xyXG4gIGZvbnQtc2l6ZTozMHB4O2JvcmRlcjoxcHggI0ZGRiBzb2xpZDtib3JkZXItcmFkaXVzOiA1cHg7XCI+6YCA5Ye66aKE6KeIPC9kaXY+XHJcblxyXG4gIDxpbWcgKm5nSWY9XCJjaGVja0ZpbGVUeXBlKGZpbGVVcmwpPT0naW1hZ2UnXCIgc3R5bGU9XCJoZWlnaHQ6OTAlO21hcmdpbi1sZWZ0OjUlO21hcmdpbi10b3A6MSU7YmFja2dyb3VuZDojZmZmO1wiIFtzcmNdPVwiZmlsZVVybD9maWxlVXJsOidhc3NldHMvaWNvbi9ub3VzZXIucG5nJ1wiIGFsdD1cIlwiPlxyXG4gIDx2aWRlbyAqbmdJZj1cImZpbGVVcmwmJmNoZWNrRmlsZVR5cGUoZmlsZVVybCk9PSd2aWRlbydcIiBhdXRvcGxheSBzdHlsZT1cIm1heC1oZWlnaHQ6OTAlO21heC13aWR0aDogODAlO21hcmdpbi1sZWZ0OjUlO21hcmdpbi10b3A6MSU7YmFja2dyb3VuZDojZmZmO1wiIFtzcmNdPVwiZmlsZVVybFwiIGFsdD1cIlwiPjwvdmlkZW8+XHJcbiAgXHJcbjwvZGl2PiJdfQ==
8
+ import{FmodeParse}from"@fmode/parse";import*as plupload from"plupload";import{Component,EventEmitter,Input,Output}from"@angular/core";import{NovaUploadService}from"../../storage/service-upload/nova-upload.service";import*as i0 from"@angular/core";import*as i1 from"../../storage/service-upload/nova-upload.service";import*as i2 from"@angular/common";import*as i3 from"ng-zorro-antd/button";import*as i4 from"ng-zorro-antd/core/transition-patch";import*as i5 from"ng-zorro-antd/core/wave";import*as i6 from"ng-zorro-antd/icon";const Parse=FmodeParse.with("nova");export class EditUploadComponent{get file(){return this._file}set file(e){this._file=e,this.fileChange.emit(e)}addToFileList(e){this.fileList||(this.fileList=[]),this.fileList.find((i=>i==e))||this.fileList.push(e),this.fileListChange.emit(this.fileList)}get files(){return this._files}set files(e){this._files=e}async queryDomain(){let e=new Parse.Query("Company"),i=await e.get(this.getBelongId());i.get("configQiniu")&&i.get("configQiniu").domain?(console.log(i.get("configQiniu").domain),this.qiniuDomain=i.get("configQiniu").domain):this.qiniuDomain="https://file-cloud.fmode.cn"}constructor(e){this.uploadServ=e,this.dragdrop=!1,this.multi=!1,this.max_file_size=100,this.type="image",this.onFilesChange=new EventEmitter,this.avatarType="",this.inputType=null,this.fileChange=new EventEmitter,this.fileList=[],this.fileListChange=new EventEmitter,this.path="camera",this.isCapacitor=!1,this.zoneUrl="https://upload-z2.qiniup.com/",this.hashid=this.uuid(),this.mime_types=[{title:"",extensions:"jpg,gif,png,bmp,jpeg"}],this.imgShowing=!1,this.isCapacitor=this.uploadServ.isCapacitor(),this.local=window.location.pathname,this.listenToUploader()}ngOnInit(){this.queryDomain(),"more"==this.avatarType&&(this.multi=!0),console.log(this._files)}async takeFromCamera(){let e=await this.getUptoken();if("image"==this.type)try{let i=await this.uploadServ.takePicture(e);this.currentKey=i.key,await this.setFiles(i)}catch(e){console.error(e),console.error(JSON.stringify(e))}if("video"==this.type){let i=await this.uploadServ.captureVideo(e);this.currentKey=i.key,await this.setFiles(i)}}ngAfterViewInit(){null==this.files&&(this.files=[]),this.uploaderType(),this.upable()&&this.getUptoken().then((e=>{this.uptoken=e.uptoken,this.domain=e.domain,this.initUploader(e.uptoken,e.domain)}))}async getUptoken(){return this.qiniuConf?.uptoken||(this.qiniuConf=await Parse.Cloud.run("qiniu_uptoken",{company:this.getBelongId()}),this.zoneUrl=this.qiniuConf?.zoneUrl),this.qiniuConf}checkFileType(e){if(e&&"string"==typeof e){if(e.endsWith("png"))return"image";if(e.endsWith("jpg"))return"image";if(e.endsWith("jpeg"))return"image";if(e.endsWith("gif"))return"image"}if(e&&"string"==typeof e){if(e.endsWith("mp4"))return"video";if(e.endsWith("webm"))return"video";if(e.endsWith("ogg"))return"video"}return"file"}upable(){return""!=this.type}showFile(e){console.log(123),this.fileUrl=e,this.imgShowing=!0}closeShowModal(){this.imgShowing=!1}async setFiles(e){if((this._files&&0==this._files.length||this.multi)&&e&&e.url){let i=e.url;e.url.indexOf("undefined")>-1&&(i=(this.qiniuDomain?this.qiniuDomain:"https://file-cloud.fmode.cn/")+e.url.replace("undefined/","")),this.files=i,this.file=i,this.addToFileList(i),this.currentKey&&await this.uploadServ.saveAttachment(e,this.qiniuDomain,null,this.getBelongId()),this.dragdrop=!1}}deleteFile(e){let i=this._files?.length&&this._files?.findIndex&&this._files?.findIndex((i=>i==e));-1!=i&&this._files?.splice&&this._files?.splice(i,1);let t=this.fileList?.findIndex((i=>i==e));-1!=t&&(this.fileList.splice(t,1),this.fileListChange.emit(this.fileList)),this.file=void 0}listenToUploader(){console.log(123),document.addEventListener("uploader"+this.hashid+".onprogress",(e=>{console.log(123),this.setFiles(e.detail.file),this.setFiles(e.detail.file.percent)}),!1),document.addEventListener("uploader"+this.hashid+".fileuploaded",(e=>{this.setFiles(e.detail.file)}),!1)}uploaderType(){switch(console.log(this.type),this.type){case"image":this.mime_types=[{title:"Image files",extensions:"jpg,gif,png,webp,jpeg"}];break;case"attachment":this.mime_types=[{title:"Image files",extensions:"jpg,gif,png,webp,jpeg"},{title:"Attachment files",extensions:"pdf,doc,docx,xls,md,txt,json"},{title:"Zip files",extensions:"zip,7z,tar.gz,rar"}];break;case"video":this.mime_types=[{title:"Video files",extensions:"flv,mpg,mpeg,avi,wmv,mov,asf,rm,rmvb,mkv,m4v,mp4"}]}}getBelongId(){if(this.company)return this.company;return window.localStorage.getItem("company")}initUploader(e,i){let t=this,n=this.hashid;this.uploader=new plupload.Uploader({runtimes:"html5,html4",browse_button:"pickfiles_button_"+this.hashid,url:this.zoneUrl,multipart_params:{token:e},container:"dragdrop_container_"+this.hashid,filters:{max_file_size:this.max_file_size+"mb",prevent_duplicates:!0,mime_types:this.mime_types},max_retries:3,multi_selection:this.multi,drop_element:"dragdrop_container_"+this.hashid,chunk_size:"4mb",init:{BeforeUpload:function(i,n){"more"==t.avatarType?t.files.push(n):t.files=[];let l=t.uploadServ.genFileKey(n,t.getBelongId());t.currentKey=l,t.uploader.setOption({multipart_params:{token:e,key:l}})},UploadProgress:function(e,i){let t=new CustomEvent("uploader"+n+".onprogress",{detail:{up:e,file:i}});document.dispatchEvent(t)},FileUploaded:function(e,i,l){console.log("成功",e,i,l);let o=e.getOption("domain")+"/"+JSON.parse(l.response).key;i.url=o;let s=new CustomEvent("uploader"+n+".fileuploaded",{detail:{up:e,file:i,info:l}});document.dispatchEvent(s),console.log(t.files)},UploadComplete:function(){"more"!=t.avatarType&&(t.uploader.files=[])}}}),this.uploader.init(),this.uploader.bind("FilesAdded",(function(e,i){console.log(123),t.uploader.start()})),this.uploader.bind("FilesAdded",(function(e,i){}))}uuid(){let e=[],i="0123456789abcdef";for(let t=0;t<36;t++)e[t]=i.substr(Math.floor(16*Math.random()),1);return e[14]="4",e[19]=i.substr(3&e[19]|8,1),e[8]=e[13]=e[18]=e[23]="-",e.join("")}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:EditUploadComponent,deps:[{token:i1.NovaUploadService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:EditUploadComponent,selector:"fm-edit-upload",inputs:{_files:["files","_files"],dragdrop:"dragdrop",multi:"multi",max_file_size:"max_file_size",type:"type",avatarType:"avatarType",company:"company",_file:["file","_file"],fileList:"fileList",path:"path"},outputs:{onFilesChange:"filesChange",fileChange:"fileChange",fileListChange:"fileListChange"},ngImport:i0,template:'\x3c!-- 预览图片:行内列表 --\x3e\n<ng-container *ngFor="let f of fileList">\n <div class="file-item" [ngSwitch]="checkFileType(f)">\n \x3c!-- 图片显示 --\x3e\n <div class="item" *ngSwitchCase="\'image\'">\n <img (click)="showFile(f)" style="width:100px;height:100px;" *ngIf="f" [src]="f+\'?imageView2/1/w/200/h/200\'"\n alt="" />\n <button (click)="deleteFile(f)" *ngIf="upable()" nzSize=\'small\' nz-button nzType="danger" nzShape="circle">\n <i style="width: 10px; height: 10px;" nz-icon nzType="close"></i>\n </button>\n </div>\n \x3c!-- 视频显示 --\x3e\n <div class="item" *ngSwitchCase="\'video\'">\n <video (click)="showFile(f)" style="width:100px;height:100px;" autoplay *ngIf="f" [src]="f"\n alt="">\n </video>\n <button (click)="deleteFile(f)" *ngIf="upable()" nzSize=\'small\' nz-button nzType="danger" nzShape="circle">\n <i style="width: 10px; height: 10px;" nz-icon nzType="close"></i>\n </button>\n </div>\n \x3c!-- 文件显示 --\x3e\n <div *ngSwitchDefault>\n <i style="width:100px;height:100px;" nz-icon [nzType]="\'file\'" [nzTheme]="\'twotone\'" style="font-size: 4.4em;"></i>\n </div>\n\n \x3c!-- 删除按钮 --\x3e\n \n </div>\n</ng-container>\n\n\x3c!-- 上传控件:相机/拍摄 (Capacitor端) --\x3e\n<div (click)="takeFromCamera()" [ngStyle]="{\'display\':isCapacitor && path == \'camera\' ?\'flex\':\'none\',\'width\':(fileList?.length==0 || multi)?\'100px\':\'0%\'}" class="divupload file-item">\n <div [ngStyle]="{\'width\':(fileList?.length==0 || multi)?\'100%\':\'0%\'}">\n <div class="plus" [class.capacitor]="isCapacitor">\n <span *ngIf="fileList?.length==0 || multi" nz-icon nzType="plus" nzTheme="outline"></span>\n </div>\n </div>\n</div>\n\x3c!-- 上传控件:点击/拖拽 (Web端) --\x3e\n\x3c!-- 通过样式切换显示,不可用ngIf会导致id绑定上传函数失效 --\x3e\n<div [ngStyle]="{\'display\':isCapacitor && path == \'camera\' ?\'none\':\'flex\',\'width\':(fileList?.length==0 || multi)?\'100px\':\'0%\'}" id="dragdrop_container_{{hashid}}" class="divupload file-item">\n <div [ngStyle]="{\'width\':(fileList?.length==0 || multi)?\'100%\':\'0%\'}" id="pickfiles_button_{{hashid}}">\n <div class="plus">\n <span *ngIf="fileList?.length==0 || multi" nz-icon nzType="plus" nzTheme="outline"></span>\n </div>\n </div>\n</div>\n\n\x3c!-- 预览区域:图片放大 --\x3e\n<div *ngIf="imgShowing" (click)="closeShowModal()"\nstyle="position:fixed;top:0px;left:0px;width:100%;height:100%;z-index:65535;\n background-color: rgba(0,0,0,0.6);text-align: center;">\n <div style="width:90%;margin-left:5%;margin-top:1%;color:#fff;\n font-size:30px;border:1px #FFF solid;border-radius: 5px;">退出预览</div>\n\n <img *ngIf="checkFileType(fileUrl)==\'image\'" style="height:90%;margin-left:5%;margin-top:1%;background:#fff;" [src]="fileUrl?fileUrl:\'assets/icon/nouser.png\'" alt="">\n <video *ngIf="fileUrl&&checkFileType(fileUrl)==\'video\'" autoplay style="max-height:90%;max-width: 80%;margin-left:5%;margin-top:1%;background:#fff;" [src]="fileUrl" alt=""></video>\n \n</div>',styles:[".file-item{float:left;height:100px;display:flex}.file-item .plus{width:100px;height:100px;display:flex;justify-content:center;align-items:center;align-content:center}.file-item .plus span{flex:100%;align-items:center;align-content:center}.file-item .capacitor{display:flex;justify-content:center}.file-item .capacitor span{position:relative;margin-left:-70px;margin-top:-70px}.file-item .item{position:relative}.file-item .item button{position:absolute;top:-11px;left:82px;display:flex;justify-content:center;align-items:center}.divupload{height:100px;width:100px;background-color:#ededed}.divupload div{height:100%}.divupload span{color:#909090;font-size:30px;position:absolute;left:35px;top:35px}.img{height:100px;width:100px;cursor:pointer}\n"],dependencies:[{kind:"directive",type:i2.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i2.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:i2.NgStyle,selector:"[ngStyle]",inputs:["ngStyle"]},{kind:"directive",type:i2.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:i2.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"directive",type:i2.NgSwitchDefault,selector:"[ngSwitchDefault]"},{kind:"component",type:i3.NzButtonComponent,selector:"button[nz-button], a[nz-button]",inputs:["nzBlock","nzGhost","nzSearch","nzLoading","nzDanger","disabled","tabIndex","nzType","nzShape","nzSize"],exportAs:["nzButton"]},{kind:"directive",type:i4.ɵNzTransitionPatchDirective,selector:"[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group",inputs:["hidden"]},{kind:"directive",type:i5.NzWaveDirective,selector:'[nz-wave],button[nz-button]:not([nzType="link"]):not([nzType="text"])',inputs:["nzWaveExtraNode"],exportAs:["nzWave"]},{kind:"directive",type:i6.NzIconDirective,selector:"[nz-icon]",inputs:["nzSpin","nzRotate","nzType","nzTheme","nzTwotoneColor","nzIconfont"],exportAs:["nzIcon"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:EditUploadComponent,decorators:[{type:Component,args:[{selector:"fm-edit-upload",template:'\x3c!-- 预览图片:行内列表 --\x3e\n<ng-container *ngFor="let f of fileList">\n <div class="file-item" [ngSwitch]="checkFileType(f)">\n \x3c!-- 图片显示 --\x3e\n <div class="item" *ngSwitchCase="\'image\'">\n <img (click)="showFile(f)" style="width:100px;height:100px;" *ngIf="f" [src]="f+\'?imageView2/1/w/200/h/200\'"\n alt="" />\n <button (click)="deleteFile(f)" *ngIf="upable()" nzSize=\'small\' nz-button nzType="danger" nzShape="circle">\n <i style="width: 10px; height: 10px;" nz-icon nzType="close"></i>\n </button>\n </div>\n \x3c!-- 视频显示 --\x3e\n <div class="item" *ngSwitchCase="\'video\'">\n <video (click)="showFile(f)" style="width:100px;height:100px;" autoplay *ngIf="f" [src]="f"\n alt="">\n </video>\n <button (click)="deleteFile(f)" *ngIf="upable()" nzSize=\'small\' nz-button nzType="danger" nzShape="circle">\n <i style="width: 10px; height: 10px;" nz-icon nzType="close"></i>\n </button>\n </div>\n \x3c!-- 文件显示 --\x3e\n <div *ngSwitchDefault>\n <i style="width:100px;height:100px;" nz-icon [nzType]="\'file\'" [nzTheme]="\'twotone\'" style="font-size: 4.4em;"></i>\n </div>\n\n \x3c!-- 删除按钮 --\x3e\n \n </div>\n</ng-container>\n\n\x3c!-- 上传控件:相机/拍摄 (Capacitor端) --\x3e\n<div (click)="takeFromCamera()" [ngStyle]="{\'display\':isCapacitor && path == \'camera\' ?\'flex\':\'none\',\'width\':(fileList?.length==0 || multi)?\'100px\':\'0%\'}" class="divupload file-item">\n <div [ngStyle]="{\'width\':(fileList?.length==0 || multi)?\'100%\':\'0%\'}">\n <div class="plus" [class.capacitor]="isCapacitor">\n <span *ngIf="fileList?.length==0 || multi" nz-icon nzType="plus" nzTheme="outline"></span>\n </div>\n </div>\n</div>\n\x3c!-- 上传控件:点击/拖拽 (Web端) --\x3e\n\x3c!-- 通过样式切换显示,不可用ngIf会导致id绑定上传函数失效 --\x3e\n<div [ngStyle]="{\'display\':isCapacitor && path == \'camera\' ?\'none\':\'flex\',\'width\':(fileList?.length==0 || multi)?\'100px\':\'0%\'}" id="dragdrop_container_{{hashid}}" class="divupload file-item">\n <div [ngStyle]="{\'width\':(fileList?.length==0 || multi)?\'100%\':\'0%\'}" id="pickfiles_button_{{hashid}}">\n <div class="plus">\n <span *ngIf="fileList?.length==0 || multi" nz-icon nzType="plus" nzTheme="outline"></span>\n </div>\n </div>\n</div>\n\n\x3c!-- 预览区域:图片放大 --\x3e\n<div *ngIf="imgShowing" (click)="closeShowModal()"\nstyle="position:fixed;top:0px;left:0px;width:100%;height:100%;z-index:65535;\n background-color: rgba(0,0,0,0.6);text-align: center;">\n <div style="width:90%;margin-left:5%;margin-top:1%;color:#fff;\n font-size:30px;border:1px #FFF solid;border-radius: 5px;">退出预览</div>\n\n <img *ngIf="checkFileType(fileUrl)==\'image\'" style="height:90%;margin-left:5%;margin-top:1%;background:#fff;" [src]="fileUrl?fileUrl:\'assets/icon/nouser.png\'" alt="">\n <video *ngIf="fileUrl&&checkFileType(fileUrl)==\'video\'" autoplay style="max-height:90%;max-width: 80%;margin-left:5%;margin-top:1%;background:#fff;" [src]="fileUrl" alt=""></video>\n \n</div>',styles:[".file-item{float:left;height:100px;display:flex}.file-item .plus{width:100px;height:100px;display:flex;justify-content:center;align-items:center;align-content:center}.file-item .plus span{flex:100%;align-items:center;align-content:center}.file-item .capacitor{display:flex;justify-content:center}.file-item .capacitor span{position:relative;margin-left:-70px;margin-top:-70px}.file-item .item{position:relative}.file-item .item button{position:absolute;top:-11px;left:82px;display:flex;justify-content:center;align-items:center}.divupload{height:100px;width:100px;background-color:#ededed}.divupload div{height:100%}.divupload span{color:#909090;font-size:30px;position:absolute;left:35px;top:35px}.img{height:100px;width:100px;cursor:pointer}\n"]}]}],ctorParameters:()=>[{type:i1.NovaUploadService}],propDecorators:{_files:[{type:Input,args:["files"]}],dragdrop:[{type:Input}],multi:[{type:Input}],max_file_size:[{type:Input,args:["max_file_size"]}],type:[{type:Input}],onFilesChange:[{type:Output,args:["filesChange"]}],avatarType:[{type:Input,args:["avatarType"]}],company:[{type:Input}],_file:[{type:Input,args:["file"]}],fileChange:[{type:Output}],fileList:[{type:Input}],fileListChange:[{type:Output}],path:[{type:Input}]}});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9wZXJzb24vZWRpdC11cGxvYWQvZWRpdC11cGxvYWQuY29tcG9uZW50Lm1qcw==`
10
+