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,8 +1,7 @@
1
- import { FormHelper } from "../helpers/formHelper";
2
- import { Adminizer } from "../lib/Adminizer";
3
- import inertiaFormHelper from "../helpers/inertiaFromHelper";
4
- import { getRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper";
5
- import { MediaManagerHandler } from "../lib/media-manager/MediaManagerHandler";
1
+ import { FormHelper } from "../helpers/formHelper.js";
2
+ import { Adminizer } from "../lib/Adminizer.js";
3
+ import inertiaFormHelper from "../helpers/inertiaFromHelper.js";
4
+ import { getRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper.js";
6
5
  export default async function form(req, res) {
7
6
  let slug = req.params.slug;
8
7
  // Check slug
@@ -45,8 +44,9 @@ export default async function form(req, res) {
45
44
  }
46
45
  if (form[key].type === "mediamanager") {
47
46
  let options = form[key].options;
48
- let mediaManager = MediaManagerHandler.get(options?.id ?? "default");
49
- await mediaManager.setRelations(req.body[key], "form", `${slug}_${key}`, key);
47
+ let mediaManager = req.adminizer.mediaManagerHandler.get(options?.id ?? "default");
48
+ if (req.body[key])
49
+ await mediaManager.setRelations(req.body[key], `${slug}_${key}`, 0, key);
50
50
  }
51
51
  }
52
52
  for (let field of Object.keys(req.body)) {
@@ -62,9 +62,11 @@ export default async function form(req, res) {
62
62
  for (let key of Object.keys(form)) {
63
63
  try {
64
64
  if (form[key].type === 'mediamanager') {
65
- form[key].value = await getRelationsMediaManager({
66
- list: await req.adminizer.config.forms.get(slug, key),
67
- mediaManagerId: form[key].options?.id ?? "default"
65
+ form[key].value = await getRelationsMediaManager(req.adminizer, {
66
+ mediaManagerId: form[key].options?.id ?? "default",
67
+ model: `${slug}_${key}`,
68
+ widgetName: key,
69
+ modelId: 0
68
70
  });
69
71
  }
70
72
  else {
@@ -1,6 +1,6 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  import { generate } from "password-hash";
3
- import { inertiaInitUserHelper } from "../helpers/inertiaAutHelper";
3
+ import { inertiaInitUserHelper } from "../helpers/inertiaAutHelper.js";
4
4
  export default async function initUser(req, res) {
5
5
  if (!req.adminizer.config.auth.enable) {
6
6
  return res.redirect(`${req.adminizer.config.routePrefix}/`);
@@ -1,8 +1,8 @@
1
- import { ControllerHelper } from "../helpers/controllerHelper";
2
- import { DataAccessor } from "../lib/DataAccessor";
3
- import { NodeTable } from "../lib/datatable/NodeTable";
4
- import { Adminizer } from "../lib/Adminizer";
5
- import { inertiaListHelper } from "../helpers/inertiaListHelper";
1
+ import { ControllerHelper } from "../helpers/controllerHelper.js";
2
+ import { DataAccessor } from "../lib/DataAccessor.js";
3
+ import { NodeTable } from "../lib/datatable/NodeTable.js";
4
+ import { Adminizer } from "../lib/Adminizer.js";
5
+ import { inertiaListHelper } from "../helpers/inertiaListHelper.js";
6
6
  export default async function list(req, res) {
7
7
  let entity = ControllerHelper.findEntityObject(req);
8
8
  if (!entity.model) {
@@ -1,8 +1,8 @@
1
- import { POWCaptcha } from "../lib/POWCaptcha";
1
+ import { POWCaptcha } from "../lib/POWCaptcha.js";
2
2
  import passwordHash from "password-hash";
3
- import { inertiaLoginHelper } from "../helpers/inertiaAutHelper";
4
- import { Adminizer } from "../lib/Adminizer";
5
- import { signUser } from "../lib/helper/jwt";
3
+ import { inertiaLoginHelper } from "../helpers/inertiaAutHelper.js";
4
+ import { Adminizer } from "../lib/Adminizer.js";
5
+ import { signUser } from "../lib/helper/jwt.js";
6
6
  import { serialize } from "cookie";
7
7
  export default async function login(req, res) {
8
8
  const powCaptcha = new POWCaptcha();
@@ -53,6 +53,9 @@ export default async function login(req, res) {
53
53
  //Here we use the captchaSolution key to output messages unrelated to the form fields.
54
54
  return inertiaAdminMessage(req, "Profile expired, contact the administrator", 'captchaSolution');
55
55
  }
56
+ if (!req.adminizer.accessRightsHelper.hasPermission('access-to-adminpanel', user)) {
57
+ return inertiaAdminMessage(req, "The user is not allowed to enter, please contact the administrator", 'captchaSolution');
58
+ }
56
59
  const token = signUser(user, req.adminizer.jwtSecret);
57
60
  res.setHeader('Set-Cookie', serialize('adminizer_jwt', token, {
58
61
  httpOnly: true,
@@ -1,10 +1,10 @@
1
- import { MediaManagerThumb } from "../../lib/media-manager/Thumb";
1
+ import { MediaManagerThumb } from "../../lib/media-manager/Thumb.js";
2
2
  export async function thumbController(req, res) {
3
3
  const method = req.method.toUpperCase();
4
4
  const id = req.query.id;
5
5
  const managerId = req.query.managerId;
6
6
  if (method === 'GET') {
7
7
  res.setHeader('Content-Type', 'image/webp');
8
- res.send(await MediaManagerThumb.getThumb(id, managerId));
8
+ res.send(await MediaManagerThumb.getThumb(id, managerId, req.adminizer));
9
9
  }
10
10
  }
@@ -1,4 +1,4 @@
1
- import { randomFileName } from "../../lib/media-manager/helpers/MediaManagerHelper";
1
+ import { randomFileName } from "../../lib/media-manager/helpers/MediaManagerHelper.js";
2
2
  import fs from "fs";
3
3
  import multer from 'multer';
4
4
  export class MediaManagerAdapter {
@@ -106,7 +106,7 @@ export class MediaManagerAdapter {
106
106
  });
107
107
  }
108
108
  checkDirectory() {
109
- const outputDir = `${this.manager.fileStoragePath}/${this.manager.urlPathPrefix}`;
109
+ const outputDir = `${process.cwd()}/${this.manager.fileStoragePath}/${this.manager.urlPathPrefix}`;
110
110
  if (!fs.existsSync(outputDir)) {
111
111
  fs.mkdirSync(outputDir, { recursive: true });
112
112
  }
@@ -1,5 +1,4 @@
1
- import { MediaManagerHandler } from "../../lib/media-manager/MediaManagerHandler";
2
- import { MediaManagerAdapter } from "./mediaManagerAdapter";
1
+ import { MediaManagerAdapter } from "./mediaManagerAdapter.js";
3
2
  export async function mediaManagerController(req, res) {
4
3
  const method = req.method.toUpperCase();
5
4
  let id = req.params.id ? req.params.id : '';
@@ -16,7 +15,7 @@ export async function mediaManagerController(req, res) {
16
15
  if (!id) {
17
16
  return res.sendStatus(404);
18
17
  }
19
- const _manager = MediaManagerHandler.get(id);
18
+ const _manager = req.adminizer.mediaManagerHandler.get(id);
20
19
  const manager = new MediaManagerAdapter(_manager);
21
20
  if (method === 'GET') {
22
21
  if (req.query._method === 'getLocales') {
@@ -1,5 +1,5 @@
1
- import { ControllerHelper } from "../../helpers/controllerHelper";
2
- import { DataAccessor } from "../../lib/DataAccessor";
1
+ import { ControllerHelper } from "../../helpers/controllerHelper.js";
2
+ import { DataAccessor } from "../../lib/DataAccessor.js";
3
3
  export default async function edit(req, res) {
4
4
  if (req.adminizer.config.auth.enable) {
5
5
  if (!req.user) {
@@ -3,7 +3,7 @@ export declare class NotificationController {
3
3
  static viewAll(req: ReqType, res: ResType): Promise<import("express").Response<any, Record<string, any>>>;
4
4
  static getNotificationClasses(req: ReqType, res: ResType): Promise<ResType>;
5
5
  static getNotificationsStream(req: ReqType, res: ResType): Promise<void>;
6
- static getNotificationsByClass(req: ReqType, res: ResType): Promise<void>;
6
+ static getNotificationsByClass(req: ReqType, res: ResType): Promise<ResType>;
7
7
  static getUserNotifications(req: ReqType, res: ResType): Promise<void>;
8
8
  static markAsRead(req: ReqType, res: ResType): Promise<void>;
9
9
  static markAllAsRead(req: ReqType, res: ResType): Promise<void>;
@@ -1,4 +1,4 @@
1
- import { Adminizer } from '../../lib/Adminizer';
1
+ import { Adminizer } from '../../lib/Adminizer.js';
2
2
  export class NotificationController {
3
3
  static async search(req, res) {
4
4
  NotificationController.checkNotifPermission(req, res);
@@ -143,16 +143,17 @@ export class NotificationController {
143
143
  // Проверяем права доступа
144
144
  const hasPermission = req.adminizer.accessRightsHelper.hasPermission(`notification-${notificationClass}`, req.user);
145
145
  if (!hasPermission) {
146
- res.status(403).json({ error: 'Forbidden' });
147
- return;
146
+ return res.status(403).json({ error: 'Forbidden' });
148
147
  }
149
148
  const service = req.adminizer.notificationHandler.getService(notificationClass);
149
+ if (!service)
150
+ return res.json({});
150
151
  const notifications = await service.getNotifications(req.user?.id, Number(limit), Number(skip), unreadOnly === 'true');
151
- res.json(notifications);
152
+ return res.json(notifications);
152
153
  }
153
154
  catch (error) {
154
155
  Adminizer.log.error('Error getting notifications:', error);
155
- res.status(500).json({ error: 'Internal server error' });
156
+ return res.status(500).json({ error: 'Internal server error' });
156
157
  }
157
158
  }
158
159
  // API для получения всех уведомлений пользователя
@@ -1,5 +1,5 @@
1
1
  import { generate } from "password-hash";
2
- import { inertiaRegisterHelper } from "../helpers/inertiaAutHelper";
2
+ import { inertiaRegisterHelper } from "../helpers/inertiaAutHelper.js";
3
3
  export default async function register(req, res) {
4
4
  if (!req.adminizer.config.auth.enable || req.adminizer.config.registration?.enable !== true) {
5
5
  return res.redirect(`${req.adminizer.config.routePrefix}/`);
@@ -1,7 +1,7 @@
1
- import { ControllerHelper } from "../helpers/controllerHelper";
2
- import { deleteRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper";
3
- import { DataAccessor } from "../lib/DataAccessor";
4
- import { Adminizer } from "../lib/Adminizer";
1
+ import { ControllerHelper } from "../helpers/controllerHelper.js";
2
+ import { deleteRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper.js";
3
+ import { DataAccessor } from "../lib/DataAccessor.js";
4
+ import { Adminizer } from "../lib/Adminizer.js";
5
5
  export default async function remove(req, res) {
6
6
  // Checking id of the record
7
7
  if (!req.params.id) {
@@ -1,11 +1,11 @@
1
- import { ControllerHelper } from "../helpers/controllerHelper";
2
- import { DataAccessor } from "../lib/DataAccessor";
3
- import { Adminizer } from "../lib/Adminizer";
4
- import { inertiaUserHelper } from "../helpers/inertiaUserHelper";
5
- import { inertiaGroupHelper } from "../helpers/inertiaGroupHelper";
6
- import inertiaAddHelper from "../helpers/inertiaAddHelper";
7
- import { FieldsHelper } from "../helpers/fieldsHelper";
8
- import { getRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper";
1
+ import { ControllerHelper } from "../helpers/controllerHelper.js";
2
+ import { DataAccessor } from "../lib/DataAccessor.js";
3
+ import { Adminizer } from "../lib/Adminizer.js";
4
+ import { inertiaUserHelper } from "../helpers/inertiaUserHelper.js";
5
+ import { inertiaGroupHelper } from "../helpers/inertiaGroupHelper.js";
6
+ import inertiaAddHelper from "../helpers/inertiaAddHelper.js";
7
+ import { FieldsHelper } from "../helpers/fieldsHelper.js";
8
+ import { getRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper.js";
9
9
  export default async function view(req, res) {
10
10
  // Check id
11
11
  if (!req.params.id) {
@@ -86,9 +86,11 @@ export default async function view(req, res) {
86
86
  for (const field of Object.keys(fields)) {
87
87
  let fieldConfigConfig = fields[field].config;
88
88
  if (fieldConfigConfig.type === 'mediamanager') {
89
- record[field] = await getRelationsMediaManager({
90
- list: record[field],
91
- mediaManagerId: fieldConfigConfig.options?.id ?? "default"
89
+ record[field] = await getRelationsMediaManager(req.adminizer, {
90
+ mediaManagerId: fieldConfigConfig.options?.id ?? "default",
91
+ model: entity.model.modelname,
92
+ widgetName: field,
93
+ modelId: req.params.id
92
94
  });
93
95
  }
94
96
  }
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export class AccessRightsHelper {
3
3
  _tokens = [];
4
4
  adminizer;
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "../lib/Adminizer";
1
+ import { Adminizer } from "../lib/Adminizer.js";
2
2
  export class ControllerHelper {
3
3
  /**
4
4
  * Default configuration for entity
@@ -1,6 +1,6 @@
1
- import { DataAccessor } from "../lib/DataAccessor";
2
- import { Adminizer } from "../lib/Adminizer";
3
- import { isObject } from "./JsUtils";
1
+ import { DataAccessor } from "../lib/DataAccessor.js";
2
+ import { Adminizer } from "../lib/Adminizer.js";
3
+ import { isObject } from "./JsUtils.js";
4
4
  export class FieldsHelper {
5
5
  /**
6
6
  * Load list of records for all associations into `fields`
@@ -1,6 +1,6 @@
1
1
  import * as path from "path";
2
2
  import * as fs from "fs";
3
- import { Adminizer } from "../lib/Adminizer";
3
+ import { Adminizer } from "../lib/Adminizer.js";
4
4
  export class FormHelper {
5
5
  static get(adminizer, slug) {
6
6
  if (adminizer.config.forms) {
@@ -1,7 +1,6 @@
1
- import inertiaActionsHelper from "./inertiaActionsHelper";
1
+ import inertiaActionsHelper from "./inertiaActionsHelper.js";
2
2
  import chalk from "chalk";
3
- import { isObject } from "./JsUtils";
4
- import { MediaManagerHandler } from "../lib/media-manager/MediaManagerHandler";
3
+ import { isObject } from "./JsUtils.js";
5
4
  export default function inertiaAddHelper(req, entity, fields, record, view = false) {
6
5
  const actionType = 'add';
7
6
  let props = {
@@ -107,7 +106,7 @@ export default function inertiaAddHelper(req, entity, fields, record, view = fal
107
106
  if (type === 'mediamanager') {
108
107
  const mConfig = field.config;
109
108
  const mOptions = mConfig?.options;
110
- const mediaManager = MediaManagerHandler.get(mOptions.id || 'default');
109
+ const mediaManager = req.adminizer.mediaManagerHandler.get(mOptions.id || 'default');
111
110
  if (!mediaManager) {
112
111
  options = {};
113
112
  }
@@ -1,5 +1,4 @@
1
- import { inputText, setSelectMany, getControlsOptions } from "./inertiaAddHelper";
2
- import { MediaManagerHandler } from "../lib/media-manager/MediaManagerHandler";
1
+ import { inputText, setSelectMany, getControlsOptions } from "./inertiaAddHelper.js";
3
2
  export default function inertiaFormHelper(req, postLink, formData) {
4
3
  let props = {
5
4
  fields: [],
@@ -74,7 +73,7 @@ export default function inertiaFormHelper(req, postLink, formData) {
74
73
  }
75
74
  if (type === 'mediamanager') {
76
75
  const mOptions = field.options;
77
- const mediaManager = MediaManagerHandler.get(mOptions.id || 'default');
76
+ const mediaManager = req.adminizer.mediaManagerHandler.get(mOptions.id || 'default');
78
77
  if (!mediaManager) {
79
78
  options = {};
80
79
  }
@@ -1,4 +1,4 @@
1
- import inertiaActionsHelper from "./inertiaActionsHelper";
1
+ import inertiaActionsHelper from "./inertiaActionsHelper.js";
2
2
  export function inertiaListHelper(entity, req, fields) {
3
3
  const actionType = 'list';
4
4
  let props = {
@@ -1,4 +1,4 @@
1
- import { GroupsAccessRightsHelper } from "./accessRightsHelper";
1
+ import { GroupsAccessRightsHelper } from "./accessRightsHelper.js";
2
2
  export class MenuHelper {
3
3
  config;
4
4
  constructor(config) {
@@ -1,7 +1,7 @@
1
1
  import * as path from "path";
2
2
  import * as fs from "fs";
3
- import { Adminizer } from "../lib/Adminizer";
4
- import { I18n } from "../lib/I18n";
3
+ import { Adminizer } from "../lib/Adminizer.js";
4
+ import { I18n } from "../lib/I18n.js";
5
5
  export class TranslationHelper {
6
6
  static loadTranslations(adminizer, translationsPath) {
7
7
  let translationsConfig = adminizer.config.translation;
package/index.d.ts CHANGED
@@ -17,6 +17,7 @@ export * from "./interfaces/MaaterialIcons";
17
17
  export * from "./lib/model/AbstractModel";
18
18
  export * from "./lib/model/adapter/waterline";
19
19
  export * from "./lib/model/adapter/sequelize";
20
+ export * from "./lib/media-manager/AbstractMediaManager";
20
21
  export * from "./lib/Adminizer";
21
22
  export * from "./models/GroupAP";
22
23
  export * from "./models/UserAP";
@@ -25,3 +26,7 @@ export * from "./models/MediaManagerAssociationsAP";
25
26
  export * from "./models/MediaManagerMetaAP";
26
27
  export * from "./models/NavigationAP";
27
28
  export * from "./migrations";
29
+ export * from "./system/bindNavigation";
30
+ export * from "./lib/helper/jwt";
31
+ export * from "./lib/notifications/AbstractNotificationService";
32
+ export * from "./lib/POWCaptcha";
package/index.js CHANGED
@@ -1,27 +1,32 @@
1
- export * from "./helpers/configHelper";
2
- export * from "./helpers/accessRightsHelper";
3
- export * from "./lib/widgets/abstractAction";
4
- export * from "./lib/widgets/abstractInfo";
5
- export * from "./lib/widgets/abstractCustom";
6
- export * from "./lib/widgets/abstractLink";
7
- export * from "./lib/widgets/abstractWidgetBase";
8
- export * from "./lib/widgets/abstractSwitch";
9
- export * from "./lib/widgets/widgetHandler";
10
- export * from "./lib/catalog/AbstractCatalog";
11
- export * from "./lib/catalog/Navigation";
12
- export * from "./lib/catalog/CatalogHandler";
13
- export * from "./lib/media-manager/MediaManagerHandler";
14
- export * from "./interfaces/adminpanelConfig";
15
- export * from "./interfaces/types";
16
- export * from "./interfaces/MaaterialIcons";
17
- export * from "./lib/model/AbstractModel";
18
- export * from "./lib/model/adapter/waterline";
19
- export * from "./lib/model/adapter/sequelize";
20
- export * from "./lib/Adminizer";
21
- export * from "./models/GroupAP";
22
- export * from "./models/UserAP";
23
- export * from "./models/MediaManagerAP";
24
- export * from "./models/MediaManagerAssociationsAP";
25
- export * from "./models/MediaManagerMetaAP";
26
- export * from "./models/NavigationAP";
1
+ export * from "./helpers/configHelper.js";
2
+ export * from "./helpers/accessRightsHelper.js";
3
+ export * from "./lib/widgets/abstractAction.js";
4
+ export * from "./lib/widgets/abstractInfo.js";
5
+ export * from "./lib/widgets/abstractCustom.js";
6
+ export * from "./lib/widgets/abstractLink.js";
7
+ export * from "./lib/widgets/abstractWidgetBase.js";
8
+ export * from "./lib/widgets/abstractSwitch.js";
9
+ export * from "./lib/widgets/widgetHandler.js";
10
+ export * from "./lib/catalog/AbstractCatalog.js";
11
+ export * from "./lib/catalog/Navigation.js";
12
+ export * from "./lib/catalog/CatalogHandler.js";
13
+ export * from "./lib/media-manager/MediaManagerHandler.js";
14
+ export * from "./interfaces/adminpanelConfig.js";
15
+ export * from "./interfaces/types.js";
16
+ export * from "./interfaces/MaaterialIcons.js";
17
+ export * from "./lib/model/AbstractModel.js";
18
+ export * from "./lib/model/adapter/waterline.js";
19
+ export * from "./lib/model/adapter/sequelize.js";
20
+ export * from "./lib/media-manager/AbstractMediaManager.js";
21
+ export * from "./lib/Adminizer.js";
22
+ export * from "./models/GroupAP.js";
23
+ export * from "./models/UserAP.js";
24
+ export * from "./models/MediaManagerAP.js";
25
+ export * from "./models/MediaManagerAssociationsAP.js";
26
+ export * from "./models/MediaManagerMetaAP.js";
27
+ export * from "./models/NavigationAP.js";
27
28
  export * from "./migrations";
29
+ export * from "./system/bindNavigation.js";
30
+ export * from "./lib/helper/jwt.js";
31
+ export * from "./lib/notifications/AbstractNotificationService.js";
32
+ export * from "./lib/POWCaptcha.js";
@@ -190,6 +190,15 @@ export interface AdminpanelConfig {
190
190
  };
191
191
  notifications?: {
192
192
  enabled: boolean;
193
+ enableGeneral?: boolean;
194
+ };
195
+ cors?: {
196
+ enabled: boolean;
197
+ origin: string[] | string;
198
+ path: string;
199
+ credentials?: boolean;
200
+ methods?: string[];
201
+ allowedHeaders?: string[];
193
202
  };
194
203
  }
195
204
  export interface ModelConfig {
@@ -347,6 +356,8 @@ export interface TuiEditorFieldConfig extends BaseFieldConfig {
347
356
  export interface MediaManagerOptionsField {
348
357
  id: 'default' | string;
349
358
  group: string;
359
+ accept: string[];
360
+ initTab?: 'tile-image' | 'table-video' | 'table-text' | 'table-application' | 'table-all' | 'tile-all';
350
361
  config?: Record<string, any>;
351
362
  }
352
363
  interface RangeType {
@@ -452,6 +463,7 @@ export interface NavigationConfig {
452
463
  groupField: {
453
464
  name: string;
454
465
  required: boolean;
466
+ label: string;
455
467
  }[];
456
468
  allowContentInGroup?: boolean;
457
469
  items: NavigationItemTypeConfig[];
@@ -14,6 +14,8 @@ import { ControlsHandler } from "./controls/ControlsHandler";
14
14
  import { CatalogHandler } from "./catalog/CatalogHandler";
15
15
  import { NotificationHandler } from './notifications/NotificationHandler';
16
16
  import { INotification } from "../interfaces/types";
17
+ import { MediaManagerHandler } from "./media-manager/MediaManagerHandler";
18
+ import { StorageServices } from "./catalog/Navigation";
17
19
  export declare class Adminizer {
18
20
  /**
19
21
  * If you convey this default Middleware, it will add it to the very top of the router,
@@ -34,6 +36,8 @@ export declare class Adminizer {
34
36
  vite: ViteDevServer;
35
37
  controlsHandler: ControlsHandler;
36
38
  catalogHandler: CatalogHandler;
39
+ mediaManagerHandler: MediaManagerHandler;
40
+ storageServices: StorageServices;
37
41
  jwtSecret: string;
38
42
  static logger: winston.Logger;
39
43
  constructor(ormAdapters: AbstractAdapter[]);
@@ -46,9 +50,6 @@ export declare class Adminizer {
46
50
  init(config: AdminpanelConfig): Promise<void>;
47
51
  sendNotification(notification: Omit<INotification, 'id' | 'createdAt' | 'icon'>): Promise<boolean>;
48
52
  logSystemEvent(title: string, message: string, metadata?: any): Promise<boolean>;
49
- logSystemCreatedEvent(title: string, message: string, metadata?: any): Promise<boolean>;
50
- logSystemUpdatedEvent(title: string, message: string, metadata?: any): Promise<boolean>;
51
- logSystemDeletedEvent(title: string, message: string, metadata?: any): Promise<boolean>;
52
53
  get emitter(): EventEmitter;
53
54
  getOrmAdapter(ormType: string): AbstractAdapter;
54
55
  static get log(): {
package/lib/Adminizer.js CHANGED
@@ -3,33 +3,35 @@ import cookieParser from 'cookie-parser';
3
3
  import * as path from "path";
4
4
  import winston from "winston";
5
5
  import EventEmitter from 'events';
6
- import PolicyManager from "./PolicyManager";
7
- import Router from "./../system/Router";
8
- import bindAssets from "../system/bindAssets";
9
- import bindDev from "../system/bindDev";
10
- import bindDashboardWidgets from "../system/bindDashboardWidgets";
11
- import bindNavigation from "../system/bindNavigation";
12
- import bindMediaManager from "../system/bindMediaManager";
13
- import bindAccessRights from "../system/bindAccessRights";
14
- import bindAuthorization from "../system/bindAuthorization";
15
- import bindModels from "../system/bindModels";
16
- import bindForms from "../system/bindForms";
17
- import bindTranslations from "../system/bindTranslations";
18
- import { ModelHandler } from "./model/ModelHandler";
19
- import { WidgetHandler } from "./widgets/widgetHandler";
20
- import { AccessRightsHelper } from "../helpers/accessRightsHelper";
21
- import bindReqFunctions from "../system/bindReqFunctions";
22
- import { ConfigHelper } from "../helpers/configHelper";
23
- import { I18n } from "./I18n";
24
- import { getDefaultConfig } from "../system/defaults";
25
- import bindExpressUtils from "../system/bindExpressUtils";
26
- import { bindInertia } from "../system/bindInertia";
27
- import { MenuHelper } from "../helpers/menuHelper";
28
- import { bindControls } from "../system/bindControls";
29
- import { ControlsHandler } from "./controls/ControlsHandler";
30
- import { CatalogHandler } from "./catalog/CatalogHandler";
6
+ import PolicyManager from "./PolicyManager.js";
7
+ import Router from "./../system/Router.js";
8
+ import bindAssets from "../system/bindAssets.js";
9
+ import bindDev from "../system/bindDev.js";
10
+ import bindDashboardWidgets from "../system/bindDashboardWidgets.js";
11
+ import { bindNavigation } from "../system/bindNavigation.js";
12
+ import bindMediaManager from "../system/bindMediaManager.js";
13
+ import bindAccessRights from "../system/bindAccessRights.js";
14
+ import bindAuthorization from "../system/bindAuthorization.js";
15
+ import bindModels from "../system/bindModels.js";
16
+ import bindForms from "../system/bindForms.js";
17
+ import bindTranslations from "../system/bindTranslations.js";
18
+ import { ModelHandler } from "./model/ModelHandler.js";
19
+ import { WidgetHandler } from "./widgets/widgetHandler.js";
20
+ import { AccessRightsHelper } from "../helpers/accessRightsHelper.js";
21
+ import bindReqFunctions from "../system/bindReqFunctions.js";
22
+ import { ConfigHelper } from "../helpers/configHelper.js";
23
+ import { I18n } from "./I18n.js";
24
+ import { getDefaultConfig } from "../system/defaults.js";
25
+ import bindExpressUtils from "../system/bindExpressUtils.js";
26
+ import { bindInertia } from "../system/bindInertia.js";
27
+ import { MenuHelper } from "../helpers/menuHelper.js";
28
+ import { bindControls } from "../system/bindControls.js";
29
+ import { ControlsHandler } from "./controls/ControlsHandler.js";
30
+ import { CatalogHandler } from "./catalog/CatalogHandler.js";
31
31
  import { v4 as uuid } from "uuid";
32
- import { bindNotifications } from "../system/bindNotifications";
32
+ import { bindNotifications } from "../system/bindNotifications.js";
33
+ import { MediaManagerHandler } from "./media-manager/MediaManagerHandler.js";
34
+ import { bindCors } from "../system/bindCors.js";
33
35
  export class Adminizer {
34
36
  // Preconfigures
35
37
  /**
@@ -52,6 +54,8 @@ export class Adminizer {
52
54
  vite;
53
55
  controlsHandler;
54
56
  catalogHandler;
57
+ mediaManagerHandler;
58
+ storageServices;
55
59
  // Constants
56
60
  jwtSecret = process.env.JWT_SECRET ?? uuid();
57
61
  static logger = winston.createLogger({
@@ -147,16 +151,9 @@ export class Adminizer {
147
151
  chalk.blue('\nAccess your app at http://localhost:3000'));
148
152
  }
149
153
  async init(config) {
150
- // set cookie parser
151
- this.app.use(cookieParser());
152
154
  if (!config || Object.keys(config).length === 0) {
153
155
  Adminizer.log.warn(`Adminizer init > Adminizer config is emtpy`);
154
156
  }
155
- // Set vite middleware
156
- const isViteDev = process.env.VITE_ENV === "dev";
157
- if (isViteDev)
158
- await this.viteMiddleware();
159
- this.emitter.emit('adminizer:init');
160
157
  if (this.config && Object.keys(this.config).length > 0) {
161
158
  throw new Error("Config has already been initialized");
162
159
  }
@@ -181,6 +178,15 @@ export class Adminizer {
181
178
  set: configForms.set ?? defaultForms.set
182
179
  }
183
180
  };
181
+ // Bind cors
182
+ bindCors(this);
183
+ // set cookie parser
184
+ this.app.use(cookieParser());
185
+ // Set vite middleware
186
+ const isViteDev = process.env.VITE_ENV === "dev";
187
+ if (isViteDev)
188
+ await this.viteMiddleware();
189
+ this.emitter.emit('adminizer:init');
184
190
  this.modelHandler = new ModelHandler();
185
191
  // TODO: 'hot reload' unbind models & unbind forms
186
192
  await bindModels(this);
@@ -195,6 +201,7 @@ export class Adminizer {
195
201
  this.menuHelper = new MenuHelper(this.config);
196
202
  this.widgetHandler = new WidgetHandler(this);
197
203
  this.catalogHandler = new CatalogHandler();
204
+ this.mediaManagerHandler = new MediaManagerHandler();
198
205
  bindExpressUtils(this.app);
199
206
  bindReqFunctions(this);
200
207
  // Bind assets
@@ -205,7 +212,7 @@ export class Adminizer {
205
212
  }
206
213
  }
207
214
  await bindDashboardWidgets(this);
208
- bindNavigation(this);
215
+ await bindNavigation(this);
209
216
  bindMediaManager(this);
210
217
  await bindAccessRights(this);
211
218
  if (I18n.appendLocale) {
@@ -250,19 +257,6 @@ export class Adminizer {
250
257
  return Promise.resolve(false);
251
258
  }
252
259
  }
253
- // Хелпер для CRUD системных событий
254
- async logSystemCreatedEvent(title, message, metadata) {
255
- const systemNotificationService = this.notificationHandler.getService('system');
256
- return systemNotificationService.logCreatedEvent(title, message, metadata);
257
- }
258
- async logSystemUpdatedEvent(title, message, metadata) {
259
- const systemNotificationService = this.notificationHandler.getService('system');
260
- return systemNotificationService.logUpdatedEvent(title, message, metadata);
261
- }
262
- async logSystemDeletedEvent(title, message, metadata) {
263
- const systemNotificationService = this.notificationHandler.getService('system');
264
- return systemNotificationService.logDeletedEvent(title, message, metadata);
265
- }
266
260
  get emitter() {
267
261
  return this._emitter;
268
262
  }
@@ -1,6 +1,6 @@
1
- import { ControllerHelper } from "../helpers/controllerHelper";
2
- import { Adminizer } from "./Adminizer";
3
- import { isObject } from "../helpers/JsUtils";
1
+ import { ControllerHelper } from "../helpers/controllerHelper.js";
2
+ import { Adminizer } from "./Adminizer.js";
3
+ import { isObject } from "../helpers/JsUtils.js";
4
4
  export class DataAccessor {
5
5
  adminizer;
6
6
  user;