@underpostnet/underpost 2.7.82

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 (290) hide show
  1. package/.dockerignore +14 -0
  2. package/.env.development +6 -0
  3. package/.env.production +6 -0
  4. package/.env.test +6 -0
  5. package/.github/workflows/ghpkg.yml +75 -0
  6. package/.github/workflows/publish.yml +84 -0
  7. package/.github/workflows/pwa-microservices-template.test.yml +30 -0
  8. package/.nycrc +9 -0
  9. package/.prettierignore +13 -0
  10. package/.prettierrc +9 -0
  11. package/.vscode/extensions.json +72 -0
  12. package/.vscode/settings.json +100 -0
  13. package/AUTHORS.md +10 -0
  14. package/CHANGELOG.md +37 -0
  15. package/Dockerfile +90 -0
  16. package/LICENSE +21 -0
  17. package/README.md +96 -0
  18. package/bin/db.js +172 -0
  19. package/bin/deploy.js +674 -0
  20. package/bin/file.js +93 -0
  21. package/bin/index.js +82 -0
  22. package/bin/ssl.js +55 -0
  23. package/bin/util.js +182 -0
  24. package/bin/vs.js +35 -0
  25. package/conf.js +251 -0
  26. package/docker-compose.yml +67 -0
  27. package/jsconfig.json +7 -0
  28. package/jsdoc.json +32 -0
  29. package/nodemon.json +6 -0
  30. package/package.json +134 -0
  31. package/prometheus.yml +36 -0
  32. package/src/api/core/core.controller.js +69 -0
  33. package/src/api/core/core.model.js +11 -0
  34. package/src/api/core/core.router.js +23 -0
  35. package/src/api/core/core.service.js +29 -0
  36. package/src/api/crypto/crypto.controller.js +51 -0
  37. package/src/api/crypto/crypto.model.js +23 -0
  38. package/src/api/crypto/crypto.router.js +20 -0
  39. package/src/api/crypto/crypto.service.js +64 -0
  40. package/src/api/default/default.controller.js +69 -0
  41. package/src/api/default/default.model.js +20 -0
  42. package/src/api/default/default.router.js +23 -0
  43. package/src/api/default/default.service.js +31 -0
  44. package/src/api/file/file.controller.js +53 -0
  45. package/src/api/file/file.model.js +19 -0
  46. package/src/api/file/file.router.js +21 -0
  47. package/src/api/file/file.service.js +80 -0
  48. package/src/api/instance/instance.controller.js +69 -0
  49. package/src/api/instance/instance.model.js +36 -0
  50. package/src/api/instance/instance.router.js +33 -0
  51. package/src/api/instance/instance.service.js +48 -0
  52. package/src/api/test/test.controller.js +59 -0
  53. package/src/api/test/test.model.js +14 -0
  54. package/src/api/test/test.router.js +21 -0
  55. package/src/api/test/test.service.js +35 -0
  56. package/src/api/user/user.build.js +16 -0
  57. package/src/api/user/user.controller.js +70 -0
  58. package/src/api/user/user.model.js +65 -0
  59. package/src/api/user/user.router.js +345 -0
  60. package/src/api/user/user.service.js +479 -0
  61. package/src/api.js +23 -0
  62. package/src/client/Default.index.js +40 -0
  63. package/src/client/components/core/Account.js +290 -0
  64. package/src/client/components/core/AgGrid.js +160 -0
  65. package/src/client/components/core/Auth.js +19 -0
  66. package/src/client/components/core/Badge.js +32 -0
  67. package/src/client/components/core/Blockchain.js +41 -0
  68. package/src/client/components/core/Blog.js +9 -0
  69. package/src/client/components/core/BtnIcon.js +101 -0
  70. package/src/client/components/core/CalendarCore.js +458 -0
  71. package/src/client/components/core/Chat.js +64 -0
  72. package/src/client/components/core/ColorPalette.js +5267 -0
  73. package/src/client/components/core/CommonJs.js +742 -0
  74. package/src/client/components/core/Content.js +193 -0
  75. package/src/client/components/core/Css.js +846 -0
  76. package/src/client/components/core/CssCore.js +817 -0
  77. package/src/client/components/core/D3Chart.js +44 -0
  78. package/src/client/components/core/Docs.js +231 -0
  79. package/src/client/components/core/DropDown.js +164 -0
  80. package/src/client/components/core/EventsUI.js +46 -0
  81. package/src/client/components/core/FileExplorer.js +699 -0
  82. package/src/client/components/core/FullScreen.js +45 -0
  83. package/src/client/components/core/Input.js +346 -0
  84. package/src/client/components/core/JoyStick.js +77 -0
  85. package/src/client/components/core/Keyboard.js +73 -0
  86. package/src/client/components/core/LoadingAnimation.js +178 -0
  87. package/src/client/components/core/LogIn.js +187 -0
  88. package/src/client/components/core/LogOut.js +58 -0
  89. package/src/client/components/core/Logger.js +26 -0
  90. package/src/client/components/core/Modal.js +1612 -0
  91. package/src/client/components/core/NotificationManager.js +84 -0
  92. package/src/client/components/core/Panel.js +613 -0
  93. package/src/client/components/core/PanelForm.js +468 -0
  94. package/src/client/components/core/Polyhedron.js +162 -0
  95. package/src/client/components/core/Recover.js +204 -0
  96. package/src/client/components/core/Responsive.js +53 -0
  97. package/src/client/components/core/RichText.js +51 -0
  98. package/src/client/components/core/Router.js +76 -0
  99. package/src/client/components/core/Scroll.js +34 -0
  100. package/src/client/components/core/SignUp.js +125 -0
  101. package/src/client/components/core/SocketIo.js +72 -0
  102. package/src/client/components/core/Stream.js +113 -0
  103. package/src/client/components/core/ToggleSwitch.js +87 -0
  104. package/src/client/components/core/ToolTip.js +26 -0
  105. package/src/client/components/core/Translate.js +446 -0
  106. package/src/client/components/core/Validator.js +100 -0
  107. package/src/client/components/core/VanillaJs.js +463 -0
  108. package/src/client/components/core/Wallet.js +106 -0
  109. package/src/client/components/core/Webhook.js +25 -0
  110. package/src/client/components/core/Worker.js +282 -0
  111. package/src/client/components/default/CommonDefault.js +29 -0
  112. package/src/client/components/default/CssDefault.js +13 -0
  113. package/src/client/components/default/ElementsDefault.js +38 -0
  114. package/src/client/components/default/LogInDefault.js +41 -0
  115. package/src/client/components/default/LogOutDefault.js +28 -0
  116. package/src/client/components/default/MenuDefault.js +389 -0
  117. package/src/client/components/default/RoutesDefault.js +48 -0
  118. package/src/client/components/default/SettingsDefault.js +16 -0
  119. package/src/client/components/default/SignUpDefault.js +9 -0
  120. package/src/client/components/default/SocketIoDefault.js +54 -0
  121. package/src/client/components/default/TranslateDefault.js +7 -0
  122. package/src/client/public/default/android-chrome-144x144.png +0 -0
  123. package/src/client/public/default/android-chrome-192x192.png +0 -0
  124. package/src/client/public/default/android-chrome-256x256.png +0 -0
  125. package/src/client/public/default/android-chrome-36x36.png +0 -0
  126. package/src/client/public/default/android-chrome-384x384.png +0 -0
  127. package/src/client/public/default/android-chrome-48x48.png +0 -0
  128. package/src/client/public/default/android-chrome-512x512.png +0 -0
  129. package/src/client/public/default/android-chrome-72x72.png +0 -0
  130. package/src/client/public/default/android-chrome-96x96.png +0 -0
  131. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  132. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  133. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  134. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  135. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  136. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  137. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  138. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  139. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  140. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  141. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  142. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  143. package/src/client/public/default/apple-touch-icon.png +0 -0
  144. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  145. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  146. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  147. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  148. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  149. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  150. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  151. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  152. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  153. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  154. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  155. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  156. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  157. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  158. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  159. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  160. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  161. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  162. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  163. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  164. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  165. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  166. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  167. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  168. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  169. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  170. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  171. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  172. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  173. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  174. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  175. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  176. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  177. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  178. package/src/client/public/default/assets/background/white.jpg +0 -0
  179. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  180. package/src/client/public/default/assets/background/white0.jpg +0 -0
  181. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  182. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  183. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  184. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  185. package/src/client/public/default/browserconfig.xml +12 -0
  186. package/src/client/public/default/favicon-16x16.png +0 -0
  187. package/src/client/public/default/favicon-32x32.png +0 -0
  188. package/src/client/public/default/favicon-48x48.png +0 -0
  189. package/src/client/public/default/favicon.ico +0 -0
  190. package/src/client/public/default/manifest.webmanifest +69 -0
  191. package/src/client/public/default/mstile-144x144.png +0 -0
  192. package/src/client/public/default/mstile-150x150.png +0 -0
  193. package/src/client/public/default/mstile-310x150.png +0 -0
  194. package/src/client/public/default/mstile-310x310.png +0 -0
  195. package/src/client/public/default/mstile-70x70.png +0 -0
  196. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  197. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  198. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  199. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  200. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  201. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  202. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  203. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  204. package/src/client/public/default/sitemap +148 -0
  205. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  206. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  207. package/src/client/public/doc/favicon.ico +0 -0
  208. package/src/client/public/doc/sitemap +148 -0
  209. package/src/client/public/test/favicon.ico +0 -0
  210. package/src/client/public/test/sitemap +148 -0
  211. package/src/client/services/core/core.service.js +170 -0
  212. package/src/client/services/crypto/crypto.service.js +70 -0
  213. package/src/client/services/default/default.management.js +343 -0
  214. package/src/client/services/default/default.service.js +89 -0
  215. package/src/client/services/file/file.service.js +70 -0
  216. package/src/client/services/instance/instance.management.js +74 -0
  217. package/src/client/services/instance/instance.service.js +89 -0
  218. package/src/client/services/test/test.service.js +70 -0
  219. package/src/client/services/user/user.management.js +50 -0
  220. package/src/client/services/user/user.service.js +89 -0
  221. package/src/client/ssr/Render.js +237 -0
  222. package/src/client/ssr/common/Alert.js +75 -0
  223. package/src/client/ssr/common/SsrCore.js +91 -0
  224. package/src/client/ssr/common/Translate.js +26 -0
  225. package/src/client/ssr/common/Worker.js +28 -0
  226. package/src/client/ssr/components/body/CacheControl.js +114 -0
  227. package/src/client/ssr/components/body/DefaultSplashScreen.js +90 -0
  228. package/src/client/ssr/components/email/DefaultRecoverEmail.js +21 -0
  229. package/src/client/ssr/components/email/DefaultVerifyEmail.js +17 -0
  230. package/src/client/ssr/components/head/Css.js +241 -0
  231. package/src/client/ssr/components/head/DefaultScripts.js +3 -0
  232. package/src/client/ssr/components/head/PwaDefault.js +60 -0
  233. package/src/client/ssr/offline/default.index.js +31 -0
  234. package/src/client/ssr/pages/404.js +12 -0
  235. package/src/client/ssr/pages/500.js +12 -0
  236. package/src/client/sw/default.sw.js +203 -0
  237. package/src/client/sw/template.sw.js +84 -0
  238. package/src/client.build.js +22 -0
  239. package/src/client.dev.js +21 -0
  240. package/src/cron.js +30 -0
  241. package/src/db/DataBaseProvider.js +34 -0
  242. package/src/db/mariadb/MariaDB.js +33 -0
  243. package/src/db/mongo/MongooseDB.js +125 -0
  244. package/src/dns.js +22 -0
  245. package/src/index.js +43 -0
  246. package/src/mailer/EmailRender.js +69 -0
  247. package/src/mailer/MailerProvider.js +96 -0
  248. package/src/proxy.js +22 -0
  249. package/src/runtime/lampp/Lampp.js +115 -0
  250. package/src/runtime/nginx/Nginx.js +3 -0
  251. package/src/runtime/xampp/Xampp.js +49 -0
  252. package/src/server/auth.js +235 -0
  253. package/src/server/backup.js +108 -0
  254. package/src/server/client-build-live.js +98 -0
  255. package/src/server/client-build.js +821 -0
  256. package/src/server/client-dev-server.js +60 -0
  257. package/src/server/client-formatted.js +58 -0
  258. package/src/server/client-icons.js +151 -0
  259. package/src/server/conf.js +883 -0
  260. package/src/server/cron.js +35 -0
  261. package/src/server/dns.js +89 -0
  262. package/src/server/downloader.js +42 -0
  263. package/src/server/logger.js +190 -0
  264. package/src/server/network.js +122 -0
  265. package/src/server/peer.js +33 -0
  266. package/src/server/process.js +66 -0
  267. package/src/server/prompt-optimizer.js +28 -0
  268. package/src/server/proxy.js +118 -0
  269. package/src/server/runtime.js +461 -0
  270. package/src/server/ssl.js +120 -0
  271. package/src/server.js +25 -0
  272. package/src/ws/IoInterface.js +45 -0
  273. package/src/ws/IoServer.js +39 -0
  274. package/src/ws/core/channels/core.ws.chat.js +23 -0
  275. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  276. package/src/ws/core/channels/core.ws.stream.js +31 -0
  277. package/src/ws/core/core.ws.connection.js +28 -0
  278. package/src/ws/core/core.ws.emit.js +14 -0
  279. package/src/ws/core/core.ws.server.js +24 -0
  280. package/src/ws/core/management/core.ws.chat.js +8 -0
  281. package/src/ws/core/management/core.ws.mailer.js +16 -0
  282. package/src/ws/core/management/core.ws.stream.js +8 -0
  283. package/src/ws/default/channels/default.ws.main.js +16 -0
  284. package/src/ws/default/default.ws.connection.js +22 -0
  285. package/src/ws/default/default.ws.emit.js +14 -0
  286. package/src/ws/default/default.ws.server.js +20 -0
  287. package/src/ws/default/management/default.ws.main.js +8 -0
  288. package/startup.js +11 -0
  289. package/supervisord-openssh-server.conf +5 -0
  290. package/test/api.test.js +60 -0
@@ -0,0 +1,699 @@
1
+ import { getApiBaseUrl } from '../../services/core/core.service.js';
2
+ import { DocumentService } from '../../services/document/document.service.js';
3
+ import { FileService } from '../../services/file/file.service.js';
4
+ import { AgGrid } from './AgGrid.js';
5
+ import { Auth } from './Auth.js';
6
+ import { BtnIcon } from './BtnIcon.js';
7
+ import { getSubpaths, timer, uniqueArray } from './CommonJs.js';
8
+ import { Content } from './Content.js';
9
+ import { darkTheme, renderCssAttr } from './Css.js';
10
+ import { EventsUI } from './EventsUI.js';
11
+ import { fileFormDataFactory, Input, InputFile } from './Input.js';
12
+ import { loggerFactory } from './Logger.js';
13
+ import { Modal } from './Modal.js';
14
+ import { NotificationManager } from './NotificationManager.js';
15
+ import { RouterEvents } from './Router.js';
16
+ import { Translate } from './Translate.js';
17
+ import { Validator } from './Validator.js';
18
+ import { copyData, downloadFile, getProxyPath, getQueryParams, s, setPath } from './VanillaJs.js';
19
+
20
+ const logger = loggerFactory(import.meta);
21
+
22
+ class LoadFolderRenderer {
23
+ eGui;
24
+
25
+ async init(params) {
26
+ console.log('LoadFolderRenderer created', params);
27
+ // params.data._id
28
+
29
+ this.eGui = document.createElement('div');
30
+ this.eGui.innerHTML = html`<i class="fas fa-folder"></i> ${params.data.location}`;
31
+ }
32
+
33
+ getGui() {
34
+ return this.eGui;
35
+ }
36
+
37
+ refresh(params) {
38
+ console.log('LoadFolderRenderer refreshed', params);
39
+ return true;
40
+ }
41
+ }
42
+
43
+ class LoadFileNameRenderer {
44
+ eGui;
45
+
46
+ async init(params) {
47
+ console.log('LoadFileNameRenderer created', params);
48
+ // params.data._id
49
+
50
+ this.eGui = document.createElement('div');
51
+ this.eGui.innerHTML = html`<i class="fas fa-file"></i> ${params.data.name}`;
52
+ }
53
+
54
+ getGui() {
55
+ return this.eGui;
56
+ }
57
+
58
+ refresh(params) {
59
+ console.log('LoadFileNameRenderer refreshed', params);
60
+ return true;
61
+ }
62
+ }
63
+
64
+ class FolderHeaderComp {
65
+ eGui;
66
+
67
+ async init(params) {
68
+ console.log('FolderHeaderComp created', params);
69
+ // params.data._id
70
+
71
+ this.eGui = document.createElement('div');
72
+ this.eGui.innerHTML = html`<i class="fas fa-file"></i>`;
73
+ }
74
+
75
+ getGui() {
76
+ return this.eGui;
77
+ }
78
+
79
+ refresh(params) {
80
+ console.log('FolderHeaderComp refreshed', params);
81
+ return true;
82
+ }
83
+ }
84
+
85
+ const FileExplorer = {
86
+ Api: {},
87
+ Render: async function (options = { idModal: '' }) {
88
+ const { idModal } = options;
89
+ FileExplorer.Api[idModal] = options;
90
+ const gridFolderId = 'folder-explorer-grid';
91
+ const gridFileId = 'file-explorer-grid';
92
+ const idDropFileInput = 'file-explorer';
93
+ let formBodyFiles;
94
+ const query = getQueryParams();
95
+ let location = query?.location ? this.locationFormat({ f: query }) : '/';
96
+ let files, folders, documentId, documentInstance;
97
+ const cleanData = () => {
98
+ files = [];
99
+ folders = [];
100
+ documentId = '';
101
+ documentInstance = [];
102
+ };
103
+ cleanData();
104
+ FileExplorer.Api[idModal].displayList = async () => {
105
+ if (!s(`.${idModal}`)) return;
106
+ const query = getQueryParams();
107
+ location = query?.location ? this.locationFormat({ f: query }) : '/';
108
+ s(`.file-explorer-query-nav`).value = location;
109
+ const format = this.documentDataFormat({ document: documentInstance, location });
110
+ files = format.files;
111
+ folders = format.folders;
112
+ AgGrid.grids[gridFileId].setGridOption('rowData', files);
113
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
114
+ };
115
+ FileExplorer.Api[idModal].updateData = async (optionsUpdate = { display: false }) => {
116
+ if (!s(`.${idModal}`)) return;
117
+ if (Auth.getToken()) {
118
+ try {
119
+ const { status, data: document } = await DocumentService.get();
120
+ const format = this.documentDataFormat({ document, location });
121
+ files = format.files;
122
+ documentId = format.documentId;
123
+ folders = format.folders;
124
+ documentInstance = document;
125
+ } catch (error) {
126
+ logger.error(error);
127
+ NotificationManager.Push({
128
+ html: error.message,
129
+ status: 'error',
130
+ });
131
+ }
132
+ } else cleanData();
133
+ setTimeout(async () => {
134
+ if (s(`.${idModal}`) && optionsUpdate && optionsUpdate.display) await FileExplorer.Api[idModal].displayList();
135
+ });
136
+ };
137
+
138
+ RouterEvents['file-explorer'] = ({ path, pushPath, route }) => {
139
+ if (route === 'cloud')
140
+ setTimeout(async () => {
141
+ // await this.Api[idModal].updateData();
142
+ await FileExplorer.Api[idModal].displayList();
143
+ });
144
+ };
145
+
146
+ setTimeout(async () => {
147
+ FileExplorer.Api[idModal].updateData({ display: true });
148
+ const formData = [
149
+ {
150
+ model: 'location',
151
+ id: `file-explorer-query-nav`,
152
+ rules: [], // { type: 'isEmpty' }
153
+ },
154
+ ];
155
+ const validators = await Validator.instance(formData);
156
+
157
+ EventsUI.onClick(`.btn-input-file-explorer`, async (e) => {
158
+ e.preventDefault();
159
+ const { errorMessage } = await validators();
160
+ if (!formBodyFiles)
161
+ return NotificationManager.Push({
162
+ html: Translate.Render(`warning-upload-no-selects-file`),
163
+ status: 'warning',
164
+ });
165
+ if (errorMessage) return;
166
+ let fileData;
167
+ {
168
+ const { status, data } = await FileService.post({ body: formBodyFiles });
169
+ fileData = data;
170
+ }
171
+ {
172
+ // const body = {};
173
+ // for (const inputData of formData) {
174
+ // if ('model' in inputData) body[inputData.model] = s(`.${inputData.id}`).value;
175
+ // }
176
+ location = this.locationFormat({ f: { location: s(`.file-explorer-query-nav`).value } });
177
+ let status = 'success';
178
+ for (const file of fileData) {
179
+ const result = await DocumentService.post({
180
+ body: {
181
+ fileId: file._id,
182
+ location,
183
+ title: file.name,
184
+ },
185
+ });
186
+ if (result.status === 'success') documentInstance.push({ ...result.data, fileId: file });
187
+ else if (status !== 'error') status = 'error';
188
+ }
189
+ const format = this.documentDataFormat({ document: documentInstance, location });
190
+ files = format.files;
191
+ folders = format.folders;
192
+ AgGrid.grids[gridFileId].setGridOption('rowData', files);
193
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
194
+ NotificationManager.Push({
195
+ html: Translate.Render(`${status}-upload-file`),
196
+ status,
197
+ });
198
+ if (status === 'success') {
199
+ s(`.btn-input-home-directory`).click();
200
+ s(`.btn-clear-input-file-${idDropFileInput}`).click();
201
+ }
202
+ }
203
+ });
204
+
205
+ EventsUI.onClick(`.btn-input-go-explorer`, async (e) => {
206
+ e.preventDefault();
207
+ const newLocation = this.locationFormat({ f: { location: s(`.file-explorer-query-nav`).value } });
208
+ if (newLocation === location) return;
209
+ location = newLocation;
210
+ setPath(`${window.location.pathname}?location=${location}`);
211
+ s(`.file-explorer-query-nav`).value = location;
212
+ // const format = this.documentDataFormat({ document: documentInstance, location });
213
+ await FileExplorer.Api[idModal].updateData({ display: true });
214
+ });
215
+ EventsUI.onClick(`.btn-input-home-directory`, async (e) => {
216
+ e.preventDefault();
217
+ let newLocation = '/';
218
+ if (s(`.file-explorer-uploader`).style.display !== 'none') {
219
+ s(`.file-explorer-uploader`).style.display = 'none';
220
+ s(`.file-explorer-nav`).style.display = 'block';
221
+ } else if (newLocation === location) return;
222
+ else location = newLocation;
223
+ setPath(`${window.location.pathname}?location=${location}`);
224
+ s(`.file-explorer-query-nav`).value = location;
225
+ const format = this.documentDataFormat({ document: documentInstance, location });
226
+ files = format.files;
227
+ folders = format.folders;
228
+ AgGrid.grids[gridFileId].setGridOption('rowData', files);
229
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
230
+ });
231
+ EventsUI.onClick(`.btn-input-copy-directory`, async (e) => {
232
+ e.preventDefault();
233
+ await copyData(window.location.href);
234
+ NotificationManager.Push({
235
+ html: Translate.Render('success-copy-data'),
236
+ status: 'success',
237
+ });
238
+ });
239
+ EventsUI.onClick(`.btn-input-back-explorer`, async (e) => {
240
+ e.preventDefault();
241
+ window.history.back();
242
+ });
243
+ EventsUI.onClick(`.btn-input-forward-explorer`, async (e) => {
244
+ e.preventDefault();
245
+ window.history.forward();
246
+ });
247
+ EventsUI.onClick(`.btn-input-upload-file`, async (e) => {
248
+ e.preventDefault();
249
+ s(`.file-explorer-nav`).style.display = 'none';
250
+ s(`.file-explorer-uploader`).style.display = 'block';
251
+ });
252
+ });
253
+
254
+ class LoadFileActionsRenderer {
255
+ eGui;
256
+
257
+ async init(params) {
258
+ console.log('LoadFileActionsRenderer created', params);
259
+ // params.data._id
260
+
261
+ this.eGui = document.createElement('div');
262
+ this.eGui.innerHTML = html`
263
+ <div class="fl">
264
+ ${await BtnIcon.Render({
265
+ class: `in fll management-table-btn-mini btn-file-download-${params.data._id}`,
266
+ label: html` <i class="fas fa-download"></i>`,
267
+ type: 'button',
268
+ })}
269
+ ${await BtnIcon.Render({
270
+ class: `in fll management-table-btn-mini btn-file-delete-${params.data._id}`,
271
+ label: html` <i class="fa-solid fa-circle-xmark"></i>`,
272
+ type: 'button',
273
+ })}
274
+ ${await BtnIcon.Render({
275
+ class: `in fll management-table-btn-mini btn-file-view-${params.data._id}`,
276
+ label: html` <i class="fas fa-eye"></i>`,
277
+ type: 'button',
278
+ })}
279
+ ${await BtnIcon.Render({
280
+ class: `in fll management-table-btn-mini btn-file-copy-content-link-${params.data._id}`,
281
+ label: html`<i class="fas fa-copy"></i>`,
282
+ type: 'button',
283
+ })}
284
+ </div>
285
+ `;
286
+
287
+ setTimeout(() => {
288
+ const uri = `${getProxyPath()}content/?cid=${params.data._id}`;
289
+ const url = `${window.location.origin}${uri}`;
290
+
291
+ const originObj = documentInstance.find((d) => d._id === params.data._id);
292
+ const blobUri = originObj ? getApiBaseUrl({ id: originObj.fileId._id, endpoint: 'file/blob' }) : undefined;
293
+
294
+ if (!originObj) {
295
+ s(`.btn-file-view-${params.data._id}`).classList.add('hide');
296
+ s(`.btn-file-copy-content-link-${params.data._id}`).classList.add('hide');
297
+ }
298
+
299
+ EventsUI.onClick(`.btn-file-view-${params.data._id}`, async (e) => {
300
+ e.preventDefault();
301
+ if (location.href !== url) {
302
+ setPath(uri);
303
+ s(`.main-btn-content`).click();
304
+ }
305
+ });
306
+
307
+ EventsUI.onClick(`.btn-file-copy-content-link-${params.data._id}`, async (e) => {
308
+ e.preventDefault();
309
+ await copyData(blobUri);
310
+ NotificationManager.Push({
311
+ html: Translate.Render('success-copy-data'),
312
+ status: 'success',
313
+ });
314
+ });
315
+
316
+ EventsUI.onClick(`.btn-file-download-${params.data._id}`, async (e) => {
317
+ e.preventDefault();
318
+ console.log(params);
319
+ const {
320
+ data: [file],
321
+ status,
322
+ } = await FileService.get({ id: params.data.fileId });
323
+
324
+ downloadFile(new Blob([new Uint8Array(file.data.data)], { type: params.data.mimetype }), params.data.name);
325
+ });
326
+ EventsUI.onClick(`.btn-file-delete-${params.data._id}`, async (e) => {
327
+ e.preventDefault();
328
+ {
329
+ const confirmResult = await Modal.RenderConfirm({
330
+ html: async () => {
331
+ return html`
332
+ <div class="in section-mp" style="text-align: center">
333
+ ${Translate.Render('confirm-delete-item')}
334
+ <br />
335
+ "${params.data.title}"
336
+ </div>
337
+ `;
338
+ },
339
+ id: `delete-${params.data._id}`,
340
+ });
341
+ if (confirmResult.status !== 'confirm') return;
342
+
343
+ const { data, status, message } = await FileService.delete({
344
+ id: params.data.fileId,
345
+ });
346
+ NotificationManager.Push({
347
+ html: status,
348
+ status,
349
+ });
350
+ if (status === 'error') return;
351
+ }
352
+ const { data, status, message } = await DocumentService.delete({
353
+ id: params.data._id,
354
+ });
355
+ NotificationManager.Push({
356
+ html: status,
357
+ status,
358
+ });
359
+ if (status === 'error') return;
360
+
361
+ documentInstance = documentInstance.filter((f) => f._id !== params.data._id);
362
+ const format = FileExplorer.documentDataFormat({ document: documentInstance, location });
363
+ files = format.files;
364
+ folders = format.folders;
365
+ // AgGrid.grids[gridFileId].setGridOption('rowData', files);
366
+ // const selectedData = gridApi.getSelectedRows();
367
+ AgGrid.grids[gridFileId].applyTransaction({ remove: [params.data] });
368
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
369
+ });
370
+ });
371
+ }
372
+
373
+ getGui() {
374
+ return this.eGui;
375
+ }
376
+
377
+ refresh(params) {
378
+ console.log('LoadFileActionsRenderer refreshed', params);
379
+ return true;
380
+ }
381
+ }
382
+
383
+ class LoadFolderActionsRenderer {
384
+ eGui;
385
+
386
+ async init(params) {
387
+ console.log('LoadFolderActionsRenderer created', params);
388
+ // params.data._id
389
+ const id = params.data.locationId;
390
+
391
+ this.eGui = document.createElement('div');
392
+ this.eGui.innerHTML = html`
393
+ <div class="fl">
394
+ ${await BtnIcon.Render({
395
+ class: `in fll management-table-btn-mini btn-folder-delete-${id}`,
396
+ label: html` <i class="fa-solid fa-circle-xmark"></i>`,
397
+ type: 'button',
398
+ })}
399
+ </div>
400
+ `;
401
+
402
+ setTimeout(() => {
403
+ EventsUI.onClick(`.btn-folder-delete-${id}`, async (e) => {
404
+ const confirmResult = await Modal.RenderConfirm({
405
+ html: async () => {
406
+ return html`
407
+ <div class="in section-mp" style="text-align: center">
408
+ ${Translate.Render('confirm-delete-item')}
409
+ <br />
410
+ "${params.data.location}"
411
+ </div>
412
+ `;
413
+ },
414
+ id: `delete-${id}`,
415
+ });
416
+ if (confirmResult.status !== 'confirm') return;
417
+
418
+ e.preventDefault();
419
+ const idFilesDelete = [];
420
+ for (const file of documentInstance.filter(
421
+ (f) => FileExplorer.locationFormat({ f }) === params.data.location, // .startsWith(params.data.location),
422
+ )) {
423
+ {
424
+ const { data, status, message } = await FileService.delete({
425
+ id: file.fileId._id,
426
+ });
427
+ }
428
+ {
429
+ idFilesDelete.push(file._id);
430
+ const { data, status, message } = await DocumentService.delete({
431
+ id: file._id,
432
+ });
433
+ }
434
+ }
435
+ NotificationManager.Push({
436
+ html: Translate.Render('success-delete'),
437
+ status: 'success',
438
+ });
439
+ documentInstance = documentInstance.filter((f) => !idFilesDelete.includes(f._id));
440
+ const format = FileExplorer.documentDataFormat({ document: documentInstance, location });
441
+ files = format.files;
442
+ folders = format.folders;
443
+ AgGrid.grids[gridFileId].setGridOption('rowData', files);
444
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
445
+ });
446
+ });
447
+ }
448
+
449
+ getGui() {
450
+ return this.eGui;
451
+ }
452
+
453
+ refresh(params) {
454
+ console.log('LoadFolderActionsRenderer refreshed', params);
455
+ return true;
456
+ }
457
+ }
458
+
459
+ return html`
460
+ <form>
461
+ <div class="fl">
462
+ ${await BtnIcon.Render({
463
+ class: 'in fll management-table-btn-mini btn-input-home-directory',
464
+ label: html`<i class="fas fa-home"></i>
465
+ <!-- ${Translate.Render('home-directory')} -->`,
466
+ type: 'button',
467
+ })}
468
+ ${await BtnIcon.Render({
469
+ class: 'in fll management-table-btn-mini btn-input-back-explorer',
470
+ label: html` <i class="fa-solid fa-circle-left"></i>
471
+ <!-- ${Translate.Render('go')} -->`,
472
+ type: 'button',
473
+ })}
474
+ ${await BtnIcon.Render({
475
+ class: 'in fll management-table-btn-mini btn-input-forward-explorer',
476
+ label: html` <i class="fa-solid fa-circle-right"></i>
477
+ <!-- ${Translate.Render('go')} -->`,
478
+ type: 'button',
479
+ })}
480
+ ${await BtnIcon.Render({
481
+ class: 'in fll management-table-btn-mini btn-input-go-explorer',
482
+ label: html`<i class="fas fa-sync-alt"></i>
483
+ <!-- ${Translate.Render('go')} -->`,
484
+ type: 'submit',
485
+ })}
486
+ ${await BtnIcon.Render({
487
+ class: 'in fll management-table-btn-mini btn-input-copy-directory',
488
+ label: html`<i class="fas fa-copy"></i>
489
+ <!-- ${Translate.Render('home-directory')} -->`,
490
+ type: 'button',
491
+ })}
492
+ ${await BtnIcon.Render({
493
+ class: 'in fll management-table-btn-mini btn-input-upload-file',
494
+ label: html`<i class="fa-solid fa-cloud-arrow-up"></i>
495
+ <!-- ${Translate.Render('home-directory')} -->`,
496
+ type: 'button',
497
+ })}
498
+ </div>
499
+ <div class="in">
500
+ ${await Input.Render({
501
+ id: `file-explorer-query-nav`,
502
+ type: 'text',
503
+ label: html`<i class="fab fa-wpexplorer"></i> ${Translate.Render('current-path')}`,
504
+ containerClass: 'in section-mp input-container-width',
505
+ placeholder: true,
506
+ value: location,
507
+ })}
508
+ </div>
509
+ </form>
510
+ <div class="fl file-explorer-nav">
511
+ <div class="in fll explorer-file-col">
512
+ <div class="in explorer-file-sub-col section-mp">
513
+ <div class="in">
514
+ ${await AgGrid.Render({
515
+ id: gridFolderId,
516
+ darkTheme,
517
+ // style: {
518
+ // height: '200px',
519
+ // },
520
+ gridOptions: {
521
+ defaultColDef: {
522
+ editable: false,
523
+ minWidth: 100,
524
+ filter: true,
525
+ autoHeight: true,
526
+ },
527
+ rowData: folders,
528
+ columnDefs: [
529
+ {
530
+ field: 'location',
531
+ headerName: 'Folder',
532
+ minWidth: 200,
533
+ flex: 1,
534
+ cellStyle: function (params) {
535
+ return { cursor: 'pointer' };
536
+ },
537
+ cellRenderer: LoadFolderRenderer,
538
+ onCellClicked: (event) => {
539
+ // console.warn('onCellClicked', event);
540
+ const newLocation = event.data.location;
541
+ if (newLocation === location) return;
542
+ location = newLocation;
543
+ setPath(`${window.location.pathname}?location=${location}`);
544
+ s(`.file-explorer-query-nav`).value = location;
545
+ const format = this.documentDataFormat({ document: documentInstance, location });
546
+ files = format.files;
547
+ folders = format.folders;
548
+ AgGrid.grids[gridFileId].setGridOption('rowData', files);
549
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
550
+ },
551
+ },
552
+ {
553
+ // suppressHeaderMenuButton: true,
554
+ // sortable: false,
555
+ field: 'fileCount',
556
+ headerName: '🗎',
557
+ width: 60,
558
+ cellStyle: function (params) {
559
+ return { cursor: 'pointer' };
560
+ },
561
+ // headerComponent: FolderHeaderComp,
562
+ // headerComponentParams: {
563
+ // menuIcon: 'fa-bars',
564
+ // template: `test`,
565
+ // },
566
+ },
567
+ { headerName: '', width: 60, cellRenderer: LoadFolderActionsRenderer },
568
+ ],
569
+ rowSelection: 'single',
570
+ onSelectionChanged: (event) => {
571
+ return;
572
+ const selectedRows = AgGrid.grids[gridFolderId].getSelectedRows();
573
+ console.log('selectedRows', { event, selectedRows });
574
+ if (selectedRows[0]) {
575
+ const newLocation = selectedRows[0].location;
576
+ if (newLocation === location) return;
577
+ location = newLocation;
578
+ setPath(`${window.location.pathname}?location=${location}`);
579
+ s(`.file-explorer-query-nav`).value = location;
580
+ const format = this.documentDataFormat({ document: documentInstance, location });
581
+ files = format.files;
582
+ folders = format.folders;
583
+ AgGrid.grids[gridFileId].setGridOption('rowData', files);
584
+ AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
585
+ }
586
+ },
587
+ },
588
+ })}
589
+ </div>
590
+ </div>
591
+ </div>
592
+ <div class="in fll explorer-file-col">
593
+ <div class="in explorer-file-sub-col section-mp">
594
+ <div class="in">
595
+ ${await AgGrid.Render({
596
+ id: gridFileId,
597
+ darkTheme,
598
+ // style: {
599
+ // height: '200px',
600
+ // },
601
+ gridOptions: {
602
+ defaultColDef: {
603
+ editable: false,
604
+ minWidth: 100,
605
+ filter: true,
606
+ autoHeight: true,
607
+ },
608
+ // rowData: files,
609
+ rowData: undefined,
610
+ columnDefs: [
611
+ { field: 'name', flex: 2, headerName: 'Name', cellRenderer: LoadFileNameRenderer },
612
+ { field: 'mimetype', flex: 1, headerName: 'Type' },
613
+ { headerName: '', width: 80, cellRenderer: LoadFileActionsRenderer },
614
+ ],
615
+ },
616
+ })}
617
+ </div>
618
+ </div>
619
+ </div>
620
+ </div>
621
+ <form class="file-explorer-uploader" style="display: none">
622
+ ${await InputFile.Render(
623
+ {
624
+ id: idDropFileInput,
625
+ multiple: true,
626
+ },
627
+ {
628
+ clear: () => {
629
+ console.log('file explorer clear file');
630
+ formBodyFiles = undefined;
631
+ },
632
+ change: (e) => {
633
+ console.log('file explorer change file', e);
634
+ formBodyFiles = fileFormDataFactory(e);
635
+ },
636
+ },
637
+ )}
638
+ <div class="in">
639
+ ${await BtnIcon.Render({
640
+ class: 'wfa section-mp btn-input-file-explorer',
641
+ style: renderCssAttr({
642
+ style: {
643
+ 'font-size': '25px',
644
+ 'text-align': 'center',
645
+ padding: '20px',
646
+ },
647
+ }),
648
+ label: html`<i class="fa-solid fa-cloud-arrow-up"></i> ${Translate.Render('upload')}`,
649
+ type: 'submit',
650
+ })}
651
+ </div>
652
+ </form>
653
+ `;
654
+ },
655
+ locationFormat: function ({ f }) {
656
+ if (f.location[0] !== '/') f.location = `/${f.location}`;
657
+ if (f.location !== '/' && f.location[f.location.length - 1] === '/') f.location = f.location.slice(0, -1);
658
+ return f.location;
659
+ },
660
+ documentDataFormat: function ({ document, location }) {
661
+ let files = document.map((f) => {
662
+ if (!f.fileId)
663
+ f.fileId = {
664
+ name: f.title + '.md',
665
+ mimetype: 'text/markdown',
666
+ _id: f.mdFileId,
667
+ };
668
+ return {
669
+ location: this.locationFormat({ f }),
670
+ name: f.fileId.name,
671
+ mimetype: f.fileId.mimetype,
672
+ fileId: f.fileId._id,
673
+ _id: f._id,
674
+ title: f.title,
675
+ };
676
+ });
677
+ let documentId = document._id;
678
+ let folders = [];
679
+ for (const folderPath of uniqueArray(files.map((f) => f.location)))
680
+ folders = ['/'].concat(folders.concat(getSubpaths(folderPath)));
681
+ folders = uniqueArray(folders).map((f, i) => {
682
+ return {
683
+ location: f,
684
+ locationId: `loc-${i}`,
685
+ };
686
+ });
687
+ files = files.filter((f) => f.location === location);
688
+ folders = folders
689
+ .filter((f) => f.location.startsWith(location))
690
+ .map((f) => {
691
+ f.fileCount = document.filter((file) => file.location === f.location).length;
692
+ return f;
693
+ })
694
+ .filter((f) => f.fileCount > 0);
695
+ return { files, documentId, folders };
696
+ },
697
+ };
698
+
699
+ export { FileExplorer };