adminizer 4.1.0-commit.ad1476a → 4.1.0-commit.d8a06d3

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 (173) hide show
  1. package/assets/{VanillaJSONEditor-FUe77pIA.js → VanillaJSONEditor-D-Lx670g.js} +1 -1
  2. package/assets/add-BP_u3Tjl.js +1 -0
  3. package/assets/add-form-nffmiYTh.js +1 -0
  4. package/assets/add-group-D4vcHlm-.js +1 -0
  5. package/assets/{add-group-form-dzadPSfL.js → add-group-form-gNJW11-q.js} +1 -1
  6. package/assets/add-user-DWh3Nas0.js +1 -0
  7. package/assets/add-user-form-BJ0FsZYJ.js +1 -0
  8. package/assets/{app-DMmad2-f.css → app-WTooYWC3.css} +1 -1
  9. package/assets/{app-layout-D1m9Kvxq.js → app-layout-DYsRFUuP.js} +1 -1
  10. package/assets/{app-shell-BWMRMkHM.js → app-shell-Dd9Eknik.js} +1 -1
  11. package/assets/app-sidebar-BOmu6-Sl.js +1 -0
  12. package/assets/{app-sidebar-header-DLAFi13E.js → app-sidebar-header-CoXSzWxk.js} +1 -1
  13. package/assets/app.js +2 -2
  14. package/assets/{breadcrumbs-CQNon4Vl.js → breadcrumbs-BmAq4fHT.js} +1 -1
  15. package/assets/{button-CQ9t1kLz.js → button-C9B_5Jf_.js} +1 -1
  16. package/assets/{checkbox-W0nGAXIj.js → checkbox-Fg27sL_1.js} +1 -1
  17. package/assets/{compiler-runtime-tM4jBQ-T.js → compiler-runtime-hB6dAw2d.js} +1 -1
  18. package/assets/dashboard-BACj996r.js +3 -0
  19. package/assets/dashboard-BOltB2Hq.css +1 -0
  20. package/assets/{date-picker-B__dVVqj.js → date-picker-DI1cCO7K.js} +1 -1
  21. package/assets/{dropdown-menu-SEBnEIiL.js → dropdown-menu-Bhj17ENm.js} +1 -1
  22. package/assets/{field-renderer-CapylJU9.js → field-renderer-DVHZF6HS.js} +3 -3
  23. package/assets/form-BgWdwvz1.js +1 -0
  24. package/assets/form-DgtErfln.js +1 -0
  25. package/assets/{geo-json-CwteYDGB.js → geo-json-BjiyTtMu.js} +1 -1
  26. package/assets/{handsontable-BCnjOpBr.js → handsontable-4mjU_b0n.js} +1 -1
  27. package/assets/home-CHntBHJa.js +2 -0
  28. package/assets/{icon-Bz9BMaD0.js → icon-Dt0vBgDO.js} +1 -1
  29. package/assets/index-B8BS9wMC.js +1 -0
  30. package/assets/{index-DEk3sC8d.js → index-BKCgnGj_.js} +1 -1
  31. package/assets/{index-C0SL3SHw.js → index-BykbU6Ee.js} +1 -1
  32. package/assets/index-CaJgc5EZ.js +1 -0
  33. package/assets/{index-BcE9FUM6.js → index-Cgp8OfuI.js} +1 -1
  34. package/assets/{index-DTRTjOmh.js → index-Cw5o84pO.js} +1 -1
  35. package/assets/{init-user-D9mW-g14.js → init-user-JfCKJ5Ce.js} +1 -1
  36. package/assets/{input-DF7Ue23C.js → input-CvRbIbk4.js} +1 -1
  37. package/assets/{input-error-BBygona6.js → input-error-DMK7cAt7.js} +1 -1
  38. package/assets/{label-Z506NKsW.js → label-CSLFe9Bz.js} +1 -1
  39. package/assets/list-B2Oa5O_Q.js +1 -0
  40. package/assets/{list-table-DB1sEQLF.js → list-table-DA9MhywL.js} +5 -5
  41. package/assets/{login-DrGaTWhY.js → login-DQwGtdis.js} +1 -1
  42. package/assets/manifest.json +491 -470
  43. package/assets/{material-icon-CItZiB53.js → material-icon-BJg8o_fs.js} +1 -1
  44. package/assets/module-DWXp59Vg.js +1 -0
  45. package/assets/{monaco-editor-DqAqwxw4.js → monaco-editor-CJs0_GlD.js} +1 -1
  46. package/assets/{multi-select-oabtVhUP.js → multi-select-BvRpAW8r.js} +1 -1
  47. package/assets/{nav-footer-CM-yHiRs.js → nav-footer-Bs4dmN1d.js} +1 -1
  48. package/assets/{nav-main-Q3xofGRT.js → nav-main-Bq3IMk4C.js} +1 -1
  49. package/assets/{nav-user-Ds8i0Pa2.js → nav-user-CbB22J5O.js} +1 -1
  50. package/assets/{pagination-render-B57pOpFy.js → pagination-render-DuXDDbC_.js} +1 -1
  51. package/assets/{popover-I249Gg2O.js → popover-DtoGI2b1.js} +1 -1
  52. package/assets/{register-C9FQIDtS.js → register-BSogVF0h.js} +1 -1
  53. package/assets/{select-D1N8zRPY.js → select-BWepUw-9.js} +1 -1
  54. package/assets/{sidebar-4D-sX2l4.js → sidebar-CAHsHdjM.js} +2 -2
  55. package/assets/skeleton-COOcAA8f.js +1 -0
  56. package/assets/{sonner-Dzckw3U3.js → sonner-BI0IFOQN.js} +1 -1
  57. package/assets/{toast-editor-FbrFd1ft.js → toast-editor-CMK7QtF1.js} +1 -1
  58. package/assets/{tooltip-D2ehgLlB.js → tooltip-DHwpLKOI.js} +1 -1
  59. package/assets/{use-appearance-Co6mO0dV.js → use-appearance-DRfIqTgw.js} +1 -1
  60. package/assets/{use-window-size-B8l6Bpkf.js → use-window-size-h0Sh_NvX.js} +1 -1
  61. package/assets/{user-info-DBYoAJYJ.js → user-info-DFrmpJ4y.js} +1 -1
  62. package/assets/{user-menu-content-qkvdkUVd.js → user-menu-content-DPXQdERj.js} +1 -1
  63. package/assets/welcome-B4WCIXKf.js +1 -0
  64. package/controllers/add.js +2 -2
  65. package/controllers/addGroup.js +2 -4
  66. package/controllers/addUser.js +4 -6
  67. package/controllers/catalog/Catalog.js +2 -2
  68. package/controllers/catalog/FrontentCatalogAdapter.js +1 -2
  69. package/controllers/ckeditorUpload.js +2 -3
  70. package/controllers/dashboard.js +16 -2
  71. package/controllers/edit.js +2 -3
  72. package/controllers/editGroup.js +2 -4
  73. package/controllers/editUser.js +3 -5
  74. package/controllers/form.js +2 -3
  75. package/controllers/getAllWidgets.js +3 -3
  76. package/controllers/initUser.js +1 -2
  77. package/controllers/list.js +4 -4
  78. package/controllers/login.js +31 -15
  79. package/controllers/media-manager/mediaManagerAdapter.js +1 -2
  80. package/controllers/media-manager/mediaManagerApi.js +2 -2
  81. package/controllers/navigation/edit.js +1 -1
  82. package/controllers/processInstallFinalize.js +2 -2
  83. package/controllers/processInstallStep.d.ts +0 -1
  84. package/controllers/processInstallStep.js +122 -132
  85. package/controllers/register.js +1 -4
  86. package/controllers/remove.js +2 -2
  87. package/controllers/timezones.js +1 -1
  88. package/controllers/view.js +2 -2
  89. package/controllers/welcome.js +1 -1
  90. package/controllers/widgets/Action.js +2 -2
  91. package/controllers/widgets/Custom.js +2 -2
  92. package/controllers/widgets/Info.js +2 -2
  93. package/controllers/widgets/switch.js +2 -2
  94. package/controllers/widgetsDB.js +5 -5
  95. package/helpers/accessRightsHelper.d.ts +3 -2
  96. package/helpers/accessRightsHelper.js +1 -1
  97. package/helpers/configHelper.js +2 -1
  98. package/helpers/fieldsHelper.d.ts +1 -1
  99. package/helpers/inertiaActionsHelper.js +1 -1
  100. package/helpers/inertiaAddHelper.d.ts +1 -1
  101. package/helpers/inertiaAddHelper.js +2 -0
  102. package/helpers/inertiaFromHelper.js +2 -0
  103. package/helpers/inertiaGroupHelper.d.ts +4 -2
  104. package/helpers/inertiaGroupHelper.js +1 -1
  105. package/helpers/inertiaListHelper.js +5 -5
  106. package/helpers/inertiaMenuHelper.js +1 -1
  107. package/helpers/inertiaUserHelper.d.ts +7 -1
  108. package/helpers/inertiaUserHelper.js +5 -1
  109. package/index.d.ts +7 -0
  110. package/index.js +7 -0
  111. package/interfaces/adminpanelConfig.d.ts +6 -2
  112. package/interfaces/global.d.ts +5 -26
  113. package/lib/Adminizer.d.ts +2 -0
  114. package/lib/Adminizer.js +17 -1
  115. package/lib/catalog/AbstractCatalog.js +0 -1
  116. package/lib/catalog/Navigation.js +6 -6
  117. package/lib/datatable/NodeTable.js +0 -3
  118. package/lib/inertia/inertiaAdapter.js +0 -1
  119. package/lib/installStepper/installStepper.js +5 -5
  120. package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
  121. package/lib/media-manager/AbstractMediaManager.js +1 -1
  122. package/lib/v4/DataAccessor.d.ts +2 -1
  123. package/lib/v4/DataAccessor.js +2 -2
  124. package/lib/v4/POWCaptcha.js +0 -1
  125. package/lib/v4/PolicyManager.js +0 -1
  126. package/lib/v4/helper/jwt.d.ts +10 -0
  127. package/lib/v4/helper/jwt.js +18 -0
  128. package/lib/v4/model/AbstractModel.js +0 -2
  129. package/lib/v4/model/ModelHandler.js +0 -1
  130. package/lib/v4/model/adapter/sequelize.d.ts +3 -2
  131. package/lib/v4/model/adapter/sequelize.js +250 -58
  132. package/lib/v4/model/adapter/waterline.js +0 -1
  133. package/lib/widgets/abstractAction.d.ts +1 -1
  134. package/lib/widgets/abstractCustom.d.ts +27 -12
  135. package/lib/widgets/abstractCustom.js +8 -2
  136. package/lib/widgets/abstractInfo.d.ts +1 -1
  137. package/lib/widgets/abstractInfo.js +1 -1
  138. package/lib/widgets/abstractLink.d.ts +1 -0
  139. package/lib/widgets/abstractSwitch.d.ts +1 -1
  140. package/lib/widgets/abstractWidgetBase.d.ts +1 -1
  141. package/lib/widgets/widgetHandler.d.ts +20 -3
  142. package/lib/widgets/widgetHandler.js +25 -25
  143. package/models/GroupAP.d.ts +8 -0
  144. package/models/MediaManagerAP.d.ts +16 -0
  145. package/models/MediaManagerAssociationsAP.d.ts +10 -0
  146. package/models/MediaManagerMetaAP.d.ts +8 -0
  147. package/models/NavigationAP.d.ts +5 -0
  148. package/models/UserAP.d.ts +25 -2
  149. package/models/UserAP.js +2 -2
  150. package/package.json +17 -10
  151. package/policies/checkAuth.js +4 -3
  152. package/policies/setLocale.js +2 -2
  153. package/system/Router.js +14 -14
  154. package/system/bindAuthorization.js +4 -5
  155. package/system/bindInertia.js +9 -9
  156. package/system/bindInstallStepper.js +1 -1
  157. package/system/bindReqFunctions.js +16 -0
  158. package/translations/ru.json +17 -8
  159. package/assets/add-ZITr43GJ.js +0 -1
  160. package/assets/add-form-CYOfr0Ef.js +0 -1
  161. package/assets/add-group-B332wN8K.js +0 -1
  162. package/assets/add-user-TC-mYdsB.js +0 -1
  163. package/assets/add-user-form-y2f_1_lM.js +0 -1
  164. package/assets/app-sidebar-BCtaEFGb.js +0 -1
  165. package/assets/dashboard-BR602KhL.js +0 -1
  166. package/assets/form-DOUNk3o2.js +0 -1
  167. package/assets/form-lOKv4Qbw.js +0 -1
  168. package/assets/home-Ch6QfTIt.js +0 -2
  169. package/assets/index-Cdb9ACvz.js +0 -1
  170. package/assets/index-K81GbF6O.js +0 -1
  171. package/assets/list-Qyd7ecQH.js +0 -1
  172. package/assets/module-DBaykv8l.js +0 -1
  173. package/assets/welcome-D2adQ8EU.js +0 -1
@@ -3,6 +3,7 @@ import InfoBase from "./abstractInfo";
3
3
  import ActionBase from "./abstractAction";
4
4
  import LinkBase from "./abstractLink";
5
5
  import CustomBase from "./abstractCustom";
6
+ import * as process from "node:process";
6
7
  export class WidgetHandler {
7
8
  widgets = [];
8
9
  adminizer;
@@ -34,7 +35,7 @@ export class WidgetHandler {
34
35
  }
35
36
  }
36
37
  }
37
- getAll(user) {
38
+ getAll(user, i18n) {
38
39
  let widgets = [];
39
40
  if (this.widgets.length) {
40
41
  let id_key = 0;
@@ -45,9 +46,9 @@ export class WidgetHandler {
45
46
  id: `${widget.id}__${id_key}`,
46
47
  type: widget.widgetType,
47
48
  api: `${this.adminizer.config.routePrefix}/widgets-switch/${widget.id}`,
48
- description: widget.description,
49
+ description: i18n.__(widget.description),
49
50
  icon: widget.icon,
50
- name: widget.name,
51
+ name: i18n.__(widget.name),
51
52
  backgroundCSS: widget.backgroundCSS ?? null,
52
53
  size: widget.size ?? null
53
54
  });
@@ -59,9 +60,9 @@ export class WidgetHandler {
59
60
  id: `${widget.id}__${id_key}`,
60
61
  type: widget.widgetType,
61
62
  api: `${this.adminizer.config.routePrefix}/widgets-info/${widget.id}`,
62
- description: widget.description,
63
+ description: i18n.__(widget.description),
63
64
  icon: widget.icon,
64
- name: widget.name,
65
+ name: i18n.__(widget.name),
65
66
  backgroundCSS: widget.backgroundCSS ?? null,
66
67
  size: widget.size ?? null
67
68
  });
@@ -73,9 +74,9 @@ export class WidgetHandler {
73
74
  id: `${widget.id}__${id_key}`,
74
75
  type: widget.widgetType,
75
76
  api: `${this.adminizer.config.routePrefix}/widgets-action/${widget.id}`,
76
- description: widget.description,
77
+ description: i18n.__(widget.description),
77
78
  icon: widget.icon,
78
- name: widget.name,
79
+ name: i18n.__(widget.name),
79
80
  backgroundCSS: widget.backgroundCSS ?? null,
80
81
  size: widget.size ?? null
81
82
  });
@@ -86,10 +87,11 @@ export class WidgetHandler {
86
87
  let links_id_key = 0;
87
88
  for (const link of widget.links) {
88
89
  widgets.push({
89
- name: link.name,
90
+ name: i18n.__(link.name),
90
91
  id: `${widget.id}__${links_id_key}`,
91
92
  type: 'link',
92
- description: link.description,
93
+ linkType: link.linkType,
94
+ description: i18n.__(link.description),
93
95
  link: link.link,
94
96
  icon: link.icon,
95
97
  backgroundCSS: link.backgroundCSS
@@ -104,15 +106,12 @@ export class WidgetHandler {
104
106
  id: `${widget.id}_${id_key}`,
105
107
  type: widget.widgetType,
106
108
  api: `${this.adminizer.config.routePrefix}/widgets-custom/${widget.id}`,
107
- description: widget.description,
109
+ description: i18n.__(widget.description),
108
110
  icon: widget.icon,
109
- name: widget.name,
111
+ name: i18n.__(widget.name),
110
112
  backgroundCSS: widget.backgroundCSS ?? null,
111
113
  size: widget.size ?? null,
112
- scriptUrl: widget.scriptUrl,
113
- constructorName: widget.constructorName,
114
- constructorOption: widget.constructorOption,
115
- hideAdminPanelUI: widget.hideAdminPanelUI
114
+ scriptUrl: process.env.VITE_ENV === 'dev' ? widget.jsPath.dev : widget.jsPath.production,
116
115
  });
117
116
  }
118
117
  }
@@ -123,9 +122,9 @@ export class WidgetHandler {
123
122
  }
124
123
  return Promise.resolve(widgets);
125
124
  }
126
- async getWidgetsDB(id, auth) {
125
+ async getWidgetsDB(id, auth, i18n) {
127
126
  let user;
128
- let widgets;
127
+ let result = { widgets: [], layout: [] };
129
128
  if (!auth) {
130
129
  // TODO refactor CRUD functions for DataAccessor usage
131
130
  user = await this.adminizer.modelHandler.model.get("UserAP")?.["_findOne"]({ login: this.adminizer.config.administrator?.login ?? 'admin' });
@@ -134,11 +133,11 @@ export class WidgetHandler {
134
133
  // TODO refactor CRUD functions for DataAccessor usage
135
134
  user = await this.adminizer.modelHandler.model.get("UserAP")?.["_findOne"]({ id: id });
136
135
  }
137
- if (!user || !user.widgets || user.widgets.length === 0) {
136
+ if (!user || !user.widgets || user.widgets.widgets.length === 0) {
138
137
  if (this.adminizer.config.dashboard && typeof this.adminizer.config.dashboard !== "boolean" && this.adminizer.config.dashboard.defaultWidgets) {
139
138
  let defaultWidgets = this.adminizer.config.dashboard.defaultWidgets;
140
- widgets = await this.getAll(user);
141
- widgets.forEach(widget => {
139
+ result.widgets = await this.getAll(user, i18n);
140
+ result.widgets.forEach(widget => {
142
141
  if (defaultWidgets.includes(widget.id.split("__")[0])) {
143
142
  widget.added = true;
144
143
  }
@@ -146,19 +145,20 @@ export class WidgetHandler {
146
145
  }
147
146
  }
148
147
  else {
149
- widgets = user.widgets;
148
+ result.widgets = user.widgets.widgets;
149
+ result.layout = user.widgets.layout;
150
150
  }
151
- return widgets;
151
+ return result;
152
152
  }
153
- async setWidgetsDB(id, widgets, auth) {
153
+ async setWidgetsDB(id, body, auth) {
154
154
  if (!auth) {
155
155
  // TODO refactor CRUD functions for DataAccessor usage
156
- let updatedUser = await this.adminizer.modelHandler.model.get("UserAP")?.["_updateOne"]({ login: this.adminizer.config.administrator?.login ?? 'admin' }, { widgets: widgets });
156
+ let updatedUser = await this.adminizer.modelHandler.model.get("UserAP")?.["_updateOne"]({ login: this.adminizer.config.administrator?.login ?? 'admin' }, { widgets: body });
157
157
  return updatedUser.id;
158
158
  }
159
159
  else {
160
160
  // TODO refactor CRUD functions for DataAccessor usage
161
- let updatedUser = await this.adminizer.modelHandler.model.get("UserAP")?.["_updateOne"]({ id: id }, { widgets: widgets });
161
+ let updatedUser = await this.adminizer.modelHandler.model.get("UserAP")?.["_updateOne"]({ id: id }, { widgets: body });
162
162
  return updatedUser.id;
163
163
  }
164
164
  }
@@ -1,3 +1,4 @@
1
+ import { UserAP } from "./UserAP";
1
2
  declare const _default: {
2
3
  id: {
3
4
  type: string;
@@ -21,3 +22,10 @@ declare const _default: {
21
22
  };
22
23
  };
23
24
  export default _default;
25
+ export interface GroupAP {
26
+ id: number;
27
+ name: string;
28
+ description?: string;
29
+ tokens?: string[];
30
+ users?: UserAP[];
31
+ }
@@ -1,3 +1,5 @@
1
+ import { MediaManagerAssociationsAP } from "./MediaManagerAssociationsAP";
2
+ import { MediaManagerMetaAP } from "./MediaManagerMetaAP";
1
3
  declare const _default: {
2
4
  id: {
3
5
  type: string;
@@ -44,3 +46,17 @@ declare const _default: {
44
46
  };
45
47
  };
46
48
  export default _default;
49
+ export interface MediaManagerAP {
50
+ id: string;
51
+ parent?: MediaManagerAP;
52
+ variants?: MediaManagerAP[];
53
+ mimeType?: string;
54
+ path?: string;
55
+ size?: number;
56
+ group?: string;
57
+ tag?: string;
58
+ url?: string;
59
+ filename?: string;
60
+ meta?: MediaManagerMetaAP[];
61
+ modelAssociation?: MediaManagerAssociationsAP[];
62
+ }
@@ -1,3 +1,4 @@
1
+ import { MediaManagerAP } from "./MediaManagerAP";
1
2
  declare const _default: {
2
3
  id: {
3
4
  type: string;
@@ -26,3 +27,12 @@ declare const _default: {
26
27
  };
27
28
  };
28
29
  export default _default;
30
+ export interface MediaManagerAssociationsAP {
31
+ id: string;
32
+ mediaManagerId?: string;
33
+ model?: Record<string, unknown>;
34
+ modelId?: Record<string, unknown>;
35
+ widgetName?: string;
36
+ sortOrder?: number;
37
+ file?: MediaManagerAP;
38
+ }
@@ -1,3 +1,4 @@
1
+ import { MediaManagerAP } from "./MediaManagerAP";
1
2
  declare const _default: {
2
3
  id: {
3
4
  type: string;
@@ -20,3 +21,10 @@ declare const _default: {
20
21
  };
21
22
  };
22
23
  export default _default;
24
+ export interface MediaManagerMetaAP {
25
+ id: string;
26
+ key?: string;
27
+ value?: Record<string, unknown>;
28
+ isPublic?: boolean;
29
+ parent?: MediaManagerAP;
30
+ }
@@ -16,3 +16,8 @@ declare const _default: {
16
16
  };
17
17
  };
18
18
  export default _default;
19
+ export interface NavigationAP {
20
+ id: string;
21
+ label: string;
22
+ tree: Record<string, unknown>;
23
+ }
@@ -1,3 +1,6 @@
1
+ import { WidgetConfig } from "lib/widgets/widgetHandler";
2
+ import { GroupAP } from "./GroupAP";
3
+ import { WidgetLayoutItem } from "../assets/js/types";
1
4
  declare const _default: {
2
5
  id: {
3
6
  type: string;
@@ -16,10 +19,10 @@ declare const _default: {
16
19
  email: {
17
20
  type: string;
18
21
  };
19
- passwordHashed: {
22
+ avatar: {
20
23
  type: string;
21
24
  };
22
- password: {
25
+ passwordHashed: {
23
26
  type: string;
24
27
  };
25
28
  timezone: {
@@ -52,3 +55,23 @@ declare const _default: {
52
55
  };
53
56
  };
54
57
  export default _default;
58
+ export interface UserAP {
59
+ id: number;
60
+ login: string;
61
+ fullName?: string;
62
+ email?: string;
63
+ avatar?: string;
64
+ passwordHashed?: string;
65
+ timezone?: string;
66
+ expires?: string;
67
+ locale?: string;
68
+ isDeleted?: boolean;
69
+ isActive?: boolean;
70
+ isAdministrator?: boolean;
71
+ groups?: GroupAP[];
72
+ widgets?: {
73
+ widgets: WidgetConfig[];
74
+ layout: WidgetLayoutItem[];
75
+ };
76
+ isConfirmed?: boolean;
77
+ }
package/models/UserAP.js CHANGED
@@ -16,10 +16,10 @@ export default {
16
16
  email: {
17
17
  type: "string"
18
18
  },
19
- passwordHashed: {
19
+ avatar: {
20
20
  type: "string"
21
21
  },
22
- password: {
22
+ passwordHashed: {
23
23
  type: "string"
24
24
  },
25
25
  timezone: {
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "adminizer",
3
3
  "type": "module",
4
- "version": "4.1.0-commit.ad1476a",
4
+ "version": "4.1.0-commit.d8a06d3",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1",
8
- "start": "tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
8
+ "start": "cross-env NO_SEED_DATA=true ORM=sequelize tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
9
9
  "dev": "cross-env VITE_ENV=dev tsx watch --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
10
+ "dev:sequelize": "cross-env VITE_ENV=dev NO_SEED_DATA=true ORM=sequelize tsx watch --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
10
11
  "build:assets": "vite build",
11
12
  "compile:backend": "tsc -p src/tsconfig.json",
12
13
  "watch:backend": "tsc -w -p src/tsconfig.json",
@@ -17,9 +18,9 @@
17
18
  "build:react-quill": "vite build --config modules/controls/wysiwyg/vite.config.react-quill.ts",
18
19
  "copy:modules": "node copy-modules.js",
19
20
  "build:assets:modules": "npm run build:assets && npm run copy:modules",
20
- "start:seed": "cross-env SEED_DATA=true tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
21
+ "start:seed": "cross-env ORM=sequelize tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
21
22
  "demo:build": "npm run copy:backend && npm run compile:backend && npm run build:assets && npm run copy:modules",
22
- "demo": "cross-env SEED_DATA=true DEMO=true tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts"
23
+ "demo": "cross-env ORM=sequelize tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts"
23
24
  },
24
25
  "keywords": [],
25
26
  "author": "",
@@ -27,9 +28,12 @@
27
28
  "description": "",
28
29
  "dependencies": {
29
30
  "@radix-ui/react-menubar": "^1.1.12",
31
+ "@radix-ui/react-portal": "^1.1.6",
32
+ "@radix-ui/react-switch": "^1.2.4",
30
33
  "body-parser": "^1.20.3",
31
34
  "chalk": "^5.4.1",
32
35
  "cmdk": "^1.1.1",
36
+ "cookie": "^1.0.2",
33
37
  "cookie-parser": "^1.4.7",
34
38
  "cors": "^2.8.5",
35
39
  "crypto-puzzle": "^5.0.2",
@@ -37,13 +41,14 @@
37
41
  "ejs": "^3.1.10",
38
42
  "express": "^4.21.2",
39
43
  "express-session": "^1.18.1",
40
- "ky": "^1.8.0",
44
+ "jsonwebtoken": "^9.0.2",
41
45
  "multer": "^1.4.5-lts.1",
42
46
  "next-themes": "^0.4.6",
43
47
  "password-hash": "^1.2.2",
44
48
  "sharp": "^0.33.5",
45
49
  "typeorm": "^0.3.20",
46
50
  "uuid": "^11.0.5",
51
+ "waterline": "^0.15.2",
47
52
  "winston": "^3.17.0"
48
53
  },
49
54
  "devDependencies": {
@@ -73,6 +78,7 @@
73
78
  "@types/express-session": "^1.18.1",
74
79
  "@types/he": "^1.2.3",
75
80
  "@types/json-schema": "^7.0.15",
81
+ "@types/jsonwebtoken": "^9.0.9",
76
82
  "@types/leaflet": "^1.9.17",
77
83
  "@types/lodash-es": "^4.17.12",
78
84
  "@types/multer": "^1.4.12",
@@ -80,6 +86,7 @@
80
86
  "@types/password-hash": "^1.2.24",
81
87
  "@types/react": "^19.0.3",
82
88
  "@types/react-dom": "^19.0.2",
89
+ "@types/react-grid-layout": "^1.3.5",
83
90
  "@types/sprintf-js": "^1.1.4",
84
91
  "@types/uuid": "^10.0.0",
85
92
  "@types/waterline": "^0.13.9",
@@ -99,15 +106,19 @@
99
106
  "react": "^19.0.0",
100
107
  "react-day-picker": "^8.10.1",
101
108
  "react-dom": "^19.0.0",
109
+ "react-grid-layout": "^1.5.1",
102
110
  "react-intersection-observer": "^9.16.0",
103
111
  "react-leaflet": "^5.0.0",
104
112
  "react-quill-new": "^3.4.6",
105
113
  "react-simple-wysiwyg": "^3.2.2",
106
114
  "sails-disk": "^2.1.2",
107
115
  "sails-postgresql": "^5.0.1",
116
+ "sequelize": "^6.37.5",
117
+ "sequelize-typescript": "^2.1.6",
108
118
  "shelljs": "^0.9.2",
109
119
  "sonner": "^2.0.3",
110
120
  "sprintf-js": "^1.1.3",
121
+ "sqlite3": "^5.1.7",
111
122
  "tailwind-merge": "^3.0.2",
112
123
  "tailwindcss": "^4.0.15",
113
124
  "tsx": "^4.19.3",
@@ -116,10 +127,6 @@
116
127
  "vanilla-jsoneditor": "^3.1.1",
117
128
  "vite": "^6.1.0",
118
129
  "vite-plugin-externals": "^0.6.2",
119
- "vite-plugin-full-reload": "^1.2.0",
120
- "waterline": "^0.15.2",
121
- "sqlite3": "^5.1.7",
122
- "sequelize": "^6.37.5",
123
- "sequelize-typescript": "^2.1.6"
130
+ "vite-plugin-full-reload": "^1.2.0"
124
131
  }
125
132
  }
@@ -4,12 +4,13 @@ export default async function checkAuth(req, res, proceed) {
4
4
  locale = req.adminizer.config.translation.defaultLocale;
5
5
  }
6
6
  if (!req.adminizer.config.auth.enable) {
7
- if (req.session.UserAP) {
8
- req.session.UserAP.isAdministrator = true;
7
+ if (req.user) {
8
+ req.user.isAdministrator = true;
9
9
  }
10
10
  else {
11
- req.session.UserAP = {
11
+ req.user = {
12
12
  id: 0,
13
+ login: "No Auth",
13
14
  isAdministrator: true,
14
15
  locale: locale
15
16
  };
@@ -5,8 +5,8 @@ export default async function setLocale(req, res, proceed) {
5
5
  if (typeof req.adminizer.config.translation === 'boolean') {
6
6
  return proceed();
7
7
  }
8
- if (req.session.UserAP && req.session.UserAP.locale) {
9
- req.i18n.setLocale(req.session.UserAP.locale);
8
+ if (req.user && req.user.locale) {
9
+ req.i18n.setLocale(req.user.locale);
10
10
  }
11
11
  else {
12
12
  req.i18n.setLocale(req.adminizer.config.translation.defaultLocale);
package/system/Router.js CHANGED
@@ -1,5 +1,5 @@
1
- import _processInstallStep from "../controllers/processInstallStep";
2
- import _processInstallFinalize from "../controllers/processInstallFinalize";
1
+ // import _processInstallStep from "../controllers/processInstallStep";
2
+ // import _processInstallFinalize from "../controllers/processInstallFinalize";
3
3
  import _dashboard from "../controllers/dashboard";
4
4
  import _welcome from "../controllers/welcome";
5
5
  import _list from "../controllers/list";
@@ -38,33 +38,33 @@ export default class Router {
38
38
  /**
39
39
  * Widgets All
40
40
  */
41
- adminizer.app.all(`/widgets-get-all`, adminizer.policyManager.bindPolicies(policies, _getAllWidgets));
41
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-get-all`, adminizer.policyManager.bindPolicies(policies, _getAllWidgets));
42
42
  /**
43
43
  * Widgets All from DB
44
44
  */
45
- adminizer.app.all(`/widgets-get-all-db`, adminizer.policyManager.bindPolicies(policies, _widgetsDB));
45
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-get-all-db`, adminizer.policyManager.bindPolicies(policies, _widgetsDB));
46
46
  /**
47
47
  * Widgets Switch
48
48
  */
49
- adminizer.app.all(`/widgets-switch/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetSwitchController));
49
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-switch/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetSwitchController));
50
50
  /**
51
51
  * Widgets Info
52
52
  */
53
- adminizer.app.all(`/widgets-info/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetInfoController));
53
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-info/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetInfoController));
54
54
  /**
55
55
  * Widgets Action
56
56
  */
57
- adminizer.app.all(`/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetActionController));
57
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetActionController));
58
58
  /**
59
59
  * Widgets Custom
60
60
  */
61
- adminizer.app.all(`/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetCustomController));
62
- /**
63
- * Module Install Stepper
64
- * @deprecated
65
- * */
66
- adminizer.app.all(`/install/:id`, adminizer.policyManager.bindPolicies(policies, _processInstallStep));
67
- adminizer.app.all(`/install/:id/finalize`, adminizer.policyManager.bindPolicies(policies, _processInstallFinalize));
61
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetCustomController));
62
+ // /**
63
+ // * Module Install Stepper
64
+ // * @deprecated
65
+ // * */
66
+ // adminizer.app.all(`/install/:id`, adminizer.policyManager.bindPolicies(policies, _processInstallStep));
67
+ // adminizer.app.all(`/install/:id/finalize`, adminizer.policyManager.bindPolicies(policies, _processInstallFinalize));
68
68
  /**
69
69
  * Edit form
70
70
  * */
@@ -25,8 +25,7 @@ export default async function bindAuthorization(adminizer) {
25
25
  for (let admin of admins) {
26
26
  adminsCredentials.push({
27
27
  fullName: admin.fullName,
28
- login: admin.login,
29
- password: admin.password
28
+ login: admin.login
30
29
  });
31
30
  }
32
31
  Adminizer.log.debug(`Has Administrators with login [${adminsCredentials[0].login}]`);
@@ -44,11 +43,11 @@ export default async function bindAuthorization(adminizer) {
44
43
  };
45
44
  }
46
45
  try {
47
- let passwordHashed = generate(adminData.login + adminData.password);
46
+ let passwordHashed = generate(adminData.login + adminData.password + process.env.AP_PASSWORD_SALT);
48
47
  let password = 'masked';
49
48
  // TODO refactor CRUD functions for DataAccessor usage
50
49
  await adminizer.modelHandler.model.get("UserAP")?.["_create"]({
51
- login: adminData.login, password: password, passwordHashed: passwordHashed, fullName: "Administrator",
50
+ login: adminData.login, passwordHashed: passwordHashed, fullName: "Administrator",
52
51
  isActive: true, isAdministrator: true
53
52
  });
54
53
  }
@@ -62,7 +61,7 @@ export default async function bindAuthorization(adminizer) {
62
61
  }
63
62
  else if (process.env.ADMINPANEL_DEMO_ADMIN_ENABLE !== undefined) {
64
63
  try {
65
- let passwordHashed = generate("demodemo");
64
+ let passwordHashed = generate("demodemo" + process.env.AP_PASSWORD_SALT);
66
65
  let password = 'masked';
67
66
  // TODO refactor CRUD functions for DataAccessor usage
68
67
  await adminizer.modelHandler.model.get("UserAP")?.["_create"]({
@@ -22,7 +22,7 @@ export function bindInertia(adminizer) {
22
22
  else {
23
23
  const manifestPath = path.resolve(import.meta.dirname, '../assets/manifest.json');
24
24
  if (!fs.existsSync(manifestPath)) {
25
- console.log('[vite]: Warning: manifest.json not found in dist folder! Please run "npm run build:assets" first.');
25
+ console.warn('[vite]: Warning: manifest.json not found in dist folder! Please run "npm run build:assets" first.');
26
26
  return '';
27
27
  }
28
28
  const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
@@ -102,18 +102,18 @@ export function bindInertia(adminizer) {
102
102
  adminizer.app.use((req, _, next) => {
103
103
  checkAuth(req, adminizer);
104
104
  req.Inertia.setViewData({
105
- lang: req.session.UserAP?.locale || 'en',
105
+ lang: req.user?.locale || 'en',
106
106
  });
107
107
  const menuHelper = new InertiaMenuHelper(adminizer);
108
108
  req.Inertia.shareProps({
109
109
  auth: {
110
- user: req.session.UserAP
110
+ user: req.session.userPretended ?? req.user
111
111
  },
112
- menu: req.session.UserAP ? menuHelper.getMenuItems(req) : null,
112
+ menu: req.user ? menuHelper.getMenuItems(req) : null,
113
113
  brand: menuHelper.getBrandTitle(),
114
114
  logout: menuHelper.getLogoutUrl(),
115
- logoutBtn: req.session.UserAP?.locale == 'ru' ? 'Выход' : "Log out",
116
- section: req.session.UserAP ? [
115
+ logoutBtn: req.user?.locale == 'ru' ? 'Выход' : "Log out",
116
+ section: req.user ? [
117
117
  {
118
118
  title: req.i18n.__("Adminpanel"),
119
119
  id: "adminpanel-0",
@@ -133,11 +133,11 @@ function checkAuth(req, adminizer) {
133
133
  locale = adminizer.config.translation.defaultLocale;
134
134
  }
135
135
  if (!adminizer.config.auth.enable) {
136
- if (req.session.UserAP) {
137
- req.session.UserAP.isAdministrator = true;
136
+ if (req.user) {
137
+ req.user.isAdministrator = true;
138
138
  }
139
139
  else {
140
- req.session.UserAP = {
140
+ req.user = {
141
141
  id: 0,
142
142
  isAdministrator: true,
143
143
  locale: locale,
@@ -3,7 +3,7 @@ import { Adminizer } from "../lib/Adminizer";
3
3
  let installStepper = InstallStepper.getInstance();
4
4
  export default function bindInstallStepper(adminizer) {
5
5
  let installStepperPolicy = function (req, res, proceed) {
6
- if (!req.session.UserAP) {
6
+ if (!req.user) {
7
7
  return proceed();
8
8
  }
9
9
  let goingToProcessInstallStep = req._parsedUrl.pathname === `/install/${installStepper.id}`;
@@ -1,6 +1,8 @@
1
1
  import { Adminizer } from "../lib/Adminizer";
2
2
  import multer from "multer";
3
3
  import { I18n } from "../lib/v4/I18n";
4
+ import { parse } from "cookie";
5
+ import { verifyUser } from "../lib/v4/helper/jwt";
4
6
  export default function bindReqFunctions(adminizer) {
5
7
  let bindReqFunctions = function (req, res, next) {
6
8
  /**
@@ -31,6 +33,20 @@ export default function bindReqFunctions(adminizer) {
31
33
  if (res.locals) {
32
34
  req.i18n.registerMethods(res.locals, req);
33
35
  }
36
+ // TODO: I made it quickly, you need to spread for architecture to different files, or re -ize this file to a girlfriend
37
+ // NOTE: This is here because inertia should receive data to routes
38
+ // JWT token
39
+ const cookies = parse(req.headers.cookie || '');
40
+ const token = cookies.adminizer_jwt;
41
+ if (token) {
42
+ const user = verifyUser(token, req.adminizer.jwtSecret);
43
+ if (user) {
44
+ req.user = user;
45
+ }
46
+ }
47
+ if (req.session.userPretended) {
48
+ req.user = req.session.userPretended;
49
+ }
34
50
  next();
35
51
  };
36
52
  adminizer.app.use('/', bindReqFunctions);
@@ -59,12 +59,12 @@
59
59
  "Yes": "Да",
60
60
  "No": "Нет",
61
61
  "Full Name": "Полное имя",
62
- "password": "password",
62
+ "password": "пароль",
63
63
  "expires": "Истекает",
64
64
  "is administrator": "Администратор",
65
65
  "widgets": "Виджеты",
66
66
  "isConfirmed": "Подтверждено",
67
- "isAdministrator": "isAdministrator",
67
+ "isAdministrator": "Администратор",
68
68
  "id": "id",
69
69
  "Title": "Title",
70
70
  "name": "Имя",
@@ -72,7 +72,6 @@
72
72
  "tokens": "Токены",
73
73
  "users": "Пользователи",
74
74
  "data": "data",
75
- "data2": "data2",
76
75
  "Google": "Google",
77
76
  "Google1": "Google1",
78
77
  "Google2": "Google2",
@@ -80,10 +79,10 @@
80
79
  "Textarea": "Textarea",
81
80
  "Disabled": "Disabled",
82
81
  "Boolean": "Boolean",
83
- "time": "time",
84
- "Number": "Number",
85
- "Editor": "Editor",
86
- "Date and time": "Date and time",
82
+ "time": "Время",
83
+ "Number": "Номер",
84
+ "Editor": "Редактор",
85
+ "Date and time": "Дата и время",
87
86
  "Values in \"password\" and \"repeatPassword\" fields should be the same": "Значения в полях \"password\" и \"repeatPassword\" должны быть одинаковыми.",
88
87
  "Is Administrator": "Администратор",
89
88
  "Is confirmed": "Подтверждено",
@@ -91,5 +90,15 @@
91
90
  "New record was created": "Новая запись создана",
92
91
  "Record was updated": "Запись обновлена",
93
92
  "Record was not removed": "Запись не удалена",
94
- "Record was removed successfully !": "Запись удалена успешно!"
93
+ "Record was removed successfully !": "Запись удалена успешно!",
94
+ "Quick actions": "Быстрые действия",
95
+ "Toggle to change the grid. To save the grid, turn it off.": "Переключите для изменения сетки. Чтобы сохранить сетку, отключите.",
96
+ "You don't have any widgets selected yet. You can add them by clicking on the plus sign at the top right.": "У вас пока нет выбранных виджетов. Вы можете добавить их, нажав на значок плюса в правом верхнем углу.",
97
+ "No widgets found": "Виджеты не найдены",
98
+ "Global Settings": "Глобальные настройки",
99
+ "All": "Все",
100
+ "Custom": "Пользовательский виджет",
101
+ "Fast links": "Быстрые ссылки",
102
+ "Info": "Информация",
103
+ "Switcher": "Переключатель"
95
104
  }
@@ -1 +0,0 @@
1
- import{j as t}from"./app.js";import{c as m}from"./compiler-runtime-tM4jBQ-T.js";import{A as i}from"./app-layout-D1m9Kvxq.js";import p from"./add-form-CYOfr0Ef.js";import"./sidebar-4D-sX2l4.js";import"./index-DrWfGwtf.js";import"./button-CQ9t1kLz.js";import"./utils-DjqsqOe8.js";import"./index-DTRTjOmh.js";import"./createLucideIcon-BFG25zNo.js";import"./index-Cdb9ACvz.js";import"./index-D5ir9iUV.js";import"./index-K81GbF6O.js";import"./index-C0SL3SHw.js";import"./index-BC0yfOHo.js";import"./tooltip-D2ehgLlB.js";import"./index-BcE9FUM6.js";import"./app-shell-BWMRMkHM.js";import"./app-sidebar-BCtaEFGb.js";import"./nav-main-Q3xofGRT.js";import"./material-icon-CItZiB53.js";import"./chevron-right-D5q8rF7h.js";import"./index-BbXEMx9n.js";import"./index-DEk3sC8d.js";import"./chevrons-up-down-kALltqHV.js";import"./app-sidebar-header-DLAFi13E.js";import"./breadcrumbs-CQNon4Vl.js";import"./nav-user-Ds8i0Pa2.js";import"./dropdown-menu-SEBnEIiL.js";import"./user-info-DBYoAJYJ.js";import"./user-menu-content-qkvdkUVd.js";import"./icon-Bz9BMaD0.js";import"./use-appearance-Co6mO0dV.js";import"./label-Z506NKsW.js";import"./field-renderer-CapylJU9.js";import"./checkbox-W0nGAXIj.js";import"./index-DwctwfU0.js";import"./check-LAUWAnlX.js";import"./select-D1N8zRPY.js";import"./chevron-down-B5XuAFRu.js";import"./dynamic-controls-CSVVCONh.js";import"./input-DF7Ue23C.js";import"./multi-select-oabtVhUP.js";import"./popover-I249Gg2O.js";import"./search-BspystAk.js";import"./form-state-702tb_BV.js";import"./input-error-BBygona6.js";import"./move-left-BhKZRPb4.js";import"./loader-circle-Utah5tGx.js";const e=[];function to(){const r=m.c(1);let o;return r[0]===Symbol.for("react.memo_cache_sentinel")?(o=t.jsx(i,{breadcrumbs:e,children:t.jsx(p,{})}),r[0]=o):o=r[0],o}export{to as default};