underpost 2.7.1 → 2.7.2

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 (213) hide show
  1. package/.dockerignore +13 -13
  2. package/.env.development +7 -7
  3. package/.env.production +7 -7
  4. package/.env.test +7 -7
  5. package/.github/workflows/publish.yml +26 -0
  6. package/.nycrc +9 -9
  7. package/.prettierignore +12 -12
  8. package/.prettierrc +9 -9
  9. package/.vscode/extensions.json +72 -72
  10. package/.vscode/settings.json +100 -99
  11. package/Dockerfile +89 -89
  12. package/LICENSE +21 -21
  13. package/README.md +96 -96
  14. package/bin/db.js +172 -119
  15. package/bin/deploy.js +582 -661
  16. package/bin/dns.js +1 -1
  17. package/bin/file.js +92 -92
  18. package/bin/index.js +53 -53
  19. package/bin/install.js +398 -357
  20. package/bin/shortcut.js +44 -44
  21. package/bin/ssl.js +65 -64
  22. package/bin/util.js +182 -182
  23. package/bin/vs.js +35 -35
  24. package/conf.js +251 -249
  25. package/docker-compose.yml +67 -67
  26. package/jsconfig.json +7 -7
  27. package/jsdoc.json +32 -32
  28. package/nodemon.json +6 -6
  29. package/package.json +137 -132
  30. package/prometheus.yml +36 -36
  31. package/setup.sh +24 -24
  32. package/src/api/core/core.controller.js +69 -69
  33. package/src/api/core/core.model.js +11 -11
  34. package/src/api/core/core.router.js +23 -23
  35. package/src/api/core/core.service.js +29 -29
  36. package/src/api/crypto/crypto.controller.js +51 -51
  37. package/src/api/crypto/crypto.model.js +23 -23
  38. package/src/api/crypto/crypto.router.js +20 -20
  39. package/src/api/crypto/crypto.service.js +64 -64
  40. package/src/api/default/default.controller.js +69 -69
  41. package/src/api/default/default.model.js +20 -20
  42. package/src/api/default/default.router.js +23 -23
  43. package/src/api/default/default.service.js +31 -31
  44. package/src/api/file/file.controller.js +53 -51
  45. package/src/api/file/file.model.js +19 -19
  46. package/src/api/file/file.router.js +21 -20
  47. package/src/api/file/file.service.js +76 -70
  48. package/src/api/instance/instance.controller.js +69 -69
  49. package/src/api/instance/instance.model.js +36 -36
  50. package/src/api/instance/instance.router.js +33 -33
  51. package/src/api/instance/instance.service.js +48 -48
  52. package/src/api/test/test.controller.js +59 -59
  53. package/src/api/test/test.model.js +14 -14
  54. package/src/api/test/test.router.js +21 -21
  55. package/src/api/test/test.service.js +35 -35
  56. package/src/api/user/user.build.js +16 -0
  57. package/src/api/user/user.controller.js +70 -70
  58. package/src/api/user/user.model.js +65 -65
  59. package/src/api/user/user.router.js +345 -345
  60. package/src/api/user/user.service.js +479 -479
  61. package/src/api.js +23 -23
  62. package/src/client/Default.index.js +40 -40
  63. package/src/client/components/core/Account.js +290 -290
  64. package/src/client/components/core/AgGrid.js +160 -160
  65. package/src/client/components/core/Auth.js +19 -19
  66. package/src/client/components/core/Badge.js +32 -32
  67. package/src/client/components/core/BlockChain.js +41 -41
  68. package/src/client/components/core/Blog.js +9 -9
  69. package/src/client/components/core/BtnIcon.js +101 -94
  70. package/src/client/components/core/CalendarCore.js +458 -319
  71. package/src/client/components/core/Chat.js +64 -64
  72. package/src/client/components/core/ColorPalette.js +5267 -5267
  73. package/src/client/components/core/CommonJs.js +735 -732
  74. package/src/client/components/core/Content.js +193 -49
  75. package/src/client/components/core/Css.js +1064 -1027
  76. package/src/client/components/core/CssCore.js +817 -796
  77. package/src/client/components/core/D3Chart.js +44 -44
  78. package/src/client/components/core/Docs.js +229 -229
  79. package/src/client/components/core/DropDown.js +164 -164
  80. package/src/client/components/core/EventsUI.js +46 -54
  81. package/src/client/components/core/FileExplorer.js +699 -624
  82. package/src/client/components/core/FullScreen.js +45 -45
  83. package/src/client/components/core/Input.js +346 -259
  84. package/src/client/components/core/JoyStick.js +77 -77
  85. package/src/client/components/core/Keyboard.js +73 -73
  86. package/src/client/components/core/LoadingAnimation.js +179 -157
  87. package/src/client/components/core/LogIn.js +187 -181
  88. package/src/client/components/core/LogOut.js +58 -52
  89. package/src/client/components/core/Logger.js +26 -26
  90. package/src/client/components/core/Modal.js +1612 -1596
  91. package/src/client/components/core/NotificationManager.js +84 -84
  92. package/src/client/components/core/Panel.js +613 -413
  93. package/src/client/components/core/PanelForm.js +468 -0
  94. package/src/client/components/core/Polyhedron.js +162 -162
  95. package/src/client/components/core/Recover.js +204 -204
  96. package/src/client/components/core/Responsive.js +53 -53
  97. package/src/client/components/core/RichText.js +51 -27
  98. package/src/client/components/core/Router.js +76 -77
  99. package/src/client/components/core/Scroll.js +34 -0
  100. package/src/client/components/core/SignUp.js +125 -125
  101. package/src/client/components/core/SocketIo.js +72 -72
  102. package/src/client/components/core/Stream.js +113 -113
  103. package/src/client/components/core/ToggleSwitch.js +87 -87
  104. package/src/client/components/core/ToolTip.js +26 -26
  105. package/src/client/components/core/Translate.js +437 -408
  106. package/src/client/components/core/Validator.js +100 -100
  107. package/src/client/components/core/VanillaJs.js +460 -457
  108. package/src/client/components/core/Wallet.js +106 -106
  109. package/src/client/components/core/Webhook.js +25 -25
  110. package/src/client/components/core/Worker.js +272 -272
  111. package/src/client/components/default/CommonDefault.js +29 -29
  112. package/src/client/components/default/CssDefault.js +13 -13
  113. package/src/client/components/default/ElementsDefault.js +38 -38
  114. package/src/client/components/default/LogInDefault.js +41 -41
  115. package/src/client/components/default/LogOutDefault.js +28 -28
  116. package/src/client/components/default/MenuDefault.js +389 -389
  117. package/src/client/components/default/RoutesDefault.js +48 -48
  118. package/src/client/components/default/SettingsDefault.js +16 -16
  119. package/src/client/components/default/SignUpDefault.js +9 -9
  120. package/src/client/components/default/SocketIoDefault.js +54 -54
  121. package/src/client/components/default/TranslateDefault.js +7 -7
  122. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  123. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  124. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  125. package/src/client/public/default/browserconfig.xml +11 -11
  126. package/src/client/public/default/manifest.webmanifest +68 -68
  127. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  128. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  129. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  130. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  131. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  132. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  133. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  134. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  135. package/src/client/public/default/sitemap +147 -147
  136. package/src/client/public/default/yandex-browser-manifest.json +8 -8
  137. package/src/client/public/doc/sitemap +147 -147
  138. package/src/client/public/test/sitemap +147 -147
  139. package/src/client/services/core/core.service.js +170 -152
  140. package/src/client/services/crypto/crypto.service.js +70 -70
  141. package/src/client/services/default/default.management.js +345 -345
  142. package/src/client/services/default/default.service.js +89 -89
  143. package/src/client/services/file/file.service.js +70 -70
  144. package/src/client/services/instance/instance.management.js +74 -74
  145. package/src/client/services/instance/instance.service.js +89 -89
  146. package/src/client/services/test/test.service.js +70 -70
  147. package/src/client/services/user/user.management.js +50 -50
  148. package/src/client/services/user/user.service.js +89 -89
  149. package/src/client/ssr/Render.js +16 -16
  150. package/src/client/ssr/body-components/CacheControl.js +114 -113
  151. package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -79
  152. package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -21
  153. package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -17
  154. package/src/client/ssr/head-components/Css.js +241 -241
  155. package/src/client/ssr/head-components/DefaultScripts.js +3 -3
  156. package/src/client/ssr/head-components/Microdata.js +11 -11
  157. package/src/client/ssr/head-components/Production.js +1 -1
  158. package/src/client/ssr/head-components/PwaDefault.js +59 -59
  159. package/src/client/ssr/head-components/Seo.js +14 -14
  160. package/src/client/sw/default.sw.js +201 -201
  161. package/src/client/sw/template.sw.js +84 -84
  162. package/src/client.build.js +22 -22
  163. package/src/client.dev.js +21 -21
  164. package/src/cron.js +25 -25
  165. package/src/db/DataBaseProvider.js +34 -34
  166. package/src/db/mariadb/MariaDB.js +33 -33
  167. package/src/db/mongo/MongooseDB.js +46 -46
  168. package/src/dns.js +22 -22
  169. package/src/index.js +42 -29
  170. package/src/mailer/EmailRender.js +69 -69
  171. package/src/mailer/MailerProvider.js +96 -96
  172. package/src/proxy.js +22 -22
  173. package/src/runtime/lampp/Lampp.js +69 -44
  174. package/src/runtime/nginx/Nginx.js +3 -3
  175. package/src/runtime/xampp/Xampp.js +49 -49
  176. package/src/server/auth.js +235 -204
  177. package/src/server/backup.js +101 -94
  178. package/src/server/client-build-live.js +72 -72
  179. package/src/server/client-build.js +705 -699
  180. package/src/server/client-dev-server.js +60 -58
  181. package/src/server/client-formatted.js +48 -48
  182. package/src/server/client-icons.js +149 -150
  183. package/src/server/conf.js +860 -611
  184. package/src/server/dns.js +98 -98
  185. package/src/server/downloader.js +42 -42
  186. package/src/server/logger.js +180 -180
  187. package/src/server/network.js +122 -122
  188. package/src/server/peer.js +33 -33
  189. package/src/server/process.js +66 -66
  190. package/src/server/prompt-optimizer.js +28 -28
  191. package/src/server/proxy.js +118 -118
  192. package/src/server/runtime.js +444 -393
  193. package/src/server/ssl.js +109 -107
  194. package/src/server.js +25 -25
  195. package/src/ws/IoInterface.js +45 -45
  196. package/src/ws/IoServer.js +39 -39
  197. package/src/ws/core/channels/core.ws.chat.js +23 -23
  198. package/src/ws/core/channels/core.ws.mailer.js +35 -35
  199. package/src/ws/core/channels/core.ws.stream.js +31 -31
  200. package/src/ws/core/core.ws.connection.js +28 -28
  201. package/src/ws/core/core.ws.emit.js +14 -14
  202. package/src/ws/core/core.ws.server.js +24 -24
  203. package/src/ws/core/management/core.ws.chat.js +8 -8
  204. package/src/ws/core/management/core.ws.mailer.js +16 -16
  205. package/src/ws/core/management/core.ws.stream.js +8 -8
  206. package/src/ws/default/channels/default.ws.main.js +16 -16
  207. package/src/ws/default/default.ws.connection.js +22 -22
  208. package/src/ws/default/default.ws.emit.js +14 -14
  209. package/src/ws/default/default.ws.server.js +20 -20
  210. package/src/ws/default/management/default.ws.main.js +8 -8
  211. package/startup.js +11 -11
  212. package/supervisord-openssh-server.conf +4 -4
  213. package/test/api.test.js +60 -60
@@ -1,319 +1,458 @@
1
- import { EventSchedulerService } from '../../services/event-scheduler/event-scheduler.service.js';
2
- import { Auth } from './Auth.js';
3
- import { BtnIcon } from './BtnIcon.js';
4
- import { range, s4 } from './CommonJs.js';
5
- import { Modal } from './Modal.js';
6
- import { NotificationManager } from './NotificationManager.js';
7
- import { Panel } from './Panel.js';
8
- import { Responsive } from './Responsive.js';
9
- import { RouterEvents } from './Router.js';
10
- import { Translate } from './Translate.js';
11
- import { append, getTimeZone, htmls, s, sa } from './VanillaJs.js';
12
-
13
- // https://fullcalendar.io/docs/event-object
14
-
15
- const CalendarCore = {
16
- RenderStyle: async function () {},
17
- Render: async function (options = { idModal: '' }) {
18
- let calendar;
19
- let data = range(0, 5).map((i) => {
20
- return {
21
- id: `event-${i}`,
22
- description: `Event ${s4()}${s4()}${s4()}`,
23
- start: new Date().toTimeString(),
24
- end: new Date().toTimeString(),
25
- };
26
- });
27
-
28
- {
29
- if (Auth.getToken()) {
30
- const result = await EventSchedulerService.get({
31
- id: `creatorUser`,
32
- });
33
- NotificationManager.Push({
34
- html: result.status === 'success' ? Translate.Render('success-get-events-scheduler') : result.message,
35
- status: result.status,
36
- });
37
- if (result.status === 'success')
38
- data = result.data
39
- .map((o) => {
40
- o.id = o._id;
41
- return o;
42
- })
43
- .reverse();
44
- }
45
- }
46
- const renderCalendar = () => {
47
- const calendarEl = s('#calendar');
48
- calendar = new FullCalendar.Calendar(calendarEl, {
49
- plugins: [FullCalendar.DayGrid.default, FullCalendar.TimeGrid.default, FullCalendar.List.default],
50
- // initialView: 'dayGridWeek',
51
- timeZone: getTimeZone(),
52
- dateClick: function (arg) {
53
- console.error('calendar dateClick', arg.date.toString());
54
- },
55
- events: [{ title: 'Meeting', start: new Date() }],
56
- initialView: 'dayGridMonth',
57
- headerToolbar: {
58
- left: 'prev,next today',
59
- center: 'title',
60
- right: 'dayGridMonth,timeGridWeek,listWeek',
61
- },
62
- });
63
-
64
- calendar.render();
65
- };
66
- setTimeout(() => {
67
- renderCalendar();
68
- Translate.Event['fullcalendar-lang'] = () => {
69
- calendar.setOption('locale', s(`html`).lang);
70
- if (s(`.fc-timegrid-axis-cushion`)) htmls(`.fc-timegrid-axis-cushion`, Translate.Render('all-day'));
71
- if (s(`.fc-dayGridMonth-button`)) htmls(`.fc-dayGridMonth-button`, Translate.Render('month'));
72
- if (s(`.fc-timeGridWeek-button`)) htmls(`.fc-timeGridWeek-button`, Translate.Render('week'));
73
- if (s(`.fc-listWeek-button`)) htmls(`.fc-listWeek-button`, Translate.Render('summary'));
74
- if (s(`.fc-today-button`)) htmls(`.fc-today-button`, Translate.Render('today'));
75
- };
76
- setTimeout(() => {
77
- Translate.Event['fullcalendar-lang']();
78
- s(`.fc-dayGridMonth-button`).onclick = () => {
79
- Translate.Event['fullcalendar-lang']();
80
- };
81
- s(`.fc-listWeek-button`).onclick = () => {
82
- Translate.Event['fullcalendar-lang']();
83
- };
84
- s(`.fc-timeGridWeek-button`).onclick = () => {
85
- Translate.Event['fullcalendar-lang']();
86
- };
87
- s(`.fc-next-button`).onclick = () => {
88
- Translate.Event['fullcalendar-lang']();
89
- };
90
- s(`.fc-prev-button`).onclick = () => {
91
- Translate.Event['fullcalendar-lang']();
92
- };
93
- s(`.fc-today-button`).onclick = () => {
94
- Translate.Event['fullcalendar-lang']();
95
- };
96
- });
97
-
98
- sa(`.fc-button-group`)[1].style.float = 'right';
99
- });
100
-
101
- const idPanel = 'calendar-panel';
102
- const formData = [
103
- {
104
- model: 'id',
105
- id: 'id',
106
- inputType: 'text',
107
- disableRender: true,
108
- rules: [{ type: 'isEmpty' }],
109
- },
110
- {
111
- id: 'description',
112
- model: 'description',
113
- inputType: 'text',
114
- rules: [{ type: 'isEmpty' }],
115
- panel: { type: 'title' },
116
- },
117
- {
118
- id: 'allDay',
119
- model: 'allDay',
120
- inputType: 'checkbox-on-off',
121
- rules: [],
122
- panel: { type: 'info-row', icon: html`<i class="fa-solid fa-infinity"></i>` },
123
- },
124
- {
125
- id: 'start',
126
- model: 'start',
127
- inputType: 'datetime-local',
128
- panel: { type: 'subtitle' },
129
- },
130
- {
131
- id: 'end',
132
- model: 'end',
133
- inputType: 'datetime-local',
134
- panel: { type: 'info-row' },
135
- },
136
- ];
137
-
138
- const heightTopBar = 100;
139
- const heightBottomBar = 0;
140
-
141
- setTimeout(() => {
142
- const resizeModal = () => {
143
- Modal.Data[options.idModal].onObserverListener[options.idModal] = () => {
144
- if (s(`.main-body-calendar`))
145
- s(`.main-body-calendar`).style.height = `${
146
- s(`.${options.idModal}`).offsetHeight - Modal.headerTitleHeight
147
- }px`;
148
- };
149
- Modal.Data[options.idModal].onObserverListener[options.idModal]();
150
- };
151
- setTimeout(resizeModal);
152
- RouterEvents[`${options.idModal}-main-body`] = ({ route }) => {
153
- if (route === 'calendar') {
154
- setTimeout(() => {
155
- resizeModal();
156
- }, 400);
157
- }
158
- };
159
-
160
- s(`.close-calendar-container`).onclick = () => {
161
- s(`.calendar-container`).classList.add('hide');
162
- s(`.main-body-calendar`).classList.remove('hide');
163
- htmls(
164
- `.style-calendar`,
165
- html`<style>
166
- .modal-calendar {
167
- overflow: hidden;
168
- }
169
- </style>`,
170
- );
171
- };
172
- });
173
-
174
- return html`
175
- <style>
176
- .main-body-calendar {
177
- overflow: auto;
178
- }
179
- .${idPanel}-form {
180
- max-width: 750px !important;
181
- }
182
- </style>
183
- <div class="style-calendar">
184
- <style>
185
- .modal-calendar {
186
- overflow: hidden;
187
- }
188
- </style>
189
- </div>
190
-
191
- <div class="in main-body-calendar">
192
- ${await Panel.Render({
193
- idPanel,
194
- parentIdModal: options.idModal,
195
- formData,
196
- heightTopBar,
197
- heightBottomBar,
198
- data,
199
- formContainerClass: '',
200
- customFormHeightAdjust: 120,
201
- scrollClassContainer: 'main-body-calendar',
202
- titleIcon: html`<i class="fas fa-calendar-alt"></i>`,
203
- route: 'calendar',
204
- callBackPanelRender: async function ({ data, imgRender, htmlRender }) {
205
- return await htmlRender({
206
- render: html`<div class="abs center">
207
- <i class="far fa-calendar" style="font-size: 130px; color: #d3d3d3cf;"></i>
208
- </div>`,
209
- });
210
- },
211
- customButtons: [
212
- {
213
- label: html`<i class="fa-regular fa-calendar-days"></i> ${Translate.Render('calendar')}`,
214
- onClick: function () {
215
- s(`.calendar-container`).classList.remove('hide');
216
- s(`.main-body-calendar`).classList.add('hide');
217
- // renderCalendar();
218
- calendar.setOption('height', 700);
219
- Translate.Event['fullcalendar-lang']();
220
- htmls(
221
- `.style-calendar`,
222
- html`<style>
223
- .modal-calendar {
224
- overflow: auto;
225
- }
226
- </style>`,
227
- );
228
- },
229
- },
230
- ],
231
- on: {
232
- add: async function ({ data }) {
233
- const { status, message } = await EventSchedulerService.post({ body: data });
234
- NotificationManager.Push({
235
- html: status === 'success' ? Translate.Render('success-add-event-scheduler') : message,
236
- status: status,
237
- });
238
- return { data, status, message };
239
- },
240
- },
241
- })}
242
- <div class="in" style="margin-bottom: 100px"></div>
243
- </div>
244
- <style>
245
- .calendar-container {
246
- color: black;
247
- background: #fcfcfc;
248
- }
249
-
250
- .calendar-container a {
251
- color: #4a4a4a;
252
- cursor: pointer;
253
- }
254
- .calendar-container a:hover {
255
- color: #8a8a8a;
256
- }
257
-
258
- .fc-toolbar-title {
259
- font-size: 20px !important;
260
- margin: 0px !important;
261
- text-transform: uppercase;
262
- color: #8a8a8a;
263
- padding: 10px 5px 5px 5px;
264
- }
265
-
266
- .fc-button,
267
- .fc-button-primary {
268
- border: none !important;
269
- border-radius: 0px !important;
270
- background: #b1b1b1 !important;
271
- margin: 3px !important;
272
- /* color: #4a4a4a; */
273
- }
274
-
275
- .fc-button-primary:hover,
276
- .fc-button:hover {
277
- background: #4a4a4a !important;
278
- /* background: #b1b1b1 !important; */
279
- /* box-shadow: none !important;
280
- border-radius: 0px !important;
281
- border: none !important; */
282
- }
283
-
284
- .fc-button-primary:active .fc-button:active {
285
- /* box-shadow: none !important;
286
- border-radius: 0px !important;
287
- border: none !important; */
288
- }
289
-
290
- .fc-toolbar {
291
- display: block !important;
292
- }
293
-
294
- .fc-toolbar-chunk {
295
- padding: 5px;
296
- }
297
-
298
- .calendar-buttons-container {
299
- padding-bottom: 15px;
300
- top: ${Modal.headerTitleHeight}px;
301
- height: 60px;
302
- z-index: 4;
303
- }
304
- </style>
305
- <div class="in calendar-container hide">
306
- <div class="stq modal calendar-buttons-container">
307
- ${await BtnIcon.Render({
308
- class: `section-mp btn-custom close-calendar-container flr`,
309
- label: html`<i class="fa-solid fa-xmark"></i> ${Translate.Render('close')}`,
310
- type: 'button',
311
- })}
312
- </div>
313
- <div class="in"><div id="calendar"></div></div>
314
- </div>
315
- `;
316
- },
317
- };
318
-
319
- export { CalendarCore };
1
+ import { EventSchedulerService } from '../../services/event-scheduler/event-scheduler.service.js';
2
+ import { Auth } from './Auth.js';
3
+ import { BtnIcon } from './BtnIcon.js';
4
+ import { newInstance, range, s4 } from './CommonJs.js';
5
+ import { renderCssAttr } from './Css.js';
6
+ import { Modal } from './Modal.js';
7
+ import { NotificationManager } from './NotificationManager.js';
8
+ import { Panel } from './Panel.js';
9
+ import { Responsive } from './Responsive.js';
10
+ import { listenQueryPathInstance, RouterEvents, setQueryPath } from './Router.js';
11
+ import { Translate } from './Translate.js';
12
+ import { append, getQueryParams, getTimeZone, htmls, s, sa } from './VanillaJs.js';
13
+
14
+ // https://fullcalendar.io/docs/event-object
15
+
16
+ const CalendarCore = {
17
+ RenderStyle: async function () {},
18
+ Data: {},
19
+ Render: async function (options = { idModal: '', Elements: {}, heightTopBar: 50, heightBottomBar: 50 }) {
20
+ this.Data[options.idModal] = {
21
+ data: [],
22
+ originData: [],
23
+ filesData: [],
24
+ calendar: {},
25
+ };
26
+
27
+ const { heightTopBar, heightBottomBar } = options;
28
+
29
+ const titleIcon = html`<i class="fas fa-calendar-alt"></i>`;
30
+
31
+ const getSrrData = () => {
32
+ this.Data[options.idModal].data = range(0, 5).map((i) => {
33
+ return {
34
+ id: `event-${i}`,
35
+ description: `Event ${s4()}${s4()}${s4()}`,
36
+ start: new Date().toTimeString(),
37
+ end: new Date().toTimeString(),
38
+ };
39
+ });
40
+ };
41
+ getSrrData();
42
+
43
+ const dateFormat = (date) =>
44
+ html`<span
45
+ style="${renderCssAttr({
46
+ style: {
47
+ 'font-size': '14px',
48
+ color: '#888',
49
+ },
50
+ })}"
51
+ >${new Date(date).toLocaleString().replaceAll(',', '')}</span
52
+ >`;
53
+
54
+ const getPanelData = async () => {
55
+ const result = await EventSchedulerService.get({
56
+ id: `${getQueryParams().cid ? getQueryParams().cid : 'creatorUser'}`,
57
+ });
58
+ NotificationManager.Push({
59
+ html: result.status === 'success' ? Translate.Render('success-get-events-scheduler') : result.message,
60
+ status: result.status,
61
+ });
62
+ if (result.status === 'success') {
63
+ const resultData = Array.isArray(result.data) ? result.data : [result.data];
64
+ this.Data[options.idModal].filesData = [];
65
+ this.Data[options.idModal].originData = newInstance(resultData);
66
+ this.Data[options.idModal].data = resultData.map((o) => {
67
+ if (o.creatorUserId && options.Elements.Data.user.main.model.user._id === o.creatorUserId) o.tools = true;
68
+ o.id = o._id;
69
+ o.start = dateFormat(o.start);
70
+ o.end = dateFormat(o.end);
71
+ this.Data[options.idModal].filesData.push({});
72
+ return o;
73
+ });
74
+ }
75
+ };
76
+
77
+ const renderCalendar = () => {
78
+ const calendarEl = s(`.calendar-${idPanel}`);
79
+ this.Data[options.idModal].calendar = new FullCalendar.Calendar(calendarEl, {
80
+ plugins: [FullCalendar.DayGrid.default, FullCalendar.TimeGrid.default, FullCalendar.List.default],
81
+ // initialView: 'dayGridWeek',
82
+ timeZone: getTimeZone(),
83
+ dateClick: function (arg) {
84
+ console.error('calendar dateClick', arg.date.toString());
85
+ },
86
+ events: [{ title: 'Meeting', start: new Date() }],
87
+ initialView: 'dayGridMonth',
88
+ headerToolbar: {
89
+ left: 'prev,next today',
90
+ center: 'title',
91
+ right: 'dayGridMonth,timeGridWeek,listWeek',
92
+ },
93
+ });
94
+
95
+ this.Data[options.idModal].calendar.render();
96
+ };
97
+ setTimeout(() => {
98
+ renderCalendar();
99
+ Translate.Event['fullcalendar-lang'] = () => {
100
+ this.Data[options.idModal].calendar.setOption('locale', s(`html`).lang);
101
+ if (s(`.fc-timegrid-axis-cushion`)) htmls(`.fc-timegrid-axis-cushion`, Translate.Render('all-day'));
102
+ if (s(`.fc-dayGridMonth-button`)) htmls(`.fc-dayGridMonth-button`, Translate.Render('month'));
103
+ if (s(`.fc-timeGridWeek-button`)) htmls(`.fc-timeGridWeek-button`, Translate.Render('week'));
104
+ if (s(`.fc-listWeek-button`)) htmls(`.fc-listWeek-button`, Translate.Render('summary'));
105
+ if (s(`.fc-today-button`)) htmls(`.fc-today-button`, Translate.Render('today'));
106
+ };
107
+ setTimeout(() => {
108
+ Translate.Event['fullcalendar-lang']();
109
+ s(`.fc-dayGridMonth-button`).onclick = () => {
110
+ Translate.Event['fullcalendar-lang']();
111
+ };
112
+ s(`.fc-listWeek-button`).onclick = () => {
113
+ Translate.Event['fullcalendar-lang']();
114
+ };
115
+ s(`.fc-timeGridWeek-button`).onclick = () => {
116
+ Translate.Event['fullcalendar-lang']();
117
+ };
118
+ s(`.fc-next-button`).onclick = () => {
119
+ Translate.Event['fullcalendar-lang']();
120
+ };
121
+ s(`.fc-prev-button`).onclick = () => {
122
+ Translate.Event['fullcalendar-lang']();
123
+ };
124
+ s(`.fc-today-button`).onclick = () => {
125
+ Translate.Event['fullcalendar-lang']();
126
+ };
127
+ });
128
+
129
+ sa(`.fc-button-group`)[1].style.float = 'right';
130
+ });
131
+
132
+ const idPanel = `calendar-panel-${options.idModal}`;
133
+ const formData = [
134
+ {
135
+ model: 'id',
136
+ id: 'id',
137
+ inputType: 'text',
138
+ disableRender: true,
139
+ rules: [{ type: 'isEmpty' }],
140
+ },
141
+ {
142
+ id: 'description',
143
+ model: 'description',
144
+ inputType: 'text',
145
+ rules: [{ type: 'isEmpty' }],
146
+ panel: { type: 'title' },
147
+ },
148
+ {
149
+ id: 'allDay',
150
+ model: 'allDay',
151
+ inputType: 'checkbox-on-off',
152
+ rules: [],
153
+ panel: { type: 'info-row', icon: html`<i class="fa-solid fa-infinity"></i>` },
154
+ },
155
+ {
156
+ id: 'start',
157
+ model: 'start',
158
+ inputType: 'datetime-local',
159
+ panel: { type: 'subtitle' },
160
+ },
161
+ {
162
+ id: 'end',
163
+ model: 'end',
164
+ inputType: 'datetime-local',
165
+ panel: { type: 'info-row' },
166
+ },
167
+ ];
168
+
169
+ setTimeout(() => {
170
+ const resizeModal = () => {
171
+ Modal.Data[options.idModal].onObserverListener[options.idModal] = () => {
172
+ if (s(`.main-body-calendar-${options.idModal}`))
173
+ s(`.main-body-calendar-${options.idModal}`).style.height = `${
174
+ s(`.${options.idModal}`).offsetHeight - Modal.headerTitleHeight
175
+ }px`;
176
+ };
177
+ Modal.Data[options.idModal].onObserverListener[options.idModal]();
178
+ };
179
+ setTimeout(resizeModal);
180
+ RouterEvents[`${options.idModal}-main-body`] = ({ route }) => {
181
+ if (route === 'calendar') {
182
+ setTimeout(() => {
183
+ resizeModal();
184
+ }, 400);
185
+ }
186
+ };
187
+
188
+ s(`.close-calendar-container`).onclick = () => {
189
+ s(`.calendar-container`).classList.add('hide');
190
+ s(`.main-body-calendar-${options.idModal}`).classList.remove('hide');
191
+ htmls(
192
+ `.style-calendar`,
193
+ html`<style>
194
+ .modal-calendar {
195
+ overflow: hidden;
196
+ }
197
+ </style>`,
198
+ );
199
+ };
200
+ });
201
+
202
+ const panelRender = async () => {
203
+ return html`${await Panel.Render({
204
+ idPanel,
205
+ parentIdModal: options.idModal,
206
+ formData,
207
+ heightTopBar,
208
+ heightBottomBar,
209
+ data: this.Data[options.idModal].data,
210
+ formContainerClass: '',
211
+ scrollClassContainer: `main-body-calendar-${options.idModal}`,
212
+ originData: () => this.Data[options.idModal].originData,
213
+ filesData: () => this.Data[options.idModal].filesData,
214
+ onClick: async function ({ payload }) {
215
+ if (options.route) {
216
+ setQueryPath({ path: options.route, queryPath: payload._id });
217
+ if (options.parentIdModal) Modal.Data[options.parentIdModal].query = `${window.location.search}`;
218
+ if (CalendarCore.Data[options.idModal].updatePanel)
219
+ await CalendarCore.Data[options.idModal].updatePanel();
220
+ }
221
+ },
222
+ titleIcon,
223
+ route: 'calendar',
224
+ callBackPanelRender: async function ({ data, fileRender, htmlRender }) {
225
+ return await htmlRender({
226
+ render: html`<div class="abs center">
227
+ <i class="far fa-calendar" style="font-size: 130px; color: #d3d3d3cf;"></i>
228
+ </div>`,
229
+ });
230
+ },
231
+ customButtons: [
232
+ {
233
+ label: html`<i class="fa-regular fa-calendar-days"></i> ${Translate.Render('calendar')}`,
234
+ onClick: function () {
235
+ s(`.calendar-container`).classList.remove('hide');
236
+ s(`.main-body-calendar-${options.idModal}`).classList.add('hide');
237
+ // renderCalendar();
238
+ CalendarCore.Data[options.idModal].calendar.setOption('height', 700);
239
+ Translate.Event['fullcalendar-lang']();
240
+ htmls(
241
+ `.style-calendar`,
242
+ html`<style>
243
+ .modal-calendar {
244
+ overflow: auto;
245
+ }
246
+ </style>`,
247
+ );
248
+ },
249
+ },
250
+ ],
251
+ on: {
252
+ add: async function ({ data, editId }) {
253
+ const {
254
+ status,
255
+ message,
256
+ data: documentData,
257
+ } = editId
258
+ ? await EventSchedulerService.put({ id: editId, body: { ...data, _id: undefined } })
259
+ : await EventSchedulerService.post({ body: data });
260
+ NotificationManager.Push({
261
+ html:
262
+ status === 'success'
263
+ ? editId
264
+ ? Translate.Render('success-edit-event-scheduler')
265
+ : Translate.Render('success-add-event-scheduler')
266
+ : message,
267
+ status: status,
268
+ });
269
+
270
+ if (status === 'success') {
271
+ data.start = dateFormat(data.start);
272
+ data.end = dateFormat(data.end);
273
+ data.tools = true;
274
+ data._id = documentData._id;
275
+
276
+ let originObj, indexOriginObj;
277
+ let filesData = {};
278
+ if (editId) {
279
+ indexOriginObj = CalendarCore.Data[options.idModal].originData.findIndex((d) => d._id === editId);
280
+ if (indexOriginObj > -1) originObj = CalendarCore.Data[options.idModal].originData[indexOriginObj];
281
+ }
282
+ if (originObj) {
283
+ CalendarCore.Data[options.idModal].originData[indexOriginObj] = documentData;
284
+ CalendarCore.Data[options.idModal].data[indexOriginObj] = data;
285
+ CalendarCore.Data[options.idModal].filesData[indexOriginObj] = filesData;
286
+ } else {
287
+ CalendarCore.Data[options.idModal].originData.push(documentData);
288
+ CalendarCore.Data[options.idModal].data.push(data);
289
+ CalendarCore.Data[options.idModal].filesData.push(filesData);
290
+ }
291
+
292
+ setQueryPath({ path: options.route, queryPath: documentData._id });
293
+ if (options.parentIdModal) Modal.Data[options.parentIdModal].query = `${window.location.search}`;
294
+ if (CalendarCore.Data[options.idModal].updatePanel)
295
+ await CalendarCore.Data[options.idModal].updatePanel();
296
+ }
297
+ return { data, status, message };
298
+ },
299
+ remove: async function ({ e, data }) {
300
+ e.preventDefault();
301
+ const confirmResult = await Modal.RenderConfirm({
302
+ html: async () => {
303
+ return html`
304
+ <div class="in section-mp" style="text-align: center">
305
+ ${Translate.Render('confirm-delete-item')}
306
+ <br />
307
+ "${data.description}"
308
+ </div>
309
+ `;
310
+ },
311
+ id: `delete-${idPanel}`,
312
+ });
313
+ if (confirmResult.status === 'confirm') {
314
+ const { status, message } = await EventSchedulerService.delete({
315
+ id: data._id,
316
+ });
317
+ NotificationManager.Push({
318
+ html: status,
319
+ status,
320
+ });
321
+
322
+ if (getQueryParams().cid === data.id) {
323
+ setQueryPath({ path: options.route, queryPath: '' });
324
+ if (CalendarCore.Data[options.idModal].updatePanel)
325
+ await CalendarCore.Data[options.idModal].updatePanel();
326
+ }
327
+
328
+ return { status };
329
+ }
330
+ return { status: 'error' };
331
+ },
332
+ },
333
+ })}
334
+ <div class="in" style="margin-bottom: 100px"></div>`;
335
+ };
336
+
337
+ let lastCid;
338
+ let lasUserId;
339
+ this.Data[options.idModal].updatePanel = async () => {
340
+ const cid = getQueryParams().cid ? getQueryParams().cid : '';
341
+ if (lastCid === cid && lasUserId === options.Elements.Data.user.main.model.user._id) return;
342
+ if (options.route === 'home') Modal.homeCid = newInstance(cid);
343
+ lasUserId = newInstance(options.Elements.Data.user.main.model.user._id);
344
+ lastCid = cid;
345
+ if (s(`.main-body-calendar-${options.idModal}`)) {
346
+ if (Auth.getToken()) await getPanelData();
347
+ else getSrrData();
348
+ htmls(`.main-body-calendar-${options.idModal}`, await panelRender());
349
+ }
350
+ };
351
+
352
+ if (options.route)
353
+ listenQueryPathInstance({
354
+ id: options.parentIdModal ? 'html-' + options.parentIdModal : 'main-body',
355
+ routeId: options.route,
356
+ event: async (path) => {
357
+ setTimeout(() => {
358
+ CalendarCore.Data[options.idModal].updatePanel();
359
+ });
360
+ },
361
+ });
362
+
363
+ if (options.route === 'home') setTimeout(CalendarCore.Data[options.idModal].updatePanel);
364
+
365
+ return html`
366
+ <style>
367
+ .main-body-calendar-${options.idModal} {
368
+ overflow: auto;
369
+ }
370
+ .${idPanel}-form {
371
+ max-width: 750px !important;
372
+ }
373
+ </style>
374
+ <div class="style-calendar">
375
+ <style>
376
+ .modal-calendar {
377
+ overflow: hidden;
378
+ }
379
+ </style>
380
+ </div>
381
+
382
+ <div class="in main-body-calendar-${options.idModal}">${await panelRender()}</div>
383
+ <style>
384
+ .calendar-container {
385
+ color: black;
386
+ background: #fcfcfc;
387
+ }
388
+
389
+ .calendar-container a {
390
+ color: #4a4a4a;
391
+ cursor: pointer;
392
+ }
393
+ .calendar-container a:hover {
394
+ color: #8a8a8a;
395
+ }
396
+
397
+ .fc-toolbar-title {
398
+ font-size: 20px !important;
399
+ margin: 0px !important;
400
+ text-transform: uppercase;
401
+ color: #8a8a8a;
402
+ padding: 10px 5px 5px 5px;
403
+ }
404
+
405
+ .fc-button,
406
+ .fc-button-primary {
407
+ border: none !important;
408
+ border-radius: 0px !important;
409
+ background: #b1b1b1 !important;
410
+ margin: 3px !important;
411
+ /* color: #4a4a4a; */
412
+ }
413
+
414
+ .fc-button-primary:hover,
415
+ .fc-button:hover {
416
+ background: #4a4a4a !important;
417
+ /* background: #b1b1b1 !important; */
418
+ /* box-shadow: none !important;
419
+ border-radius: 0px !important;
420
+ border: none !important; */
421
+ }
422
+
423
+ .fc-button-primary:active .fc-button:active {
424
+ /* box-shadow: none !important;
425
+ border-radius: 0px !important;
426
+ border: none !important; */
427
+ }
428
+
429
+ .fc-toolbar {
430
+ display: block !important;
431
+ }
432
+
433
+ .fc-toolbar-chunk {
434
+ padding: 5px;
435
+ }
436
+
437
+ .calendar-buttons-container {
438
+ padding-bottom: 15px;
439
+ top: ${Modal.headerTitleHeight}px;
440
+ height: 60px;
441
+ z-index: 4;
442
+ }
443
+ </style>
444
+ <div class="in calendar-container hide">
445
+ <div class="stq modal calendar-buttons-container">
446
+ ${await BtnIcon.Render({
447
+ class: `section-mp btn-custom close-calendar-container flr`,
448
+ label: html`<i class="fa-solid fa-xmark"></i> ${Translate.Render('close')}`,
449
+ type: 'button',
450
+ })}
451
+ </div>
452
+ <div class="in"><div class="calendar-${idPanel}"></div></div>
453
+ </div>
454
+ `;
455
+ },
456
+ };
457
+
458
+ export { CalendarCore };