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
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { InstallStepper } from "../lib/installStepper/installStepper";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { Adminizer } from "../lib/Adminizer";
|
|
4
|
-
export default async function processInstallStep(req, res) {
|
|
5
|
-
if (req.adminizer.config.auth.enable) {
|
|
6
|
-
if (!req.session.UserAP) {
|
|
7
|
-
res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`process-install-step`, req.session.UserAP)) {
|
|
11
|
-
res.sendStatus(403);
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
if (req.method.toUpperCase() === 'GET') {
|
|
16
|
-
Adminizer.log.debug("GET REQUEST TO PROCESS INSTALL STEP");
|
|
17
|
-
let installStepper = InstallStepper.getStepper(req.params.id);
|
|
18
|
-
if (!installStepper) {
|
|
19
|
-
res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (installStepper.hasUnprocessedSteps() || installStepper.hasUnfinalizedSteps()) {
|
|
23
|
-
let renderData = installStepper.render(req);
|
|
24
|
-
let renderer = renderData.currentStep.renderer;
|
|
25
|
-
// run onInit method before showing step to user
|
|
26
|
-
try {
|
|
27
|
-
await renderData.currentStep.onInit();
|
|
28
|
-
}
|
|
29
|
-
catch (e) {
|
|
30
|
-
console.log("ERROR IN PROCESS INSTALL STEP", e);
|
|
31
|
-
res.viewAdmin(`installer/error`, { error: e, stepperId: installStepper.id });
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
res.viewAdmin(`installer/${renderer}`, { ...renderData, stepperId: installStepper.id });
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (req.method.toUpperCase() === 'POST') {
|
|
43
|
-
try {
|
|
44
|
-
Adminizer.log.debug("POST REQUEST TO PROCESS INSTALL STEP", JSON.stringify(req.body, null, 2));
|
|
45
|
-
let installStepper = InstallStepper.getStepper(req.params.id);
|
|
46
|
-
const currentStepId = req.body.currentStepId;
|
|
47
|
-
const filesCounter = req.body.filesCounter;
|
|
48
|
-
// upload files before processing other fields (filesCounter > 0 means that req contains files)
|
|
49
|
-
const uploadedFiles = await handleFileUploads(req, currentStepId, filesCounter);
|
|
50
|
-
if (req.body.action === 'next') {
|
|
51
|
-
const inputData = JSON.parse(req.body.inputData);
|
|
52
|
-
if (uploadedFiles.length) {
|
|
53
|
-
inputData.uploadedFiles = uploadedFiles;
|
|
54
|
-
}
|
|
55
|
-
// trying to process step
|
|
56
|
-
await installStepper.processStep(currentStepId, inputData);
|
|
57
|
-
}
|
|
58
|
-
else if (req.body.action === 'skip') {
|
|
59
|
-
// trying to skip step
|
|
60
|
-
await installStepper.skipStep(currentStepId);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
res.status(400).send("Invalid action parameter");
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
// go back to stepper if there are more unprocessed steps, otherwise go back to /admin
|
|
67
|
-
if (installStepper.hasUnprocessedSteps()) {
|
|
68
|
-
res.redirect(`${req.adminizer.config.routePrefix}/install/${installStepper.id}`);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
res.redirect(`${req.adminizer.config.routePrefix}/`);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
Adminizer.log.error("Error processing step:", error);
|
|
78
|
-
res.status(500).send("Error processing step");
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (req.method.toUpperCase() === 'DELETE') {
|
|
83
|
-
Adminizer.log.debug("DELETE REQUEST TO PROCESS INSTALL STEP", req.body);
|
|
84
|
-
try {
|
|
85
|
-
InstallStepper.deleteStepper(req.params.id);
|
|
86
|
-
res.status(200).send("OK");
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
catch (e) {
|
|
90
|
-
res.status(403).send(e);
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
res.status(500).send("Invalid request method");
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
;
|
|
98
|
-
async function handleFileUploads(req, currentStepId, filesCounter) {
|
|
99
|
-
const uploadedFiles = [];
|
|
100
|
-
for (let i = 0; i < filesCounter; i++) {
|
|
101
|
-
const fieldName = `files_${i}`;
|
|
102
|
-
const uploadMiddleware = req.upload({
|
|
103
|
-
destination: "installStepper/uploadedImages",
|
|
104
|
-
filename: (file) => {
|
|
105
|
-
const extension = path.extname(file.originalname);
|
|
106
|
-
const baseName = path.basename(file.originalname, extension);
|
|
107
|
-
return `${currentStepId}_${baseName}_${Date.now()}${extension}`;
|
|
108
|
-
},
|
|
109
|
-
}).single(fieldName);
|
|
110
|
-
try {
|
|
111
|
-
await new Promise((resolve, reject) => {
|
|
112
|
-
uploadMiddleware(req, null, (err) => {
|
|
113
|
-
if (err) {
|
|
114
|
-
Adminizer.logger.error(`Error uploading file: ${fieldName}`, err);
|
|
115
|
-
reject(err);
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
const uploadedFile = req.file?.path;
|
|
119
|
-
if (uploadedFile) {
|
|
120
|
-
uploadedFiles.push(uploadedFile);
|
|
121
|
-
}
|
|
122
|
-
resolve();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
Adminizer.logger.error(`Failed to upload file: ${fieldName}`, err);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return uploadedFiles;
|
|
132
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { ObservablePromise } from "../observablePromise";
|
|
2
|
-
export default abstract class InstallStepAbstract {
|
|
3
|
-
abstract id: string;
|
|
4
|
-
abstract title: string;
|
|
5
|
-
abstract badge: string;
|
|
6
|
-
abstract sortOrder: number;
|
|
7
|
-
/** Step can be skipped. For this option you should do realization for skip handler */
|
|
8
|
-
abstract canBeSkipped: boolean;
|
|
9
|
-
abstract description: string;
|
|
10
|
-
abstract scriptsUrl: string;
|
|
11
|
-
abstract stylesUrl: string;
|
|
12
|
-
/** For custom modules to set the list of settings wanted to set in this step */
|
|
13
|
-
settingsKeys: string[];
|
|
14
|
-
/** Absolute path to ejs template */
|
|
15
|
-
abstract ejsPath: string;
|
|
16
|
-
abstract renderer: "ejs" | "jsonforms";
|
|
17
|
-
isSkipped: boolean;
|
|
18
|
-
isProcessed: boolean;
|
|
19
|
-
/** Data that will be given to browser */
|
|
20
|
-
payload: any;
|
|
21
|
-
groupSortOrder: number;
|
|
22
|
-
finallyPromise: ObservablePromise<void>;
|
|
23
|
-
finallyDescription: string;
|
|
24
|
-
/**
|
|
25
|
-
* A sign that finalization should be started
|
|
26
|
-
*/
|
|
27
|
-
finallyToRun: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* The time it takes for finally to complete
|
|
30
|
-
*
|
|
31
|
-
* default: 15 seconds
|
|
32
|
-
*
|
|
33
|
-
* maximum: 10 minutes;
|
|
34
|
-
*/
|
|
35
|
-
finallyTimeout: number;
|
|
36
|
-
/** Action that will be run when saving data to storage */
|
|
37
|
-
abstract process(data: any, context?: any): Promise<void>;
|
|
38
|
-
/** Method will be called after processing step (both process or skip) */
|
|
39
|
-
finally(data: any, context?: any): Promise<void>;
|
|
40
|
-
/** This method will be called by InstallStepper and is a wrapper for "finally" method */
|
|
41
|
-
toFinally(data?: any, context?: any, timeout?: number): void;
|
|
42
|
-
/** Action that will be run when skipping the step */
|
|
43
|
-
protected abstract skip(): Promise<void>;
|
|
44
|
-
/** This method will be called by InstallStepper and is a wrapper for "skip" method */
|
|
45
|
-
skipIt(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Checks that step should be processed during install
|
|
48
|
-
* `true` means that the step has been completed and does not need to be shown
|
|
49
|
-
*/
|
|
50
|
-
abstract check(): Promise<boolean>;
|
|
51
|
-
onInit(): Promise<void>;
|
|
52
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { ObservablePromise } from "../observablePromise";
|
|
2
|
-
import { Adminizer } from "../Adminizer";
|
|
3
|
-
export default class InstallStepAbstract {
|
|
4
|
-
/** For custom modules to set the list of settings wanted to set in this step */
|
|
5
|
-
settingsKeys = [];
|
|
6
|
-
isSkipped = false;
|
|
7
|
-
isProcessed = false;
|
|
8
|
-
/** Data that will be given to browser */
|
|
9
|
-
payload = {};
|
|
10
|
-
groupSortOrder = 1;
|
|
11
|
-
finallyPromise = null;
|
|
12
|
-
finallyDescription = null;
|
|
13
|
-
/**
|
|
14
|
-
* A sign that finalization should be started
|
|
15
|
-
*/
|
|
16
|
-
finallyToRun = false;
|
|
17
|
-
/**
|
|
18
|
-
* The time it takes for finally to complete
|
|
19
|
-
*
|
|
20
|
-
* default: 15 seconds
|
|
21
|
-
*
|
|
22
|
-
* maximum: 10 minutes;
|
|
23
|
-
*/
|
|
24
|
-
finallyTimeout = 15 * 60 * 1000;
|
|
25
|
-
/** Method will be called after processing step (both process or skip) */
|
|
26
|
-
finally(data, context) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
/** This method will be called by InstallStepper and is a wrapper for "finally" method */
|
|
30
|
-
toFinally(data, context, timeout) {
|
|
31
|
-
Adminizer.log.debug(`To finally [${this.id}]`);
|
|
32
|
-
if (!timeout) {
|
|
33
|
-
timeout = this.finallyTimeout;
|
|
34
|
-
}
|
|
35
|
-
if (!timeout || typeof timeout !== "number") {
|
|
36
|
-
timeout = 15 * 60 * 1000;
|
|
37
|
-
}
|
|
38
|
-
if (timeout > 10 * 60 * 60 * 1000) {
|
|
39
|
-
timeout = 10 * 60 * 60 * 1000;
|
|
40
|
-
}
|
|
41
|
-
if (typeof arguments[0] === "number") {
|
|
42
|
-
timeout = arguments[0];
|
|
43
|
-
}
|
|
44
|
-
if (this.finallyPromise && this.finallyPromise.status === "pending") {
|
|
45
|
-
Adminizer.log.warn(`Method "finally" was already executed and won't be executed again`);
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
try {
|
|
49
|
-
this.finallyPromise = new ObservablePromise(this.finally(data, context), timeout);
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
Adminizer.log.error(`Step [${this.id}] finally error:`, error);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
this.finallyPromise.promise;
|
|
56
|
-
}
|
|
57
|
-
/** This method will be called by InstallStepper and is a wrapper for "skip" method */
|
|
58
|
-
async skipIt() {
|
|
59
|
-
if (this.canBeSkipped === false) {
|
|
60
|
-
throw `Step [${this.title}] can not be skipped`;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
await this.skip();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async onInit() {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import InstallStepAbstract from "./InstallStepAbstract";
|
|
2
|
-
export default class FinalizeStep extends InstallStepAbstract {
|
|
3
|
-
canBeSkipped: boolean;
|
|
4
|
-
description: string;
|
|
5
|
-
ejsPath: string;
|
|
6
|
-
id: string;
|
|
7
|
-
scriptsUrl: string;
|
|
8
|
-
sortOrder: number;
|
|
9
|
-
stylesUrl: string;
|
|
10
|
-
title: string;
|
|
11
|
-
badge: string;
|
|
12
|
-
isSkipped: boolean;
|
|
13
|
-
settingsKeys: string[];
|
|
14
|
-
renderer: "ejs";
|
|
15
|
-
isProcessed: boolean;
|
|
16
|
-
check(): Promise<boolean>;
|
|
17
|
-
process(data: any): Promise<void>;
|
|
18
|
-
skip(): Promise<void>;
|
|
19
|
-
finally(): Promise<void>;
|
|
20
|
-
toFinally(): void;
|
|
21
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import InstallStepAbstract from "./InstallStepAbstract";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { InstallStepper } from "./installStepper";
|
|
4
|
-
export default class FinalizeStep extends InstallStepAbstract {
|
|
5
|
-
canBeSkipped = false;
|
|
6
|
-
description = '';
|
|
7
|
-
ejsPath = path.resolve(import.meta.dirname, '../../views/ejs/installer/partials/finalize.ejs');
|
|
8
|
-
id = 'finalize';
|
|
9
|
-
scriptsUrl = '';
|
|
10
|
-
sortOrder = 0;
|
|
11
|
-
stylesUrl = '';
|
|
12
|
-
title = 'Finalize Step';
|
|
13
|
-
badge = '';
|
|
14
|
-
isSkipped = false;
|
|
15
|
-
settingsKeys = [];
|
|
16
|
-
renderer = "ejs";
|
|
17
|
-
isProcessed = false;
|
|
18
|
-
async check() {
|
|
19
|
-
if (this.isProcessed) {
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
let installStepper = InstallStepper.getInstance();
|
|
24
|
-
if (!installStepper.hasUnfinalizedSteps()) {
|
|
25
|
-
this.canBeSkipped = true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
async process(data) {
|
|
31
|
-
let installStepper = InstallStepper.getInstance();
|
|
32
|
-
if (!installStepper.hasUnfinalizedSteps()) {
|
|
33
|
-
this.isProcessed = true;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async skip() {
|
|
37
|
-
let installStepper = InstallStepper.getInstance();
|
|
38
|
-
if (!installStepper.hasUnfinalizedSteps()) {
|
|
39
|
-
this.isProcessed = true;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
finally() {
|
|
43
|
-
return Promise.resolve();
|
|
44
|
-
}
|
|
45
|
-
toFinally() {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import InstallStepAbstract from "./InstallStepAbstract";
|
|
2
|
-
interface RenderData {
|
|
3
|
-
totalStepCount: number;
|
|
4
|
-
leftStepsCount: number;
|
|
5
|
-
currentStep: InstallStepAbstract;
|
|
6
|
-
locale: string;
|
|
7
|
-
}
|
|
8
|
-
export declare class InstallStepper {
|
|
9
|
-
id: string;
|
|
10
|
-
private steps;
|
|
11
|
-
context: any;
|
|
12
|
-
readonly canBeClosed: boolean;
|
|
13
|
-
static instances: InstallStepper[];
|
|
14
|
-
constructor(id: string, canBeClosed?: boolean);
|
|
15
|
-
static addStepper(stepper?: InstallStepper): void;
|
|
16
|
-
static getStepper(stepperId: string): InstallStepper;
|
|
17
|
-
static deleteStepper(stepperId: string): void;
|
|
18
|
-
static getInstance(): InstallStepper;
|
|
19
|
-
getSteps(): InstallStepAbstract[];
|
|
20
|
-
processStep(stepId: string, data: any): Promise<void>;
|
|
21
|
-
private getStepById;
|
|
22
|
-
/** Prepares steps array for user interface render */
|
|
23
|
-
render(req: ReqType): RenderData;
|
|
24
|
-
skipStep(stepId: string): Promise<void>;
|
|
25
|
-
/** Add step (replace if it already exists) */
|
|
26
|
-
addStep(step: InstallStepAbstract): void;
|
|
27
|
-
hasUnprocessedSteps(): boolean;
|
|
28
|
-
getNextUnprocessedStep(): InstallStepAbstract;
|
|
29
|
-
hasUnfinalizedSteps(): boolean;
|
|
30
|
-
getFinalizeStatus(): {
|
|
31
|
-
status: string;
|
|
32
|
-
finalizeList: {
|
|
33
|
-
id: string;
|
|
34
|
-
status: "pending" | "fulfilled" | "rejected";
|
|
35
|
-
description: string;
|
|
36
|
-
info: string;
|
|
37
|
-
}[];
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export {};
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import FinalizeStep from "./finalizeStep";
|
|
2
|
-
import * as fs from "fs";
|
|
3
|
-
import { TranslationHelper } from "../../helpers/translationHelper";
|
|
4
|
-
import { Adminizer } from "../Adminizer";
|
|
5
|
-
export class InstallStepper {
|
|
6
|
-
id;
|
|
7
|
-
steps = [];
|
|
8
|
-
context = {};
|
|
9
|
-
canBeClosed;
|
|
10
|
-
// TODO remove static fields for multi adminizer server
|
|
11
|
-
static instances = [];
|
|
12
|
-
constructor(id, canBeClosed = false) {
|
|
13
|
-
this.id = id;
|
|
14
|
-
this.canBeClosed = canBeClosed;
|
|
15
|
-
}
|
|
16
|
-
static addStepper(stepper) {
|
|
17
|
-
if (this.instances.find(item => item.id === stepper.id)) {
|
|
18
|
-
Adminizer.log.debug(`Stepper with id ${stepper.id} was deleted due to creating new one`);
|
|
19
|
-
this.deleteStepper(stepper.id);
|
|
20
|
-
}
|
|
21
|
-
this.instances.push(stepper);
|
|
22
|
-
}
|
|
23
|
-
static getStepper(stepperId) {
|
|
24
|
-
return this.instances.find(item => item.id === stepperId);
|
|
25
|
-
}
|
|
26
|
-
static deleteStepper(stepperId) {
|
|
27
|
-
let stepper = this.getStepper(stepperId);
|
|
28
|
-
if (!stepper.canBeClosed) {
|
|
29
|
-
Adminizer.log.error(`Can not delete stepper: Stepper with id ${stepperId} can not be closed.`);
|
|
30
|
-
throw `Can not delete stepper: Stepper with id ${stepperId} can not be closed`;
|
|
31
|
-
}
|
|
32
|
-
const index = this.instances.findIndex(item => item.id === stepperId);
|
|
33
|
-
if (index !== -1) {
|
|
34
|
-
this.instances.splice(index, 1);
|
|
35
|
-
Adminizer.log.info(`Stepper with id ${stepperId} has been deleted.`);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
Adminizer.log.error(`Can not delete stepper: Stepper with id ${stepperId} not found.`);
|
|
39
|
-
throw `Can not delete stepper: Stepper with id ${stepperId} not found.`;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
static getInstance() {
|
|
43
|
-
if (!this.instances.length) {
|
|
44
|
-
let newStepper = new InstallStepper("project", false);
|
|
45
|
-
this.instances.push(newStepper);
|
|
46
|
-
}
|
|
47
|
-
return this.instances.find(item => item.id === "project");
|
|
48
|
-
}
|
|
49
|
-
getSteps() {
|
|
50
|
-
return this.steps;
|
|
51
|
-
}
|
|
52
|
-
async processStep(stepId, data) {
|
|
53
|
-
try {
|
|
54
|
-
/** As we sort steps by sortOrder, we should check that previous steps were processed */
|
|
55
|
-
const stepIndex = this.steps.findIndex(item => item.id === stepId);
|
|
56
|
-
Adminizer.log.debug("STEP INDEX", stepIndex);
|
|
57
|
-
for (let i = 0; i < stepIndex; i++) {
|
|
58
|
-
if (this.steps[i].canBeSkipped && this.steps[i].isSkipped) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
let checkResult = await this.steps[i].check();
|
|
62
|
-
if (checkResult === false) {
|
|
63
|
-
throw `Previous step was not processed`;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
let step = this.getStepById(stepId);
|
|
67
|
-
// get context copy and write down information in it on process without damaging source object
|
|
68
|
-
let contextCopy = { ...this.context };
|
|
69
|
-
await step.process(data, contextCopy);
|
|
70
|
-
Object.assign(this.context, contextCopy);
|
|
71
|
-
step.isProcessed = true;
|
|
72
|
-
Adminizer.log.debug(`STEP ${stepId} was processed`);
|
|
73
|
-
// call finalize method only if has description
|
|
74
|
-
if (step.finallyToRun) {
|
|
75
|
-
contextCopy = { ...this.context };
|
|
76
|
-
step.toFinally(data, this.context);
|
|
77
|
-
Object.assign(this.context, contextCopy);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
catch (e) {
|
|
81
|
-
Adminizer.log.error(`Error processing step: ${e}`);
|
|
82
|
-
throw new Error(e);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
getStepById(stepId) {
|
|
86
|
-
return this.steps.find(item => item.id === stepId);
|
|
87
|
-
}
|
|
88
|
-
/** Prepares steps array for user interface render */
|
|
89
|
-
render(req) {
|
|
90
|
-
let stepToRender = this.getNextUnprocessedStep();
|
|
91
|
-
let leftSteps = this.steps.filter(step => !step.isProcessed && !step.isSkipped);
|
|
92
|
-
// set locale
|
|
93
|
-
if (typeof req.adminizer.config.translation !== "boolean") {
|
|
94
|
-
if (!req.session.UserAP.locale || !req.adminizer.config.translation.locales.includes(req.session.UserAP.locale)) {
|
|
95
|
-
req.session.UserAP.locale = req.adminizer.config.translation.defaultLocale || "en";
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
req.session.UserAP.locale = "en";
|
|
100
|
-
}
|
|
101
|
-
this.context.locale = req.session.UserAP.locale;
|
|
102
|
-
// translate step
|
|
103
|
-
stepToRender = TranslationHelper.translateProperties(req.i18n, stepToRender, ["title", "description", "name"]);
|
|
104
|
-
return {
|
|
105
|
-
totalStepCount: this.steps.length,
|
|
106
|
-
leftStepsCount: leftSteps.length,
|
|
107
|
-
currentStep: stepToRender,
|
|
108
|
-
locale: req.session.UserAP.locale
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
async skipStep(stepId) {
|
|
112
|
-
try {
|
|
113
|
-
let step = this.getStepById(stepId);
|
|
114
|
-
await step.skipIt();
|
|
115
|
-
step.isSkipped = true;
|
|
116
|
-
}
|
|
117
|
-
catch (e) {
|
|
118
|
-
Adminizer.log.error(`Error skipping step: ${e}`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/** Add step (replace if it already exists) */
|
|
122
|
-
addStep(step) {
|
|
123
|
-
if (step.renderer === "ejs") {
|
|
124
|
-
if (!step.ejsPath || !fs.existsSync(step.ejsPath)) {
|
|
125
|
-
throw `Step [${step.title}] error: ejs path does not exists`;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
const stepIndex = this.steps.findIndex(item => item.id === step.id);
|
|
129
|
-
if (stepIndex !== -1) {
|
|
130
|
-
Adminizer.log.warn(`Attention! The step has been replaced\`${step.id}\``);
|
|
131
|
-
this.steps[stepIndex] = step;
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
this.steps.push(step);
|
|
135
|
-
}
|
|
136
|
-
// sort by group, then by renderer and then by sortOrder
|
|
137
|
-
this.steps.sort((a, b) => {
|
|
138
|
-
if (a.groupSortOrder !== b.groupSortOrder) {
|
|
139
|
-
return a.groupSortOrder - b.groupSortOrder;
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
if (a.renderer !== b.renderer) {
|
|
143
|
-
return a.renderer === 'ejs' ? -1 : 1;
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
return a.sortOrder - b.sortOrder;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
hasUnprocessedSteps() {
|
|
152
|
-
return this.steps.some(step => !step.isProcessed && !step.isSkipped);
|
|
153
|
-
}
|
|
154
|
-
getNextUnprocessedStep() {
|
|
155
|
-
let nextStep = this.steps.find(step => !step.isProcessed && !step.isSkipped);
|
|
156
|
-
if (!nextStep && this.hasUnfinalizedSteps()) {
|
|
157
|
-
if (this.getStepById("finalize")) {
|
|
158
|
-
nextStep = this.getStepById("finalize");
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
let timer = setInterval(() => {
|
|
162
|
-
// clear steps if all of them was processed and finalized
|
|
163
|
-
if (!this.hasUnprocessedSteps() && !this.hasUnfinalizedSteps()) {
|
|
164
|
-
this.steps = [];
|
|
165
|
-
Adminizer.log.debug("CLEARING STEPS", this.steps);
|
|
166
|
-
clearInterval(timer);
|
|
167
|
-
}
|
|
168
|
-
}, 5000);
|
|
169
|
-
nextStep = new FinalizeStep();
|
|
170
|
-
this.addStep(nextStep);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return nextStep;
|
|
174
|
-
}
|
|
175
|
-
hasUnfinalizedSteps() {
|
|
176
|
-
return this.steps.some(step => step.finallyPromise?.status === "pending");
|
|
177
|
-
}
|
|
178
|
-
getFinalizeStatus() {
|
|
179
|
-
let stepsWithFinalize = this.steps.filter(step => step.finallyPromise !== null);
|
|
180
|
-
let generalStatus = "fulfilled";
|
|
181
|
-
let stepFinalizeStatuses = stepsWithFinalize.map(item => {
|
|
182
|
-
let info = null;
|
|
183
|
-
// if one of them is pending, general status is pending
|
|
184
|
-
if (item.finallyPromise.status === "pending") {
|
|
185
|
-
generalStatus = "pending";
|
|
186
|
-
}
|
|
187
|
-
if (item.finallyPromise.status === "rejected") {
|
|
188
|
-
generalStatus = "rejected";
|
|
189
|
-
info = `Error: ${item.finallyPromise.info}`;
|
|
190
|
-
}
|
|
191
|
-
return { id: item.id, status: item.finallyPromise.status, description: item.finallyDescription, info: info };
|
|
192
|
-
});
|
|
193
|
-
return { status: generalStatus, finalizeList: stepFinalizeStatuses ?? [] };
|
|
194
|
-
}
|
|
195
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
declare const _default: {
|
|
2
|
-
id: {
|
|
3
|
-
type: string;
|
|
4
|
-
allowNull: boolean;
|
|
5
|
-
uuid: boolean;
|
|
6
|
-
primaryKey: boolean;
|
|
7
|
-
required: boolean;
|
|
8
|
-
};
|
|
9
|
-
parent: {
|
|
10
|
-
model: string;
|
|
11
|
-
};
|
|
12
|
-
variants: {
|
|
13
|
-
collection: string;
|
|
14
|
-
via: string;
|
|
15
|
-
};
|
|
16
|
-
mimeType: {
|
|
17
|
-
type: string;
|
|
18
|
-
};
|
|
19
|
-
path: {
|
|
20
|
-
type: string;
|
|
21
|
-
};
|
|
22
|
-
size: {
|
|
23
|
-
type: string;
|
|
24
|
-
};
|
|
25
|
-
group: {
|
|
26
|
-
type: string;
|
|
27
|
-
};
|
|
28
|
-
tag: {
|
|
29
|
-
type: string;
|
|
30
|
-
};
|
|
31
|
-
url: {
|
|
32
|
-
type: string;
|
|
33
|
-
};
|
|
34
|
-
filename: {
|
|
35
|
-
type: string;
|
|
36
|
-
};
|
|
37
|
-
meta: {
|
|
38
|
-
collection: string;
|
|
39
|
-
via: string;
|
|
40
|
-
};
|
|
41
|
-
modelAssociation: {
|
|
42
|
-
collection: string;
|
|
43
|
-
via: string;
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
export default _default;
|
package/models/MediaManagerAP.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
id: {
|
|
3
|
-
type: "string",
|
|
4
|
-
allowNull: false,
|
|
5
|
-
uuid: true,
|
|
6
|
-
primaryKey: true,
|
|
7
|
-
required: true
|
|
8
|
-
},
|
|
9
|
-
parent: {
|
|
10
|
-
model: "MediaManagerAP"
|
|
11
|
-
},
|
|
12
|
-
variants: {
|
|
13
|
-
collection: "MediaManagerAP",
|
|
14
|
-
via: "parent"
|
|
15
|
-
},
|
|
16
|
-
mimeType: {
|
|
17
|
-
type: "string"
|
|
18
|
-
},
|
|
19
|
-
path: {
|
|
20
|
-
type: "string"
|
|
21
|
-
},
|
|
22
|
-
size: {
|
|
23
|
-
type: "number"
|
|
24
|
-
},
|
|
25
|
-
group: {
|
|
26
|
-
type: "string"
|
|
27
|
-
},
|
|
28
|
-
tag: {
|
|
29
|
-
type: "string"
|
|
30
|
-
},
|
|
31
|
-
url: {
|
|
32
|
-
type: "string"
|
|
33
|
-
},
|
|
34
|
-
filename: {
|
|
35
|
-
type: "string"
|
|
36
|
-
},
|
|
37
|
-
meta: {
|
|
38
|
-
collection: "MediaManagerMetaAP",
|
|
39
|
-
via: "parent"
|
|
40
|
-
},
|
|
41
|
-
modelAssociation: {
|
|
42
|
-
collection: "MediaManagerAssociationsAP",
|
|
43
|
-
via: "file"
|
|
44
|
-
}
|
|
45
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
declare const _default: {
|
|
2
|
-
id: {
|
|
3
|
-
type: string;
|
|
4
|
-
allowNull: boolean;
|
|
5
|
-
uuid: boolean;
|
|
6
|
-
primaryKey: boolean;
|
|
7
|
-
required: boolean;
|
|
8
|
-
};
|
|
9
|
-
mediaManagerId: {
|
|
10
|
-
type: string;
|
|
11
|
-
};
|
|
12
|
-
model: {
|
|
13
|
-
type: string;
|
|
14
|
-
};
|
|
15
|
-
modelId: {
|
|
16
|
-
type: string;
|
|
17
|
-
};
|
|
18
|
-
widgetName: {
|
|
19
|
-
type: string;
|
|
20
|
-
};
|
|
21
|
-
sortOrder: {
|
|
22
|
-
type: string;
|
|
23
|
-
};
|
|
24
|
-
file: {
|
|
25
|
-
model: string;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
export default _default;
|