@underpostnet/underpost 2.7.9

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 (297) 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 +115 -0
  6. package/.github/workflows/publish.yml +84 -0
  7. package/.github/workflows/pwa-microservices-template.page.yml +54 -0
  8. package/.github/workflows/pwa-microservices-template.test.yml +30 -0
  9. package/.nycrc +9 -0
  10. package/.prettierignore +13 -0
  11. package/.prettierrc +9 -0
  12. package/.vscode/extensions.json +72 -0
  13. package/.vscode/settings.json +106 -0
  14. package/AUTHORS.md +10 -0
  15. package/CHANGELOG.md +85 -0
  16. package/Dockerfile +90 -0
  17. package/LICENSE +21 -0
  18. package/README.md +96 -0
  19. package/bin/cron.js +47 -0
  20. package/bin/db.js +180 -0
  21. package/bin/deploy.js +859 -0
  22. package/bin/file.js +109 -0
  23. package/bin/index.js +82 -0
  24. package/bin/ssl.js +55 -0
  25. package/bin/util.js +204 -0
  26. package/bin/vs.js +35 -0
  27. package/conf.js +265 -0
  28. package/docker-compose.yml +67 -0
  29. package/jsconfig.json +7 -0
  30. package/jsdoc.json +32 -0
  31. package/nodemon.json +6 -0
  32. package/package.json +134 -0
  33. package/prometheus.yml +36 -0
  34. package/src/api/core/core.controller.js +69 -0
  35. package/src/api/core/core.model.js +11 -0
  36. package/src/api/core/core.router.js +23 -0
  37. package/src/api/core/core.service.js +31 -0
  38. package/src/api/crypto/crypto.controller.js +51 -0
  39. package/src/api/crypto/crypto.model.js +23 -0
  40. package/src/api/crypto/crypto.router.js +20 -0
  41. package/src/api/crypto/crypto.service.js +64 -0
  42. package/src/api/default/default.controller.js +69 -0
  43. package/src/api/default/default.model.js +20 -0
  44. package/src/api/default/default.router.js +23 -0
  45. package/src/api/default/default.service.js +31 -0
  46. package/src/api/file/file.controller.js +53 -0
  47. package/src/api/file/file.model.js +19 -0
  48. package/src/api/file/file.router.js +21 -0
  49. package/src/api/file/file.service.js +80 -0
  50. package/src/api/instance/instance.controller.js +69 -0
  51. package/src/api/instance/instance.model.js +36 -0
  52. package/src/api/instance/instance.router.js +33 -0
  53. package/src/api/instance/instance.service.js +48 -0
  54. package/src/api/test/test.controller.js +59 -0
  55. package/src/api/test/test.model.js +14 -0
  56. package/src/api/test/test.router.js +21 -0
  57. package/src/api/test/test.service.js +35 -0
  58. package/src/api/user/user.build.js +16 -0
  59. package/src/api/user/user.controller.js +70 -0
  60. package/src/api/user/user.model.js +65 -0
  61. package/src/api/user/user.router.js +345 -0
  62. package/src/api/user/user.service.js +479 -0
  63. package/src/api.js +23 -0
  64. package/src/client/Default.index.js +40 -0
  65. package/src/client/components/core/Account.js +290 -0
  66. package/src/client/components/core/AgGrid.js +160 -0
  67. package/src/client/components/core/Auth.js +19 -0
  68. package/src/client/components/core/Badge.js +32 -0
  69. package/src/client/components/core/Blockchain.js +41 -0
  70. package/src/client/components/core/Blog.js +9 -0
  71. package/src/client/components/core/BtnIcon.js +101 -0
  72. package/src/client/components/core/CalendarCore.js +458 -0
  73. package/src/client/components/core/Chat.js +64 -0
  74. package/src/client/components/core/ColorPalette.js +5267 -0
  75. package/src/client/components/core/CommonJs.js +742 -0
  76. package/src/client/components/core/Content.js +193 -0
  77. package/src/client/components/core/Css.js +846 -0
  78. package/src/client/components/core/CssCore.js +844 -0
  79. package/src/client/components/core/D3Chart.js +44 -0
  80. package/src/client/components/core/Docs.js +331 -0
  81. package/src/client/components/core/DropDown.js +164 -0
  82. package/src/client/components/core/EventsUI.js +46 -0
  83. package/src/client/components/core/FileExplorer.js +699 -0
  84. package/src/client/components/core/FullScreen.js +45 -0
  85. package/src/client/components/core/Input.js +346 -0
  86. package/src/client/components/core/JoyStick.js +77 -0
  87. package/src/client/components/core/Keyboard.js +73 -0
  88. package/src/client/components/core/LoadingAnimation.js +178 -0
  89. package/src/client/components/core/LogIn.js +187 -0
  90. package/src/client/components/core/LogOut.js +58 -0
  91. package/src/client/components/core/Logger.js +26 -0
  92. package/src/client/components/core/Modal.js +1814 -0
  93. package/src/client/components/core/NotificationManager.js +84 -0
  94. package/src/client/components/core/Panel.js +613 -0
  95. package/src/client/components/core/PanelForm.js +469 -0
  96. package/src/client/components/core/Polyhedron.js +162 -0
  97. package/src/client/components/core/Recover.js +204 -0
  98. package/src/client/components/core/Responsive.js +68 -0
  99. package/src/client/components/core/RichText.js +53 -0
  100. package/src/client/components/core/Router.js +76 -0
  101. package/src/client/components/core/Scroll.js +34 -0
  102. package/src/client/components/core/SignUp.js +125 -0
  103. package/src/client/components/core/SocketIo.js +72 -0
  104. package/src/client/components/core/Stream.js +113 -0
  105. package/src/client/components/core/ToggleSwitch.js +87 -0
  106. package/src/client/components/core/ToolTip.js +26 -0
  107. package/src/client/components/core/Translate.js +446 -0
  108. package/src/client/components/core/Validator.js +100 -0
  109. package/src/client/components/core/VanillaJs.js +463 -0
  110. package/src/client/components/core/Wallet.js +106 -0
  111. package/src/client/components/core/WebComponent.js +44 -0
  112. package/src/client/components/core/Webhook.js +25 -0
  113. package/src/client/components/core/Worker.js +280 -0
  114. package/src/client/components/default/CommonDefault.js +29 -0
  115. package/src/client/components/default/CssDefault.js +13 -0
  116. package/src/client/components/default/ElementsDefault.js +38 -0
  117. package/src/client/components/default/LogInDefault.js +41 -0
  118. package/src/client/components/default/LogOutDefault.js +28 -0
  119. package/src/client/components/default/MenuDefault.js +389 -0
  120. package/src/client/components/default/RoutesDefault.js +48 -0
  121. package/src/client/components/default/SettingsDefault.js +16 -0
  122. package/src/client/components/default/SignUpDefault.js +9 -0
  123. package/src/client/components/default/SocketIoDefault.js +54 -0
  124. package/src/client/components/default/TranslateDefault.js +7 -0
  125. package/src/client/public/default/android-chrome-144x144.png +0 -0
  126. package/src/client/public/default/android-chrome-192x192.png +0 -0
  127. package/src/client/public/default/android-chrome-256x256.png +0 -0
  128. package/src/client/public/default/android-chrome-36x36.png +0 -0
  129. package/src/client/public/default/android-chrome-384x384.png +0 -0
  130. package/src/client/public/default/android-chrome-48x48.png +0 -0
  131. package/src/client/public/default/android-chrome-512x512.png +0 -0
  132. package/src/client/public/default/android-chrome-72x72.png +0 -0
  133. package/src/client/public/default/android-chrome-96x96.png +0 -0
  134. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  135. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  136. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  137. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  138. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  139. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  140. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  141. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  142. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  143. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  144. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  145. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  146. package/src/client/public/default/apple-touch-icon.png +0 -0
  147. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  148. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  149. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  150. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  151. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  152. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  153. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  154. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  155. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  156. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  157. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  158. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  159. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  160. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  161. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  162. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  163. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  164. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  165. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  166. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  167. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  168. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  169. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  170. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  171. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  172. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  173. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  174. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  175. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  176. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  177. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  178. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  179. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  180. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  181. package/src/client/public/default/assets/background/white.jpg +0 -0
  182. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  183. package/src/client/public/default/assets/background/white0.jpg +0 -0
  184. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  185. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  186. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  187. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  188. package/src/client/public/default/browserconfig.xml +12 -0
  189. package/src/client/public/default/favicon-16x16.png +0 -0
  190. package/src/client/public/default/favicon-32x32.png +0 -0
  191. package/src/client/public/default/favicon-48x48.png +0 -0
  192. package/src/client/public/default/favicon.ico +0 -0
  193. package/src/client/public/default/manifest.webmanifest +69 -0
  194. package/src/client/public/default/mstile-144x144.png +0 -0
  195. package/src/client/public/default/mstile-150x150.png +0 -0
  196. package/src/client/public/default/mstile-310x150.png +0 -0
  197. package/src/client/public/default/mstile-310x310.png +0 -0
  198. package/src/client/public/default/mstile-70x70.png +0 -0
  199. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  200. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  201. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  202. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  203. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  204. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  205. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  206. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  207. package/src/client/public/default/site.webmanifest +69 -0
  208. package/src/client/public/default/sitemap +148 -0
  209. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  210. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  211. package/src/client/public/doc/favicon.ico +0 -0
  212. package/src/client/public/doc/sitemap +148 -0
  213. package/src/client/public/test/favicon.ico +0 -0
  214. package/src/client/public/test/sitemap +148 -0
  215. package/src/client/services/core/core.service.js +170 -0
  216. package/src/client/services/crypto/crypto.service.js +70 -0
  217. package/src/client/services/default/default.management.js +343 -0
  218. package/src/client/services/default/default.service.js +89 -0
  219. package/src/client/services/file/file.service.js +70 -0
  220. package/src/client/services/instance/instance.management.js +74 -0
  221. package/src/client/services/instance/instance.service.js +89 -0
  222. package/src/client/services/test/test.service.js +70 -0
  223. package/src/client/services/user/user.management.js +50 -0
  224. package/src/client/services/user/user.service.js +89 -0
  225. package/src/client/ssr/Render.js +237 -0
  226. package/src/client/ssr/common/Alert.js +75 -0
  227. package/src/client/ssr/common/SsrCore.js +91 -0
  228. package/src/client/ssr/common/Translate.js +26 -0
  229. package/src/client/ssr/common/Worker.js +28 -0
  230. package/src/client/ssr/components/body/CacheControl.js +114 -0
  231. package/src/client/ssr/components/body/DefaultSplashScreen.js +90 -0
  232. package/src/client/ssr/components/email/DefaultRecoverEmail.js +21 -0
  233. package/src/client/ssr/components/email/DefaultVerifyEmail.js +17 -0
  234. package/src/client/ssr/components/head/Css.js +241 -0
  235. package/src/client/ssr/components/head/DefaultScripts.js +3 -0
  236. package/src/client/ssr/components/head/Production.js +1 -0
  237. package/src/client/ssr/components/head/Pwa.js +146 -0
  238. package/src/client/ssr/components/head/PwaDefault.js +60 -0
  239. package/src/client/ssr/components/head/Seo.js +14 -0
  240. package/src/client/ssr/pages/404.js +12 -0
  241. package/src/client/ssr/pages/500.js +12 -0
  242. package/src/client/ssr/pages/maintenance.js +14 -0
  243. package/src/client/ssr/pages/offline.js +21 -0
  244. package/src/client/sw/default.sw.js +205 -0
  245. package/src/client/sw/template.sw.js +84 -0
  246. package/src/client.build.js +22 -0
  247. package/src/client.dev.js +21 -0
  248. package/src/db/DataBaseProvider.js +45 -0
  249. package/src/db/mariadb/MariaDB.js +33 -0
  250. package/src/db/mongo/MongooseDB.js +124 -0
  251. package/src/dns.js +22 -0
  252. package/src/index.js +43 -0
  253. package/src/mailer/EmailRender.js +69 -0
  254. package/src/mailer/MailerProvider.js +96 -0
  255. package/src/proxy.js +22 -0
  256. package/src/runtime/lampp/Lampp.js +115 -0
  257. package/src/runtime/nginx/Nginx.js +3 -0
  258. package/src/runtime/xampp/Xampp.js +49 -0
  259. package/src/server/auth.js +235 -0
  260. package/src/server/backup.js +120 -0
  261. package/src/server/client-build-live.js +98 -0
  262. package/src/server/client-build.js +754 -0
  263. package/src/server/client-dev-server.js +60 -0
  264. package/src/server/client-formatted.js +58 -0
  265. package/src/server/client-icons.js +151 -0
  266. package/src/server/conf.js +929 -0
  267. package/src/server/crypto.js +91 -0
  268. package/src/server/dns.js +118 -0
  269. package/src/server/downloader.js +42 -0
  270. package/src/server/logger.js +190 -0
  271. package/src/server/network.js +209 -0
  272. package/src/server/peer.js +33 -0
  273. package/src/server/process.js +66 -0
  274. package/src/server/prompt-optimizer.js +28 -0
  275. package/src/server/proxy.js +118 -0
  276. package/src/server/runtime.js +463 -0
  277. package/src/server/ssl.js +120 -0
  278. package/src/server.js +25 -0
  279. package/src/ws/IoInterface.js +45 -0
  280. package/src/ws/IoServer.js +39 -0
  281. package/src/ws/core/channels/core.ws.chat.js +23 -0
  282. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  283. package/src/ws/core/channels/core.ws.stream.js +31 -0
  284. package/src/ws/core/core.ws.connection.js +28 -0
  285. package/src/ws/core/core.ws.emit.js +14 -0
  286. package/src/ws/core/core.ws.server.js +24 -0
  287. package/src/ws/core/management/core.ws.chat.js +8 -0
  288. package/src/ws/core/management/core.ws.mailer.js +16 -0
  289. package/src/ws/core/management/core.ws.stream.js +8 -0
  290. package/src/ws/default/channels/default.ws.main.js +16 -0
  291. package/src/ws/default/default.ws.connection.js +22 -0
  292. package/src/ws/default/default.ws.emit.js +14 -0
  293. package/src/ws/default/default.ws.server.js +20 -0
  294. package/src/ws/default/management/default.ws.main.js +8 -0
  295. package/startup.js +11 -0
  296. package/supervisord-openssh-server.conf +5 -0
  297. package/test/api.test.js +60 -0
@@ -0,0 +1,1814 @@
1
+ import { cap, getId, newInstance } from './CommonJs.js';
2
+ import { Draggable } from '@neodrag/vanilla';
3
+ import {
4
+ append,
5
+ s,
6
+ prepend,
7
+ setPath,
8
+ getProxyPath,
9
+ htmls,
10
+ sa,
11
+ getAllChildNodes,
12
+ getCurrentTrace,
13
+ isActiveElement,
14
+ } from './VanillaJs.js';
15
+ import { BtnIcon } from './BtnIcon.js';
16
+ import { Responsive } from './Responsive.js';
17
+ import { loggerFactory } from './Logger.js';
18
+ import {
19
+ Css,
20
+ ThemeEvents,
21
+ Themes,
22
+ ThemesScope,
23
+ darkTheme,
24
+ renderStyleTag,
25
+ renderStatus,
26
+ renderCssAttr,
27
+ } from './Css.js';
28
+ import { setDocTitle } from './Router.js';
29
+ import { NotificationManager } from './NotificationManager.js';
30
+ import { EventsUI } from './EventsUI.js';
31
+ import { Translate } from './Translate.js';
32
+ import { Input } from './Input.js';
33
+ import { Validator } from './Validator.js';
34
+ import { DropDown } from './DropDown.js';
35
+ import { Keyboard } from './Keyboard.js';
36
+ import { Badge } from './Badge.js';
37
+ import { Worker } from './Worker.js';
38
+
39
+ const logger = loggerFactory(import.meta);
40
+
41
+ const Modal = {
42
+ Data: {},
43
+ Render: async function (
44
+ options = {
45
+ id: '',
46
+ barConfig: {},
47
+ title: '',
48
+ html: '',
49
+ handleType: 'bar',
50
+ mode: '' /* slide-menu */,
51
+ RouterInstance: {},
52
+ disableTools: [],
53
+ },
54
+ ) {
55
+ if (options.heightBottomBar === undefined) options.heightBottomBar = 50;
56
+ if (options.heightTopBar === undefined) options.heightTopBar = 50;
57
+ let originHeightBottomBar = options.heightBottomBar ? newInstance(options.heightBottomBar) : 0;
58
+ let originHeightTopBar = options.heightTopBar ? newInstance(options.heightTopBar) : 0;
59
+ let width = 300;
60
+ let height = 400;
61
+ let top = 0;
62
+ let left = 0;
63
+ const topBottomBarEnable = options && options.barMode && options.barMode === 'top-bottom-bar';
64
+ if (!topBottomBarEnable) {
65
+ options.heightTopBar = options.heightTopBar + options.heightBottomBar;
66
+ options.heightBottomBar = 0;
67
+ }
68
+ const setCenterRestore = () => {
69
+ const ResponsiveData = Responsive.getResponsiveData();
70
+ top = `${ResponsiveData.height / 2 - height / 2}px`;
71
+ left = `${ResponsiveData.width / 2 - width / 2}px`;
72
+ };
73
+ setCenterRestore();
74
+ let transition = `opacity 0.3s, box-shadow 0.3s, bottom 0.3s`;
75
+ const originSlideMenuWidth = 320;
76
+ const collapseSlideMenuWidth = 50;
77
+ let slideMenuWidth = originSlideMenuWidth;
78
+ const minWidth = width;
79
+ const heightDefaultTopBar = 0;
80
+ const heightDefaultBottomBar = 0;
81
+ const idModal = options && 'id' in options ? options.id : getId(this.Data, 'modal-');
82
+ this.Data[idModal] = {
83
+ options,
84
+ onCloseListener: {},
85
+ onMenuListener: {},
86
+ onDragEndListener: {},
87
+ onObserverListener: {},
88
+ onClickListener: {},
89
+ onExpandUiListener: {},
90
+ query: options.query ? `${window.location.search}` : undefined,
91
+ };
92
+ if (options && 'mode' in options) {
93
+ this.Data[idModal][options.mode] = {};
94
+ switch (options.mode) {
95
+ case 'view':
96
+ if (options && options.slideMenu) s(`.btn-close-${options.slideMenu}`).click();
97
+ options.zIndexSync = true;
98
+
99
+ options.style = {
100
+ ...options.style,
101
+ 'min-width': `${minWidth}px`,
102
+ };
103
+
104
+ if (this.mobileModal()) {
105
+ options.barConfig.buttons.restore.disabled = true;
106
+ options.barConfig.buttons.minimize.disabled = true;
107
+ options.dragDisabled = true;
108
+ options.style.resize = 'none';
109
+ }
110
+
111
+ Responsive.Event[`view-${idModal}`] = () => {
112
+ if (!this.Data[idModal]) return delete Responsive.Event[`view-${idModal}`];
113
+ if (this.Data[idModal].slideMenu)
114
+ s(`.${idModal}`).style.height = `${
115
+ window.innerHeight -
116
+ (options.heightTopBar ? options.heightTopBar : heightDefaultTopBar) -
117
+ (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
118
+ }px`;
119
+ };
120
+ Responsive.Event[`view-${idModal}`]();
121
+
122
+ // Router
123
+ if (options.route)
124
+ (() => {
125
+ let path = window.location.pathname;
126
+ if (path !== '/' && path[path.length - 1] === '/') path = path.slice(0, -1);
127
+ const proxyPath = getProxyPath();
128
+ const newPath = `${proxyPath}${options.route}`;
129
+ if (path !== newPath) {
130
+ // console.warn('SET MODAL URI', newPath);
131
+ setPath(`${newPath}`); // ${location.search}
132
+ setDocTitle({ ...options.RouterInstance, route: options.route });
133
+ }
134
+ })();
135
+
136
+ break;
137
+ case 'slide-menu':
138
+ case 'slide-menu-right':
139
+ case 'slide-menu-left':
140
+ (async () => {
141
+ const { barConfig } = options;
142
+ options.style = {
143
+ position: 'absolute',
144
+ height: `${
145
+ window.innerHeight -
146
+ (options.heightTopBar ? options.heightTopBar : heightDefaultTopBar) -
147
+ (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
148
+ }px`,
149
+ width: `${slideMenuWidth}px`,
150
+ // 'overflow-x': 'hidden',
151
+ // overflow: 'visible', // required for tooltip
152
+ 'z-index': 6,
153
+ resize: 'none',
154
+ top: `${options.heightTopBar ? options.heightTopBar : heightDefaultTopBar}px`,
155
+ };
156
+ options.mode === 'slide-menu-right' ? (options.style.right = '0px') : (options.style.left = '0px');
157
+ const contentIconClass = 'abs center';
158
+
159
+ options.dragDisabled = true;
160
+ options.titleClass = 'hide';
161
+ top = '0px';
162
+ left = 'auto';
163
+ width = 'auto';
164
+ // barConfig.buttons.maximize.disabled = true;
165
+ // barConfig.buttons.minimize.disabled = true;
166
+ // barConfig.buttons.restore.disabled = true;
167
+ // barConfig.buttons.menu.disabled = true;
168
+ // barConfig.buttons.close.disabled = true;
169
+ options.btnBarModalClass = 'hide';
170
+ Responsive.Event[`slide-menu-${idModal}`] = () => {
171
+ for (const _idModal of Object.keys(this.Data)) {
172
+ if (this.Data[_idModal].slideMenu && this.Data[_idModal].slideMenu.id === idModal)
173
+ this.Data[_idModal].slideMenu.callBack();
174
+ }
175
+ s(`.${idModal}`).style.height = `${
176
+ window.innerHeight -
177
+ (options.heightTopBar ? options.heightTopBar : heightDefaultTopBar) -
178
+ (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
179
+ }px`;
180
+ if (s(`.main-body-top`)) {
181
+ if (Modal.mobileModal()) {
182
+ if (s(`.btn-menu-${idModal}`).classList.contains('hide') && collapseSlideMenuWidth !== slideMenuWidth)
183
+ s(`.main-body-top`).classList.remove('hide');
184
+ if (s(`.btn-close-${idModal}`).classList.contains('hide')) s(`.main-body-top`).classList.add('hide');
185
+ } else if (!s(`.main-body-top`).classList.contains('hide')) s(`.main-body-top`).classList.add('hide');
186
+ }
187
+ };
188
+ barConfig.buttons.menu.onClick = () => {
189
+ this.Data[idModal][options.mode].width = slideMenuWidth;
190
+ s(`.btn-menu-${idModal}`).classList.add('hide');
191
+ s(`.btn-close-${idModal}`).classList.remove('hide');
192
+ s(`.${idModal}`).style.width = `${this.Data[idModal][options.mode].width}px`;
193
+ s(`.html-${idModal}`).style.display = 'block';
194
+ // s(`.title-modal-${idModal}`).style.display = 'block';
195
+ setTimeout(() => {
196
+ s(`.main-body-btn-ui-menu-menu`).classList.add('hide');
197
+ s(`.main-body-btn-ui-menu-close`).classList.remove('hide');
198
+ if (s(`.btn-bar-center-icon-menu`)) {
199
+ s(`.btn-bar-center-icon-close`).classList.remove('hide');
200
+ s(`.btn-bar-center-icon-menu`).classList.add('hide');
201
+ }
202
+ });
203
+
204
+ setTimeout(() => {
205
+ s(`.main-body-btn-container`).style[
206
+ true || (options.mode && options.mode.match('right')) ? 'right' : 'left'
207
+ ] = options.mode && options.mode.match('right') ? `${slideMenuWidth}px` : '0px';
208
+ });
209
+ Responsive.Event[`slide-menu-${idModal}`]();
210
+ };
211
+ barConfig.buttons.close.onClick = () => {
212
+ this.Data[idModal][options.mode].width = 0;
213
+ s(`.btn-close-${idModal}`).classList.add('hide');
214
+ s(`.btn-menu-${idModal}`).classList.remove('hide');
215
+ s(`.${idModal}`).style.width = `${this.Data[idModal][options.mode].width}px`;
216
+ s(`.html-${idModal}`).style.display = 'none';
217
+ setTimeout(() => {
218
+ s(`.main-body-btn-ui-menu-close`).classList.add('hide');
219
+ s(`.main-body-btn-ui-menu-menu`).classList.remove('hide');
220
+ if (s(`.btn-bar-center-icon-menu`)) {
221
+ s(`.btn-bar-center-icon-menu`).classList.remove('hide');
222
+ s(`.btn-bar-center-icon-close`).classList.add('hide');
223
+ }
224
+ });
225
+ // s(`.title-modal-${idModal}`).style.display = 'none';
226
+ setTimeout(() => {
227
+ s(`.main-body-btn-container`).style[
228
+ true || (options.mode && options.mode.match('right')) ? 'right' : 'left'
229
+ ] = `${0}px`;
230
+ });
231
+ Responsive.Event[`slide-menu-${idModal}`]();
232
+ };
233
+ transition += `, width 0.3s`;
234
+
235
+ setTimeout(() => {
236
+ append(
237
+ 'body',
238
+ html`
239
+ <div
240
+ class="abs main-body-btn-container"
241
+ style="top: ${options.heightTopBar + 50}px; z-index: 9; ${true ||
242
+ (options.mode && options.mode.match('right'))
243
+ ? 'right'
244
+ : 'left'}: 50px; width: 50px; height: 100px; transition: .3s"
245
+ >
246
+ <div
247
+ class="abs main-body-btn main-body-btn-menu"
248
+ style="top: 50px; ${true || (options.mode && options.mode.match('right'))
249
+ ? 'right'
250
+ : 'left'}: 0px"
251
+ >
252
+ <div class="abs center">
253
+ <i class="fa-solid fa-xmark hide main-body-btn-ui-menu-close"></i>
254
+ <i class="fa-solid fa-bars main-body-btn-ui-menu-menu"></i>
255
+ </div>
256
+ </div>
257
+ <div
258
+ class="abs main-body-btn main-body-btn-ui"
259
+ style="top: 0px; ${true || (options.mode && options.mode.match('right')) ? 'right' : 'left'}: 0px"
260
+ >
261
+ <div class="abs center">
262
+ <i class="fas fa-caret-down main-body-btn-ui-open hide"></i>
263
+ <i class="fas fa-caret-up main-body-btn-ui-close"></i>
264
+ </div>
265
+ </div>
266
+ </div>
267
+ `,
268
+ );
269
+
270
+ s(`.main-body-btn-menu`).onclick = () => {
271
+ Modal.actionBtnCenter();
272
+ };
273
+
274
+ let _heightTopBar, _heightBottomBar, _topMenu;
275
+ s(`.main-body-btn-ui`).onclick = () => {
276
+ if (s(`.main-body-btn-ui-open`).classList.contains('hide')) {
277
+ s(`.main-body-btn-ui-open`).classList.remove('hide');
278
+ s(`.main-body-btn-ui-close`).classList.add('hide');
279
+ _heightTopBar = newInstance(options.heightTopBar);
280
+ _heightBottomBar = newInstance(options.heightBottomBar);
281
+ _topMenu = newInstance(s(`.modal-menu`).style.top);
282
+ options.heightTopBar = 0;
283
+ options.heightBottomBar = 0;
284
+ s(`.slide-menu-top-bar`).classList.add('hide');
285
+ s(`.bottom-bar`).classList.add('hide');
286
+ s(`.modal-menu`).style.top = '0px';
287
+ s(`.main-body-btn-container`).style.top = '50px';
288
+ s(`.main-body`).style.top = '0px';
289
+ } else {
290
+ s(`.main-body-btn-ui-close`).classList.remove('hide');
291
+ s(`.main-body-btn-ui-open`).classList.add('hide');
292
+ options.heightTopBar = _heightTopBar;
293
+ options.heightBottomBar = _heightBottomBar;
294
+ s(`.modal-menu`).style.top = _topMenu;
295
+ s(`.main-body-btn-container`).style.top = `${options.heightTopBar + 50}px`;
296
+ s(`.slide-menu-top-bar`).classList.remove('hide');
297
+ s(`.bottom-bar`).classList.remove('hide');
298
+ s(`.main-body`).style.top = `${options.heightTopBar}px`;
299
+ }
300
+ Responsive.Event[`slide-menu-modal-menu`]();
301
+ Object.keys(this.Data).map((_idModal) => {
302
+ if (this.Data[_idModal].slideMenu) {
303
+ if (s(`.btn-maximize-${_idModal}`)) s(`.btn-maximize-${_idModal}`).click();
304
+ }
305
+ });
306
+ Responsive.Event[`view-${'main-body'}`]();
307
+ if (Responsive.Event[`view-${'bottom-bar'}`]) Responsive.Event[`view-${'bottom-bar'}`]();
308
+ if (Responsive.Event[`view-${'main-body-top'}`]) Responsive.Event[`view-${'main-body-top'}`]();
309
+ for (const keyEvent of Object.keys(this.Data[idModal].onExpandUiListener)) {
310
+ this.Data[idModal].onExpandUiListener[keyEvent](
311
+ !s(`.main-body-btn-ui-open`).classList.contains('hide'),
312
+ );
313
+ }
314
+ };
315
+ });
316
+
317
+ const inputSearchBoxId = `top-bar-search-box`;
318
+ append(
319
+ 'body',
320
+ html` <div class="fix modal slide-menu-top-bar">
321
+ <div
322
+ class="fl top-bar ${options.barClass ? options.barClass : ''}"
323
+ style="height: ${originHeightTopBar}px;"
324
+ >
325
+ ${await BtnIcon.Render({
326
+ style: `height: 100%`,
327
+ class: 'in fll main-btn-menu action-bar-box action-btn-close hide',
328
+ label: html` <div class="${contentIconClass} action-btn-close-render">
329
+ <i class="fa-solid fa-xmark"></i>
330
+ </div>`,
331
+ })}
332
+ ${await BtnIcon.Render({
333
+ style: `height: 100%`,
334
+ class: `in fll main-btn-menu action-bar-box action-btn-app-icon ${
335
+ options?.disableTools?.includes('app-icon') ? 'hide' : ''
336
+ }`,
337
+ label: html` <div class="${contentIconClass} action-btn-app-icon-render"></div>`,
338
+ })}
339
+ <form
340
+ class="in fll top-bar-search-box-container hover ${options?.disableTools?.includes('text-box')
341
+ ? 'hide'
342
+ : ''}"
343
+ >
344
+ ${await Input.Render({
345
+ id: inputSearchBoxId,
346
+ placeholder: Modal.mobileModal() ? Translate.Render('search', '.top-bar-search-box') : undefined, // html`<i class="fa-solid fa-magnifying-glass"></i> ${Translate.Render('search')}`,
347
+ placeholderIcon: html`<div
348
+ class="in fll"
349
+ style="width: ${originHeightTopBar}px; height: ${originHeightTopBar}px;"
350
+ >
351
+ <div class="abs center"><i class="fa-solid fa-magnifying-glass"></i></div>
352
+ ${!Modal.mobileModal()
353
+ ? html` <div
354
+ class="inl wfm key-shortcut-container-info"
355
+ style="${renderCssAttr({ style: { top: '10px', left: '60px' } })}"
356
+ >
357
+ ${await Badge.Render({
358
+ id: 'shortcut-key-info-search',
359
+ text: 'Shift',
360
+ classList: 'inl',
361
+ style: { 'z-index': 1 },
362
+ })}
363
+ ${await Badge.Render({
364
+ id: 'shortcut-key-info-search',
365
+ text: '+',
366
+ classList: 'inl',
367
+ style: { 'z-index': 1, background: 'none', color: '#5f5f5f' },
368
+ })}
369
+ ${await Badge.Render({
370
+ id: 'shortcut-key-info-search',
371
+ text: 'k',
372
+ classList: 'inl',
373
+ style: { 'z-index': 1 },
374
+ })}
375
+ </div>`
376
+ : ''}
377
+ </div>`,
378
+ inputClass: 'in fll',
379
+ // containerClass: '',
380
+ })}
381
+ </form>
382
+ <div
383
+ class="abs top-box-profile-container ${options?.disableTools?.includes('profile') ? 'hide' : ''}"
384
+ >
385
+ ${await BtnIcon.Render({
386
+ style: `height: 100%`,
387
+ class: 'in fll session-in-log-in main-btn-menu action-bar-box action-btn-profile-log-in',
388
+ label: html` <div class="${contentIconClass} action-btn-profile-log-in-render"></div>`,
389
+ })}
390
+ ${await BtnIcon.Render({
391
+ style: `height: 100%`,
392
+ class: 'in fll session-in-log-out main-btn-menu action-bar-box action-btn-profile-log-out',
393
+ label: html` <div class="${contentIconClass} action-btn-profile-log-out-render">
394
+ <i class="fas fa-user-plus"></i>
395
+ </div>`,
396
+ })}
397
+ </div>
398
+ </div>
399
+ </div>`,
400
+ );
401
+ EventsUI.onClick(`.action-btn-profile-log-in`, () => {
402
+ s(`.main-btn-account`).click();
403
+ });
404
+ EventsUI.onClick(`.action-btn-profile-log-out`, () => {
405
+ s(`.main-btn-sign-up`).click();
406
+ });
407
+ s(`.input-info-${inputSearchBoxId}`).style.textAlign = 'left';
408
+ htmls(`.input-info-${inputSearchBoxId}`, '');
409
+ const inputInfoNode = s(`.input-info-${inputSearchBoxId}`).cloneNode(true);
410
+ s(`.input-info-${inputSearchBoxId}`).remove();
411
+ {
412
+ const id = 'search-box-history';
413
+ const searchBoxHistoryId = id;
414
+ const formDataInfoNode = [
415
+ {
416
+ model: 'search-box',
417
+ id: inputSearchBoxId,
418
+ rules: [] /*{ type: 'isEmpty' }, { type: 'isEmail' }*/,
419
+ },
420
+ ];
421
+ let hoverHistBox = false;
422
+ let hoverInputBox = false;
423
+ let currentKeyBoardSearchBoxIndex = 0;
424
+ let results = [];
425
+ let historySearchBox = [];
426
+
427
+ const checkHistoryBoxTitleStatus = () => {
428
+ if (s(`.search-box-result-title`) && s(`.search-box-result-title`).classList) {
429
+ if (!s(`.${inputSearchBoxId}`).value.trim()) {
430
+ s(`.search-box-result-title`).classList.add('hide');
431
+ s(`.search-box-recent-title`).classList.remove('hide');
432
+ } else {
433
+ s(`.search-box-recent-title`).classList.add('hide');
434
+ s(`.search-box-result-title`).classList.remove('hide');
435
+ }
436
+ }
437
+ };
438
+
439
+ const checkShortcutContainerInfoEnabled = () => {
440
+ if (Modal.mobileModal() || !s(`.key-shortcut-container-info`)) return;
441
+ if (!s(`.${inputSearchBoxId}`).value) {
442
+ s(`.key-shortcut-container-info`).classList.remove('hide');
443
+ } else s(`.key-shortcut-container-info`).classList.add('hide');
444
+ };
445
+
446
+ const renderSearchResult = async (results) => {
447
+ htmls(`.html-${searchBoxHistoryId}`, '');
448
+ if (results.length === 0) {
449
+ append(
450
+ `.html-${searchBoxHistoryId}`,
451
+ await BtnIcon.Render({
452
+ label: html`<i class="fas fa-exclamation-circle"></i> ${Translate.Render('no-result-found')}`,
453
+ class: `wfa`,
454
+ style: renderCssAttr({
455
+ style: {
456
+ padding: '3px',
457
+ margin: '2px',
458
+ 'text-align': 'center',
459
+ border: 'none',
460
+ cursor: 'default',
461
+ background: 'none !important',
462
+ },
463
+ }),
464
+ }),
465
+ );
466
+ }
467
+ let indexResult = -1;
468
+ for (const result of results) {
469
+ indexResult++;
470
+ const indexRender = indexResult;
471
+ append(
472
+ `.html-${searchBoxHistoryId}`,
473
+ await BtnIcon.Render({
474
+ label: `${
475
+ result.fontAwesomeIcon
476
+ ? html`<i class="${result.fontAwesomeIcon.classList.toString()}"></i> `
477
+ : result.imgElement
478
+ ? html`<img
479
+ class="inl"
480
+ src="${result.imgElement.src}"
481
+ style="${renderCssAttr({ style: { width: '25px', height: '25px' } })}"
482
+ />`
483
+ : ''
484
+ } ${Translate.Render(result.routerId)}`,
485
+ class: `wfa search-result-btn-${result.routerId} ${
486
+ indexResult === currentKeyBoardSearchBoxIndex ? 'main-btn-menu-active' : ''
487
+ } search-result-btn-${indexResult}`,
488
+ style: renderCssAttr({
489
+ style: { padding: '3px', margin: '2px', 'text-align': 'left' },
490
+ }),
491
+ }),
492
+ );
493
+ s(`.search-result-btn-${result.routerId}`).onclick = () => {
494
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.remove(
495
+ `main-btn-menu-active`,
496
+ );
497
+ currentKeyBoardSearchBoxIndex = indexRender;
498
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.add(
499
+ `main-btn-menu-active`,
500
+ );
501
+ setSearchValue(`.search-result-btn-${result.routerId}`);
502
+ };
503
+ }
504
+ };
505
+
506
+ const getResultSearchBox = (validatorData) => {
507
+ const { model, id } = validatorData;
508
+ switch (model) {
509
+ case 'search-box':
510
+ {
511
+ if (
512
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex] &&
513
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList
514
+ )
515
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.remove(
516
+ `main-btn-menu-active`,
517
+ );
518
+ currentKeyBoardSearchBoxIndex = 0;
519
+ if (
520
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex] &&
521
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList
522
+ )
523
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.add(
524
+ `main-btn-menu-active`,
525
+ );
526
+ results = [];
527
+ const routerInstance = Worker.RouterInstance.Routes();
528
+ for (const _routerId of Object.keys(routerInstance)) {
529
+ const routerId = _routerId.slice(1);
530
+ if (routerId) {
531
+ if (
532
+ s(`.main-btn-${routerId}`) &&
533
+ (routerId.toLocaleLowerCase().match(s(`.${id}`).value.toLocaleLowerCase()) ||
534
+ (Translate.Data[routerId] &&
535
+ Object.keys(Translate.Data[routerId]).filter((keyLang) =>
536
+ Translate.Data[routerId][keyLang]
537
+ .toLocaleLowerCase()
538
+ .match(s(`.${id}`).value.toLocaleLowerCase()),
539
+ ).length > 0))
540
+ ) {
541
+ const fontAwesomeIcon = getAllChildNodes(s(`.main-btn-${routerId}`)).find((e) => {
542
+ return (
543
+ e.classList &&
544
+ Array.from(e.classList).find((e) => e.match('fa-') && !e.match('fa-grip-vertical'))
545
+ );
546
+ });
547
+ const imgElement = getAllChildNodes(s(`.main-btn-${routerId}`)).find((e) => {
548
+ return (
549
+ typeof e.src === 'string' &&
550
+ e.src.match(routerId) &&
551
+ e.classList &&
552
+ Array.from(e.classList).find((e) => e.match('img-btn-square-menu'))
553
+ );
554
+ });
555
+ if (imgElement || fontAwesomeIcon) {
556
+ results.push({
557
+ routerId,
558
+ fontAwesomeIcon: fontAwesomeIcon,
559
+ imgElement,
560
+ });
561
+ }
562
+ }
563
+ }
564
+ }
565
+ }
566
+ break;
567
+
568
+ default:
569
+ break;
570
+ }
571
+ if (s(`.${inputSearchBoxId}`).value.trim()) renderSearchResult(results);
572
+ else renderSearchResult(historySearchBox);
573
+ };
574
+
575
+ const searchBoxCallBack = async (validatorData) => {
576
+ const isSearchBoxActiveElement = isActiveElement(inputSearchBoxId);
577
+ checkHistoryBoxTitleStatus();
578
+ checkShortcutContainerInfoEnabled();
579
+ if (!isSearchBoxActiveElement && !hoverHistBox && !hoverInputBox) {
580
+ Modal.removeModal(searchBoxHistoryId);
581
+ return;
582
+ }
583
+ setTimeout(() => getResultSearchBox(validatorData));
584
+ };
585
+
586
+ const getDefaultSearchBoxSelector = () => `.search-result-btn-${currentKeyBoardSearchBoxIndex}`;
587
+
588
+ const updateSearchBoxValue = (selector) => {
589
+ if (!selector) selector = getDefaultSearchBoxSelector();
590
+ if (s(selector).childNodes) {
591
+ if (
592
+ s(selector).childNodes[s(selector).childNodes.length - 1] &&
593
+ s(selector).childNodes[s(selector).childNodes.length - 1].data &&
594
+ s(selector).childNodes[s(selector).childNodes.length - 1].data.trim()
595
+ ) {
596
+ s(`.${inputSearchBoxId}`).value =
597
+ s(selector).childNodes[s(selector).childNodes.length - 1].data.trim();
598
+ } else if (
599
+ s(selector).childNodes[s(selector).childNodes.length - 2] &&
600
+ s(selector).childNodes[s(selector).childNodes.length - 2].outerText &&
601
+ s(selector).childNodes[s(selector).childNodes.length - 2].outerText.trim()
602
+ ) {
603
+ s(`.${inputSearchBoxId}`).value =
604
+ s(selector).childNodes[s(selector).childNodes.length - 2].outerText.trim();
605
+ }
606
+ }
607
+ checkHistoryBoxTitleStatus();
608
+ checkShortcutContainerInfoEnabled();
609
+ };
610
+
611
+ const setSearchValue = (selector) => {
612
+ if (!selector) selector = getDefaultSearchBoxSelector();
613
+ historySearchBox = historySearchBox.filter(
614
+ (h) => h.routerId !== results[currentKeyBoardSearchBoxIndex].routerId,
615
+ );
616
+ historySearchBox.unshift(results[currentKeyBoardSearchBoxIndex]);
617
+ updateSearchBoxValue(selector);
618
+ s(`.main-btn-${results[currentKeyBoardSearchBoxIndex].routerId}`).click();
619
+ Modal.removeModal(searchBoxHistoryId);
620
+ };
621
+
622
+ const searchBoxHistoryOpen = async () => {
623
+ if (!s(`.${id}`)) {
624
+ const { barConfig } = await Themes[Css.currentTheme]();
625
+ barConfig.buttons.maximize.disabled = true;
626
+ barConfig.buttons.minimize.disabled = true;
627
+ barConfig.buttons.restore.disabled = true;
628
+ barConfig.buttons.menu.disabled = true;
629
+ barConfig.buttons.close.disabled = false;
630
+ await Modal.Render({
631
+ id,
632
+ barConfig,
633
+ title: html`<div class="search-box-recent-title">
634
+ ${renderViewTitle({
635
+ icon: html`<i class="fas fa-history mini-title"></i>`,
636
+ text: Translate.Render('recent'),
637
+ })}
638
+ </div>
639
+ <div class="search-box-result-title hide">
640
+ ${renderViewTitle({
641
+ icon: html`<i class="far fa-list-alt mini-title"></i>`,
642
+ text: Translate.Render('results'),
643
+ })}
644
+ </div>`,
645
+ html: () => html``,
646
+ titleClass: 'mini-title',
647
+ style: {
648
+ resize: 'none',
649
+ 'max-width': '450px',
650
+ height:
651
+ this.mobileModal() && window.innerWidth < 445
652
+ ? `${window.innerHeight - originHeightTopBar}px !important`
653
+ : '300px !important',
654
+ 'z-index': 7,
655
+ },
656
+ dragDisabled: true,
657
+ maximize: true,
658
+ heightBottomBar: 0,
659
+ heightTopBar: originHeightTopBar,
660
+ barMode: options.barMode,
661
+ });
662
+
663
+ const titleNode = s(`.title-modal-${id}`).cloneNode(true);
664
+ s(`.title-modal-${id}`).remove();
665
+ s(`.btn-bar-modal-container-render-${id}`).classList.add('in');
666
+ s(`.btn-bar-modal-container-render-${id}`).classList.add('fll');
667
+ s(`.btn-bar-modal-container-render-${id}`).appendChild(titleNode);
668
+
669
+ prepend(`.btn-bar-modal-container-${id}`, html`<div class="hide">${inputInfoNode.outerHTML}</div>`);
670
+
671
+ s(`.top-bar-search-box-container`).onmouseover = () => {
672
+ hoverInputBox = true;
673
+ };
674
+ s(`.top-bar-search-box-container`).onmouseout = () => {
675
+ hoverInputBox = false;
676
+ };
677
+ s(`.${id}`).onmouseover = () => {
678
+ hoverHistBox = true;
679
+ };
680
+ s(`.${id}`).onmouseout = () => {
681
+ hoverHistBox = false;
682
+ s(`.${inputSearchBoxId}`).focus();
683
+ };
684
+ }
685
+ };
686
+
687
+ s('.top-bar-search-box').oninput = () => {
688
+ searchBoxHistoryOpen();
689
+ searchBoxCallBack(formDataInfoNode[0]);
690
+ };
691
+ s('.top-bar-search-box').onfocus = () => {
692
+ searchBoxHistoryOpen();
693
+ searchBoxCallBack(formDataInfoNode[0]);
694
+ };
695
+ s('.top-bar-search-box').onblur = () => {
696
+ if (!hoverHistBox && !hoverInputBox && !isActiveElement(inputSearchBoxId)) {
697
+ Modal.removeModal(searchBoxHistoryId);
698
+ }
699
+ };
700
+ EventsUI.onClick(`.top-bar-search-box-container`, () => {
701
+ searchBoxHistoryOpen();
702
+ searchBoxCallBack(formDataInfoNode[0]);
703
+ });
704
+
705
+ const timePressDelay = 100;
706
+ Keyboard.instanceMultiPressKey({
707
+ id: 'input-search-shortcut-ArrowUp',
708
+ keys: ['ArrowUp'],
709
+ eventCallBack: () => {
710
+ if (s(`.${id}`)) {
711
+ if (
712
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex] &&
713
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex - 1]
714
+ ) {
715
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.remove(
716
+ `main-btn-menu-active`,
717
+ );
718
+ currentKeyBoardSearchBoxIndex--;
719
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.add(
720
+ `main-btn-menu-active`,
721
+ );
722
+ } else {
723
+ if (s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex])
724
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.remove(
725
+ `main-btn-menu-active`,
726
+ );
727
+ currentKeyBoardSearchBoxIndex = s(`.html-${searchBoxHistoryId}`).childNodes.length - 1;
728
+ if (s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex])
729
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.add(
730
+ `main-btn-menu-active`,
731
+ );
732
+ }
733
+ updateSearchBoxValue();
734
+ }
735
+ },
736
+ timePressDelay,
737
+ });
738
+
739
+ Keyboard.instanceMultiPressKey({
740
+ id: 'input-search-shortcut-ArrowDown',
741
+ keys: ['ArrowDown'],
742
+ eventCallBack: () => {
743
+ if (s(`.${id}`)) {
744
+ if (
745
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex] &&
746
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex + 1]
747
+ ) {
748
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.remove(
749
+ `main-btn-menu-active`,
750
+ );
751
+ currentKeyBoardSearchBoxIndex++;
752
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.add(
753
+ `main-btn-menu-active`,
754
+ );
755
+ } else {
756
+ if (s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex])
757
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.remove(
758
+ `main-btn-menu-active`,
759
+ );
760
+ currentKeyBoardSearchBoxIndex = 0;
761
+ if (s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex])
762
+ s(`.html-${searchBoxHistoryId}`).childNodes[currentKeyBoardSearchBoxIndex].classList.add(
763
+ `main-btn-menu-active`,
764
+ );
765
+ }
766
+ updateSearchBoxValue();
767
+ }
768
+ },
769
+ timePressDelay,
770
+ });
771
+
772
+ s(`.top-bar-search-box-container`).onsubmit = (e) => {
773
+ e.preventDefault();
774
+ setSearchValue();
775
+ };
776
+ }
777
+ setTimeout(async () => {
778
+ // clone and change position
779
+
780
+ // s(`.btn-close-${idModal}`);
781
+ // s(`.btn-menu-${idModal}`);
782
+ if (originHeightBottomBar === 0) {
783
+ const btnCloseNode = s(`.btn-close-${idModal}`).cloneNode(true);
784
+ s(`.btn-close-${idModal}`).remove();
785
+ s(`.top-bar`).appendChild(btnCloseNode);
786
+ s(`.btn-close-${idModal}`).onclick = btnCloseEvent;
787
+
788
+ const btnMenuNode = s(`.btn-menu-${idModal}`).cloneNode(true);
789
+ s(`.btn-menu-${idModal}`).remove();
790
+ s(`.top-bar`).appendChild(btnMenuNode);
791
+ s(`.btn-menu-${idModal}`).onclick = btnMenuEvent;
792
+ }
793
+
794
+ // const titleNode = s(`.title-modal-${idModal}`).cloneNode(true);
795
+ // s(`.title-modal-${idModal}`).remove();
796
+ // s(`.top-bar`).appendChild(titleNode);
797
+
798
+ s(`.slide-menu-top-bar`).style.zIndex = 7;
799
+
800
+ // s('body').removeChild(`.${idModal}`);
801
+ // while (s(`.top-modal`).firstChild) s(`.top-modal`).removeChild(s(`.top-modal`).firstChild);
802
+
803
+ {
804
+ const { barConfig } = await Themes[Css.currentTheme]();
805
+ barConfig.buttons.maximize.disabled = true;
806
+ barConfig.buttons.minimize.disabled = true;
807
+ barConfig.buttons.restore.disabled = true;
808
+ barConfig.buttons.menu.disabled = true;
809
+ barConfig.buttons.close.disabled = true;
810
+ const id = 'main-body';
811
+ await Modal.Render({
812
+ id,
813
+ barConfig,
814
+ html: options.htmlMainBody ? options.htmlMainBody : () => html``,
815
+ titleClass: 'hide',
816
+ style: {
817
+ // overflow: 'hidden',
818
+ background: 'none',
819
+ resize: 'none',
820
+ 'min-width': `${minWidth}px`,
821
+ width: '100%',
822
+ // border: '3px solid red',
823
+ },
824
+ dragDisabled: true,
825
+ maximize: true,
826
+ slideMenu: 'modal-menu',
827
+ heightTopBar: originHeightTopBar,
828
+ heightBottomBar: originHeightBottomBar,
829
+ barMode: options.barMode,
830
+ });
831
+ const maxWidthInputSearchBox = 450;
832
+ const paddingInputSearchBox = 5;
833
+ const paddingRightSearchBox = 50;
834
+ Responsive.Event[`view-${id}`] = () => {
835
+ if (!this.Data[id] || !s(`.${id}`)) return delete Responsive.Event[`view-${id}`];
836
+ const widthInputSearchBox =
837
+ window.innerWidth > maxWidthInputSearchBox ? maxWidthInputSearchBox : window.innerWidth;
838
+ s(`.top-bar-search-box-container`).style.width = `${
839
+ widthInputSearchBox - originHeightTopBar - paddingRightSearchBox - 1
840
+ }px`;
841
+ s(`.top-bar-search-box`).style.width = `${
842
+ widthInputSearchBox -
843
+ originHeightTopBar * 2 -
844
+ paddingRightSearchBox -
845
+ paddingInputSearchBox * 2 /*padding input*/ -
846
+ 10 /* right-margin */
847
+ }px`;
848
+ s(`.top-bar-search-box`).style.top = `${
849
+ (originHeightTopBar - s(`.top-bar-search-box`).clientHeight) / 2
850
+ }px`;
851
+ if (this.Data[id].slideMenu)
852
+ s(`.${id}`).style.height = `${
853
+ window.innerHeight -
854
+ (options.heightTopBar ? options.heightTopBar : heightDefaultTopBar) -
855
+ (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
856
+ }px`;
857
+ };
858
+ Responsive.Event[`view-${id}`]();
859
+ Keyboard.instanceMultiPressKey({
860
+ id: 'input-search-shortcut-k',
861
+ keys: [
862
+ ['Shift', 'k'],
863
+ ['Alt', 'k'],
864
+ ],
865
+ eventCallBack: () => {
866
+ if (s(`.top-bar-search-box`)) {
867
+ s(`.top-bar-search-box`).blur();
868
+ s(`.top-bar-search-box`).focus();
869
+ s(`.top-bar-search-box`).select();
870
+ }
871
+ },
872
+ });
873
+ }
874
+
875
+ {
876
+ const { barConfig } = await Themes[Css.currentTheme]();
877
+ barConfig.buttons.maximize.disabled = true;
878
+ barConfig.buttons.minimize.disabled = true;
879
+ barConfig.buttons.restore.disabled = true;
880
+ barConfig.buttons.menu.disabled = true;
881
+ barConfig.buttons.close.disabled = true;
882
+ const id = 'bottom-bar';
883
+ if (options && options.homeModals && !options.homeModals.includes(id)) options.homeModals.push(id);
884
+ else options.homeModals = [id];
885
+ const html = async () => html`
886
+ <style>
887
+ .top-bar-search-box-container {
888
+ height: 100%;
889
+ overflow: hidden;
890
+ }
891
+ .bottom-bar {
892
+ overflow: hidden;
893
+ }
894
+ .action-bar-box {
895
+ margin: 0px;
896
+ border: none;
897
+ width: 50px;
898
+ min-height: 50px;
899
+ }
900
+ </style>
901
+ <div
902
+ class="fl ${options.barClass ? options.barClass : ''}"
903
+ style="height: ${originHeightBottomBar}px;"
904
+ >
905
+ ${await BtnIcon.Render({
906
+ style: `height: 100%`,
907
+ class: `in fl${
908
+ options.mode === 'slide-menu-right' ? 'r' : 'l'
909
+ } main-btn-menu action-bar-box action-btn-center ${
910
+ options?.disableTools?.includes('center') ? 'hide' : ''
911
+ }`,
912
+ label: html`
913
+ <div class="${contentIconClass}">
914
+ <i class="far fa-square btn-bar-center-icon-square hide"></i>
915
+ <span class="btn-bar-center-icon-close hide">${barConfig.buttons.close.label}</span>
916
+ <span class="btn-bar-center-icon-menu">${barConfig.buttons.menu.label}</span>
917
+ </div>
918
+ `,
919
+ })}
920
+ ${await BtnIcon.Render({
921
+ style: `height: 100%`,
922
+ class: `in flr main-btn-menu action-bar-box action-btn-lang ${
923
+ options?.disableTools?.includes('lang') ? 'hide' : ''
924
+ }`,
925
+ label: html` <div class="${contentIconClass} action-btn-lang-render"></div>`,
926
+ })}
927
+ ${await BtnIcon.Render({
928
+ style: `height: 100%`,
929
+ class: `in flr main-btn-menu action-bar-box action-btn-theme ${
930
+ options?.disableTools?.includes('theme') ? 'hide' : ''
931
+ }`,
932
+ label: html` <div class="${contentIconClass} action-btn-theme-render"></div>`,
933
+ })}
934
+ ${await BtnIcon.Render({
935
+ style: `height: 100%`,
936
+ class: `in flr main-btn-menu action-bar-box action-btn-home ${
937
+ options?.disableTools?.includes('navigator') ? 'hide' : ''
938
+ }`,
939
+ label: html` <div class="${contentIconClass}"><i class="fas fa-home"></i></div>`,
940
+ })}
941
+ ${await BtnIcon.Render({
942
+ style: `height: 100%`,
943
+ class: `in flr main-btn-menu action-bar-box action-btn-right ${
944
+ options?.disableTools?.includes('navigator') ? 'hide' : ''
945
+ }`,
946
+ label: html` <div class="${contentIconClass}"><i class="fas fa-chevron-right"></i></div>`,
947
+ })}
948
+ ${await BtnIcon.Render({
949
+ style: `height: 100%`,
950
+ class: `in flr main-btn-menu action-bar-box action-btn-left ${
951
+ options?.disableTools?.includes('navigator') ? 'hide' : ''
952
+ }`,
953
+ label: html`<div class="${contentIconClass}"><i class="fas fa-chevron-left"></i></div>`,
954
+ })}
955
+ </div>
956
+ `;
957
+ if (options.heightBottomBar === 0 && options.heightTopBar > 0) {
958
+ append(`.slide-menu-top-bar`, html` <div class="in ${id}">${await html()}</div>`);
959
+ } else {
960
+ await Modal.Render({
961
+ id,
962
+ barConfig,
963
+ html,
964
+ titleClass: 'hide',
965
+ style: {
966
+ resize: 'none',
967
+ height: `${options.heightBottomBar}px`,
968
+ 'min-width': `${minWidth}px`,
969
+ 'z-index': 7,
970
+ },
971
+ dragDisabled: true,
972
+ maximize: true,
973
+ barMode: options.barMode,
974
+ });
975
+ Responsive.Event[`view-${id}`] = () => {
976
+ if (!this.Data[id] || !s(`.${id}`)) return delete Responsive.Event[`view-${id}`];
977
+ // <div class="in fll right-offset-menu-bottom-bar" style="height: 100%"></div>
978
+ // s(`.right-offset-menu-bottom-bar`).style.width = `${window.innerWidth - slideMenuWidth}px`;
979
+ s(`.${id}`).style.top = `${
980
+ window.innerHeight - (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
981
+ }px`;
982
+ };
983
+ Responsive.Event[`view-${id}`]();
984
+ }
985
+ EventsUI.onClick(`.action-btn-left`, (e) => {
986
+ e.preventDefault();
987
+ window.history.back();
988
+ });
989
+ EventsUI.onClick(`.action-btn-center`, (e) => {
990
+ e.preventDefault();
991
+ this.actionBtnCenter();
992
+ });
993
+ EventsUI.onClick(`.action-btn-right`, (e) => {
994
+ e.preventDefault();
995
+ window.history.forward();
996
+ });
997
+ EventsUI.onClick(`.action-btn-home`, () => s(`.main-btn-home`).click());
998
+ EventsUI.onClick(`.action-btn-app-icon`, () => s(`.action-btn-home`).click());
999
+ Keyboard.instanceMultiPressKey({
1000
+ id: 'input-shortcut-global-escape',
1001
+ keys: ['Escape'],
1002
+ eventCallBack: () => {
1003
+ // if (s(`.main-btn-home`)) s(`.main-btn-home`).click();
1004
+
1005
+ if (s(`.btn-close-${this.currentTopModalId}`)) s(`.btn-close-${this.currentTopModalId}`).click();
1006
+ },
1007
+ });
1008
+ }
1009
+
1010
+ {
1011
+ ThemeEvents['action-btn-theme'] = () => {
1012
+ htmls(
1013
+ `.action-btn-theme-render`,
1014
+ html` ${darkTheme ? html` <i class="fas fa-moon"></i>` : html`<i class="far fa-sun"></i>`}`,
1015
+ );
1016
+ };
1017
+ ThemeEvents['action-btn-theme']();
1018
+
1019
+ EventsUI.onClick(`.action-btn-theme`, async () => {
1020
+ const themePair = ThemesScope.find((t) => t.theme === Css.currentTheme).themePair;
1021
+ const theme = themePair ? themePair : ThemesScope.find((t) => t.dark === !darkTheme).theme;
1022
+ if (s(`.dropdown-option-${theme}`))
1023
+ DropDown.Tokens['settings-theme'].onClickEvents[`dropdown-option-${theme}`]();
1024
+ else await Themes[theme]();
1025
+ });
1026
+ if (!(ThemesScope.find((t) => t.dark) && ThemesScope.find((t) => !t.dark))) {
1027
+ s(`.action-btn-theme`).classList.add('hide');
1028
+ }
1029
+ }
1030
+
1031
+ {
1032
+ htmls(`.action-btn-lang-render`, html` ${s('html').lang}`);
1033
+ EventsUI.onClick(`.action-btn-lang`, () => {
1034
+ let lang = 'en';
1035
+ if (s('html').lang === 'en') lang = 'es';
1036
+ if (s(`.dropdown-option-${lang}`))
1037
+ DropDown.Tokens['settings-lang'].onClickEvents[`dropdown-option-${lang}`]();
1038
+ else Translate.renderLang(lang);
1039
+ });
1040
+ }
1041
+
1042
+ {
1043
+ const { barConfig } = await Themes[Css.currentTheme]();
1044
+ barConfig.buttons.maximize.disabled = true;
1045
+ barConfig.buttons.minimize.disabled = true;
1046
+ barConfig.buttons.restore.disabled = true;
1047
+ barConfig.buttons.menu.disabled = true;
1048
+ barConfig.buttons.close.disabled = true;
1049
+ const id = 'main-body-top';
1050
+ await Modal.Render({
1051
+ id,
1052
+ barConfig,
1053
+ html: () => html``,
1054
+ titleClass: 'hide',
1055
+ class: 'hide',
1056
+ style: {
1057
+ // overflow: 'hidden',
1058
+ background: 'none',
1059
+ resize: 'none',
1060
+ 'min-width': `${minWidth}px`,
1061
+ 'z-index': 5,
1062
+ background: `rgba(61, 61, 61, 0.5)`,
1063
+ // border: '3px solid red',
1064
+ },
1065
+ dragDisabled: true,
1066
+ maximize: true,
1067
+ heightTopBar: originHeightTopBar,
1068
+ heightBottomBar: originHeightBottomBar,
1069
+ barMode: options.barMode,
1070
+ });
1071
+
1072
+ Responsive.Event[`view-${id}`] = () => {
1073
+ if (!this.Data[id] || !s(`.${id}`)) return delete Responsive.Event[`view-${id}`];
1074
+ s(`.${id}`).style.height =
1075
+ s(`.main-body-btn-ui-close`).classList.contains('hide') &&
1076
+ s(`.btn-restore-${id}`).style.display !== 'none'
1077
+ ? `${window.innerHeight}px`
1078
+ : `${
1079
+ window.innerHeight -
1080
+ (options.heightTopBar ? options.heightTopBar : heightDefaultTopBar) -
1081
+ (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
1082
+ }px`;
1083
+
1084
+ if (
1085
+ s(`.main-body-btn-ui-close`).classList.contains('hide') &&
1086
+ s(`.btn-restore-${id}`).style.display !== 'none'
1087
+ ) {
1088
+ s(`.${id}`).style.top = '0px';
1089
+ } else {
1090
+ s(`.${id}`).style.top = `${options.heightTopBar ? options.heightTopBar : heightDefaultTopBar}px`;
1091
+ }
1092
+ };
1093
+ Responsive.Event[`view-${id}`]();
1094
+
1095
+ s(`.main-body-top`).onclick = () => s(`.btn-close-modal-menu`).click();
1096
+ }
1097
+
1098
+ await NotificationManager.RenderBoard(options);
1099
+ });
1100
+ })();
1101
+ break;
1102
+
1103
+ case 'dropNotification':
1104
+ (() => {
1105
+ setTimeout(() => {
1106
+ s(`.${idModal}`).style.top = 'auto';
1107
+ s(`.${idModal}`).style.left = 'auto';
1108
+ s(`.${idModal}`).style.height = 'auto';
1109
+ s(`.${idModal}`).style.position = 'absolute';
1110
+ let countDrop = 0;
1111
+ Object.keys(this.Data)
1112
+ .reverse()
1113
+ .map((_idModal) => {
1114
+ if (this.Data[_idModal][options.mode]) {
1115
+ s(`.${_idModal}`).style.bottom = `${countDrop * s(`.${_idModal}`).clientHeight * 1.05}px`;
1116
+ countDrop++;
1117
+ }
1118
+ });
1119
+ });
1120
+ })();
1121
+ break;
1122
+
1123
+ default:
1124
+ break;
1125
+ }
1126
+ }
1127
+ if (options.zIndexSync) this.zIndexSync({ idModal });
1128
+ if (s(`.${idModal}`)) {
1129
+ s(`.btn-maximize-${idModal}`).click();
1130
+ return;
1131
+ }
1132
+ if (options.slideMenu) {
1133
+ if (options.titleClass) options.titleClass = ' title-view-modal ' + options.titleClass;
1134
+ options.titleClass = ' title-view-modal ';
1135
+ }
1136
+
1137
+ const render = html` <style class="style-${idModal}">
1138
+ .${idModal} {
1139
+ width: ${width}px;
1140
+ height: ${height}px;
1141
+ top: ${top};
1142
+ left: ${left};
1143
+ overflow: auto; /* resizable required */
1144
+ resize: auto; /* resizable required */
1145
+ transition: ${transition};
1146
+ opacity: 0;
1147
+ z-index: 1;
1148
+ }
1149
+ .bar-default-modal-${idModal} {
1150
+ top: 0px;
1151
+ left: 0px;
1152
+ z-index: 3;
1153
+ }
1154
+
1155
+ .modal-html-${idModal} {
1156
+ }
1157
+
1158
+ .btn-modal-default-${idModal} {
1159
+ }
1160
+ .modal-handle-${idModal} {
1161
+ width: 90%;
1162
+ height: 90%;
1163
+ top: 5%;
1164
+ left: 5%;
1165
+ }
1166
+ .sub-menu-title-container-${idModal},
1167
+ .nav-path-container-${idModal} {
1168
+ top: 0px;
1169
+ left: 0px;
1170
+ width: 200px;
1171
+ height: 50px;
1172
+ overflow: hidden;
1173
+ font-size: 20px;
1174
+ cursor: default;
1175
+ }
1176
+ .nav-path-display-${idModal} {
1177
+ font-size: 11px;
1178
+ width: 100%;
1179
+ top: 35px;
1180
+ left: 37px;
1181
+ }
1182
+ .nav-title-display-${idModal} {
1183
+ font-size: 19px;
1184
+ width: 100%;
1185
+ top: 13px;
1186
+ left: 13px;
1187
+ }
1188
+ </style>
1189
+ ${renderStyleTag(`style-${idModal}`, `.${idModal}`, options)}
1190
+ <div class="fix ${options && options.class ? options.class : ''} modal box-shadow ${idModal}">
1191
+ <div class="abs modal-handle-${idModal}"></div>
1192
+ <div class="in modal-html-${idModal}">
1193
+ <div class="stq bar-default-modal bar-default-modal-${idModal}">
1194
+ <div
1195
+ class="fl btn-bar-modal-container btn-bar-modal-container-${idModal} ${options?.btnBarModalClass
1196
+ ? options.btnBarModalClass
1197
+ : ''}"
1198
+ >
1199
+ <div class="btn-bar-modal-container-render-${idModal}"></div>
1200
+ <div class="in flr bar-default-modal" style="z-index: 1">
1201
+ ${await BtnIcon.Render({
1202
+ class: `btn-minimize-${idModal} btn-modal-default btn-modal-default-${idModal} ${
1203
+ options?.btnContainerClass ? options.btnContainerClass : ''
1204
+ } ${options?.barConfig?.buttons?.minimize?.disabled ? 'hide' : ''}`,
1205
+ label: html`<div class="${options?.btnIconContainerClass ? options.btnIconContainerClass : ''}">
1206
+ ${options?.barConfig?.buttons?.minimize?.label ? options.barConfig.buttons.minimize.label : html`_`}
1207
+ </div>`,
1208
+ })}
1209
+ ${await BtnIcon.Render({
1210
+ class: `btn-restore-${idModal} btn-modal-default btn-modal-default-${idModal} ${
1211
+ options?.btnContainerClass ? options.btnContainerClass : ''
1212
+ } ${options?.barConfig?.buttons?.restore?.disabled ? 'hide' : ''}`,
1213
+ label: html`<div class="${options?.btnIconContainerClass ? options.btnIconContainerClass : ''}">
1214
+ ${options?.barConfig?.buttons?.restore?.label ? options.barConfig.buttons.restore.label : html`□`}
1215
+ </div>`,
1216
+ style: 'display: none',
1217
+ })}
1218
+ ${await BtnIcon.Render({
1219
+ class: `btn-maximize-${idModal} btn-modal-default btn-modal-default-${idModal} ${
1220
+ options?.btnContainerClass ? options.btnContainerClass : ''
1221
+ } ${options?.barConfig?.buttons?.maximize?.disabled ? 'hide' : ''}`,
1222
+ label: html`<div class="${options?.btnIconContainerClass ? options.btnIconContainerClass : ''}">
1223
+ ${options?.barConfig?.buttons?.maximize?.label ? options.barConfig.buttons.maximize.label : html`▢`}
1224
+ </div>`,
1225
+ })}
1226
+ ${await BtnIcon.Render({
1227
+ class: `btn-close-${idModal} btn-modal-default btn-modal-default-${idModal} ${
1228
+ options?.btnContainerClass ? options.btnContainerClass : ''
1229
+ } ${options?.barConfig?.buttons?.close?.disabled ? 'hide' : ''}`,
1230
+ label: html`<div class="${options?.btnIconContainerClass ? options.btnIconContainerClass : ''}">
1231
+ ${options?.barConfig?.buttons?.close?.label ? options.barConfig.buttons.close.label : html`X`}
1232
+ </div>`,
1233
+ })}
1234
+ ${await BtnIcon.Render({
1235
+ class: `btn-menu-${idModal} btn-modal-default btn-modal-default-${idModal} ${
1236
+ options?.btnContainerClass ? options.btnContainerClass : ''
1237
+ } ${options?.barConfig?.buttons?.menu?.disabled ? 'hide' : ''}`,
1238
+ label: html`<div class="${options?.btnIconContainerClass ? options.btnIconContainerClass : ''}">
1239
+ ${options?.barConfig?.buttons?.menu?.label ? options.barConfig.buttons.menu.label : html`≡`}
1240
+ </div>`,
1241
+ })}
1242
+ </div>
1243
+ </div>
1244
+ ${options && options.status
1245
+ ? html` <div class="abs modal-icon-container">${renderStatus(options.status)}</div> `
1246
+ : ''}
1247
+ <div
1248
+ class="inl title-modal-${idModal} ${options && options.titleClass ? options.titleClass : 'title-modal'}"
1249
+ >
1250
+ ${options && options.titleRender ? options.titleRender() : options.title ? options.title : ''}
1251
+ </div>
1252
+ </div>
1253
+
1254
+ <div class="in html-${idModal}">
1255
+ ${options.mode && options.mode.match('slide-menu')
1256
+ ? html`<div
1257
+ class="stq modal"
1258
+ style="${renderCssAttr({ style: { height: '50px', 'z-index': 1, top: '0px' } })}"
1259
+ >
1260
+ ${await BtnIcon.Render({
1261
+ style: renderCssAttr({ style: { height: '100%', color: '#5f5f5f' } }),
1262
+ class: `in flr main-btn-menu action-bar-box btn-icon-menu-mode`,
1263
+ label: html` <div class="abs center">
1264
+ <i
1265
+ class="fas fa-caret-right btn-icon-menu-mode-right ${options.mode && options.mode.match('right')
1266
+ ? ''
1267
+ : 'hide'}"
1268
+ ></i
1269
+ ><i
1270
+ class="fas fa-caret-left btn-icon-menu-mode-left ${options.mode && options.mode.match('right')
1271
+ ? 'hide'
1272
+ : ''}"
1273
+ ></i>
1274
+ </div>`,
1275
+ })}
1276
+ ${await BtnIcon.Render({
1277
+ style: renderCssAttr({ style: { height: '100%', color: '#5f5f5f' } }),
1278
+ class: `in flr main-btn-menu action-bar-box btn-icon-menu-back hide`,
1279
+ label: html`<div class="abs center"><i class="fas fa-undo-alt"></i></div>`,
1280
+ })}
1281
+ <div class="abs sub-menu-title-container-${idModal} ac">
1282
+ <div class="abs nav-title-display-${idModal}">
1283
+ <!-- <i class="fas fa-home"></i> ${Translate.Render('home')} -->
1284
+ </div>
1285
+ </div>
1286
+ <div class="abs nav-path-container-${idModal} ahc bold">
1287
+ <div class="abs nav-path-display-${idModal}"><!-- ${location.pathname} --></div>
1288
+ </div>
1289
+ </div>`
1290
+ : ''}
1291
+ ${options && options.html ? (typeof options.html === 'function' ? await options.html() : options.html) : ''}
1292
+ </div>
1293
+ </div>
1294
+ </div>`;
1295
+ const selector = options && options.selector ? options.selector : 'body';
1296
+ if (options) {
1297
+ switch (options.renderType) {
1298
+ case 'prepend':
1299
+ prepend(selector, render);
1300
+ break;
1301
+ default:
1302
+ append(selector, render);
1303
+ break;
1304
+ }
1305
+ } else append(selector, render);
1306
+ let handle = [s(`.bar-default-modal-${idModal}`), s(`.modal-handle-${idModal}`), s(`.modal-html-${idModal}`)];
1307
+ if (options && 'handleType' in options) {
1308
+ switch (options.handleType) {
1309
+ case 'bar':
1310
+ handle = [s(`.bar-default-modal-${idModal}`)];
1311
+
1312
+ break;
1313
+
1314
+ default:
1315
+ break;
1316
+ }
1317
+ }
1318
+ switch (options.mode) {
1319
+ case 'slide-menu':
1320
+ case 'slide-menu-right':
1321
+ case 'slide-menu-left':
1322
+ const backMenuButtonEvent = async () => {
1323
+ if (location.pathname !== getProxyPath()) setPath(getProxyPath());
1324
+ if (s(`.menu-btn-container-children`)) htmls(`.menu-btn-container-children`, '');
1325
+ // htmls(`.nav-title-display-${'modal-menu'}`, html`<i class="fas fa-home"></i> ${Translate.Render('home')}`);
1326
+ htmls(`.nav-title-display-${'modal-menu'}`, html``);
1327
+ htmls(`.nav-path-display-${idModal}`, '');
1328
+ s(`.btn-icon-menu-back`).classList.add('hide');
1329
+ if (s(`.menu-btn-container-main`)) s(`.menu-btn-container-main`).classList.remove('hide');
1330
+ };
1331
+ s(`.main-btn-home`).onclick = () => {
1332
+ for (const keyModal of Object.keys(this.Data)) {
1333
+ if (
1334
+ ![idModal, 'main-body-top', 'main-body']
1335
+ .concat(options?.homeModals ? options.homeModals : [])
1336
+ .includes(keyModal)
1337
+ )
1338
+ s(`.btn-close-${keyModal}`).click();
1339
+ backMenuButtonEvent();
1340
+ }
1341
+ s(`.btn-close-modal-menu`).click();
1342
+ };
1343
+ EventsUI.onClick(`.btn-icon-menu-back`, backMenuButtonEvent);
1344
+ EventsUI.onClick(`.btn-icon-menu-mode`, () => {
1345
+ if (s(`.btn-icon-menu-mode-right`).classList.contains('hide')) {
1346
+ s(`.btn-icon-menu-mode-right`).classList.remove('hide');
1347
+ s(`.btn-icon-menu-mode-left`).classList.add('hide');
1348
+ } else {
1349
+ s(`.btn-icon-menu-mode-left`).classList.remove('hide');
1350
+ s(`.btn-icon-menu-mode-right`).classList.add('hide');
1351
+ }
1352
+ if (slideMenuWidth === originSlideMenuWidth) {
1353
+ slideMenuWidth = collapseSlideMenuWidth;
1354
+ setTimeout(() => {
1355
+ s(`.main-body-btn-container`).style[
1356
+ true || (options.mode && options.mode.match('right')) ? 'right' : 'left'
1357
+ ] = options.mode && options.mode.match('right') ? `${slideMenuWidth}px` : '0px';
1358
+ }, 1);
1359
+
1360
+ if (!s(`.btn-bar-center-icon-close`).classList.contains('hide')) {
1361
+ sa(`.handle-btn-container`).forEach((el) => el.classList.add('hide'));
1362
+ sa(`.menu-label-text`).forEach((el) => el.classList.add('hide'));
1363
+ if (!Modal.mobileModal()) {
1364
+ sa(`.tooltip-menu`).forEach((el) => el.classList.remove('hide'));
1365
+ s(`.${idModal}`).style.overflow = 'visible';
1366
+ }
1367
+ if (s(`.menu-btn-container-main`) && s(`.menu-btn-container-main`).classList.contains('hide'))
1368
+ s(`.btn-icon-menu-back`).classList.add('hide');
1369
+ }
1370
+ if (options.onCollapseMenu) options.onCollapseMenu();
1371
+ s(`.sub-menu-title-container-${'modal-menu'}`).classList.add('hide');
1372
+ s(`.nav-path-container-${'modal-menu'}`).classList.add('hide');
1373
+ } else {
1374
+ slideMenuWidth = originSlideMenuWidth;
1375
+ setTimeout(() => {
1376
+ s(`.main-body-btn-container`).style[
1377
+ true || (options.mode && options.mode.match('right')) ? 'right' : 'left'
1378
+ ] = options.mode && options.mode.match('right') ? `${slideMenuWidth}px` : '0px';
1379
+ }, 1);
1380
+
1381
+ sa(`.handle-btn-container`).forEach((el) => el.classList.remove('hide'));
1382
+ sa(`.menu-label-text`).forEach((el) => el.classList.remove('hide'));
1383
+ if (!Modal.mobileModal()) {
1384
+ sa(`.tooltip-menu`).forEach((el) => el.classList.add('hide'));
1385
+ s(`.${idModal}`).style.overflow = null;
1386
+ }
1387
+ if (s(`.menu-btn-container-main`) && s(`.menu-btn-container-main`).classList.contains('hide'))
1388
+ s(`.btn-icon-menu-back`).classList.remove('hide');
1389
+
1390
+ if (options.onExtendMenu) options.onExtendMenu();
1391
+ s(`.sub-menu-title-container-${'modal-menu'}`).classList.remove('hide');
1392
+ s(`.nav-path-container-${'modal-menu'}`).classList.remove('hide');
1393
+ }
1394
+ // btn-bar-center-icon-menu
1395
+ this.actionBtnCenter();
1396
+ this.actionBtnCenter();
1397
+ });
1398
+
1399
+ break;
1400
+
1401
+ default:
1402
+ break;
1403
+ }
1404
+ let dragOptions = {
1405
+ // disabled: true,
1406
+ handle,
1407
+ onDragStart: (data) => {
1408
+ if (!s(`.${idModal}`)) return;
1409
+ // logger.info('Dragging started', data);
1410
+ s(`.${idModal}`).style.transition = null;
1411
+ },
1412
+ onDrag: (data) => {
1413
+ if (!s(`.${idModal}`)) return;
1414
+ // logger.info('Dragging', data);
1415
+ },
1416
+ onDragEnd: (data) => {
1417
+ if (!s(`.${idModal}`)) return;
1418
+ // logger.info('Dragging stopped', data);
1419
+ s(`.${idModal}`).style.transition = transition;
1420
+ Object.keys(this.Data[idModal].onDragEndListener).map((keyListener) =>
1421
+ this.Data[idModal].onDragEndListener[keyListener](),
1422
+ );
1423
+ },
1424
+ };
1425
+ let dragInstance;
1426
+ // new Draggable(s(`.${idModal}`), { disabled: true });
1427
+ const setDragInstance = () => (options?.dragDisabled ? null : new Draggable(s(`.${idModal}`), dragOptions));
1428
+ this.Data[idModal].setDragInstance = (updateDragOptions) => {
1429
+ dragOptions = {
1430
+ ...dragOptions,
1431
+ ...updateDragOptions,
1432
+ };
1433
+ dragInstance = setDragInstance();
1434
+ this.Data[idModal].dragInstance = dragInstance;
1435
+ this.Data[idModal].dragOptions = dragOptions;
1436
+ };
1437
+ s(`.${idModal}`).style.transition = '0.15s';
1438
+ setTimeout(() => (s(`.${idModal}`).style.opacity = '1'));
1439
+ setTimeout(() => (s(`.${idModal}`).style.transition = transition), 150);
1440
+
1441
+ const btnCloseEvent = () => {
1442
+ Object.keys(this.Data[idModal].onCloseListener).map((keyListener) =>
1443
+ this.Data[idModal].onCloseListener[keyListener](),
1444
+ );
1445
+ if (options && 'barConfig' in options && options.barConfig.buttons.close.onClick)
1446
+ return options.barConfig.buttons.close.onClick();
1447
+ s(`.${idModal}`).style.opacity = '0';
1448
+ if (this.Data[idModal].observer) {
1449
+ this.Data[idModal].observer.disconnect();
1450
+ // this.Data[idModal].observer.unobserve();
1451
+ }
1452
+ setTimeout(() => {
1453
+ if (!s(`.${idModal}`)) return;
1454
+ this.removeModal(idModal);
1455
+ // Router
1456
+ if (options.route)
1457
+ (() => {
1458
+ let path = window.location.pathname;
1459
+ if (path[path.length - 1] !== '/') path = `${path}/`;
1460
+ let newPath = `${getProxyPath()}`;
1461
+ if (path !== newPath) {
1462
+ for (const subIdModal of Object.keys(this.Data).reverse()) {
1463
+ if (this.Data[subIdModal].options.route) {
1464
+ newPath = `${newPath}${this.Data[subIdModal].options.route}`;
1465
+ // console.warn('SET MODAL URI', newPath);
1466
+ setPath(newPath);
1467
+ this.setTopModalCallback(subIdModal);
1468
+ return setDocTitle({ ...options.RouterInstance, route: this.Data[subIdModal].options.route });
1469
+ }
1470
+ }
1471
+ // console.warn('SET MODAL URI', newPath);
1472
+ setPath(`${newPath}${Modal.homeCid ? `?cid=${Modal.homeCid}` : ''}`);
1473
+ return setDocTitle({ ...options.RouterInstance, route: '' });
1474
+ }
1475
+ })();
1476
+ }, 300);
1477
+ };
1478
+ s(`.btn-close-${idModal}`).onclick = btnCloseEvent;
1479
+
1480
+ s(`.btn-minimize-${idModal}`).onclick = () => {
1481
+ if (options.slideMenu) delete this.Data[idModal].slideMenu;
1482
+ s(`.${idModal}`).style.transition = '0.3s';
1483
+ s(`.btn-minimize-${idModal}`).style.display = 'none';
1484
+ s(`.btn-maximize-${idModal}`).style.display = null;
1485
+ s(`.btn-restore-${idModal}`).style.display = null;
1486
+ s(`.${idModal}`).style.height = `${s(`.bar-default-modal-${idModal}`).clientHeight}px`;
1487
+ setTimeout(() => (s(`.${idModal}`).style.transition = transition), 300);
1488
+ };
1489
+ s(`.btn-restore-${idModal}`).onclick = () => {
1490
+ if (options.slideMenu) delete this.Data[idModal].slideMenu;
1491
+ s(`.${idModal}`).style.transition = '0.3s';
1492
+ s(`.btn-restore-${idModal}`).style.display = 'none';
1493
+ s(`.btn-minimize-${idModal}`).style.display = null;
1494
+ s(`.btn-maximize-${idModal}`).style.display = null;
1495
+ s(`.${idModal}`).style.transform = null;
1496
+ s(`.${idModal}`).style.height = null;
1497
+ s(`.${idModal}`).style.width = null;
1498
+ setCenterRestore();
1499
+ s(`.${idModal}`).style.top = top;
1500
+ s(`.${idModal}`).style.left = left;
1501
+ dragInstance = setDragInstance();
1502
+ setTimeout(() => (s(`.${idModal}`).style.transition = transition), 300);
1503
+ };
1504
+ s(`.btn-maximize-${idModal}`).onclick = () => {
1505
+ s(`.${idModal}`).style.transition = '0.3s';
1506
+ setTimeout(() => (s(`.${idModal}`).style.transition = transition), 300);
1507
+ s(`.btn-maximize-${idModal}`).style.display = 'none';
1508
+ s(`.btn-restore-${idModal}`).style.display = null;
1509
+ s(`.btn-minimize-${idModal}`).style.display = null;
1510
+ s(`.${idModal}`).style.transform = null;
1511
+
1512
+ if (options.slideMenu) {
1513
+ const idSlide = this.Data[options.slideMenu]['slide-menu']
1514
+ ? 'slide-menu'
1515
+ : this.Data[options.slideMenu]['slide-menu-right']
1516
+ ? 'slide-menu-right'
1517
+ : 'slide-menu-left';
1518
+ const callBack = () => {
1519
+ s(`.${idModal}`).style.transition = '0.3s';
1520
+ s(`.${idModal}`).style.width = `${window.innerWidth - this.Data[options.slideMenu][idSlide].width}px`;
1521
+ s(`.${idModal}`).style.left =
1522
+ idSlide === 'slide-menu-right' ? `0px` : `${this.Data[options.slideMenu][idSlide].width}px`;
1523
+ setTimeout(() => (s(`.${idModal}`) ? (s(`.${idModal}`).style.transition = transition) : null), 300);
1524
+ };
1525
+
1526
+ callBack();
1527
+ this.Data[idModal].slideMenu = {
1528
+ callBack,
1529
+ id: options.slideMenu,
1530
+ };
1531
+ Responsive.Event['h-ui-hide-' + idModal] = () => {
1532
+ setTimeout(() => {
1533
+ if (!s(`.${idModal}`) || !s(`.main-body-btn-ui-close`)) return;
1534
+ s(`.${idModal}`).style.height =
1535
+ s(`.main-body-btn-ui-close`).classList.contains('hide') &&
1536
+ s(`.btn-restore-${idModal}`).style.display !== 'none'
1537
+ ? `${window.innerHeight}px`
1538
+ : `${
1539
+ window.innerHeight -
1540
+ (options.heightTopBar ? options.heightTopBar : heightDefaultTopBar) -
1541
+ (options.heightBottomBar ? options.heightBottomBar : heightDefaultBottomBar)
1542
+ }px`;
1543
+ s(`.${idModal}`).style.top =
1544
+ s(`.main-body-btn-ui-close`).classList.contains('hide') &&
1545
+ s(`.btn-restore-${idModal}`).style.display !== 'none'
1546
+ ? `0px`
1547
+ : `${options.heightTopBar ? options.heightTopBar : heightDefaultTopBar}px`;
1548
+ });
1549
+ };
1550
+ Responsive.Event['h-ui-hide-' + idModal]();
1551
+ } else {
1552
+ delete Responsive.Event['h-ui-hide-' + idModal];
1553
+ s(`.${idModal}`).style.width = '100%';
1554
+ s(`.${idModal}`).style.height = '100%';
1555
+ s(`.${idModal}`).style.top = `${options.heightTopBar ? options.heightTopBar : heightDefaultTopBar}px`;
1556
+ s(`.${idModal}`).style.left = `0px`;
1557
+ }
1558
+ dragInstance = setDragInstance();
1559
+ };
1560
+
1561
+ const btnMenuEvent = () => {
1562
+ Object.keys(this.Data[idModal].onMenuListener).map((keyListener) =>
1563
+ this.Data[idModal].onMenuListener[keyListener](),
1564
+ );
1565
+ if (options && 'barConfig' in options && options.barConfig.buttons.menu.onClick)
1566
+ return options.barConfig.buttons.menu.onClick();
1567
+ };
1568
+ s(`.btn-menu-${idModal}`).onclick = btnMenuEvent;
1569
+
1570
+ dragInstance = setDragInstance();
1571
+ if (options && options.maximize) s(`.btn-maximize-${idModal}`).click();
1572
+ if (options.observer) {
1573
+ this.Data[idModal].onObserverListener = {};
1574
+ this.Data[idModal].observerCallBack = () => {
1575
+ // logger.info('ResizeObserver', `.${idModal}`, s(`.${idModal}`).offsetWidth, s(`.${idModal}`).offsetHeight);
1576
+ if (this.Data[idModal] && this.Data[idModal].onObserverListener)
1577
+ Object.keys(this.Data[idModal].onObserverListener).map((eventKey) =>
1578
+ this.Data[idModal].onObserverListener[eventKey]({
1579
+ width: s(`.${idModal}`).offsetWidth,
1580
+ height: s(`.${idModal}`).offsetHeight,
1581
+ }),
1582
+ );
1583
+ else console.warn('observer not found', idModal);
1584
+ };
1585
+ this.Data[idModal].observer = new ResizeObserver(this.Data[idModal].observerCallBack);
1586
+ this.Data[idModal].observer.observe(s(`.${idModal}`));
1587
+ setTimeout(this.Data[idModal].observerCallBack);
1588
+ }
1589
+ // cancel: [cancel1, cancel2]
1590
+ s(`.${idModal}`).onclick = () => {
1591
+ this.Data[idModal]?.onClickListener
1592
+ ? Object.keys(this.Data[idModal].onClickListener).map((keyListener) =>
1593
+ this.Data[idModal].onClickListener[keyListener](),
1594
+ )
1595
+ : null;
1596
+ };
1597
+ return {
1598
+ id: idModal,
1599
+ ...this.Data[idModal],
1600
+ };
1601
+ },
1602
+ currentTopModalId: '',
1603
+ zIndexSync: function ({ idModal }) {
1604
+ setTimeout(() => {
1605
+ const cleanTopModal = () => {
1606
+ Object.keys(this.Data).map((_idModal) => {
1607
+ if (this.Data[_idModal].options.zIndexSync && s(`.${_idModal}`)) s(`.${_idModal}`).style.zIndex = '3';
1608
+ });
1609
+ };
1610
+ const setTopModal = () => {
1611
+ if (s(`.${idModal}`)) {
1612
+ this.setTopModalCallback(idModal);
1613
+ } else setTimeout(setTopModal, 100);
1614
+ };
1615
+ cleanTopModal();
1616
+ setTopModal();
1617
+ this.Data[idModal].onClickListener[`${idModal}-z-index`] = () => {
1618
+ if (s(`.${idModal}`) && s(`.${idModal}`).style.zIndex === '3') {
1619
+ if (this.Data[idModal].options.route) setPath(`${getProxyPath()}${this.Data[idModal].options.route}`);
1620
+ cleanTopModal();
1621
+ setTopModal();
1622
+ }
1623
+ };
1624
+ });
1625
+ },
1626
+ setTopModalCallback: function (idModal) {
1627
+ s(`.${idModal}`).style.zIndex = '4';
1628
+ this.currentTopModalId = `${idModal}`;
1629
+ if (
1630
+ this.Data[idModal].query &&
1631
+ `${location.pathname}${window.location.search}` !== `${location.pathname}${this.Data[idModal].query}`
1632
+ )
1633
+ setPath(`${location.pathname}${this.Data[idModal].query}`);
1634
+ },
1635
+ mobileModal: () => window.innerWidth < 600 || window.innerHeight < 600,
1636
+ writeHTML: ({ idModal, html }) => htmls(`.html-${idModal}`, html),
1637
+ viewModalOpen: function () {
1638
+ return Object.keys(this.Data).find((idModal) => s(`.${idModal}`) && this.Data[idModal].options.mode === 'view');
1639
+ },
1640
+ removeModal: function (idModal) {
1641
+ if (!s(`.${idModal}`)) return;
1642
+ s(`.${idModal}`).remove();
1643
+ sa(`.style-${idModal}`).forEach((element) => {
1644
+ element.remove();
1645
+ });
1646
+ delete this.Data[idModal];
1647
+ },
1648
+ RenderConfirm: async function (options) {
1649
+ const { id } = options;
1650
+ append(
1651
+ 'body',
1652
+ html`
1653
+ <div
1654
+ class="fix background-confirm-modal-${id}"
1655
+ style="${renderCssAttr({
1656
+ style: {
1657
+ 'z-index': '10',
1658
+ background: 'rgba(0,0,0,0.5)',
1659
+ width: '100%',
1660
+ height: '100%',
1661
+ top: '0px',
1662
+ left: '0px',
1663
+ transition: '0.3s',
1664
+ opacity: '1',
1665
+ },
1666
+ })}"
1667
+ ></div>
1668
+ `,
1669
+ );
1670
+ const removeBackgroundConfirmModal = () => {
1671
+ s(`.background-confirm-modal-${id}`).style.opacity = '0';
1672
+ setTimeout(() => {
1673
+ s(`.background-confirm-modal-${id}`).remove();
1674
+ });
1675
+ };
1676
+
1677
+ return new Promise(async (resolve, reject) => {
1678
+ const { barConfig } = await Themes[Css.currentTheme]();
1679
+ barConfig.buttons.maximize.disabled = true;
1680
+ barConfig.buttons.minimize.disabled = true;
1681
+ barConfig.buttons.restore.disabled = true;
1682
+ barConfig.buttons.menu.disabled = true;
1683
+ barConfig.buttons.close.disabled = false;
1684
+ const htmlRender = html`
1685
+ <br />
1686
+ <div class="in section-mp" style="font-size: 40px; text-align: center">
1687
+ <i class="fas fa-question-circle"></i>
1688
+ </div>
1689
+ ${await options.html()}
1690
+ <div class="in section-mp">
1691
+ ${await BtnIcon.Render({
1692
+ class: `in section-mp form-button btn-confirm-${id}`,
1693
+ label: Translate.Render('confirm'),
1694
+ type: 'submit',
1695
+ style: `margin: auto`,
1696
+ })}
1697
+ </div>
1698
+ <div class="in section-mp">
1699
+ ${await BtnIcon.Render({
1700
+ class: `in section-mp form-button btn-cancel-${id}`,
1701
+ label: Translate.Render('cancel'),
1702
+ type: 'submit',
1703
+ style: `margin: auto`,
1704
+ })}
1705
+ </div>
1706
+ `;
1707
+ await Modal.Render({
1708
+ id,
1709
+ barConfig,
1710
+ titleClass: 'hide',
1711
+ style: {
1712
+ width: '300px',
1713
+ height: '350px',
1714
+ overflow: 'hidden',
1715
+ 'z-index': '11',
1716
+ resize: 'none',
1717
+ },
1718
+ dragDisabled: true,
1719
+ ...options,
1720
+ html: htmlRender,
1721
+ });
1722
+
1723
+ const end = () => {
1724
+ removeBackgroundConfirmModal();
1725
+ Modal.removeModal(id);
1726
+ };
1727
+ barConfig.buttons.close.onClick = () => {
1728
+ end();
1729
+ resolve({ status: 'cancelled' });
1730
+ };
1731
+ s(`.background-confirm-modal-${id}`).onclick = () => {
1732
+ end();
1733
+ resolve({ status: 'cancelled' });
1734
+ };
1735
+ s(`.btn-cancel-${id}`).onclick = () => {
1736
+ end();
1737
+ resolve({ status: 'cancelled' });
1738
+ };
1739
+ s(`.btn-confirm-${id}`).onclick = () => {
1740
+ end();
1741
+ resolve({ status: 'confirm' });
1742
+ };
1743
+ });
1744
+ },
1745
+ headerTitleHeight: 40,
1746
+ actionBtnCenter: function () {
1747
+ // if (!s(`.btn-close-modal-menu`).classList.contains('hide')) return s(`.main-btn-home`).click();
1748
+ if (!s(`.btn-close-modal-menu`).classList.contains('hide')) {
1749
+ return s(`.btn-close-modal-menu`).click();
1750
+ }
1751
+ if (!s(`.btn-menu-modal-menu`).classList.contains('hide')) {
1752
+ return s(`.btn-menu-modal-menu`).click();
1753
+ }
1754
+ },
1755
+ cleanUI: function () {
1756
+ s(`.top-bar`).classList.add('hide');
1757
+ s(`.bottom-bar`).classList.add('hide');
1758
+ s(`.modal-menu`).classList.add('hide');
1759
+ },
1760
+ restoreUI: function () {
1761
+ s(`.top-bar`).classList.remove('hide');
1762
+ s(`.bottom-bar`).classList.remove('hide');
1763
+ s(`.modal-menu`).classList.remove('hide');
1764
+ },
1765
+ };
1766
+
1767
+ const renderMenuLabel = ({ img, text, icon }) => {
1768
+ if (!img) return html`<span class="menu-btn-icon">${icon}</span> ${text}`;
1769
+ return html`<img class="abs center img-btn-square-menu" src="${getProxyPath()}assets/ui-icons/${img}" />
1770
+ <div class="abs center main-btn-menu-text">${text}</div>`;
1771
+ };
1772
+
1773
+ const renderViewTitle = (options = { icon: '', img: '', text: '', assetFolder: '', 'ui-icons': '', dim, top }) => {
1774
+ if (options.dim === undefined) options.dim = 60;
1775
+ const { img, text, icon, dim, top } = options;
1776
+ if (!img && !options['ui-icon']) return html`<span class="view-title-icon">${icon}</span> ${text}`;
1777
+ return html`<img
1778
+ class="abs img-btn-square-view-title"
1779
+ style="${renderCssAttr({
1780
+ style: { width: `${dim}px`, height: `${dim}px`, top: top !== undefined ? `${top}px` : `-${dim / 2}px` },
1781
+ })}"
1782
+ src="${options['ui-icon']
1783
+ ? `${getProxyPath()}assets/${options.assetFolder ? options.assetFolder : 'ui-icons'}/${options['ui-icon']}`
1784
+ : img}"
1785
+ />
1786
+ <div class="in text-btn-square-view-title" style="${renderCssAttr({ style: { 'padding-left': `${dim}px` } })}">
1787
+ ${text}
1788
+ </div>`;
1789
+ };
1790
+
1791
+ const buildBadgeToolTipMenuOption = (id, sideKey = 'left') => {
1792
+ const option = {
1793
+ id: `tooltip-content-main-btn-${id}`,
1794
+ text: `${Translate.Render(`${id}`)}`,
1795
+ classList: 'tooltip-menu hide',
1796
+ style: { top: `0px` },
1797
+ };
1798
+ switch (sideKey) {
1799
+ case 'left':
1800
+ option.style.left = '40px';
1801
+
1802
+ break;
1803
+
1804
+ case 'right':
1805
+ option.style.right = '80px';
1806
+ break;
1807
+
1808
+ default:
1809
+ break;
1810
+ }
1811
+ return option;
1812
+ };
1813
+
1814
+ export { Modal, renderMenuLabel, renderViewTitle, buildBadgeToolTipMenuOption };