adminizer 4.1.0-build.2 → 4.1.0-build.21

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 (197) hide show
  1. package/Readme.md +11 -1
  2. package/assets/{VanillaJSONEditor-FUe77pIA.js → VanillaJSONEditor-D-Lx670g.js} +1 -1
  3. package/assets/add-BP_u3Tjl.js +1 -0
  4. package/assets/add-form-nffmiYTh.js +1 -0
  5. package/assets/add-group-D4vcHlm-.js +1 -0
  6. package/assets/{add-group-form-dzadPSfL.js → add-group-form-gNJW11-q.js} +1 -1
  7. package/assets/add-user-DWh3Nas0.js +1 -0
  8. package/assets/add-user-form-BJ0FsZYJ.js +1 -0
  9. package/assets/{app-DMmad2-f.css → app-C3OdwOHy.css} +1 -1
  10. package/assets/{app-layout-D1m9Kvxq.js → app-layout-DYsRFUuP.js} +1 -1
  11. package/assets/{app-shell-BWMRMkHM.js → app-shell-Dd9Eknik.js} +1 -1
  12. package/assets/app-sidebar-BOmu6-Sl.js +1 -0
  13. package/assets/{app-sidebar-header-DLAFi13E.js → app-sidebar-header-CoXSzWxk.js} +1 -1
  14. package/assets/app.js +2 -2
  15. package/assets/{breadcrumbs-CQNon4Vl.js → breadcrumbs-BmAq4fHT.js} +1 -1
  16. package/assets/{button-CQ9t1kLz.js → button-C9B_5Jf_.js} +1 -1
  17. package/assets/{checkbox-W0nGAXIj.js → checkbox-Fg27sL_1.js} +1 -1
  18. package/assets/{compiler-runtime-tM4jBQ-T.js → compiler-runtime-hB6dAw2d.js} +1 -1
  19. package/assets/dashboard-BOltB2Hq.css +1 -0
  20. package/assets/dashboard-Ddh74NBQ.js +3 -0
  21. package/assets/{date-picker-B__dVVqj.js → date-picker-DI1cCO7K.js} +1 -1
  22. package/assets/{dropdown-menu-SEBnEIiL.js → dropdown-menu-Bhj17ENm.js} +1 -1
  23. package/assets/{field-renderer-CapylJU9.js → field-renderer-DVHZF6HS.js} +3 -3
  24. package/assets/form-BgWdwvz1.js +1 -0
  25. package/assets/form-DgtErfln.js +1 -0
  26. package/assets/{geo-json-CwteYDGB.js → geo-json-BjiyTtMu.js} +1 -1
  27. package/assets/{handsontable-BCnjOpBr.js → handsontable-4mjU_b0n.js} +1 -1
  28. package/assets/home-CHntBHJa.js +2 -0
  29. package/assets/{icon-Bz9BMaD0.js → icon-Dt0vBgDO.js} +1 -1
  30. package/assets/index-B8BS9wMC.js +1 -0
  31. package/assets/{index-DEk3sC8d.js → index-BKCgnGj_.js} +1 -1
  32. package/assets/{index-C0SL3SHw.js → index-BykbU6Ee.js} +1 -1
  33. package/assets/index-CaJgc5EZ.js +1 -0
  34. package/assets/{index-BcE9FUM6.js → index-Cgp8OfuI.js} +1 -1
  35. package/assets/{index-DTRTjOmh.js → index-Cw5o84pO.js} +1 -1
  36. package/assets/{init-user-D9mW-g14.js → init-user-JfCKJ5Ce.js} +1 -1
  37. package/assets/{input-DF7Ue23C.js → input-CvRbIbk4.js} +1 -1
  38. package/assets/{input-error-BBygona6.js → input-error-DMK7cAt7.js} +1 -1
  39. package/assets/{label-Z506NKsW.js → label-CSLFe9Bz.js} +1 -1
  40. package/assets/list-B2Oa5O_Q.js +1 -0
  41. package/assets/{list-table-DB1sEQLF.js → list-table-DA9MhywL.js} +5 -5
  42. package/assets/{login-DrGaTWhY.js → login-DQwGtdis.js} +1 -1
  43. package/assets/manifest.json +491 -470
  44. package/assets/{material-icon-CItZiB53.js → material-icon-BJg8o_fs.js} +1 -1
  45. package/assets/module-DWXp59Vg.js +1 -0
  46. package/assets/{monaco-editor-DqAqwxw4.js → monaco-editor-CJs0_GlD.js} +1 -1
  47. package/assets/{multi-select-oabtVhUP.js → multi-select-BvRpAW8r.js} +1 -1
  48. package/assets/{nav-footer-CM-yHiRs.js → nav-footer-Bs4dmN1d.js} +1 -1
  49. package/assets/{nav-main-Q3xofGRT.js → nav-main-Bq3IMk4C.js} +1 -1
  50. package/assets/{nav-user-Ds8i0Pa2.js → nav-user-CbB22J5O.js} +1 -1
  51. package/assets/{pagination-render-B57pOpFy.js → pagination-render-DuXDDbC_.js} +1 -1
  52. package/assets/{popover-I249Gg2O.js → popover-DtoGI2b1.js} +1 -1
  53. package/assets/{register-C9FQIDtS.js → register-BSogVF0h.js} +1 -1
  54. package/assets/{select-D1N8zRPY.js → select-BWepUw-9.js} +1 -1
  55. package/assets/{sidebar-4D-sX2l4.js → sidebar-CAHsHdjM.js} +2 -2
  56. package/assets/skeleton-COOcAA8f.js +1 -0
  57. package/assets/{sonner-Dzckw3U3.js → sonner-BI0IFOQN.js} +1 -1
  58. package/assets/{toast-editor-FbrFd1ft.js → toast-editor-CMK7QtF1.js} +1 -1
  59. package/assets/{tooltip-D2ehgLlB.js → tooltip-DHwpLKOI.js} +1 -1
  60. package/assets/{use-appearance-Co6mO0dV.js → use-appearance-DRfIqTgw.js} +1 -1
  61. package/assets/{use-window-size-B8l6Bpkf.js → use-window-size-h0Sh_NvX.js} +1 -1
  62. package/assets/{user-info-DBYoAJYJ.js → user-info-DFrmpJ4y.js} +1 -1
  63. package/assets/{user-menu-content-qkvdkUVd.js → user-menu-content-DPXQdERj.js} +1 -1
  64. package/assets/welcome-B4WCIXKf.js +1 -0
  65. package/controllers/add.js +3 -3
  66. package/controllers/addGroup.js +2 -4
  67. package/controllers/addUser.js +4 -6
  68. package/controllers/catalog/Catalog.js +2 -2
  69. package/controllers/catalog/FrontentCatalogAdapter.js +1 -2
  70. package/controllers/ckeditorUpload.js +2 -3
  71. package/controllers/dashboard.js +16 -2
  72. package/controllers/edit.js +3 -4
  73. package/controllers/editGroup.js +2 -4
  74. package/controllers/editUser.js +3 -5
  75. package/controllers/form.js +2 -3
  76. package/controllers/getAllWidgets.js +3 -3
  77. package/controllers/initUser.js +1 -2
  78. package/controllers/list.js +5 -5
  79. package/controllers/login.js +31 -15
  80. package/controllers/media-manager/mediaManagerAdapter.js +1 -2
  81. package/controllers/media-manager/mediaManagerApi.js +2 -2
  82. package/controllers/navigation/edit.js +2 -2
  83. package/controllers/register.js +1 -4
  84. package/controllers/remove.js +3 -3
  85. package/controllers/timezones.js +1 -1
  86. package/controllers/view.js +3 -3
  87. package/controllers/welcome.js +1 -1
  88. package/controllers/widgets/Action.js +2 -2
  89. package/controllers/widgets/Custom.js +2 -2
  90. package/controllers/widgets/Info.js +2 -2
  91. package/controllers/widgets/switch.js +2 -2
  92. package/controllers/widgetsDB.js +5 -5
  93. package/helpers/accessRightsHelper.d.ts +6 -2
  94. package/helpers/accessRightsHelper.js +21 -3
  95. package/helpers/configHelper.js +2 -1
  96. package/helpers/controllerHelper.js +1 -1
  97. package/helpers/fieldsHelper.d.ts +1 -1
  98. package/helpers/fieldsHelper.js +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 +2 -2
  107. package/helpers/inertiaUserHelper.d.ts +7 -1
  108. package/helpers/inertiaUserHelper.js +5 -1
  109. package/helpers/menuHelper.d.ts +2 -1
  110. package/helpers/menuHelper.js +8 -2
  111. package/index.d.ts +4 -1
  112. package/index.js +7 -1
  113. package/interfaces/adminpanelConfig.d.ts +19 -23
  114. package/interfaces/global.d.ts +8 -26
  115. package/interfaces/types.d.ts +1 -1
  116. package/lib/Adminizer.d.ts +2 -0
  117. package/lib/Adminizer.js +26 -6
  118. package/lib/catalog/AbstractCatalog.js +0 -1
  119. package/lib/catalog/Navigation.js +6 -7
  120. package/lib/datatable/NodeTable.js +2 -5
  121. package/lib/inertia/inertiaAdapter.js +0 -1
  122. package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
  123. package/lib/media-manager/AbstractMediaManager.js +1 -1
  124. package/lib/media-manager/Items.js +0 -3
  125. package/lib/v4/DataAccessor.d.ts +5 -2
  126. package/lib/v4/DataAccessor.js +31 -14
  127. package/lib/v4/I18n.js +2 -0
  128. package/lib/v4/POWCaptcha.js +0 -1
  129. package/lib/v4/PolicyManager.js +0 -1
  130. package/lib/v4/helper/jwt.d.ts +10 -0
  131. package/lib/v4/helper/jwt.js +18 -0
  132. package/lib/v4/model/AbstractModel.d.ts +5 -1
  133. package/lib/v4/model/AbstractModel.js +2 -3
  134. package/lib/v4/model/ModelHandler.js +0 -1
  135. package/lib/v4/model/adapter/sequelize.d.ts +11 -2
  136. package/lib/v4/model/adapter/sequelize.js +451 -118
  137. package/lib/v4/model/adapter/waterline.js +5 -3
  138. package/lib/widgets/abstractAction.d.ts +1 -1
  139. package/lib/widgets/abstractCustom.d.ts +27 -12
  140. package/lib/widgets/abstractCustom.js +8 -2
  141. package/lib/widgets/abstractInfo.d.ts +1 -1
  142. package/lib/widgets/abstractInfo.js +1 -1
  143. package/lib/widgets/abstractLink.d.ts +1 -0
  144. package/lib/widgets/abstractSwitch.d.ts +1 -1
  145. package/lib/widgets/abstractWidgetBase.d.ts +1 -1
  146. package/lib/widgets/widgetHandler.d.ts +27 -3
  147. package/lib/widgets/widgetHandler.js +25 -25
  148. package/models/GroupAP.d.ts +8 -0
  149. package/models/NavigationAP.d.ts +5 -0
  150. package/models/UserAP.d.ts +24 -2
  151. package/models/UserAP.js +2 -2
  152. package/package.json +23 -11
  153. package/policies/checkAuth.js +4 -3
  154. package/policies/setLocale.js +2 -2
  155. package/system/Router.js +6 -14
  156. package/system/bindAccessRights.js +0 -4
  157. package/system/bindAuthorization.js +4 -5
  158. package/system/bindDev.js +1 -0
  159. package/system/bindInertia.js +9 -9
  160. package/system/bindMediaManager.js +0 -1
  161. package/system/bindModels.js +7 -2
  162. package/system/bindNavigation.js +0 -1
  163. package/system/bindReqFunctions.js +15 -0
  164. package/translations/ru.json +17 -8
  165. package/assets/add-ZITr43GJ.js +0 -1
  166. package/assets/add-form-CYOfr0Ef.js +0 -1
  167. package/assets/add-group-B332wN8K.js +0 -1
  168. package/assets/add-user-TC-mYdsB.js +0 -1
  169. package/assets/add-user-form-y2f_1_lM.js +0 -1
  170. package/assets/app-sidebar-BCtaEFGb.js +0 -1
  171. package/assets/dashboard-BR602KhL.js +0 -1
  172. package/assets/form-DOUNk3o2.js +0 -1
  173. package/assets/form-lOKv4Qbw.js +0 -1
  174. package/assets/home-Ch6QfTIt.js +0 -2
  175. package/assets/index-Cdb9ACvz.js +0 -1
  176. package/assets/index-K81GbF6O.js +0 -1
  177. package/assets/list-Qyd7ecQH.js +0 -1
  178. package/assets/module-DBaykv8l.js +0 -1
  179. package/assets/welcome-D2adQ8EU.js +0 -1
  180. package/controllers/processInstallFinalize.d.ts +0 -1
  181. package/controllers/processInstallFinalize.js +0 -16
  182. package/controllers/processInstallStep.d.ts +0 -1
  183. package/controllers/processInstallStep.js +0 -132
  184. package/lib/installStepper/InstallStepAbstract.d.ts +0 -52
  185. package/lib/installStepper/InstallStepAbstract.js +0 -69
  186. package/lib/installStepper/finalizeStep.d.ts +0 -21
  187. package/lib/installStepper/finalizeStep.js +0 -48
  188. package/lib/installStepper/installStepper.d.ts +0 -40
  189. package/lib/installStepper/installStepper.js +0 -195
  190. package/models/MediaManagerAP.d.ts +0 -46
  191. package/models/MediaManagerAP.js +0 -45
  192. package/models/MediaManagerAssociationsAP.d.ts +0 -28
  193. package/models/MediaManagerAssociationsAP.js +0 -27
  194. package/models/MediaManagerMetaAP.d.ts +0 -22
  195. package/models/MediaManagerMetaAP.js +0 -21
  196. package/system/bindInstallStepper.d.ts +0 -2
  197. package/system/bindInstallStepper.js +0 -23
@@ -48,7 +48,6 @@ export class WaterlineModel extends AbstractModel {
48
48
  query = query.limit(options.limit);
49
49
  }
50
50
  let result = await query;
51
- console.log(result, "result");
52
51
  return result;
53
52
  }
54
53
  async _updateOne(criteria, data) {
@@ -91,10 +90,13 @@ export class WaterlineAdapter extends AbstractAdapter {
91
90
  /** Method that processes custom waterline model creation. Is used for system models. Replaces beforeCreate method in waterline */
92
91
  static async registerSystemModels(waterlineORM) {
93
92
  const systemModelsDir = path.resolve(import.meta.dirname, "../../../../models");
94
- const systemModelsFiles = fs.readdirSync(systemModelsDir).filter(file => file.endsWith(".js"));
93
+ let systemModelsFiles = fs.readdirSync(systemModelsDir).filter(file => file.endsWith(".js"));
94
+ if (!systemModelsFiles.length) {
95
+ systemModelsFiles = fs.readdirSync(systemModelsDir).filter(file => file.endsWith(".ts") && !file.endsWith(".d.ts"));
96
+ }
95
97
  // Register adminizer system models
96
98
  await Promise.all(systemModelsFiles.map(async (file) => {
97
- const modelName = path.basename(file, ".js");
99
+ const modelName = path.basename(file).replace(/\.(ts|js)$/, "");
98
100
  const systemModelPath = path.resolve(systemModelsDir, file);
99
101
  const adminizerModel = (await import(pathToFileURL(systemModelPath).href)).default;
100
102
  const waterlineLikeModel = generateWaterlineModel(modelName, adminizerModel);
@@ -1,7 +1,7 @@
1
1
  import BaseWidget from "./abstractWidgetBase";
2
2
  export default abstract class ActionBase extends BaseWidget {
3
3
  readonly widgetType = "action";
4
- /** Widget background css (color, Image) */
4
+ /** Widget background css color */
5
5
  abstract readonly backgroundCSS: string | null;
6
6
  abstract action(): Promise<any>;
7
7
  }
@@ -1,13 +1,28 @@
1
- import BaseWidget from "./abstractWidgetBase";
2
- export default abstract class CustomBase extends BaseWidget {
3
- /** Widget background css (color, Image) */
4
- abstract readonly backgroundCSS: string | null;
5
- /** Fullpath script for loading in dashboard in browser */
6
- abstract readonly scriptUrl: string;
7
- /** How widgets processor can call constructor of this widget */
8
- abstract readonly constructorName: string;
9
- /** Options to constuctor */
10
- abstract readonly constructorOption: any;
11
- /** Hide title, icon, description */
12
- abstract readonly hideAdminPanelUI: boolean;
1
+ import { MaterialIcon } from "material-icons";
2
+ export default abstract class CustomBase {
3
+ /** Widget unique id */
4
+ abstract readonly id: string;
5
+ /** Widget Name */
6
+ abstract readonly name: string;
7
+ /** JS module file path */
8
+ abstract readonly jsPath: {
9
+ dev: string;
10
+ production: string;
11
+ };
12
+ /** For group access rights by department */
13
+ abstract readonly department: string;
14
+ /** Widget background css color */
15
+ readonly backgroundCSS: string;
16
+ /** Widget size */
17
+ abstract readonly size: {
18
+ h: number;
19
+ w: number;
20
+ } | null;
21
+ /** Widget description */
22
+ abstract readonly description: string;
23
+ /** Widget icon */
24
+ abstract readonly icon?: MaterialIcon | string;
25
+ readonly widgetType: 'custom';
26
+ routePrefix: string;
27
+ protected constructor(routePrefix: string);
13
28
  }
@@ -1,3 +1,9 @@
1
- import BaseWidget from "./abstractWidgetBase";
2
- export default class CustomBase extends BaseWidget {
1
+ export default class CustomBase {
2
+ /** Widget background css color */
3
+ backgroundCSS;
4
+ widgetType = 'custom';
5
+ routePrefix;
6
+ constructor(routePrefix) {
7
+ this.routePrefix = routePrefix;
8
+ }
3
9
  }
@@ -1,7 +1,7 @@
1
1
  import BaseWidget from "./abstractWidgetBase";
2
2
  export default abstract class InfoBase extends BaseWidget {
3
3
  readonly widgetType = "info";
4
- /** Widget background css (color, Image) */
4
+ /** Widget background css color */
5
5
  readonly backgroundCSS: string;
6
6
  /** Widget size */
7
7
  readonly size: {
@@ -1,7 +1,7 @@
1
1
  import BaseWidget from "./abstractWidgetBase";
2
2
  export default class InfoBase extends BaseWidget {
3
3
  widgetType = "info";
4
- /** Widget background css (color, Image) */
4
+ /** Widget background css color */
5
5
  backgroundCSS;
6
6
  /** Widget size */
7
7
  size = null;
@@ -5,6 +5,7 @@ export interface Links {
5
5
  description: string;
6
6
  icon?: MaterialIcon;
7
7
  link: string;
8
+ linkType: 'self' | 'blank';
8
9
  backgroundCSS: string | null;
9
10
  }
10
11
  export default abstract class LinkBase extends BaseWidget {
@@ -1,7 +1,7 @@
1
1
  import BaseWidget from "./abstractWidgetBase";
2
2
  export default abstract class SwitchBase extends BaseWidget {
3
3
  readonly widgetType = "switcher";
4
- /** Widget background css (color, Image) */
4
+ /** Widget background css color */
5
5
  abstract readonly backgroundCSS: string | null;
6
6
  /** Get current state */
7
7
  abstract getState(): Promise<boolean>;
@@ -23,5 +23,5 @@ export default abstract class BaseWidget {
23
23
  /** Run task */
24
24
  "action" |
25
25
  /** Change location, or open in new tab */
26
- "link" | "custom";
26
+ "link";
27
27
  }
@@ -5,6 +5,8 @@ import LinkBase from "./abstractLink";
5
5
  import CustomBase from "./abstractCustom";
6
6
  import { AdminpanelIcon } from "../../interfaces/adminpanelConfig";
7
7
  import { Adminizer } from "../Adminizer";
8
+ import { UserAP } from "models/UserAP";
9
+ import { I18n } from "../v4/I18n";
8
10
  export type WidgetType = (SwitcherBase | InfoBase | ActionBase | LinkBase | CustomBase);
9
11
  export interface WidgetConfig {
10
12
  id: string;
@@ -16,6 +18,7 @@ export interface WidgetConfig {
16
18
  name: string;
17
19
  backgroundCSS: string;
18
20
  scriptUrl?: string;
21
+ linkType?: 'self' | 'blank';
19
22
  constructorName?: string;
20
23
  constructorOption?: any;
21
24
  size?: {
@@ -25,6 +28,21 @@ export interface WidgetConfig {
25
28
  added?: boolean;
26
29
  hideAdminPanelUI?: boolean;
27
30
  }
31
+ export interface WidgetLayoutItem {
32
+ x: number;
33
+ y: number;
34
+ w: number;
35
+ h: number;
36
+ i: string;
37
+ id: string;
38
+ }
39
+ export interface WidgetsLayouts {
40
+ lg: WidgetLayoutItem[];
41
+ md: WidgetLayoutItem[];
42
+ sm: WidgetLayoutItem[];
43
+ xs: WidgetLayoutItem[];
44
+ xxs: WidgetLayoutItem[];
45
+ }
28
46
  export declare class WidgetHandler {
29
47
  private widgets;
30
48
  adminizer: Adminizer;
@@ -32,7 +50,13 @@ export declare class WidgetHandler {
32
50
  add(widget: WidgetType): void;
33
51
  getById(id: string): WidgetType | undefined;
34
52
  removeById(id: string): void;
35
- getAll(user: ModelsAP["UserAP"]): Promise<WidgetConfig[]>;
36
- getWidgetsDB(id: number, auth: boolean): Promise<WidgetConfig[]>;
37
- setWidgetsDB(id: number, widgets: WidgetConfig[], auth: boolean): Promise<number>;
53
+ getAll(user: UserAP, i18n: I18n): Promise<WidgetConfig[]>;
54
+ getWidgetsDB(id: number, auth: boolean, i18n: I18n): Promise<{
55
+ widgets: WidgetConfig[];
56
+ layout: WidgetsLayouts;
57
+ }>;
58
+ setWidgetsDB(id: number, body: {
59
+ widgets: WidgetConfig[];
60
+ layout: WidgetLayoutItem[];
61
+ }, auth: boolean): Promise<number>;
38
62
  }
@@ -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: { lg: [], md: [], sm: [], xs: [], xxs: [] } };
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
+ }
@@ -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,5 @@
1
+ import { WidgetConfig, WidgetsLayouts } from "lib/widgets/widgetHandler";
2
+ import { GroupAP } from "./GroupAP";
1
3
  declare const _default: {
2
4
  id: {
3
5
  type: string;
@@ -16,10 +18,10 @@ declare const _default: {
16
18
  email: {
17
19
  type: string;
18
20
  };
19
- passwordHashed: {
21
+ avatar: {
20
22
  type: string;
21
23
  };
22
- password: {
24
+ passwordHashed: {
23
25
  type: string;
24
26
  };
25
27
  timezone: {
@@ -52,3 +54,23 @@ declare const _default: {
52
54
  };
53
55
  };
54
56
  export default _default;
57
+ export interface UserAP {
58
+ id: number;
59
+ login: string;
60
+ fullName?: string;
61
+ email?: string;
62
+ avatar?: string;
63
+ passwordHashed?: string;
64
+ timezone?: string;
65
+ expires?: string;
66
+ locale?: string;
67
+ isDeleted?: boolean;
68
+ isActive?: boolean;
69
+ isAdministrator?: boolean;
70
+ groups?: GroupAP[];
71
+ widgets?: {
72
+ widgets: WidgetConfig[];
73
+ layout: WidgetsLayouts;
74
+ };
75
+ isConfirmed?: boolean;
76
+ }
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-build.2",
4
+ "version": "4.1.0-build.21",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1",
8
- "start": "tsx --tsconfig ./fixture/tsconfig.json ./fixture/index.ts",
7
+ "test": "vitest --reporter verbose",
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,19 +18,19 @@
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": "",
26
27
  "license": "MIT",
27
28
  "description": "",
28
29
  "dependencies": {
29
- "@radix-ui/react-menubar": "^1.1.12",
30
30
  "body-parser": "^1.20.3",
31
31
  "chalk": "^5.4.1",
32
32
  "cmdk": "^1.1.1",
33
+ "cookie": "^1.0.2",
33
34
  "cookie-parser": "^1.4.7",
34
35
  "cors": "^2.8.5",
35
36
  "crypto-puzzle": "^5.0.2",
@@ -37,17 +38,20 @@
37
38
  "ejs": "^3.1.10",
38
39
  "express": "^4.21.2",
39
40
  "express-session": "^1.18.1",
40
- "ky": "^1.8.0",
41
+ "jsonwebtoken": "^9.0.2",
41
42
  "multer": "^1.4.5-lts.1",
42
43
  "next-themes": "^0.4.6",
43
44
  "password-hash": "^1.2.2",
44
45
  "sharp": "^0.33.5",
45
46
  "typeorm": "^0.3.20",
46
47
  "uuid": "^11.0.5",
48
+ "waterline": "^0.15.2",
47
49
  "winston": "^3.17.0"
48
50
  },
49
51
  "devDependencies": {
52
+ "@babel/plugin-proposal-decorators": "^7.27.1",
50
53
  "@ckeditor/ckeditor5-react": "^9.5.0",
54
+ "@eslint/compat": "^1.2.9",
51
55
  "@faker-js/faker": "^9.7.0",
52
56
  "@handsontable/react": "^15.2.0",
53
57
  "@inertiajs/react": "^2.0.0",
@@ -58,11 +62,14 @@
58
62
  "@radix-ui/react-dialog": "^1.1.7",
59
63
  "@radix-ui/react-dropdown-menu": "^2.1.6",
60
64
  "@radix-ui/react-label": "^2.1.2",
65
+ "@radix-ui/react-menubar": "^1.1.12",
61
66
  "@radix-ui/react-popover": "^1.1.7",
67
+ "@radix-ui/react-portal": "^1.1.6",
62
68
  "@radix-ui/react-select": "^2.1.6",
63
69
  "@radix-ui/react-separator": "^1.1.3",
64
70
  "@radix-ui/react-slider": "^1.2.3",
65
71
  "@radix-ui/react-slot": "^1.2.0",
72
+ "@radix-ui/react-switch": "^1.2.4",
66
73
  "@radix-ui/react-tooltip": "^1.1.8",
67
74
  "@tailwindcss/vite": "^4.0.15",
68
75
  "@tanstack/react-table": "^8.21.2",
@@ -73,6 +80,7 @@
73
80
  "@types/express-session": "^1.18.1",
74
81
  "@types/he": "^1.2.3",
75
82
  "@types/json-schema": "^7.0.15",
83
+ "@types/jsonwebtoken": "^9.0.9",
76
84
  "@types/leaflet": "^1.9.17",
77
85
  "@types/lodash-es": "^4.17.12",
78
86
  "@types/multer": "^1.4.12",
@@ -80,15 +88,18 @@
80
88
  "@types/password-hash": "^1.2.24",
81
89
  "@types/react": "^19.0.3",
82
90
  "@types/react-dom": "^19.0.2",
91
+ "@types/react-grid-layout": "^1.3.5",
83
92
  "@types/sprintf-js": "^1.1.4",
84
93
  "@types/uuid": "^10.0.0",
85
94
  "@types/waterline": "^0.13.9",
95
+ "@typescript-eslint/eslint-plugin": "^8.32.1",
86
96
  "@vitejs/plugin-react": "^4.3.4",
87
97
  "babel-plugin-react-compiler": "^19.0.0-beta-e993439-20250405",
88
98
  "ckeditor5": "^45.0.0",
89
99
  "class-variance-authority": "^0.7.1",
90
100
  "clsx": "^2.1.1",
91
101
  "cross-env": "^7.0.3",
102
+ "eslint": "^9.26.0",
92
103
  "handsontable": "^15.2.0",
93
104
  "json-schema": "^0.4.0",
94
105
  "leaflet": "^1.9.4",
@@ -99,15 +110,19 @@
99
110
  "react": "^19.0.0",
100
111
  "react-day-picker": "^8.10.1",
101
112
  "react-dom": "^19.0.0",
113
+ "react-grid-layout": "^1.5.1",
102
114
  "react-intersection-observer": "^9.16.0",
103
115
  "react-leaflet": "^5.0.0",
104
116
  "react-quill-new": "^3.4.6",
105
117
  "react-simple-wysiwyg": "^3.2.2",
106
118
  "sails-disk": "^2.1.2",
107
119
  "sails-postgresql": "^5.0.1",
120
+ "sequelize": "^6.37.5",
121
+ "sequelize-typescript": "^2.1.6",
108
122
  "shelljs": "^0.9.2",
109
123
  "sonner": "^2.0.3",
110
124
  "sprintf-js": "^1.1.3",
125
+ "sqlite3": "^5.1.7",
111
126
  "tailwind-merge": "^3.0.2",
112
127
  "tailwindcss": "^4.0.15",
113
128
  "tsx": "^4.19.3",
@@ -117,9 +132,6 @@
117
132
  "vite": "^6.1.0",
118
133
  "vite-plugin-externals": "^0.6.2",
119
134
  "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"
135
+ "vitest": "^3.0.7"
124
136
  }
125
137
  }
@@ -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,3 @@
1
- import _processInstallStep from "../controllers/processInstallStep";
2
- import _processInstallFinalize from "../controllers/processInstallFinalize";
3
1
  import _dashboard from "../controllers/dashboard";
4
2
  import _welcome from "../controllers/welcome";
5
3
  import _list from "../controllers/list";
@@ -38,33 +36,27 @@ export default class Router {
38
36
  /**
39
37
  * Widgets All
40
38
  */
41
- adminizer.app.all(`/widgets-get-all`, adminizer.policyManager.bindPolicies(policies, _getAllWidgets));
39
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-get-all`, adminizer.policyManager.bindPolicies(policies, _getAllWidgets));
42
40
  /**
43
41
  * Widgets All from DB
44
42
  */
45
- adminizer.app.all(`/widgets-get-all-db`, adminizer.policyManager.bindPolicies(policies, _widgetsDB));
43
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-get-all-db`, adminizer.policyManager.bindPolicies(policies, _widgetsDB));
46
44
  /**
47
45
  * Widgets Switch
48
46
  */
49
- adminizer.app.all(`/widgets-switch/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetSwitchController));
47
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-switch/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetSwitchController));
50
48
  /**
51
49
  * Widgets Info
52
50
  */
53
- adminizer.app.all(`/widgets-info/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetInfoController));
51
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-info/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetInfoController));
54
52
  /**
55
53
  * Widgets Action
56
54
  */
57
- adminizer.app.all(`/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetActionController));
55
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetActionController));
58
56
  /**
59
57
  * Widgets Custom
60
58
  */
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));
59
+ adminizer.app.all(`${adminizer.config.routePrefix}/widgets-action/:widgetId`, adminizer.policyManager.bindPolicies(policies, widgetCustomController));
68
60
  /**
69
61
  * Edit form
70
62
  * */
@@ -55,10 +55,6 @@ export default async function bindAccessRights(adminizer) {
55
55
  });
56
56
  }
57
57
  }
58
- adminizer.accessRightsHelper.registerToken({
59
- id: `process-install-step`, name: "Process install step",
60
- description: "Access to '/processInstallStep' route", department: "Routes"
61
- });
62
58
  // Widgets
63
59
  adminizer.accessRightsHelper.registerToken({
64
60
  id: `widgets`, name: "Widgets",