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.
- package/Readme.md +11 -1
- package/assets/{VanillaJSONEditor-FUe77pIA.js → VanillaJSONEditor-D-Lx670g.js} +1 -1
- package/assets/add-BP_u3Tjl.js +1 -0
- package/assets/add-form-nffmiYTh.js +1 -0
- package/assets/add-group-D4vcHlm-.js +1 -0
- package/assets/{add-group-form-dzadPSfL.js → add-group-form-gNJW11-q.js} +1 -1
- package/assets/add-user-DWh3Nas0.js +1 -0
- package/assets/add-user-form-BJ0FsZYJ.js +1 -0
- package/assets/{app-DMmad2-f.css → app-C3OdwOHy.css} +1 -1
- package/assets/{app-layout-D1m9Kvxq.js → app-layout-DYsRFUuP.js} +1 -1
- package/assets/{app-shell-BWMRMkHM.js → app-shell-Dd9Eknik.js} +1 -1
- package/assets/app-sidebar-BOmu6-Sl.js +1 -0
- package/assets/{app-sidebar-header-DLAFi13E.js → app-sidebar-header-CoXSzWxk.js} +1 -1
- package/assets/app.js +2 -2
- package/assets/{breadcrumbs-CQNon4Vl.js → breadcrumbs-BmAq4fHT.js} +1 -1
- package/assets/{button-CQ9t1kLz.js → button-C9B_5Jf_.js} +1 -1
- package/assets/{checkbox-W0nGAXIj.js → checkbox-Fg27sL_1.js} +1 -1
- package/assets/{compiler-runtime-tM4jBQ-T.js → compiler-runtime-hB6dAw2d.js} +1 -1
- package/assets/dashboard-BOltB2Hq.css +1 -0
- package/assets/dashboard-Ddh74NBQ.js +3 -0
- package/assets/{date-picker-B__dVVqj.js → date-picker-DI1cCO7K.js} +1 -1
- package/assets/{dropdown-menu-SEBnEIiL.js → dropdown-menu-Bhj17ENm.js} +1 -1
- package/assets/{field-renderer-CapylJU9.js → field-renderer-DVHZF6HS.js} +3 -3
- package/assets/form-BgWdwvz1.js +1 -0
- package/assets/form-DgtErfln.js +1 -0
- package/assets/{geo-json-CwteYDGB.js → geo-json-BjiyTtMu.js} +1 -1
- package/assets/{handsontable-BCnjOpBr.js → handsontable-4mjU_b0n.js} +1 -1
- package/assets/home-CHntBHJa.js +2 -0
- package/assets/{icon-Bz9BMaD0.js → icon-Dt0vBgDO.js} +1 -1
- package/assets/index-B8BS9wMC.js +1 -0
- package/assets/{index-DEk3sC8d.js → index-BKCgnGj_.js} +1 -1
- package/assets/{index-C0SL3SHw.js → index-BykbU6Ee.js} +1 -1
- package/assets/index-CaJgc5EZ.js +1 -0
- package/assets/{index-BcE9FUM6.js → index-Cgp8OfuI.js} +1 -1
- package/assets/{index-DTRTjOmh.js → index-Cw5o84pO.js} +1 -1
- package/assets/{init-user-D9mW-g14.js → init-user-JfCKJ5Ce.js} +1 -1
- package/assets/{input-DF7Ue23C.js → input-CvRbIbk4.js} +1 -1
- package/assets/{input-error-BBygona6.js → input-error-DMK7cAt7.js} +1 -1
- package/assets/{label-Z506NKsW.js → label-CSLFe9Bz.js} +1 -1
- package/assets/list-B2Oa5O_Q.js +1 -0
- package/assets/{list-table-DB1sEQLF.js → list-table-DA9MhywL.js} +5 -5
- package/assets/{login-DrGaTWhY.js → login-DQwGtdis.js} +1 -1
- package/assets/manifest.json +491 -470
- package/assets/{material-icon-CItZiB53.js → material-icon-BJg8o_fs.js} +1 -1
- package/assets/module-DWXp59Vg.js +1 -0
- package/assets/{monaco-editor-DqAqwxw4.js → monaco-editor-CJs0_GlD.js} +1 -1
- package/assets/{multi-select-oabtVhUP.js → multi-select-BvRpAW8r.js} +1 -1
- package/assets/{nav-footer-CM-yHiRs.js → nav-footer-Bs4dmN1d.js} +1 -1
- package/assets/{nav-main-Q3xofGRT.js → nav-main-Bq3IMk4C.js} +1 -1
- package/assets/{nav-user-Ds8i0Pa2.js → nav-user-CbB22J5O.js} +1 -1
- package/assets/{pagination-render-B57pOpFy.js → pagination-render-DuXDDbC_.js} +1 -1
- package/assets/{popover-I249Gg2O.js → popover-DtoGI2b1.js} +1 -1
- package/assets/{register-C9FQIDtS.js → register-BSogVF0h.js} +1 -1
- package/assets/{select-D1N8zRPY.js → select-BWepUw-9.js} +1 -1
- package/assets/{sidebar-4D-sX2l4.js → sidebar-CAHsHdjM.js} +2 -2
- package/assets/skeleton-COOcAA8f.js +1 -0
- package/assets/{sonner-Dzckw3U3.js → sonner-BI0IFOQN.js} +1 -1
- package/assets/{toast-editor-FbrFd1ft.js → toast-editor-CMK7QtF1.js} +1 -1
- package/assets/{tooltip-D2ehgLlB.js → tooltip-DHwpLKOI.js} +1 -1
- package/assets/{use-appearance-Co6mO0dV.js → use-appearance-DRfIqTgw.js} +1 -1
- package/assets/{use-window-size-B8l6Bpkf.js → use-window-size-h0Sh_NvX.js} +1 -1
- package/assets/{user-info-DBYoAJYJ.js → user-info-DFrmpJ4y.js} +1 -1
- package/assets/{user-menu-content-qkvdkUVd.js → user-menu-content-DPXQdERj.js} +1 -1
- package/assets/welcome-B4WCIXKf.js +1 -0
- package/controllers/add.js +3 -3
- package/controllers/addGroup.js +2 -4
- package/controllers/addUser.js +4 -6
- package/controllers/catalog/Catalog.js +2 -2
- package/controllers/catalog/FrontentCatalogAdapter.js +1 -2
- package/controllers/ckeditorUpload.js +2 -3
- package/controllers/dashboard.js +16 -2
- package/controllers/edit.js +3 -4
- package/controllers/editGroup.js +2 -4
- package/controllers/editUser.js +3 -5
- package/controllers/form.js +2 -3
- package/controllers/getAllWidgets.js +3 -3
- package/controllers/initUser.js +1 -2
- package/controllers/list.js +5 -5
- package/controllers/login.js +31 -15
- package/controllers/media-manager/mediaManagerAdapter.js +1 -2
- package/controllers/media-manager/mediaManagerApi.js +2 -2
- package/controllers/navigation/edit.js +2 -2
- package/controllers/register.js +1 -4
- package/controllers/remove.js +3 -3
- package/controllers/timezones.js +1 -1
- package/controllers/view.js +3 -3
- package/controllers/welcome.js +1 -1
- package/controllers/widgets/Action.js +2 -2
- package/controllers/widgets/Custom.js +2 -2
- package/controllers/widgets/Info.js +2 -2
- package/controllers/widgets/switch.js +2 -2
- package/controllers/widgetsDB.js +5 -5
- package/helpers/accessRightsHelper.d.ts +6 -2
- package/helpers/accessRightsHelper.js +21 -3
- package/helpers/configHelper.js +2 -1
- package/helpers/controllerHelper.js +1 -1
- package/helpers/fieldsHelper.d.ts +1 -1
- package/helpers/fieldsHelper.js +1 -1
- package/helpers/inertiaActionsHelper.js +1 -1
- package/helpers/inertiaAddHelper.d.ts +1 -1
- package/helpers/inertiaAddHelper.js +2 -0
- package/helpers/inertiaFromHelper.js +2 -0
- package/helpers/inertiaGroupHelper.d.ts +4 -2
- package/helpers/inertiaGroupHelper.js +1 -1
- package/helpers/inertiaListHelper.js +5 -5
- package/helpers/inertiaMenuHelper.js +2 -2
- package/helpers/inertiaUserHelper.d.ts +7 -1
- package/helpers/inertiaUserHelper.js +5 -1
- package/helpers/menuHelper.d.ts +2 -1
- package/helpers/menuHelper.js +8 -2
- package/index.d.ts +4 -1
- package/index.js +7 -1
- package/interfaces/adminpanelConfig.d.ts +19 -23
- package/interfaces/global.d.ts +8 -26
- package/interfaces/types.d.ts +1 -1
- package/lib/Adminizer.d.ts +2 -0
- package/lib/Adminizer.js +26 -6
- package/lib/catalog/AbstractCatalog.js +0 -1
- package/lib/catalog/Navigation.js +6 -7
- package/lib/datatable/NodeTable.js +2 -5
- package/lib/inertia/inertiaAdapter.js +0 -1
- package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
- package/lib/media-manager/AbstractMediaManager.js +1 -1
- package/lib/media-manager/Items.js +0 -3
- package/lib/v4/DataAccessor.d.ts +5 -2
- package/lib/v4/DataAccessor.js +31 -14
- package/lib/v4/I18n.js +2 -0
- package/lib/v4/POWCaptcha.js +0 -1
- package/lib/v4/PolicyManager.js +0 -1
- package/lib/v4/helper/jwt.d.ts +10 -0
- package/lib/v4/helper/jwt.js +18 -0
- package/lib/v4/model/AbstractModel.d.ts +5 -1
- package/lib/v4/model/AbstractModel.js +2 -3
- package/lib/v4/model/ModelHandler.js +0 -1
- package/lib/v4/model/adapter/sequelize.d.ts +11 -2
- package/lib/v4/model/adapter/sequelize.js +451 -118
- package/lib/v4/model/adapter/waterline.js +5 -3
- package/lib/widgets/abstractAction.d.ts +1 -1
- package/lib/widgets/abstractCustom.d.ts +27 -12
- package/lib/widgets/abstractCustom.js +8 -2
- package/lib/widgets/abstractInfo.d.ts +1 -1
- package/lib/widgets/abstractInfo.js +1 -1
- package/lib/widgets/abstractLink.d.ts +1 -0
- package/lib/widgets/abstractSwitch.d.ts +1 -1
- package/lib/widgets/abstractWidgetBase.d.ts +1 -1
- package/lib/widgets/widgetHandler.d.ts +27 -3
- package/lib/widgets/widgetHandler.js +25 -25
- package/models/GroupAP.d.ts +8 -0
- package/models/NavigationAP.d.ts +5 -0
- package/models/UserAP.d.ts +24 -2
- package/models/UserAP.js +2 -2
- package/package.json +23 -11
- package/policies/checkAuth.js +4 -3
- package/policies/setLocale.js +2 -2
- package/system/Router.js +6 -14
- package/system/bindAccessRights.js +0 -4
- package/system/bindAuthorization.js +4 -5
- package/system/bindDev.js +1 -0
- package/system/bindInertia.js +9 -9
- package/system/bindMediaManager.js +0 -1
- package/system/bindModels.js +7 -2
- package/system/bindNavigation.js +0 -1
- package/system/bindReqFunctions.js +15 -0
- package/translations/ru.json +17 -8
- package/assets/add-ZITr43GJ.js +0 -1
- package/assets/add-form-CYOfr0Ef.js +0 -1
- package/assets/add-group-B332wN8K.js +0 -1
- package/assets/add-user-TC-mYdsB.js +0 -1
- package/assets/add-user-form-y2f_1_lM.js +0 -1
- package/assets/app-sidebar-BCtaEFGb.js +0 -1
- package/assets/dashboard-BR602KhL.js +0 -1
- package/assets/form-DOUNk3o2.js +0 -1
- package/assets/form-lOKv4Qbw.js +0 -1
- package/assets/home-Ch6QfTIt.js +0 -2
- package/assets/index-Cdb9ACvz.js +0 -1
- package/assets/index-K81GbF6O.js +0 -1
- package/assets/list-Qyd7ecQH.js +0 -1
- package/assets/module-DBaykv8l.js +0 -1
- package/assets/welcome-D2adQ8EU.js +0 -1
- package/controllers/processInstallFinalize.d.ts +0 -1
- package/controllers/processInstallFinalize.js +0 -16
- package/controllers/processInstallStep.d.ts +0 -1
- package/controllers/processInstallStep.js +0 -132
- package/lib/installStepper/InstallStepAbstract.d.ts +0 -52
- package/lib/installStepper/InstallStepAbstract.js +0 -69
- package/lib/installStepper/finalizeStep.d.ts +0 -21
- package/lib/installStepper/finalizeStep.js +0 -48
- package/lib/installStepper/installStepper.d.ts +0 -40
- package/lib/installStepper/installStepper.js +0 -195
- package/models/MediaManagerAP.d.ts +0 -46
- package/models/MediaManagerAP.js +0 -45
- package/models/MediaManagerAssociationsAP.d.ts +0 -28
- package/models/MediaManagerAssociationsAP.js +0 -27
- package/models/MediaManagerMetaAP.d.ts +0 -22
- package/models/MediaManagerMetaAP.js +0 -21
- package/system/bindInstallStepper.d.ts +0 -2
- 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
|
-
|
|
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
|
|
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
|
|
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
|
|
2
|
-
export default abstract class CustomBase
|
|
3
|
-
/** Widget
|
|
4
|
-
abstract readonly
|
|
5
|
-
/**
|
|
6
|
-
abstract readonly
|
|
7
|
-
/**
|
|
8
|
-
abstract readonly
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
|
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 abstract class SwitchBase extends BaseWidget {
|
|
3
3
|
readonly widgetType = "switcher";
|
|
4
|
-
/** Widget background css
|
|
4
|
+
/** Widget background css color */
|
|
5
5
|
abstract readonly backgroundCSS: string | null;
|
|
6
6
|
/** Get current state */
|
|
7
7
|
abstract getState(): Promise<boolean>;
|
|
@@ -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:
|
|
36
|
-
getWidgetsDB(id: number, auth: boolean): Promise<
|
|
37
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
151
|
+
return result;
|
|
152
152
|
}
|
|
153
|
-
async setWidgetsDB(id,
|
|
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:
|
|
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:
|
|
161
|
+
let updatedUser = await this.adminizer.modelHandler.model.get("UserAP")?.["_updateOne"]({ id: id }, { widgets: body });
|
|
162
162
|
return updatedUser.id;
|
|
163
163
|
}
|
|
164
164
|
}
|
package/models/GroupAP.d.ts
CHANGED
|
@@ -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
|
+
}
|
package/models/NavigationAP.d.ts
CHANGED
package/models/UserAP.d.ts
CHANGED
|
@@ -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
|
-
|
|
21
|
+
avatar: {
|
|
20
22
|
type: string;
|
|
21
23
|
};
|
|
22
|
-
|
|
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
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adminizer",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.1.0-build.
|
|
4
|
+
"version": "4.1.0-build.21",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "
|
|
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
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
}
|
package/policies/checkAuth.js
CHANGED
|
@@ -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.
|
|
8
|
-
req.
|
|
7
|
+
if (req.user) {
|
|
8
|
+
req.user.isAdministrator = true;
|
|
9
9
|
}
|
|
10
10
|
else {
|
|
11
|
-
req.
|
|
11
|
+
req.user = {
|
|
12
12
|
id: 0,
|
|
13
|
+
login: "No Auth",
|
|
13
14
|
isAdministrator: true,
|
|
14
15
|
locale: locale
|
|
15
16
|
};
|
package/policies/setLocale.js
CHANGED
|
@@ -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.
|
|
9
|
-
req.i18n.setLocale(req.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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",
|