adminizer 4.1.0-commit.3bf605e → 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.
- 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-WTooYWC3.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-BACj996r.js +3 -0
- package/assets/dashboard-BOltB2Hq.css +1 -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 +2 -2
- 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 +2 -3
- 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 +4 -4
- 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 +1 -1
- package/controllers/processInstallFinalize.js +2 -2
- package/controllers/processInstallStep.d.ts +0 -1
- package/controllers/processInstallStep.js +122 -132
- package/controllers/register.js +1 -4
- package/controllers/remove.js +2 -2
- package/controllers/timezones.js +1 -1
- package/controllers/view.js +2 -2
- 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 +3 -2
- package/helpers/accessRightsHelper.js +1 -1
- package/helpers/configHelper.js +2 -1
- package/helpers/fieldsHelper.d.ts +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 +1 -1
- package/helpers/inertiaUserHelper.d.ts +7 -1
- package/helpers/inertiaUserHelper.js +5 -1
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/interfaces/adminpanelConfig.d.ts +6 -2
- package/interfaces/global.d.ts +5 -26
- package/lib/Adminizer.d.ts +2 -0
- package/lib/Adminizer.js +17 -1
- package/lib/catalog/AbstractCatalog.js +0 -1
- package/lib/catalog/Navigation.js +6 -6
- package/lib/datatable/NodeTable.js +0 -3
- package/lib/inertia/inertiaAdapter.js +0 -1
- package/lib/installStepper/installStepper.js +5 -5
- package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
- package/lib/media-manager/AbstractMediaManager.js +1 -1
- package/lib/v4/DataAccessor.d.ts +2 -1
- package/lib/v4/DataAccessor.js +2 -2
- 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.js +0 -2
- package/lib/v4/model/ModelHandler.js +0 -1
- package/lib/v4/model/adapter/sequelize.d.ts +3 -2
- package/lib/v4/model/adapter/sequelize.js +250 -58
- package/lib/v4/model/adapter/waterline.js +0 -1
- 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 +20 -3
- package/lib/widgets/widgetHandler.js +25 -25
- package/models/GroupAP.d.ts +8 -0
- package/models/MediaManagerAP.d.ts +16 -0
- package/models/MediaManagerAssociationsAP.d.ts +10 -0
- package/models/MediaManagerMetaAP.d.ts +8 -0
- package/models/NavigationAP.d.ts +5 -0
- package/models/UserAP.d.ts +25 -2
- package/models/UserAP.js +2 -2
- package/package.json +17 -10
- package/policies/checkAuth.js +4 -3
- package/policies/setLocale.js +2 -2
- package/system/Router.js +14 -14
- package/system/bindAuthorization.js +4 -5
- package/system/bindInertia.js +9 -9
- package/system/bindInstallStepper.js +1 -1
- package/system/bindReqFunctions.js +16 -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
|
@@ -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: [] };
|
|
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
|
+
}
|
|
@@ -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
|
+
}
|
package/models/NavigationAP.d.ts
CHANGED
package/models/UserAP.d.ts
CHANGED
|
@@ -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
|
-
|
|
22
|
+
avatar: {
|
|
20
23
|
type: string;
|
|
21
24
|
};
|
|
22
|
-
|
|
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
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adminizer",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.1.0-commit.
|
|
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
|
|
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": "",
|
|
@@ -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
|
-
"
|
|
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
|
}
|
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,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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
62
|
-
/**
|
|
63
|
-
|
|
64
|
-
|
|
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,
|
|
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"]({
|
package/system/bindInertia.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
110
|
+
user: req.session.userPretended ?? req.user
|
|
111
111
|
},
|
|
112
|
-
menu: req.
|
|
112
|
+
menu: req.user ? menuHelper.getMenuItems(req) : null,
|
|
113
113
|
brand: menuHelper.getBrandTitle(),
|
|
114
114
|
logout: menuHelper.getLogoutUrl(),
|
|
115
|
-
logoutBtn: req.
|
|
116
|
-
section: req.
|
|
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.
|
|
137
|
-
req.
|
|
136
|
+
if (req.user) {
|
|
137
|
+
req.user.isAdministrator = true;
|
|
138
138
|
}
|
|
139
139
|
else {
|
|
140
|
-
req.
|
|
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.
|
|
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);
|
package/translations/ru.json
CHANGED
|
@@ -59,12 +59,12 @@
|
|
|
59
59
|
"Yes": "Да",
|
|
60
60
|
"No": "Нет",
|
|
61
61
|
"Full Name": "Полное имя",
|
|
62
|
-
"password": "
|
|
62
|
+
"password": "пароль",
|
|
63
63
|
"expires": "Истекает",
|
|
64
64
|
"is administrator": "Администратор",
|
|
65
65
|
"widgets": "Виджеты",
|
|
66
66
|
"isConfirmed": "Подтверждено",
|
|
67
|
-
"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": "
|
|
84
|
-
"Number": "
|
|
85
|
-
"Editor": "
|
|
86
|
-
"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
|
}
|
package/assets/add-ZITr43GJ.js
DELETED
|
@@ -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};
|