adminizer 4.3.0-build.99 → 4.3.1

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 (163) hide show
  1. package/assets/add-9NSjG6Jx.js +1 -0
  2. package/assets/add-form-uUiOWEy_.js +1 -0
  3. package/assets/add-group-Db0HkA1m.js +1 -0
  4. package/assets/add-group-form-DMz0_Oo9.js +1 -0
  5. package/assets/add-user-BMklpOqf.js +1 -0
  6. package/assets/{add-user-form-DrclnTOd.js → add-user-form-izlXhv2-.js} +1 -1
  7. package/assets/{app-D8oqdt8J.css → app-BJd5vD4i.css} +1 -1
  8. package/assets/app-layout-DcgYmhNb.js +1 -0
  9. package/assets/{app-shell-CHEYhVco.js → app-shell-C8Cnr5Hy.js} +1 -1
  10. package/assets/app-sidebar-HwvXNZzk.js +1 -0
  11. package/assets/app-sidebar-header-C8TTx8yd.js +1 -0
  12. package/assets/app.js +5 -5
  13. package/assets/{breadcrumbs-C439DWrC.js → breadcrumbs-DSMzNYiS.js} +1 -1
  14. package/assets/catalog-C2INmTwI.js +6 -0
  15. package/assets/catalog-D4n6dpGl.css +1 -0
  16. package/assets/{dashboard-Bi5KeZu2.js → dashboard-DwFL6nqn.js} +1 -1
  17. package/assets/{date-picker-DbJ8nHp5.js → date-picker-kW3wZQr_.js} +1 -1
  18. package/assets/{del-modal-_b3CSNHb.js → del-modal-DyIWFflP.js} +1 -1
  19. package/assets/{field-renderer-4obZ_jUo.js → field-renderer-BNQVfOir.js} +3 -3
  20. package/assets/form-CAIoGuhZ.js +1 -0
  21. package/assets/form-NUd-JZJN.js +1 -0
  22. package/assets/{geo-json-CadjdhwW.js → geo-json-YeWQOYnT.js} +1 -1
  23. package/assets/{home-BUoDaWe0.js → home-CteDT1us.js} +2 -2
  24. package/assets/{icon-DM49pZW3.js → icon-DpkedrXG.js} +1 -1
  25. package/assets/{init-user-DNrB8Xt5.js → init-user-DaOvt0vG.js} +1 -1
  26. package/assets/{input-error--IOnWghB.js → input-error-CmXZF6xy.js} +1 -1
  27. package/assets/list-CXQmJbH8.js +1 -0
  28. package/assets/{list-table-BKxxQkCW.js → list-table-BPpHDVPf.js} +4 -4
  29. package/assets/{login-6Xb8bcPq.js → login-DR6fvKtm.js} +1 -1
  30. package/assets/manifest.json +82 -82
  31. package/assets/{material-icon-BedgD2NE.js → material-icon-DwkE6wKL.js} +1 -1
  32. package/assets/media-manager-DYOfUh8F.js +14 -0
  33. package/assets/{module-B4-7WkY5.js → module-BIUqcf4-.js} +1 -1
  34. package/assets/{nav-footer-BwkQkwow.js → nav-footer-B85HLj-j.js} +1 -1
  35. package/assets/{nav-main-9Eb_A0rf.js → nav-main-BqKm87JZ.js} +1 -1
  36. package/assets/nav-user-DuCZNsZX.js +1 -0
  37. package/assets/notification-BQTjxH2H.js +27 -0
  38. package/assets/pagination-render-io0M2m2O.js +1 -0
  39. package/assets/{register-BIyjCy8M.js → register-hJD1ETdf.js} +1 -1
  40. package/assets/{tabs-BK_5wdPA.js → tabs-BhkFoerH.js} +1 -1
  41. package/assets/{theme-switcher-CKiJbMkh.js → theme-switcher-cgyA7_cO.js} +1 -1
  42. package/assets/{toast-editor-BZM5RHph.js → toast-editor-DwRk6WqT.js} +1 -1
  43. package/assets/{user-info-CcYdmjMZ.js → user-info-BGQvqBmO.js} +1 -1
  44. package/assets/{user-menu-content-DbUk8ZeY.js → user-menu-content-BDm88xaM.js} +1 -1
  45. package/assets/welcome-ks57d2us.js +1 -0
  46. package/controllers/add.js +8 -8
  47. package/controllers/addGroup.js +3 -3
  48. package/controllers/addUser.js +3 -3
  49. package/controllers/catalog/Catalog.js +22 -21
  50. package/controllers/catalog/FrontendCatalogAdapter.d.ts +82 -0
  51. package/controllers/catalog/FrontendCatalogAdapter.js +228 -0
  52. package/controllers/catalog/FrontentCatalogAdapter.d.ts +4 -4
  53. package/controllers/catalog/FrontentCatalogAdapter.js +28 -10
  54. package/controllers/ckeditorUpload.js +1 -1
  55. package/controllers/edit.js +21 -12
  56. package/controllers/editGroup.js +3 -3
  57. package/controllers/editUser.js +3 -3
  58. package/controllers/form.js +12 -10
  59. package/controllers/initUser.js +2 -2
  60. package/controllers/list.js +5 -5
  61. package/controllers/login.js +7 -4
  62. package/controllers/media-manager/ThumbController.js +2 -2
  63. package/controllers/media-manager/mediaManagerAdapter.js +2 -2
  64. package/controllers/media-manager/mediaManagerApi.js +2 -3
  65. package/controllers/navigation/edit.js +2 -2
  66. package/controllers/notifications/NotificationController.d.ts +1 -1
  67. package/controllers/notifications/NotificationController.js +6 -5
  68. package/controllers/register.js +1 -1
  69. package/controllers/remove.js +4 -4
  70. package/controllers/view.js +13 -11
  71. package/helpers/accessRightsHelper.js +1 -1
  72. package/helpers/controllerHelper.js +1 -1
  73. package/helpers/fieldsHelper.js +3 -3
  74. package/helpers/formHelper.js +1 -1
  75. package/helpers/inertiaAddHelper.js +3 -4
  76. package/helpers/inertiaFromHelper.js +2 -3
  77. package/helpers/inertiaListHelper.js +1 -1
  78. package/helpers/menuHelper.js +1 -1
  79. package/helpers/translationHelper.js +2 -2
  80. package/index.d.ts +5 -0
  81. package/index.js +31 -26
  82. package/interfaces/adminpanelConfig.d.ts +12 -0
  83. package/lib/Adminizer.d.ts +4 -3
  84. package/lib/Adminizer.js +41 -47
  85. package/lib/DataAccessor.js +3 -3
  86. package/lib/I18n.js +1 -1
  87. package/lib/PolicyManager.js +1 -1
  88. package/lib/catalog/AbstractCatalog.d.ts +6 -4
  89. package/lib/catalog/AbstractCatalog.js +5 -4
  90. package/lib/catalog/Navigation.d.ts +9 -7
  91. package/lib/catalog/Navigation.js +71 -42
  92. package/lib/controls/codeEditor/MonacoEditor.js +1 -1
  93. package/lib/controls/geojsoneditor/GeoEditor.js +1 -1
  94. package/lib/controls/jsoneditor/JsonEditor.js +1 -1
  95. package/lib/controls/markdown/ToastUiEditor.js +1 -1
  96. package/lib/controls/table/Handsontable.js +1 -1
  97. package/lib/controls/wysiwyg/CKeditor.js +1 -1
  98. package/lib/inertia/inertiaAdapter.js +31 -13
  99. package/lib/media-manager/AbstractMediaManager.d.ts +5 -3
  100. package/lib/media-manager/DefaultMediaManager.d.ts +3 -3
  101. package/lib/media-manager/DefaultMediaManager.js +21 -16
  102. package/lib/media-manager/Items.js +7 -6
  103. package/lib/media-manager/MediaManagerHandler.d.ts +3 -3
  104. package/lib/media-manager/MediaManagerHandler.js +4 -4
  105. package/lib/media-manager/Thumb.d.ts +2 -1
  106. package/lib/media-manager/Thumb.js +3 -4
  107. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +7 -2
  108. package/lib/media-manager/helpers/MediaManagerHelper.js +12 -8
  109. package/lib/model/AbstractModel.js +1 -1
  110. package/lib/model/ModelHandler.js +1 -1
  111. package/lib/model/adapter/sequelize.js +1 -1
  112. package/lib/model/adapter/waterline.js +7 -1
  113. package/lib/notifications/AbstractNotificationService.js +1 -1
  114. package/lib/notifications/GeneralNotificationService.js +2 -2
  115. package/lib/notifications/NotificationHandler.js +1 -1
  116. package/lib/notifications/SystemNotificationService.js +2 -2
  117. package/lib/requestProcessor.js +2 -2
  118. package/lib/widgets/abstractAction.js +1 -1
  119. package/lib/widgets/abstractInfo.js +1 -1
  120. package/lib/widgets/abstractLink.js +1 -1
  121. package/lib/widgets/abstractSwitch.js +1 -1
  122. package/migrations/index.js +1 -1
  123. package/migrations/umzugExports.js +1 -1
  124. package/package.json +4 -2
  125. package/system/Router.js +31 -29
  126. package/system/bindAccessRights.js +7 -0
  127. package/system/bindAuthorization.js +4 -4
  128. package/system/bindControls.js +6 -6
  129. package/system/bindCors.d.ts +2 -0
  130. package/system/bindCors.js +41 -0
  131. package/system/bindDashboardWidgets.js +1 -1
  132. package/system/bindForms.js +1 -1
  133. package/system/bindInertia.js +4 -4
  134. package/system/bindMediaManager.js +2 -3
  135. package/system/bindModels.js +1 -1
  136. package/system/bindNavigation.d.ts +1 -1
  137. package/system/bindNavigation.js +34 -36
  138. package/system/bindNotifications.js +7 -7
  139. package/system/bindReqFunctions.js +7 -4
  140. package/system/bindTranslations.js +2 -2
  141. package/system/defaults.js +10 -2
  142. package/translations/ru.json +121 -120
  143. package/ui/components/handsontable.js +6 -3
  144. package/ui/lib/utils.d.ts +1 -0
  145. package/ui/lib/utils.js +16 -0
  146. package/assets/add-1E1UsMVZ.js +0 -1
  147. package/assets/add-form-CGa9QbwE.js +0 -1
  148. package/assets/add-group-7yAK6uFY.js +0 -1
  149. package/assets/add-group-form-BNmpvW8K.js +0 -1
  150. package/assets/add-user-NoYkTfZi.js +0 -1
  151. package/assets/app-layout-i2zN9Rn-.js +0 -1
  152. package/assets/app-sidebar-DeF8WNmW.js +0 -1
  153. package/assets/app-sidebar-header-DdM1EOrb.js +0 -1
  154. package/assets/catalog-B9hdop59.js +0 -6
  155. package/assets/catalog-C71LuRag.css +0 -1
  156. package/assets/form-Bte5kzjB.js +0 -1
  157. package/assets/form-oUlsuu7h.js +0 -1
  158. package/assets/list-C04Krl_W.js +0 -1
  159. package/assets/media-manager-UQT6RhI8.js +0 -14
  160. package/assets/nav-user-CRAfyE-x.js +0 -1
  161. package/assets/notification-ma2x7vka.js +0 -27
  162. package/assets/pagination-render-D3UyVAlr.js +0 -1
  163. package/assets/welcome-cWh1qnl_.js +0 -1
@@ -1,5 +1,4 @@
1
- import { DefaultMediaManager } from "../lib/media-manager/DefaultMediaManager";
2
- import { MediaManagerHandler } from "../lib/media-manager/MediaManagerHandler";
1
+ import { DefaultMediaManager } from "../lib/media-manager/DefaultMediaManager.js";
3
2
  import serveStatic from "serve-static";
4
3
  import path from "path";
5
4
  export default function bindMediaManager(adminizer) {
@@ -8,7 +7,7 @@ export default function bindMediaManager(adminizer) {
8
7
  adminizer.emitter.on("adminizer:loaded", async () => {
9
8
  try {
10
9
  let mediaManager = new DefaultMediaManager(adminizer, 'default', 'media-manager', adminizer.config.mediamanager.fileStoragePath);
11
- MediaManagerHandler.add(mediaManager);
10
+ adminizer.mediaManagerHandler.add(mediaManager);
12
11
  }
13
12
  catch (e) {
14
13
  console.log(e);
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  export default async function bindModels(adminizer) {
@@ -1,2 +1,2 @@
1
1
  import { Adminizer } from "../lib/Adminizer";
2
- export default function bindNavigation(adminizer: Adminizer): void;
2
+ export declare function bindNavigation(adminizer: Adminizer): Promise<void>;
@@ -1,40 +1,38 @@
1
- import { Navigation } from "../lib/catalog/Navigation";
2
- export default function bindNavigation(adminizer) {
3
- adminizer.emitter.on("adminizer:loaded", async () => {
4
- if (adminizer.config.navigation) {
5
- try {
6
- adminizer.config.navigation.model = adminizer.config.navigation.model ? adminizer.config.navigation.model : 'NavigationAP';
7
- let navigation = new Navigation(adminizer, adminizer.config.navigation);
8
- adminizer.catalogHandler.add(navigation);
9
- adminizer.config.models[adminizer.config.navigation.model.toLowerCase()] = {
10
- add: false,
11
- edit: {
12
- controller: '../controllers/navigation/edit',
13
- },
1
+ import { Navigation } from "../lib/catalog/Navigation.js";
2
+ export async function bindNavigation(adminizer) {
3
+ if (adminizer.config.navigation) {
4
+ try {
5
+ adminizer.config.navigation.model = adminizer.config.navigation.model ? adminizer.config.navigation.model : 'NavigationAP';
6
+ let navigation = new Navigation(adminizer, adminizer.config.navigation);
7
+ adminizer.catalogHandler.add(navigation);
8
+ adminizer.config.models[adminizer.config.navigation.model.toLowerCase()] = {
9
+ add: false,
10
+ edit: {
11
+ controller: '../controllers/navigation/edit',
12
+ },
13
+ fields: {
14
+ createdAt: false,
15
+ updatedAt: false
16
+ },
17
+ navbar: {
18
+ visible: false
19
+ },
20
+ icon: 'storage',
21
+ identifierField: "",
22
+ list: {
14
23
  fields: {
15
- createdAt: false,
16
- updatedAt: false
17
- },
18
- navbar: {
19
- visible: false
24
+ tree: false,
25
+ id: false,
20
26
  },
21
- icon: 'storage',
22
- identifierField: "",
23
- list: {
24
- fields: {
25
- tree: false,
26
- id: false,
27
- },
28
- },
29
- model: adminizer.config.navigation.model.toLowerCase(),
30
- remove: false,
31
- title: adminizer.config.navigation.model,
32
- tools: []
33
- };
34
- }
35
- catch (e) {
36
- console.log('bindNavigation Error: ', e);
37
- }
27
+ },
28
+ model: adminizer.config.navigation.model.toLowerCase(),
29
+ remove: false,
30
+ title: adminizer.config.navigation.model,
31
+ tools: []
32
+ };
33
+ }
34
+ catch (e) {
35
+ console.log('bindNavigation Error: ', e);
38
36
  }
39
- });
37
+ }
40
38
  }
@@ -1,14 +1,14 @@
1
- import { Adminizer } from '../lib/Adminizer';
2
- import { NotificationHandler } from '../lib/notifications/NotificationHandler';
3
- import { GeneralNotificationService } from '../lib/notifications/GeneralNotificationService';
4
- import { SystemNotificationService } from '../lib/notifications/SystemNotificationService';
1
+ import { NotificationHandler } from '../lib/notifications/NotificationHandler.js';
2
+ import { GeneralNotificationService } from '../lib/notifications/GeneralNotificationService.js';
3
+ import { SystemNotificationService } from '../lib/notifications/SystemNotificationService.js';
5
4
  export async function bindNotifications(adminizer) {
6
5
  // Создаем хендлер
7
6
  adminizer.notificationHandler = new NotificationHandler();
8
7
  // Регистрируем сервисы
9
- const generalService = new GeneralNotificationService(adminizer);
10
8
  const systemService = new SystemNotificationService(adminizer);
11
- adminizer.notificationHandler.registerService(generalService);
12
9
  adminizer.notificationHandler.registerService(systemService);
13
- Adminizer.log.info(`Notification system initialized with 2 services: ${systemService.notificationClass}, ${systemService.notificationClass}`);
10
+ if (adminizer.config.notifications.enableGeneral) {
11
+ const generalService = new GeneralNotificationService(adminizer);
12
+ adminizer.notificationHandler.registerService(generalService);
13
+ }
14
14
  }
@@ -1,7 +1,7 @@
1
- import { Adminizer } from "../lib/Adminizer";
2
- import { I18n } from "../lib/I18n";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
+ import { I18n } from "../lib/I18n.js";
3
3
  import { parse } from "cookie";
4
- import { verifyUser } from "../lib/helper/jwt";
4
+ import { verifyUser } from "../lib/helper/jwt.js";
5
5
  export default function bindReqFunctions(adminizer) {
6
6
  let bindReqFunctionsF = async function (req, res, next) {
7
7
  /**
@@ -11,7 +11,10 @@ export default function bindReqFunctions(adminizer) {
11
11
  /**
12
12
  * Add i18n
13
13
  * */
14
- req.i18n = new I18n({ locales: adminizer.config.translation !== false ? adminizer.config.translation.locales : [] });
14
+ req.i18n = new I18n({
15
+ locales: adminizer.config.translation !== false ? adminizer.config.translation.locales : [],
16
+ directory: adminizer.config.translation !== false ? adminizer.config.translation.path ?? null : null
17
+ });
15
18
  if (res.locals) {
16
19
  req.i18n.registerMethods(res.locals, req);
17
20
  }
@@ -1,6 +1,6 @@
1
- import { TranslationHelper } from "../helpers/translationHelper";
1
+ import { TranslationHelper } from "../helpers/translationHelper.js";
2
2
  import * as fs from "fs";
3
- import { Adminizer } from "../lib/Adminizer";
3
+ import { Adminizer } from "../lib/Adminizer.js";
4
4
  export default function bindTranslations(adminizer) {
5
5
  // load adminpanel translations
6
6
  TranslationHelper.loadTranslations(adminizer, `${adminizer.config.rootPath}/translations`);
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
- import { FileStorageHelper } from "../helpers/fileStorageHelper";
3
- import timezones from "../lib/timezones";
2
+ import { FileStorageHelper } from "../helpers/fileStorageHelper.js";
3
+ import timezones from "../lib/timezones.js";
4
4
  /**
5
5
  * Default admin config
6
6
  */
@@ -140,6 +140,14 @@ let adminpanelConfig = {
140
140
  },
141
141
  notifications: {
142
142
  enabled: false
143
+ },
144
+ cors: {
145
+ enabled: false,
146
+ origin: 'http://localhost:8080',
147
+ path: 'api/*'
148
+ },
149
+ mediamanager: {
150
+ fileStoragePath: '.tmp/public',
143
151
  }
144
152
  };
145
153
  export function setDefaultConfig(config) {
@@ -1,122 +1,123 @@
1
1
  {
2
- "Action completed": "Действие завершено",
3
- "Actions": "Действия",
4
- "All": "Все",
5
- "Are you sure?": "Вы уверены?",
6
- "Back": " Назад",
7
- "Back to Login": "Назад ко входу",
8
- "Additional login page": "Дополнительная страница входа",
9
- "Clean": "Очистить",
10
- "Confirm Password": "Подтвердите пароль",
11
- "Confirm Password*": "Подтвердите пароль*",
12
- "Create": "Создать",
13
- "Create a new administrator": "Создание нового администратора",
14
- "Create an Account": "Создать аккаунт",
15
- "Custom": "Пользовательский виджет",
16
- "Delete": "Удалить",
17
- "E-mail": "E-mail",
18
- "Edit": "Редактировать",
19
- "Email": "Электронная почта",
20
- "Fast links": "Быстрые ссылки",
21
- "Full Name": "Полное имя",
22
- "Full name": "Полное имя",
23
- "Group description": "Описание группы",
24
- "Group name": "Название группы",
25
- "Group settings": "Настройки группы",
26
- "Info": "Информация",
27
- "Is Administrator": "Администратор",
28
- "Is confirmed": "Подтверждено",
29
- "Link": "Ссылка",
30
- "Locale": "Локаль",
31
- "Log in": "Вход",
32
- "Login": "Вход",
33
- "Members": "Участники",
34
- "New record was created": "Новая запись создана",
35
- "No": "Нет",
36
- "No records found !": "Записей не найдено",
37
- "No widgets found": "Виджеты не найдены",
38
- "Not found": "Ничего не найдено",
39
- "OR": "ИЛИ",
40
- "Open in a new window": "Открывать в новом окне",
41
- "Password": "Пароль",
42
- "Passwords do not match!": "Пароли не совпадают!",
43
- "Performing an action...": "Выполняется действие...",
44
- "Please fill out the fields below": "Пожалуйста, заполните поля ниже",
45
- "Pretend to be a user": "Притворится пользователем",
46
- "Profile expires": "Профиль истекает",
47
- "Quick actions": "Быстрые действия",
48
- "Record was not removed": "Запись не удалена",
49
- "Record was removed successfully !": "Запись удалена успешно!",
50
- "Record was updated": "Запись обновлена",
51
- "Register": "Регистрация",
52
- "Repeat password": "Повторить пароль",
53
- "Reset": "Сброс",
54
- "Save": "Сохранить",
55
- "Search": "Поиск",
56
- "Select": "Выберите",
57
- "Select Ids": "Выберите ID",
58
- "Select Item type": "Выберите Элемент",
59
- "Select Items": "Ничего не выбрано",
60
- "Switcher": "Переключатель",
61
- "Timezone": "Временная зона",
62
- "Title": "Title",
63
- "Toggle to change the grid. To save the grid, turn it off.": "Переключите для изменения сетки. Чтобы сохранить сетку, отключите.",
64
- "User groups": "Группы пользователя",
65
- "User settings": "Настроики пользователя",
66
- "Values in \"password\" and \"repeatPassword\" fields should be the same": "Значения в полях \"password\" и \"repeatPassword\" должны быть одинаковыми.",
67
- "View": "Просмотреть",
68
- "Welcome": "Здравствуйте",
69
- "Yes": "Да",
70
- "You don't have any widgets selected yet. You can add them by clicking on the plus sign at the top right.": "У вас пока нет выбранных виджетов. Вы можете добавить их, нажав на значок плюса в правом верхнем углу.",
71
- "create": "Создать",
72
- "create new": "создать новую",
73
- "Widget Switcher One": "Widget Switcher One",
74
- "Site Switcher": "Site Switcher",
75
- "Widget Switcher Two": "Widget Switcher Two",
76
- "Switcher Two": "Switcher Two",
77
- "Test": "Test",
78
- "Add Test Model": "Add Test Model",
79
- "example.com": "example.com",
80
- "link to example.com": "link to example.com",
81
- "Global Settings": "Global Settings",
82
- "Info widget One": "Info widget One",
83
- "Info One": "Info One",
84
- "Info widget Two": "Info widget Two",
85
- "Info Two": "Info Two",
86
- "Info widget 3": "Info widget 3",
87
- "Info 31111": "Info 31111",
88
- "Info widget 4": "Info widget 4",
89
- "Info 4": "Info 4",
90
- "Action One": "Action One",
91
- "Action Two": "Action Two",
92
- "Widget Custom One": "Widget Custom One",
93
- "Site Custom": "Site Custom",
94
- "id": "id",
95
- "Textarea": "Textarea",
96
- "Disabled": "Disabled",
97
- "Boolean": "Boolean",
98
- "time": "time",
99
- "Number": "Number",
100
- "Editor": "Editor",
101
- "Date and time": "Date and time",
102
- "testRelationExample": "testRelationExample",
103
- "owner": "owner",
104
- "title": "title",
105
- "slug": "slug",
106
- "Images 1": "Images 1",
107
- "Images": "Изображения",
108
- "Videos": "Видео",
109
- "Texts": "Текст",
110
- "Applications": "Приложения",
111
- "Table": "Таблица",
112
- "Tile": "Плитка",
113
- "Load more": "Загрузить еще",
114
- "File": "Файл",
115
- "Name": "Имя",
116
- "Date": "Дата",
117
- "Type": "Тип",
118
- "Size (orig.)": "Размер (orig.)",
119
- "W x H (orig.)": "W x H (orig.)",
120
- "Sizes/Ver": "Sizes/Ver",
121
- "Locales": "Locales"
2
+ "Action completed": "Действие завершено",
3
+ "Actions": "Действия",
4
+ "All": "Все",
5
+ "Are you sure?": "Вы уверены?",
6
+ "Back": " Назад",
7
+ "Back to Login": "Назад ко входу",
8
+ "Additional login page": "Дополнительная страница входа",
9
+ "Clean": "Очистить",
10
+ "Confirm Password": "Подтвердите пароль",
11
+ "Confirm Password*": "Подтвердите пароль*",
12
+ "Create": "Создать",
13
+ "Create a new administrator": "Создание нового администратора",
14
+ "Create an Account": "Создать аккаунт",
15
+ "Custom": "Пользовательский виджет",
16
+ "Delete": "Удалить",
17
+ "E-mail": "E-mail",
18
+ "Edit": "Редактировать",
19
+ "Email": "Электронная почта",
20
+ "Fast links": "Быстрые ссылки",
21
+ "Full Name": "Полное имя",
22
+ "Full name": "Полное имя",
23
+ "Group description": "Описание группы",
24
+ "Group name": "Название группы",
25
+ "Group settings": "Настройки группы",
26
+ "Info": "Информация",
27
+ "Is Administrator": "Администратор",
28
+ "Is confirmed": "Подтверждено",
29
+ "Link": "Ссылка",
30
+ "Locale": "Локаль",
31
+ "Log in": "Вход",
32
+ "Login": "Вход",
33
+ "Members": "Участники",
34
+ "New record was created": "Новая запись создана",
35
+ "No": "Нет",
36
+ "No records found !": "Записей не найдено",
37
+ "No widgets found": "Виджеты не найдены",
38
+ "Not found": "Ничего не найдено",
39
+ "OR": "ИЛИ",
40
+ "Open in a new window": "Открывать в новом окне",
41
+ "Password": "Пароль",
42
+ "Passwords do not match!": "Пароли не совпадают!",
43
+ "Performing an action...": "Выполняется действие...",
44
+ "Please fill out the fields below": "Пожалуйста, заполните поля ниже",
45
+ "Pretend to be a user": "Притворится пользователем",
46
+ "Profile expires": "Профиль истекает",
47
+ "Quick actions": "Быстрые действия",
48
+ "Record was not removed": "Запись не удалена",
49
+ "Record was removed successfully !": "Запись удалена успешно!",
50
+ "Record was updated": "Запись обновлена",
51
+ "Register": "Регистрация",
52
+ "Repeat password": "Повторить пароль",
53
+ "Reset": "Сброс",
54
+ "Save": "Сохранить",
55
+ "Search": "Поиск",
56
+ "Select": "Выберите",
57
+ "Select Ids": "Выберите ID",
58
+ "Select Item type": "Выберите Элемент",
59
+ "Select Items": "Ничего не выбрано",
60
+ "Switcher": "Переключатель",
61
+ "Timezone": "Временная зона",
62
+ "Title": "Title",
63
+ "Toggle to change the grid. To save the grid, turn it off.": "Переключите для изменения сетки. Чтобы сохранить сетку, отключите.",
64
+ "User groups": "Группы пользователя",
65
+ "User settings": "Настроики пользователя",
66
+ "Values in \"password\" and \"repeatPassword\" fields should be the same": "Значения в полях \"password\" и \"repeatPassword\" должны быть одинаковыми.",
67
+ "View": "Просмотреть",
68
+ "Welcome": "Здравствуйте",
69
+ "Yes": "Да",
70
+ "You don't have any widgets selected yet. You can add them by clicking on the plus sign at the top right.": "У вас пока нет выбранных виджетов. Вы можете добавить их, нажав на значок плюса в правом верхнем углу.",
71
+ "create": "Создать",
72
+ "create new": "создать новую",
73
+ "Widget Switcher One": "Widget Switcher One",
74
+ "Site Switcher": "Site Switcher",
75
+ "Widget Switcher Two": "Widget Switcher Two",
76
+ "Switcher Two": "Switcher Two",
77
+ "Test": "Test",
78
+ "Add Test Model": "Add Test Model",
79
+ "example.com": "example.com",
80
+ "link to example.com": "link to example.com",
81
+ "Global Settings": "Global Settings",
82
+ "Info widget One": "Info widget One",
83
+ "Info One": "Info One",
84
+ "Info widget Two": "Info widget Two",
85
+ "Info Two": "Info Two",
86
+ "Info widget 3": "Info widget 3",
87
+ "Info 31111": "Info 31111",
88
+ "Info widget 4": "Info widget 4",
89
+ "Info 4": "Info 4",
90
+ "Action One": "Action One",
91
+ "Action Two": "Action Two",
92
+ "Widget Custom One": "Widget Custom One",
93
+ "Site Custom": "Site Custom",
94
+ "id": "id",
95
+ "Textarea": "Textarea",
96
+ "Disabled": "Disabled",
97
+ "Boolean": "Boolean",
98
+ "time": "time",
99
+ "Number": "Number",
100
+ "Editor": "Editor",
101
+ "Date and time": "Date and time",
102
+ "testRelationExample": "testRelationExample",
103
+ "owner": "owner",
104
+ "title": "title",
105
+ "slug": "slug",
106
+ "Images 1": "Images 1",
107
+ "Images": "Изображения",
108
+ "Videos": "Видео",
109
+ "Texts": "Текст",
110
+ "Applications": "Приложения",
111
+ "Table": "Таблица",
112
+ "Tile": "Плитка",
113
+ "Load more": "Загрузить еще",
114
+ "File": "Файл",
115
+ "Name": "Имя",
116
+ "Date": "Дата",
117
+ "Type": "Тип",
118
+ "Size (orig.)": "Размер (orig.)",
119
+ "W x H (orig.)": "W x H (orig.)",
120
+ "Sizes/Ver": "Sizes/Ver",
121
+ "Locales": "Locales",
122
+ "Leave this field empty if you don't want to change the password": "Оставьте это поле пустым, если не хотите менять пароль"
122
123
  }
@@ -34,9 +34,12 @@ const HandsonTable = ({ config, data = [], onChange, disabled }) => {
34
34
  }, []);
35
35
  const hotTableRef = useRef(null);
36
36
  useEffect(() => {
37
- if (hotTableRef.current) {
38
- hotTableRef.current.hotInstance.loadData(data);
39
- }
37
+ const timer = setTimeout(() => {
38
+ if (hotTableRef.current?.hotInstance) {
39
+ hotTableRef.current.hotInstance.loadData(data);
40
+ }
41
+ }, 100);
42
+ return () => clearTimeout(timer);
40
43
  }, [data]);
41
44
  useEffect(() => {
42
45
  if (appearance === 'dark') {
package/ui/lib/utils.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import { type ClassValue } from "clsx";
2
2
  export declare function cn(...inputs: ClassValue[]): string;
3
+ export declare function simpleSanitizeHtml(html: string): string;
package/ui/lib/utils.js CHANGED
@@ -3,3 +3,19 @@ import { twMerge } from "tailwind-merge";
3
3
  export function cn(...inputs) {
4
4
  return twMerge(clsx(inputs));
5
5
  }
6
+ export function simpleSanitizeHtml(html) {
7
+ return html
8
+ // Удаляем script теги
9
+ .replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
10
+ // Удаляем iframe, embed, object
11
+ .replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi, '')
12
+ .replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi, '')
13
+ .replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi, '')
14
+ // Удаляем опасные атрибуты событий
15
+ .replace(/ on\w+="[^"]*"/g, '')
16
+ .replace(/ on\w+='[^']*'/g, '')
17
+ .replace(/ on\w+=[^ >]+/g, '')
18
+ // Удаляем javascript: ссылки
19
+ .replace(/href="javascript:[^"]*"/gi, 'href="#"')
20
+ .replace(/href='javascript:[^']*'/gi, 'href="#"');
21
+ }
@@ -1 +0,0 @@
1
- import{u as t,j as o}from"./app.js";import{A as m}from"./app-layout-i2zN9Rn-.js";import p from"./add-form-CGa9QbwE.js";import"./jsoneditor-D95dIAP2.js";import"./vendor-wzZzN_Jv.js";import"./monaco-ICtx6xoc.js";import"./handsontable-PVakPtJV.js";import"./app-shell-CHEYhVco.js";import"./app-sidebar-DeF8WNmW.js";import"./nav-main-9Eb_A0rf.js";import"./material-icon-BedgD2NE.js";import"./app-sidebar-header-DdM1EOrb.js";import"./breadcrumbs-C439DWrC.js";import"./nav-user-CRAfyE-x.js";import"./user-info-CcYdmjMZ.js";import"./user-menu-content-DbUk8ZeY.js";import"./theme-switcher-CKiJbMkh.js";import"./icon-DM49pZW3.js";import"./field-renderer-4obZ_jUo.js";import"./dynamic-controls-BOYmRX_z.js";import"./input-error--IOnWghB.js";const i=[];function k(){const r=t();return o.jsx(m,{breadcrumbs:i,children:o.jsx(p,{page:r,catalog:!1})})}export{k as default};
@@ -1 +0,0 @@
1
- import{V as O,bw as k,j as s,B as F,U as V,aD as z,bx as R,L as S,by as $,f as A,a as L,l as P,H as D,J as U,K as J,aE as H,M as K,g as q}from"./app.js";import{r as u}from"./monaco-ICtx6xoc.js";import{Icon as _}from"./icon-DM49pZW3.js";import{F as M}from"./field-renderer-4obZ_jUo.js";import T from"./input-error--IOnWghB.js";import"./jsoneditor-D95dIAP2.js";import"./vendor-wzZzN_Jv.js";import"./handsontable-PVakPtJV.js";import"./dynamic-controls-BOYmRX_z.js";var C=new Map,N=new WeakMap,B=0,G=void 0;function Q(e){return e?(N.has(e)||(B+=1,N.set(e,B.toString())),N.get(e)):"0"}function X(e){return Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${t}_${t==="root"?Q(e.root):e[t]}`).toString()}function Y(e){const t=X(e);let a=C.get(t);if(!a){const i=new Map;let d;const c=new IntersectionObserver(o=>{o.forEach(n=>{var l;const v=n.isIntersecting&&d.some(p=>n.intersectionRatio>=p);e.trackVisibility&&typeof n.isVisible>"u"&&(n.isVisible=v),(l=i.get(n.target))==null||l.forEach(p=>{p(v,n)})})},e);d=c.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),a={id:t,observer:c,elements:i},C.set(t,a)}return a}function Z(e,t,a={},i=G){if(typeof window.IntersectionObserver>"u"&&i!==void 0){const l=e.getBoundingClientRect();return t(i,{isIntersecting:i,target:e,intersectionRatio:typeof a.threshold=="number"?a.threshold:0,time:0,boundingClientRect:l,intersectionRect:l,rootBounds:l}),()=>{}}const{id:d,observer:c,elements:o}=Y(a),n=o.get(e)||[];return o.has(e)||o.set(e,n),n.push(t),c.observe(e),function(){n.splice(n.indexOf(t),1),n.length===0&&(o.delete(e),c.unobserve(e)),o.size===0&&(c.disconnect(),C.delete(d))}}function W({threshold:e,delay:t,trackVisibility:a,rootMargin:i,root:d,triggerOnce:c,skip:o,initialInView:n,fallbackInView:l,onChange:v}={}){var p;const[j,E]=u.useState(null),m=u.useRef(v),[h,y]=u.useState({inView:!!n,entry:void 0});m.current=v,u.useEffect(()=>{if(o||!j)return;let g;return g=Z(j,(r,f)=>{y({inView:r,entry:f}),m.current&&m.current(r,f),f.isIntersecting&&c&&g&&(g(),g=void 0)},{root:d,rootMargin:i,threshold:e,trackVisibility:a,delay:t},l),()=>{g&&g()}},[Array.isArray(e)?e.toString():e,j,d,i,c,o,a,l,t]);const b=(p=h.entry)==null?void 0:p.target,w=u.useRef(void 0);!j&&b&&!c&&!o&&w.current!==b&&(w.current=b,y({inView:!!n,entry:void 0}));const x=[E,h.inView,h.entry];return x.ref=x[0],x.inView=x[1],x.entry=x[2],x}const I=u.memo(({field:e})=>s.jsxs("div",{className:"flex gap-3",children:[s.jsx(L,{htmlFor:`${e.type}-${e.name}`,children:e.label}),e.tooltip&&s.jsx(D,{children:s.jsxs(U,{children:[s.jsx(J,{onClick:t=>t.preventDefault(),children:s.jsx(_,{iconNode:H,className:"text-primary w-5 h-5 cursor-pointer"})}),s.jsx(K,{align:"center",side:"top",className:"z-[1002]",children:s.jsx("p",{children:e.tooltip})})]})})]})),ee=u.memo(({field:e,value:t,onChange:a,processing:i,notFound:d,search:c})=>{const[o,n]=W({triggerOnce:!0,rootMargin:"100px 0px"});return s.jsx("div",{ref:o,className:"grid gap-4 w-full",children:n?s.jsx(M,{field:e,value:t,onChange:a,notFound:d,search:c,processing:i}):s.jsx(P,{className:"w-full h-[250px] rounded-sm"})})}),de=({page:e,catalog:t,callback:a,openNewWindow:i,openNewWindowLabel:d,isNavigation:c})=>{const{fields:o,btnBack:n,view:l,notFound:v}=e.props,{data:p,setData:j,post:E,processing:m}=O({...Object.fromEntries(o.map(r=>[r.name,r.value??void 0])),jsonPopupCatalog:t}),[h,y]=u.useState(!1),[b,w]=u.useState(i??!1);u.useEffect(()=>(w(i??!1),k(),j({...Object.fromEntries(o.map(r=>[r.name,r.value??void 0])),jsonPopupCatalog:t}),()=>k()),[o,t,i]);const x=u.useCallback((r,f)=>{j(r,f)},[]),g=async r=>{if(r.preventDefault(),t){y(!0);const f=await q.post(e.props.postLink,p);f.status===200&&a&&(c?a(f.data.record,b):a(f.data.record))}else E(e.props.postLink)};return s.jsxs("div",{className:"p-4 w-full",children:[!t&&s.jsxs("div",{className:"w-full sticky z-[1001] py-4 pb-8 top-0 h-fit bg-background flex gap-4",children:[s.jsx(F,{className:"w-fit",asChild:!0,children:s.jsxs(V,{href:n.link,preserveScroll:!0,children:[s.jsx(_,{iconNode:z}),n.title]})}),s.jsxs(F,{variant:"green",type:"submit",className:"w-fit lg:hidden",form:"addUserForm",disabled:h||m||e.props.view||R(),children:[h||m&&s.jsx(S,{className:"h-4 w-4 animate-spin"}),e.props.btnSave.title]})]}),s.jsx("form",{id:"addUserForm",onSubmit:g,className:l?"cursor-not-allowed":"",children:s.jsxs("div",{className:`grid lg:grid-cols-[1fr_150px] gap-4 max-w-[1144px] pb-8 ${t?"lg:grid-cols-[1fr_200px]":"lg:grid-cols-[1fr_150px]"}`,children:[s.jsx("div",{className:"flex flex-col gap-10",children:o.map(r=>s.jsx("div",{className:`grid gap-4 w-full ${l?"pointer-events-none":""}`,children:r.type==="markdown"||r.type==="table"||r.type==="jsonEditor"||r.type==="codeEditor"||r.type==="geoJson"?s.jsxs(s.Fragment,{children:[s.jsx(I,{field:r}),s.jsx(T,{message:$(`${r.type}-${r.name}`)}),s.jsx(ee,{field:r,value:p[r.name],onChange:x,processing:h||m||l,notFound:v,search:e.props.search})]}):s.jsxs(s.Fragment,{children:[s.jsx(I,{field:r}),s.jsx(T,{message:$(`${r.type}-${r.name}`)}),s.jsx(M,{field:r,value:p[r.name],onChange:x,processing:h||m||l,notFound:v,search:e.props.search})]})},r.name))}),s.jsxs("div",{className:`p-4 rounded-md h-fit sticky shadow ${t?"top-0 grid gap-4":"top-[84px] hidden lg:block"}`,children:[c&&s.jsxs("div",{className:"flex gap-4 items-center",children:[s.jsx(A,{id:"targetBlank",checked:b,onCheckedChange:r=>w(!!r),className:"cursor-pointer size-5"}),s.jsx(L,{htmlFor:"targetBlank",children:d})]}),s.jsxs(F,{variant:"green",type:"submit",className:"w-fit",disabled:h||m||e.props.view||R(),children:[(h||m)&&s.jsx(S,{className:"h-4 w-4 animate-spin"}),e.props.btnSave.title]})]})]})})]})};export{I as LabelRenderer,ee as LazyField,de as default};
@@ -1 +0,0 @@
1
- import{j as r}from"./app.js";import{A as o}from"./app-layout-i2zN9Rn-.js";import t from"./add-group-form-BNmpvW8K.js";import"./jsoneditor-D95dIAP2.js";import"./vendor-wzZzN_Jv.js";import"./monaco-ICtx6xoc.js";import"./handsontable-PVakPtJV.js";import"./app-shell-CHEYhVco.js";import"./app-sidebar-DeF8WNmW.js";import"./nav-main-9Eb_A0rf.js";import"./material-icon-BedgD2NE.js";import"./app-sidebar-header-DdM1EOrb.js";import"./breadcrumbs-C439DWrC.js";import"./nav-user-CRAfyE-x.js";import"./user-info-CcYdmjMZ.js";import"./user-menu-content-DbUk8ZeY.js";import"./theme-switcher-CKiJbMkh.js";import"./icon-DM49pZW3.js";const m=[];function E(){return r.jsx(o,{breadcrumbs:m,children:r.jsx(t,{})})}export{E as default};
@@ -1 +0,0 @@
1
- import{u as B,V as M,j as e,B as T,U as O,aD as U,L as q,a as x,I as y,f as z,H,J as P,K as S,aE as A,M as G}from"./app.js";import{Icon as I}from"./icon-DM49pZW3.js";import{r as h}from"./monaco-ICtx6xoc.js";import"./jsoneditor-D95dIAP2.js";import"./vendor-wzZzN_Jv.js";import"./handsontable-PVakPtJV.js";const E=h.memo(({field:s,disabled:d,value:c,onCheckedChange:i,tooltip:n})=>{const m=h.useCallback(l=>{i(s.name,l)},[s.name,i]);return e.jsxs("div",{className:"flex gap-3 items-center",children:[e.jsx(z,{id:s.name,className:"cursor-pointer size-5",disabled:d,checked:c,onCheckedChange:m}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx(x,{className:"cursor-pointer",htmlFor:s.name,children:s.label}),n&&e.jsx(H,{children:e.jsxs(P,{children:[e.jsx(S,{onClick:l=>l.preventDefault(),children:e.jsx(I,{iconNode:A,className:"text-primary w-5 h-5 cursor-pointer"})}),e.jsx(G,{align:"center",side:"top",children:e.jsx("p",{children:s.tooltip})})]})})]})]})});function Q(){var u,j,g,b,v,f,N,k,C,w,F;const s=B(),{fields:d,groupedTokens:c,users:i}=s.props,{data:n,setData:m,clearErrors:l,post:L,processing:o}=M({...Object.fromEntries(d.map(a=>[a.name,a.value])),...Object.fromEntries(i.map(a=>[a.name,a.value])),...Object.fromEntries(c.flatMap(a=>a.fields.map(t=>[t.name,t.value])))}),r=a=>s.props.fields.find(t=>t.name===a),p=h.useCallback((a,t)=>{l(),m(a,t)},[]),D=a=>{a.preventDefault(),L(s.props.postLink)};return e.jsxs("div",{className:"flex h-full flex-1 flex-col gap-4 rounded-xl p-4",children:[e.jsxs("div",{className:"w-full sticky z-[1001] py-4 pb-8 top-0 h-fit bg-background flex gap-4",children:[e.jsx(T,{className:"mb-3 w-fit",asChild:!0,children:e.jsxs(O,{href:s.props.btnBack.link,children:[e.jsx(I,{iconNode:U}),s.props.btnBack.title]})}),e.jsxs(T,{variant:"green",type:"submit",className:"w-fit",form:"addUserForm",disabled:o||s.props.view,children:[o&&e.jsx(q,{className:"h-4 w-4 animate-spin"}),s.props.btnSave.title]})]}),e.jsx("form",{id:"addUserForm",onSubmit:D,className:`${s.props.view?"cursor-not-allowed":""}`,children:e.jsxs("div",{className:"flex flex-col gap-6 max-w-[1144px]",children:[e.jsx("h2",{className:"font-bold text-xl",children:s.props.head}),e.jsxs("div",{className:"grid gap-4",children:[e.jsx(x,{htmlFor:(u=r("name"))==null?void 0:u.name,children:(j=r("name"))==null?void 0:j.label}),e.jsx(y,{id:(g=r("name"))==null?void 0:g.name,type:"text",required:!0,tabIndex:1,autoComplete:(b=r("name"))==null?void 0:b.name,value:n.name,onChange:a=>p("name",a.target.value),disabled:o||s.props.view,placeholder:(v=r("name"))==null?void 0:v.label})]}),e.jsxs("div",{className:"grid gap-4",children:[e.jsx(x,{htmlFor:(f=r("description"))==null?void 0:f.name,children:(N=r("description"))==null?void 0:N.label}),e.jsx(y,{id:(k=r("description"))==null?void 0:k.name,type:"text",required:!0,tabIndex:1,autoComplete:(C=r("description"))==null?void 0:C.name,value:n.description,onChange:a=>p("description",a.target.value),disabled:o||s.props.view,placeholder:(w=r("description"))==null?void 0:w.label})]}),s.props.users.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"font-bold text-xl",children:s.props.userHead}),s.props.users.map(a=>e.jsx(E,{field:a,disabled:o||s.props.view,value:n[a.name],onCheckedChange:p},a.name))]}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 xl:grid-cols-4 gap-4",children:((F=s.props.groupedTokens)==null?void 0:F.length)>0&&s.props.groupedTokens.map(a=>e.jsxs("div",{className:"grid gap-4 content-start justify-between",children:[e.jsx("h2",{className:"font-bold text-xl mt-3",children:a.header}),a.fields.map(t=>e.jsx(E,{field:t,disabled:o||s.props.view,value:n[t.name],onCheckedChange:p,tooltip:!0},t.name))]},a.header))})]})})]})}export{Q as default};
@@ -1 +0,0 @@
1
- import{j as r}from"./app.js";import{A as o}from"./app-layout-i2zN9Rn-.js";import t from"./add-user-form-DrclnTOd.js";import"./jsoneditor-D95dIAP2.js";import"./vendor-wzZzN_Jv.js";import"./monaco-ICtx6xoc.js";import"./handsontable-PVakPtJV.js";import"./app-shell-CHEYhVco.js";import"./app-sidebar-DeF8WNmW.js";import"./nav-main-9Eb_A0rf.js";import"./material-icon-BedgD2NE.js";import"./app-sidebar-header-DdM1EOrb.js";import"./breadcrumbs-C439DWrC.js";import"./nav-user-CRAfyE-x.js";import"./user-info-CcYdmjMZ.js";import"./user-menu-content-DbUk8ZeY.js";import"./theme-switcher-CKiJbMkh.js";import"./icon-DM49pZW3.js";import"./input-error--IOnWghB.js";const m=[];function F(){return r.jsx(o,{breadcrumbs:m,children:r.jsx(t,{})})}export{F as default};
@@ -1 +0,0 @@
1
- import{u as i,j as r,R as p,ac as m}from"./app.js";import d from"./app-shell-CHEYhVco.js";import{AppSidebar as n}from"./app-sidebar-DeF8WNmW.js";import{A as x,N as c}from"./app-sidebar-header-DdM1EOrb.js";import{r as o}from"./monaco-ICtx6xoc.js";const j=o.memo(({children:e,breadcrumbs:s=[],className:t})=>{const a=i();return r.jsxs(d,{variant:"sidebar",children:[r.jsx(p,{title:a.props.title}),r.jsx(n,{}),r.jsxs(m,{className:t,children:[r.jsx(x,{breadcrumbs:s}),e]})]})}),S=o.memo(({children:e,className:s,breadcrumbs:t,...a})=>r.jsx(c,{children:r.jsx(j,{breadcrumbs:t,className:s,...a,children:e})}));export{S as A};
@@ -1 +0,0 @@
1
- import{u as N,j as s,aL as b,aM as g,aN as i,aO as c,aP as f,aQ as v,aR as k,aS as d,B as C,aT as M,aU as w,aV as _,aW as y,aX as B,aY as x,U as n,aZ as T,a_ as p,a$ as t,C as o,b0 as h,b1 as j,b2 as m,b3 as u,b4 as R,b5 as U}from"./app.js";import{NavMain as $}from"./nav-main-9Eb_A0rf.js";import l from"./material-icon-BedgD2NE.js";import"./jsoneditor-D95dIAP2.js";import"./vendor-wzZzN_Jv.js";import"./monaco-ICtx6xoc.js";import"./handsontable-PVakPtJV.js";function F(){const r=N();return s.jsxs(b,{collapsible:"icon",variant:"inset",children:[s.jsx(g,{children:s.jsx(i,{children:s.jsxs(c,{children:[s.jsx(f,{className:"p-0 shadow-none border-none bg-transparent hidden md:block",children:s.jsxs(v,{children:[s.jsx(k,{asChild:!0,className:"text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground rounded-md",children:s.jsx(d,{asChild:!0,children:s.jsx(C,{variant:"ghost",asChild:!0,className:`w-full ${r.props.section?"":"pointer-events-none"}`,children:s.jsxs("div",{children:[s.jsx(l,{name:"rocket_launch",className:"!text-[18px]"}),s.jsx("span",{className:"group-data-[state=collapsed]:hidden",children:r.props.brand}),r.props.section&&s.jsx(M,{className:"ml-auto group-data-[state=collapsed]:hidden"})]})})})}),r.props.section&&s.jsx(w,{side:"right",className:"z-[1003]",children:r.props.section.map(a=>s.jsx("div",{children:a.subItems?s.jsxs(_,{children:[s.jsxs(y,{className:"flex gap-2 items-center cursor-pointer",children:[s.jsx(l,{name:a.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:a.title})]}),s.jsx(B,{children:a.subItems.map(e=>s.jsx(x,{children:e.type==="blank"?s.jsxs("a",{href:e.link,target:"_blank",className:"flex gap-2 items-center",children:[e.icon&&s.jsx(l,{name:e.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:e.title})]},e.id):s.jsxs(n,{href:e.link,className:"flex gap-2 items-center",children:[e.icon&&s.jsx(l,{name:e.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:e.title})]},e.id)},e.id))})]}):s.jsx(x,{children:a.type==="blank"?s.jsxs("a",{href:a.link,target:"_blank",className:"flex gap-2 items-center",children:[a.icon&&s.jsx(l,{name:a.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:a.title})]}):s.jsxs(n,{href:a.link,className:"flex gap-2 items-center",children:[a.icon&&s.jsx(l,{name:a.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:a.title})]})})},a.id))})]})}),s.jsx(T,{className:"px-2 py-0 block md:hidden",children:s.jsx(i,{children:s.jsx(p,{asChild:!0,className:"group/collapsible",children:s.jsxs(c,{children:[s.jsx(t,{asChild:!0,children:s.jsxs(d,{children:[s.jsx(l,{name:"rocket_launch",className:"!text-[18px]"}),s.jsx("span",{className:"overflow-hidden text-ellipsis whitespace-nowrap",children:r.props.brand}),r.props.section&&s.jsx(o,{className:"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90"})]})}),r.props.section&&s.jsx(h,{children:s.jsx(j,{children:r.props.section&&r.props.section.map(a=>a.subItems?s.jsx(i,{children:s.jsx(p,{asChild:!0,className:"group/collapsible-sub",children:s.jsxs(c,{children:[s.jsx(t,{asChild:!0,children:s.jsxs(d,{children:[s.jsx(l,{name:a.icon,className:"!text-[18px]"}),s.jsx("span",{className:"overflow-hidden text-ellipsis whitespace-nowrap",children:a.title}),s.jsx(o,{className:"ml-auto transition-transform duration-200 group-data-[state=open]/collapsible-sub:rotate-90"})]})}),s.jsx(h,{children:s.jsx(j,{children:a.subItems.map(e=>s.jsx(m,{children:s.jsx(u,{asChild:!0,children:e.type==="blank"?s.jsxs("a",{href:e.link,target:"_blank",className:"flex gap-2 items-center",children:[e.icon&&s.jsx(l,{name:e.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:e.title})]}):s.jsxs(n,{href:e.link,className:"flex gap-2 items-center",children:[e.icon&&s.jsx(l,{name:e.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:e.title})]})})},e.id))})})]})})},a.id):s.jsx(m,{children:s.jsx(u,{asChild:!0,children:a.type==="blank"?s.jsxs("a",{href:a.link,target:"_blank",className:"flex gap-2 items-center",children:[a.icon&&s.jsx(l,{name:a.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:a.title})]}):s.jsxs(n,{href:a.link,className:"flex gap-2 items-center",children:[a.icon&&s.jsx(l,{name:a.icon,className:"!text-[18px]"}),s.jsx("span",{className:"hover:underline",children:a.title})]})})},a.id))})})]})})})})]},r.props.brand)})}),s.jsx(R,{children:s.jsx($,{items:r.props.menu})}),s.jsx(U,{children:s.jsx("div",{className:"text-center opacity-70",children:r.props.showVersion&&"v.4.3.0"})})]})}export{F as AppSidebar};
@@ -1 +0,0 @@
1
- import{u as P,j as e,g as f,aG as O,p as z,B as $,aH as _,s as H,v as J,aI as F,J as G,K,Z as U,M as V,r as Y,aJ as Z,U as q,L as T,aK as Q}from"./app.js";import{Breadcrumbs as W}from"./breadcrumbs-C439DWrC.js";import{NavUser as X}from"./nav-user-CRAfyE-x.js";import{ThemeSwitcher as ee}from"./theme-switcher-CKiJbMkh.js";import{r as n}from"./monaco-ICtx6xoc.js";import te from"./material-icon-BedgD2NE.js";const k=n.createContext(void 0),de=({children:i})=>{const[x,u]=n.useState([]),[b,p]=n.useState([]),[w,l]=n.useState([]),[S,v]=n.useState(!1),[r,c]=n.useState([]),N=P(),[M,j]=n.useState({}),d=[...b,...w],m=async()=>{try{const t=await f.get(`${window.routePrefix}/api/notifications`,{params:{unreadOnly:!0,limit:4}});u(t.data)}catch(t){console.error("Error fetching bell notifications:",t)}},h=async()=>{try{const t=await f.post(`${window.routePrefix}/notifications`);j(t.data)}catch(t){console.log(t)}},y=async()=>{await m()},g=async()=>{try{const t=await f.get(`${window.routePrefix}/api/notifications/get-classes`);c(t.data)}catch(t){console.error("Error fetching tabs:",t)}},C=async(t,s)=>{try{if(!t){await E(s);return}const a=await f.post(`${window.routePrefix}/api/notifications/search`,{s:t,notificationClass:s});l(a.data)}catch(a){console.error("Error searching notifications:",a)}},E=async t=>{v(!0);try{const s=`${window.routePrefix}/api/notifications/${t}`,a=await f.get(s,{params:{limit:20,skip:0,unreadOnly:!1}});return p([]),l(a.data),a.data}catch(s){return console.error("Error fetching all notifications:",s),[]}finally{v(!1)}},D=async(t,s)=>{try{const a=`${window.routePrefix}/api/notifications/${t}`,o=await f.get(a,{params:{limit:20,skip:s,unreadOnly:!1}});return l(B=>[...B,...o.data]),o.data}catch(a){return console.error("Error paginating notifications:",a),[]}};n.useEffect(()=>{if(!N.props.notifications)return;h(),m();const t=new EventSource(`${window.routePrefix}/api/notifications/stream`);return t.addEventListener("connected",s=>{const a=JSON.parse(s.data);console.log("Connected event:",a),g()}),t.addEventListener("notification",s=>{const a=JSON.parse(s.data);p(o=>[a,...o]),u(o=>[a,...o].slice(0,4))}),t.onerror=()=>{console.error("SSE connection error")},()=>t.close()},[]);const I=async(t,s)=>{try{await f.put(`${window.routePrefix}/api/notifications/${t}/${s}/read`,{}),p(a=>a.map(o=>o.id===s?{...o,read:!0}:o)),l(a=>a.map(o=>o.id===s?{...o,read:!0}:o)),u([])}catch(a){console.error("Error marking as read:",a)}},L=async()=>{try{await f.put(`${window.routePrefix}/api/notifications/read-all`),p(t=>t.map(s=>({...s,read:!0}))),l(t=>t.map(s=>({...s,read:!0}))),await m()}catch(t){console.error("Error marking all as read:",t)}},R=x.filter(t=>!t.read).length;return e.jsx(k.Provider,{value:{bellNotifications:x,allNotifications:d,unreadCount:R,getTabs:g,tabs:r,search:C,markAsRead:I,markAllAsRead:L,getLocale:h,messages:M,fetchAllNotifications:E,paginateNotifications:D,loading:S,refreshBellNotifications:y},children:i})},A=()=>{const i=n.useContext(k);if(i===void 0)throw new Error("useNotifications must be used within a NotificationProvider");return i};function ae(){const{bellNotifications:i,markAsRead:x,unreadCount:u,refreshBellNotifications:b,messages:p}=A(),[w,l]=n.useState(!1),S=async(r,c)=>{l(!0);try{await x(r,c),await b()}catch(N){console.error("Error marking as read:",N)}finally{l(!1)}},v=r=>{const c=new Date,N=new Date(r),M=c.getTime()-N.getTime(),j=Math.floor(M/1e3),d=new Intl.RelativeTimeFormat("en",{numeric:"auto"});if(j<60)return d.format(-j,"second");const m=Math.floor(j/60);if(m<60)return d.format(-m,"minute");const h=Math.floor(m/60);if(h<24)return d.format(-h,"hour");const y=Math.floor(h/24);if(y<30)return d.format(-y,"day");const g=Math.floor(y/30);if(g<12)return d.format(-g,"month");const C=Math.floor(g/12);return d.format(-C,"year")};return e.jsxs(O,{children:[e.jsx(z,{asChild:!0,className:"cursor-pointer data-[state=open]:bg-sidebar-accent",children:e.jsxs($,{variant:"ghost",className:"relative",children:[e.jsx(_,{}),u>0&&e.jsx("div",{className:"absolute top-1.5 right-1.5 size-1.5 rounded-full bg-destructive"})]})}),e.jsxs(H,{className:"z-[1002] p-2",align:"end",onCloseAutoFocus:r=>r.preventDefault(),children:[e.jsx(J,{className:`${w?"opacity-50 pointer-events-none":""}`,children:i.length===0?e.jsx("div",{className:"p-4 text-center text-muted-foreground",children:"No notifications"}):i.map(r=>e.jsxs("div",{children:[e.jsx(F,{asChild:!0,className:"cursor-pointer",onSelect:c=>{c.preventDefault(),Y.visit(`${window.routePrefix}/notifications?type=${r.notificationClass}`)},children:e.jsxs("div",{className:"grid grid-cols-[32px_250px] grid-rows-[auto_1fr] items-start gap-x-4 gap-y-2",children:[r.icon?e.jsx(te,{name:r.icon.icon,style:{color:r.icon.iconColor},className:"!text-[32px]"}):e.jsx("div",{}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"font-medium",children:r.title}),e.jsx("span",{className:"truncate",children:r.message})]}),e.jsxs("div",{className:"col-start-2 flex justify-between flex-nowrap items-center",children:[e.jsx("div",{className:"flex flex-nowrap gap-2 items-center",children:e.jsx("div",{children:v(r.createdAt)})}),e.jsxs(G,{children:[e.jsx(K,{asChild:!0,children:e.jsx($,{variant:"ghost",size:"icon",className:"size-4",onClick:c=>{c.stopPropagation(),S(r.notificationClass,r.id)},children:e.jsx(U,{className:"text-primary"})})}),e.jsx(V,{side:"left",className:"z-[1003]",children:e.jsx("p",{children:p["Make read"]})})]})]})]})}),e.jsx(Z,{})]},r.id))}),e.jsx($,{variant:"secondary",asChild:!0,children:e.jsxs(q,{href:`${window.routePrefix}/notifications?type=general`,className:`w-full ${w?"opacity-50 pointer-events-none":""}`,children:[p["View All"],w&&e.jsx(T,{className:"h-4 w-4 animate-spin"})]})})]})]})}function se({breadcrumbs:i=[]}){const{tabs:x}=A(),u=P();return e.jsx("header",{className:"border-sidebar-border/50 flex h-16 shrink-0 items-center gap-2 border-b px-6 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4",children:e.jsxs("div",{className:"flex justify-between w-full",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Q,{className:"-ml-1"}),e.jsx(W,{breadcrumbs:i})]}),e.jsxs("div",{className:"flex gap-4 items-center",children:[e.jsx(ee,{}),u.props.notifications&&(x.length>0?e.jsx(ae,{}):e.jsx("div",{className:"w-[40px] flex-none flex justify-center",children:e.jsx(T,{className:"size-4 animate-spin"})})),e.jsx(X,{})]})]})})}const fe=Object.freeze(Object.defineProperty({__proto__:null,AppSidebarHeader:se},Symbol.toStringTag,{value:"Module"}));export{se as A,de as N,fe as a,A as u};