adminizer 4.6.0 → 4.7.0-build.221
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 +12 -0
- package/assets/RelationDialogStack-CnHFOYyR.css +1 -0
- package/assets/RelationDialogStack-DI2bZxQX.js +20 -0
- package/assets/add-4213XScp.js +1 -0
- package/assets/add-group--F1XxfJ1.js +1 -0
- package/assets/add-group-form-DKRXC2n-.js +1 -0
- package/assets/add-user-b9HfMq7z.js +1 -0
- package/assets/add-user-form-UXAToWQd.js +1 -0
- package/assets/app-Clx8f5hd.css +1 -0
- package/assets/app-layout-C02ja4OI.js +1 -0
- package/assets/app-shell-D8wtkECO.js +1 -0
- package/assets/app-sidebar-BR5_zwxj.js +1 -0
- package/assets/app-sidebar-header-BZbIBQjq.js +1 -0
- package/assets/app.js +59 -7990
- package/assets/breadcrumbs-CODaqVkB.js +1 -0
- package/assets/catalog-6ZZjWdFs.js +6 -0
- package/assets/dashboard-CftAdKiH.js +3 -0
- package/assets/date-picker-DSOkNiNo.js +1 -0
- package/assets/del-modal-Cd4M7af8.js +1 -0
- package/assets/dynamic-controls-BsrJhPDY.js +1 -0
- package/assets/geo-json-CzR5JBXL.js +1 -0
- package/assets/handsontable-BI98OF5R.js +336 -0
- package/assets/history-DLHSU7Ak.js +1 -0
- package/assets/home-NcQ7nnU0.js +2 -0
- package/assets/icon-C2JNaLxH.js +1 -0
- package/assets/init-user-D2HSyXup.js +1 -0
- package/assets/input-error-CH2caTtO.js +1 -0
- package/assets/jsoneditor-DVNQmA6G.js +3869 -0
- package/assets/list-CFU0-TgN.js +4 -0
- package/assets/login-DFSLEO17.js +1 -0
- package/assets/manifest.json +246 -273
- package/assets/material-icon-Bx9pGQiQ.js +1 -0
- package/assets/media-manager-WcKe1EvD.js +6 -0
- package/assets/module-CT7PC6pc.js +1 -0
- package/assets/monaco-Bl4zdWCn.js +11 -0
- package/assets/nav-footer-BiSQkPt4.js +1 -0
- package/assets/nav-main-rTH0PfDw.js +1 -0
- package/assets/nav-user-Bj6cWs0a.js +1 -0
- package/assets/notification-Bi-PX87D.js +20 -0
- package/assets/pagination-render-AKJvTIRA.js +1 -0
- package/assets/register-BTP4uxsK.js +1 -0
- package/assets/ru-eW0WKkga.js +1 -0
- package/assets/theme-switcher-Dm8EOGzx.js +1 -0
- package/assets/toast-editor-DOg_gvSp.js +668 -0
- package/assets/user-filters-list-YUfR4XMI.js +1 -0
- package/assets/user-info-BgSbT02v.js +1 -0
- package/assets/user-menu-content-TQTXHIv6.js +1 -0
- package/assets/{vanilla-picker-l5rcX3cq.js → vanilla-picker-B3LgXoKV.js} +1 -7
- package/assets/welcome-vLwTu1R6.js +1 -0
- package/controllers/add.d.ts +1 -1
- package/controllers/add.js +20 -26
- package/controllers/addGroup.d.ts +1 -1
- package/controllers/addGroup.js +7 -15
- package/controllers/addUser.d.ts +1 -1
- package/controllers/addUser.js +10 -16
- package/controllers/catalog/Catalog.d.ts +1 -1
- package/controllers/catalog/Catalog.js +1 -10
- package/controllers/catalog/FrontendCatalogAdapter.d.ts +3 -3
- package/controllers/catalog/FrontendCatalogAdapter.js +0 -6
- package/controllers/catalog/FrontentCatalogAdapter.d.ts +3 -3
- package/controllers/catalog/FrontentCatalogAdapter.js +0 -4
- package/controllers/ckeditorUpload.js +2 -18
- package/controllers/dashboard.d.ts +1 -1
- package/controllers/dashboard.js +2 -5
- package/controllers/edit.js +24 -37
- package/controllers/editGroup.d.ts +1 -1
- package/controllers/editGroup.js +10 -21
- package/controllers/editUser.d.ts +1 -1
- package/controllers/editUser.js +11 -23
- package/controllers/exportData.d.ts +6 -0
- package/controllers/exportData.js +315 -0
- package/controllers/feed.d.ts +6 -0
- package/controllers/feed.js +73 -0
- package/controllers/feedback/feedbackController.d.ts +1 -1
- package/controllers/feedback/feedbackController.js +5 -7
- package/controllers/filter-fields/columns.d.ts +11 -0
- package/controllers/filter-fields/columns.js +106 -0
- package/controllers/filter-fields/filterFields.d.ts +10 -0
- package/controllers/filter-fields/filterFields.js +141 -0
- package/controllers/filter-fields/getAllUserFilters.d.ts +6 -0
- package/controllers/filter-fields/getAllUserFilters.js +115 -0
- package/controllers/filter-fields/groups.d.ts +5 -0
- package/controllers/filter-fields/groups.js +26 -0
- package/controllers/filter-fields/savedFilters.d.ts +25 -0
- package/controllers/filter-fields/savedFilters.js +317 -0
- package/controllers/getAllWidgets.d.ts +1 -1
- package/controllers/getAllWidgets.js +1 -9
- package/controllers/history-actions/HistoryController.js +6 -31
- package/controllers/initUser.js +6 -5
- package/controllers/inlineUpdate.d.ts +7 -0
- package/controllers/inlineUpdate.js +148 -0
- package/controllers/list.d.ts +1 -1
- package/controllers/list.js +383 -70
- package/controllers/listUserFilters.d.ts +5 -0
- package/controllers/listUserFilters.js +26 -0
- package/controllers/login.js +2 -2
- package/controllers/media-manager/mediaManagerApi.js +0 -9
- package/controllers/navigation/edit.js +3 -9
- package/controllers/notifications/NotificationController.d.ts +1 -1
- package/controllers/notifications/NotificationController.js +12 -36
- package/controllers/register.js +10 -9
- package/controllers/remove.js +10 -19
- package/controllers/timezones.d.ts +1 -1
- package/controllers/timezones.js +0 -6
- package/controllers/userApiKey.d.ts +7 -0
- package/controllers/userApiKey.js +36 -0
- package/controllers/view.js +14 -26
- package/controllers/welcome.d.ts +1 -1
- package/controllers/welcome.js +0 -4
- package/controllers/widgets/Action.d.ts +1 -1
- package/controllers/widgets/Action.js +1 -9
- package/controllers/widgets/Custom.d.ts +1 -1
- package/controllers/widgets/Custom.js +1 -9
- package/controllers/widgets/Info.d.ts +1 -1
- package/controllers/widgets/Info.js +1 -9
- package/controllers/widgets/filterInfo.d.ts +1 -0
- package/controllers/widgets/filterInfo.js +44 -0
- package/controllers/widgets/switch.d.ts +1 -1
- package/controllers/widgets/switch.js +1 -9
- package/controllers/widgetsDB.d.ts +1 -1
- package/controllers/widgetsDB.js +2 -8
- package/helpers/accessRightsHelper.d.ts +1 -1
- package/helpers/accessRightsHelper.js +5 -4
- package/helpers/apiKeyHelper.d.ts +5 -0
- package/helpers/apiKeyHelper.js +8 -0
- package/helpers/configHelper.js +12 -15
- package/helpers/controllerHelper.d.ts +14 -21
- package/helpers/controllerHelper.js +50 -83
- package/helpers/fieldsHelper.js +3 -3
- package/helpers/filterDatetimeHelper.d.ts +5 -0
- package/helpers/filterDatetimeHelper.js +84 -0
- package/helpers/inertiaActionsHelper.d.ts +2 -2
- package/helpers/inertiaActionsHelper.js +5 -4
- package/helpers/inertiaAddHelper.d.ts +3 -414
- package/helpers/inertiaAddHelper.js +39 -15
- package/helpers/inertiaGroupHelper.d.ts +2 -2
- package/helpers/inertiaGroupHelper.js +3 -3
- package/helpers/inertiaListHelper.d.ts +7 -3
- package/helpers/inertiaListHelper.js +26 -12
- package/helpers/inertiaMenuHelper.d.ts +1 -0
- package/helpers/inertiaMenuHelper.js +15 -3
- package/helpers/inertiaUserHelper.d.ts +3 -2
- package/helpers/inertiaUserHelper.js +7 -3
- package/helpers/menuHelper.d.ts +5 -2
- package/helpers/menuHelper.js +64 -12
- package/helpers/viteHelper.js +1 -2
- package/index.d.ts +6 -2
- package/index.js +6 -2
- package/interfaces/adminpanelConfig.d.ts +126 -39
- package/interfaces/internalModelAccess.d.ts +37 -0
- package/interfaces/internalModelAccess.js +1 -0
- package/interfaces/listQueryBuilder.d.ts +22 -0
- package/interfaces/listQueryBuilder.js +1 -0
- package/interfaces/queryCriteria.d.ts +54 -0
- package/interfaces/queryCriteria.js +1 -0
- package/interfaces/types.d.ts +1 -13
- package/lib/Adminizer.d.ts +4 -2
- package/lib/Adminizer.js +29 -10
- package/lib/DataAccessor.d.ts +8 -5
- package/lib/DataAccessor.js +89 -42
- package/lib/I18n.d.ts +5 -1
- package/lib/I18n.js +45 -19
- package/lib/MiddlewareManager.d.ts +8 -0
- package/lib/MiddlewareManager.js +53 -0
- package/lib/ai-assistant/OpenAiModelService.d.ts +3 -3
- package/lib/ai-assistant/OpenAiModelService.js +23 -24
- package/lib/catalog/Navigation.d.ts +1 -0
- package/lib/catalog/Navigation.js +12 -11
- package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -2
- package/lib/controls/markdown/ToastUiEditor.d.ts +1 -2
- package/lib/feedback/FeedbackHandler.js +2 -2
- package/lib/filters/ConditionValidator.d.ts +107 -0
- package/lib/filters/ConditionValidator.js +483 -0
- package/lib/filters/CustomFilterHandler.d.ts +122 -0
- package/lib/filters/CustomFilterHandler.js +131 -0
- package/lib/filters/FilterCustomFieldHandler.d.ts +2 -0
- package/lib/filters/FilterCustomFieldHandler.js +2 -0
- package/lib/filters/FilterService.d.ts +82 -0
- package/lib/filters/FilterService.js +323 -0
- package/lib/filters/index.d.ts +6 -0
- package/lib/filters/index.js +4 -0
- package/lib/history-actions/AbstractHistoryAdapter.d.ts +5 -4
- package/lib/history-actions/AbstractHistoryAdapter.js +45 -30
- package/lib/history-actions/DefaultHistoryAdapter.d.ts +2 -0
- package/lib/history-actions/DefaultHistoryAdapter.js +12 -6
- package/lib/history-actions/HistoryHandler.js +1 -1
- package/lib/list-query-builder/ListQueryBuilder.d.ts +117 -0
- package/lib/list-query-builder/ListQueryBuilder.js +707 -0
- package/lib/media-manager/AbstractMediaManager.d.ts +9 -8
- package/lib/media-manager/DefaultMediaManager.d.ts +2 -0
- package/lib/media-manager/DefaultMediaManager.js +27 -15
- package/lib/media-manager/Items.d.ts +4 -1
- package/lib/media-manager/Items.js +62 -59
- package/lib/media-manager/MediaManagerHandler.js +1 -1
- package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -1
- package/lib/media-manager/helpers/MediaManagerHelper.js +38 -4
- package/lib/model/AbstractModel.d.ts +33 -25
- package/lib/model/AbstractModel.js +54 -2
- package/lib/model/InternalModelAccessFactory.d.ts +18 -0
- package/lib/model/InternalModelAccessFactory.js +82 -0
- package/lib/model/ModelHandler.d.ts +6 -0
- package/lib/model/ModelHandler.js +14 -0
- package/lib/model/adapter/sequelize.d.ts +32 -10
- package/lib/model/adapter/sequelize.js +409 -62
- package/lib/model/adapter/typeorm.d.ts +62 -0
- package/lib/model/adapter/typeorm.js +777 -0
- package/lib/model/internalModelAccessToken.d.ts +1 -0
- package/lib/model/internalModelAccessToken.js +1 -0
- package/lib/model/internalModelRepository.d.ts +3 -0
- package/lib/model/internalModelRepository.js +4 -0
- package/lib/notifications/AbstractNotificationService.d.ts +3 -0
- package/lib/notifications/AbstractNotificationService.js +42 -36
- package/lib/notifications/GeneralNotificationService.js +37 -40
- package/lib/notifications/SystemNotificationService.js +33 -36
- package/lib/requestProcessor.js +0 -3
- package/lib/ui-i18n/getUiTranslations.d.ts +1 -0
- package/lib/ui-i18n/getUiTranslations.js +3 -0
- package/lib/ui-i18n/uiTranslationKeys.d.ts +6 -0
- package/lib/ui-i18n/uiTranslationKeys.js +268 -0
- package/lib/widgets/widgetHandler.d.ts +7 -2
- package/lib/widgets/widgetHandler.js +98 -18
- package/models/FilterAP.d.ts +116 -0
- package/models/FilterAP.js +68 -0
- package/models/FilterColumnAP.d.ts +32 -0
- package/models/FilterColumnAP.js +21 -0
- package/models/GroupAP.d.ts +1 -1
- package/models/HistoryActionsAP.d.ts +3 -3
- package/models/MediaManagerMetaAP.d.ts +1 -1
- package/models/NavigationAP.d.ts +1 -1
- package/models/UserAP.d.ts +6 -1
- package/models/UserAP.js +4 -0
- package/package.json +39 -32
- package/policies/authPolicies.d.ts +12 -0
- package/policies/authPolicies.js +104 -0
- package/policies/permissionResolvers.d.ts +12 -0
- package/policies/permissionResolvers.js +52 -0
- package/services/FeedService.d.ts +70 -0
- package/services/FeedService.js +334 -0
- package/system/Router.d.ts +1 -0
- package/system/Router.js +136 -59
- package/system/bindAccessRights.js +11 -30
- package/system/bindAuthorization.js +18 -18
- package/system/bindCors.js +16 -1
- package/system/bindCustomFilterHandlers.d.ts +2 -0
- package/system/bindCustomFilterHandlers.js +4 -0
- package/system/bindInertia.js +18 -61
- package/system/bindReqFunctions.js +10 -2
- package/system/bindTranslations.js +7 -3
- package/system/buildInternalModelAccess.d.ts +4 -0
- package/system/buildInternalModelAccess.js +59 -0
- package/system/defaults.js +18 -14
- package/system/routePolicies.d.ts +2 -0
- package/system/routePolicies.js +29 -0
- package/translations/en.json +151 -39
- package/translations/ru.json +211 -64
- package/ui/components/handsontable.js +13 -27
- package/ui/components/ui/dialog-stack.js +1 -3
- package/ui/components/ui/popover.js +1 -1
- package/ui/components/ui/sidebar.js +1 -1
- package/assets/RelationDialogStack-D9UVEF9s.js +0 -407
- package/assets/RelationDialogStack-DV8OITPR.css +0 -4
- package/assets/add-BlvzWQKF.js +0 -1
- package/assets/add-group-1Uoq9NWe.js +0 -1
- package/assets/add-group-form-B01gwDGu.js +0 -1
- package/assets/add-user-BQCAsaRy.js +0 -1
- package/assets/add-user-form-Cgwc9JkI.js +0 -1
- package/assets/app-DaOMy1nl.css +0 -72
- package/assets/app-layout-CAm60qoE.js +0 -1
- package/assets/app-shell-QWCtn9ye.js +0 -1
- package/assets/app-sidebar-CfaYbnSy.js +0 -1
- package/assets/app-sidebar-header-BsPFDhZ8.js +0 -1
- package/assets/breadcrumbs-CZZirDj8.js +0 -1
- package/assets/catalog-k5myk7fk.js +0 -6
- package/assets/dashboard-BkL9ybBw.js +0 -3
- package/assets/date-picker-B5AZ_7Q9.js +0 -1
- package/assets/del-modal-BoyXZloG.js +0 -1
- package/assets/dynamic-controls-k61T9W2P.js +0 -1
- package/assets/form-1WGY0YgG.js +0 -1
- package/assets/form-DJapG3qF.js +0 -1
- package/assets/geo-json-DsMUHo0l.js +0 -4
- package/assets/handsontable-PxYdjN8c.js +0 -298
- package/assets/history-CluyR-yJ.js +0 -1
- package/assets/home-Dug9zBzM.js +0 -2
- package/assets/icon-DfDLMG5f.js +0 -1
- package/assets/init-user-CF80MEnT.js +0 -1
- package/assets/input-error-DuuqFgZa.js +0 -1
- package/assets/jsoneditor-De1FvcYu.js +0 -3882
- package/assets/list-CuexshNt.js +0 -1
- package/assets/list-table-BsEWjTKY.js +0 -22
- package/assets/login-eDemYzN-.js +0 -1
- package/assets/material-icon-DMT8KdmE.js +0 -1
- package/assets/media-manager-DfYa_mT_.js +0 -14
- package/assets/module-Cd4Tm6uq.js +0 -1
- package/assets/monaco-BhBYtg3d.js +0 -11
- package/assets/nav-footer-D3olYxtz.js +0 -1
- package/assets/nav-main-BctqyzeV.js +0 -1
- package/assets/nav-user-Bn1Lt-BZ.js +0 -1
- package/assets/notification-D64qvni-.js +0 -27
- package/assets/pagination-render-DxD78ahJ.js +0 -1
- package/assets/register-349PwYbe.js +0 -1
- package/assets/theme-switcher-DfExsHW2.js +0 -1
- package/assets/toast-editor-ESK5iWPx.js +0 -845
- package/assets/user-info-DtBK5Kh8.js +0 -1
- package/assets/user-menu-content-0XYOCMaA.js +0 -1
- package/assets/welcome-PDp-gUei.js +0 -1
- package/controllers/form.d.ts +0 -1
- package/controllers/form.js +0 -86
- package/helpers/formHelper.d.ts +0 -6
- package/helpers/formHelper.js +0 -38
- package/helpers/inertiaFromHelper.d.ts +0 -11
- package/helpers/inertiaFromHelper.js +0 -98
- package/helpers/runtimeMode.d.ts +0 -1
- package/helpers/runtimeMode.js +0 -3
- package/lib/PolicyManager.d.ts +0 -8
- package/lib/PolicyManager.js +0 -53
- package/lib/datatable/NodeTable.d.ts +0 -49
- package/lib/datatable/NodeTable.js +0 -207
- package/lib/model/adapter/waterline.d.ts +0 -32
- package/lib/model/adapter/waterline.js +0 -180
- package/migrations/index.d.ts +0 -3
- package/migrations/index.js +0 -4
- package/migrations/knex/20250106000001_adminizer_init.d.ts +0 -8
- package/migrations/knex/20250106000001_adminizer_init.js +0 -164
- package/migrations/umzug/0001.d.ts +0 -7
- package/migrations/umzug/0001.js +0 -121
- package/migrations/umzugExports.d.ts +0 -2
- package/migrations/umzugExports.js +0 -9
- package/system/bindForms.d.ts +0 -2
- package/system/bindForms.js +0 -20
- /package/{policies → middlewares}/addMessages.d.ts +0 -0
- /package/{policies → middlewares}/addMessages.js +0 -0
- /package/{policies → middlewares}/checkAuth.d.ts +0 -0
- /package/{policies → middlewares}/checkAuth.js +0 -0
- /package/{policies → middlewares}/setLocale.d.ts +0 -0
- /package/{policies → middlewares}/setLocale.js +0 -0
|
@@ -2,6 +2,7 @@ import { Adminizer } from "../Adminizer.js";
|
|
|
2
2
|
import { isObject } from "../../helpers/JsUtils.js";
|
|
3
3
|
import { DataAccessor } from "../DataAccessor.js";
|
|
4
4
|
import { setAssociationValues } from "../../helpers/inertiaAddHelper.js";
|
|
5
|
+
import { isMediaManagerFieldConfig, normalizeMediaManagerWidgetData } from "../media-manager/helpers/MediaManagerHelper.js";
|
|
5
6
|
/**
|
|
6
7
|
* Set of model names excluded from history tracking.
|
|
7
8
|
* These models are internal or administrative and should not appear in user-accessible history.
|
|
@@ -49,6 +50,9 @@ export class AbstractHistoryAdapter {
|
|
|
49
50
|
});
|
|
50
51
|
}
|
|
51
52
|
}
|
|
53
|
+
internalModel(modelName) {
|
|
54
|
+
return this.adminizer.modelHandler.internal("history").get(modelName);
|
|
55
|
+
}
|
|
52
56
|
/**
|
|
53
57
|
* Registers access rights for this history adapter.
|
|
54
58
|
* Called during construction with a slight delay to ensure Adminizer is ready.
|
|
@@ -134,8 +138,6 @@ export class AbstractHistoryAdapter {
|
|
|
134
138
|
let accessHistory = [];
|
|
135
139
|
if (!accessToUsersHistory) {
|
|
136
140
|
history = history.filter((historyRecord) => {
|
|
137
|
-
console.log(historyRecord.user.id === user.id);
|
|
138
|
-
console.log(historyRecord.user.id, user.id);
|
|
139
141
|
return historyRecord.user.id === user.id;
|
|
140
142
|
});
|
|
141
143
|
}
|
|
@@ -147,11 +149,11 @@ export class AbstractHistoryAdapter {
|
|
|
147
149
|
// Grouping records by model for optimization
|
|
148
150
|
const fieldsCache = new Map();
|
|
149
151
|
for (const historyRecord of accessHistory) {
|
|
150
|
-
const
|
|
152
|
+
const modelResource = this.findModelResource(historyRecord);
|
|
151
153
|
const modelKey = historyRecord.modelName;
|
|
152
154
|
// We use a cache so as not to create a DataAccessor for each record
|
|
153
155
|
if (!fieldsCache.has(modelKey)) {
|
|
154
|
-
const dataAccessor = new DataAccessor(this.adminizer, user,
|
|
156
|
+
const dataAccessor = new DataAccessor(this.adminizer, user, modelResource, "edit");
|
|
155
157
|
let fields = dataAccessor.getFieldsConfig();
|
|
156
158
|
fields = await this.loadAssociations(fields, user, "edit");
|
|
157
159
|
fieldsCache.set(modelKey, fields);
|
|
@@ -176,19 +178,32 @@ export class AbstractHistoryAdapter {
|
|
|
176
178
|
* @protected
|
|
177
179
|
*/
|
|
178
180
|
async _getModelFieldsHistory(history, user) {
|
|
179
|
-
const
|
|
180
|
-
const dataAccessor = new DataAccessor(this.adminizer, user,
|
|
181
|
+
const modelResource = this.findModelResource(history);
|
|
182
|
+
const dataAccessor = new DataAccessor(this.adminizer, user, modelResource, "edit");
|
|
181
183
|
let fields = dataAccessor.getFieldsConfig();
|
|
182
184
|
fields = await this.loadAssociations(fields, user, "edit");
|
|
183
185
|
let data = {};
|
|
184
186
|
for (const field of Object.keys(fields)) {
|
|
185
187
|
const fieldConfigConfig = fields[field].config;
|
|
186
|
-
if (fieldConfigConfig
|
|
188
|
+
if (isMediaManagerFieldConfig(fieldConfigConfig)) {
|
|
189
|
+
if (!Object.prototype.hasOwnProperty.call(history.data ?? {}, field)) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
187
192
|
const mediaManager = this.adminizer.mediaManagerHandler.get(fieldConfigConfig.options?.id ?? "default");
|
|
188
193
|
data[field] = [];
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
194
|
+
const files = normalizeMediaManagerWidgetData(history.data[field], field);
|
|
195
|
+
for (const file of files) {
|
|
196
|
+
const fileData = file;
|
|
197
|
+
if (!fileData?.id)
|
|
198
|
+
continue;
|
|
199
|
+
try {
|
|
200
|
+
const media = fileData.mimeType
|
|
201
|
+
? await mediaManager.getFile(fileData.mimeType, fileData.id)
|
|
202
|
+
: null;
|
|
203
|
+
if (!media) {
|
|
204
|
+
data[field].push(fileData);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
192
207
|
data[field].push({
|
|
193
208
|
id: media.id,
|
|
194
209
|
mimeType: media.mimeType,
|
|
@@ -197,6 +212,9 @@ export class AbstractHistoryAdapter {
|
|
|
197
212
|
variants: []
|
|
198
213
|
});
|
|
199
214
|
}
|
|
215
|
+
catch (_e) {
|
|
216
|
+
data[field].push(fileData);
|
|
217
|
+
}
|
|
200
218
|
}
|
|
201
219
|
}
|
|
202
220
|
else if (fieldConfigConfig.type === 'color') {
|
|
@@ -223,8 +241,8 @@ export class AbstractHistoryAdapter {
|
|
|
223
241
|
async setModelsDisplayName(history) {
|
|
224
242
|
const modifiedHistory = [];
|
|
225
243
|
for (const historyRecord of history) {
|
|
226
|
-
const
|
|
227
|
-
const { displayName } =
|
|
244
|
+
const modelResource = this.findModelResource(historyRecord);
|
|
245
|
+
const { displayName } = modelResource.config;
|
|
228
246
|
if (!displayName) {
|
|
229
247
|
modifiedHistory.push({
|
|
230
248
|
...historyRecord,
|
|
@@ -233,8 +251,7 @@ export class AbstractHistoryAdapter {
|
|
|
233
251
|
continue;
|
|
234
252
|
}
|
|
235
253
|
try {
|
|
236
|
-
const
|
|
237
|
-
const record = await model["_findOne"]({ id: historyRecord.modelId });
|
|
254
|
+
const record = await this.internalModel(modelResource.name).findOne({ where: { id: historyRecord.modelId } });
|
|
238
255
|
let displayValue;
|
|
239
256
|
if (typeof displayName === 'string') {
|
|
240
257
|
displayValue = record ? (record[displayName] ?? historyRecord.modelId.toString()) : historyRecord.modelId.toString();
|
|
@@ -272,7 +289,7 @@ export class AbstractHistoryAdapter {
|
|
|
272
289
|
async getModelRelationsHistory(model, ids) {
|
|
273
290
|
const data = [];
|
|
274
291
|
for (const id of ids) {
|
|
275
|
-
const record = await this.
|
|
292
|
+
const record = await this.internalModel(model).findOne({ where: { id } });
|
|
276
293
|
if (record) {
|
|
277
294
|
data.push(id);
|
|
278
295
|
}
|
|
@@ -280,27 +297,25 @@ export class AbstractHistoryAdapter {
|
|
|
280
297
|
return data;
|
|
281
298
|
}
|
|
282
299
|
/**
|
|
283
|
-
* Constructs an
|
|
300
|
+
* Constructs an ModelResource object from a history record.
|
|
284
301
|
* Used to access model configuration and instance.
|
|
285
302
|
*
|
|
286
303
|
* @param history - The history record.
|
|
287
|
-
* @returns
|
|
304
|
+
* @returns ModelResource object with name, URI, model instance, and config.
|
|
288
305
|
* @protected
|
|
289
306
|
*/
|
|
290
|
-
|
|
291
|
-
const
|
|
292
|
-
const
|
|
293
|
-
const entityUri = `${this.adminizer.config.routePrefix}/${entityType}/${entityName}`;
|
|
307
|
+
findModelResource(history) {
|
|
308
|
+
const modelResourceName = history.modelName;
|
|
309
|
+
const modelResourceUri = `${this.adminizer.config.routePrefix}/model/${modelResourceName}`;
|
|
294
310
|
const models = this.adminizer.config.models;
|
|
295
|
-
const foundKey = Object.keys(models).find(key => key.toLowerCase() ===
|
|
296
|
-
const
|
|
297
|
-
name:
|
|
298
|
-
uri:
|
|
299
|
-
type: entityType,
|
|
311
|
+
const foundKey = Object.keys(models).find(key => key.toLowerCase() === modelResourceName.toLowerCase());
|
|
312
|
+
const modelResource = {
|
|
313
|
+
name: modelResourceName,
|
|
314
|
+
uri: modelResourceUri,
|
|
300
315
|
model: this.adminizer.modelHandler.model.get(history.modelName),
|
|
301
316
|
config: models[foundKey]
|
|
302
317
|
};
|
|
303
|
-
return
|
|
318
|
+
return modelResource;
|
|
304
319
|
}
|
|
305
320
|
/**
|
|
306
321
|
* Loads associated records for association-type fields.
|
|
@@ -336,11 +351,11 @@ export class AbstractHistoryAdapter {
|
|
|
336
351
|
// adding deprecated records array to config for association widget
|
|
337
352
|
Adminizer.log.warn("Warning: executing malicious job trying to add a huge amount of records in field config," +
|
|
338
353
|
" please rewrite this part of code in the nearest future");
|
|
339
|
-
let
|
|
354
|
+
let modelResource = {
|
|
340
355
|
name: modelName, config: this.adminizer.config.models[modelName],
|
|
341
|
-
model: Model, uri: `${this.adminizer.config.routePrefix}/model/${modelName}
|
|
356
|
+
model: Model, uri: `${this.adminizer.config.routePrefix}/model/${modelName}`
|
|
342
357
|
};
|
|
343
|
-
let dataAccessor = new DataAccessor(this.adminizer, user,
|
|
358
|
+
let dataAccessor = new DataAccessor(this.adminizer, user, modelResource, "view");
|
|
344
359
|
list = await Model.find({}, dataAccessor);
|
|
345
360
|
}
|
|
346
361
|
catch (e) {
|
|
@@ -6,6 +6,8 @@ export declare class DefaultHistoryAdapter extends AbstractHistoryAdapter {
|
|
|
6
6
|
id: string;
|
|
7
7
|
model: string;
|
|
8
8
|
constructor(adminizer: Adminizer);
|
|
9
|
+
private historyModel;
|
|
10
|
+
private userModel;
|
|
9
11
|
getAllHistory(user: UserAP, forUserName: string, modelName: string, limit?: number, skip?: number, from?: Date, to?: Date): Promise<{
|
|
10
12
|
data: HistoryActionsAP[];
|
|
11
13
|
}>;
|
|
@@ -6,10 +6,16 @@ export class DefaultHistoryAdapter extends AbstractHistoryAdapter {
|
|
|
6
6
|
constructor(adminizer) {
|
|
7
7
|
super(adminizer);
|
|
8
8
|
}
|
|
9
|
+
historyModel() {
|
|
10
|
+
return this.adminizer.modelHandler.internal("history").get(this.model);
|
|
11
|
+
}
|
|
12
|
+
userModel() {
|
|
13
|
+
return this.adminizer.modelHandler.internal("history").get("UserAP");
|
|
14
|
+
}
|
|
9
15
|
async getAllHistory(user, forUserName, modelName, limit = 15, skip = 0, from, to) {
|
|
10
16
|
let userId = null;
|
|
11
17
|
if (forUserName !== 'all') {
|
|
12
|
-
const foundUser = await this.
|
|
18
|
+
const foundUser = await this.userModel().findOne({ where: { login: forUserName } });
|
|
13
19
|
if (!foundUser) {
|
|
14
20
|
throw new Error("User not found");
|
|
15
21
|
}
|
|
@@ -33,7 +39,7 @@ export class DefaultHistoryAdapter extends AbstractHistoryAdapter {
|
|
|
33
39
|
while (resultItems.length < limit) {
|
|
34
40
|
// We request with a reserve to reduce the number of requests to the database
|
|
35
41
|
const fetchLimit = Math.min(limit * 2, 50);
|
|
36
|
-
const history = await this.
|
|
42
|
+
const history = await this.historyModel().find({
|
|
37
43
|
where: query,
|
|
38
44
|
sort: "createdAt DESC",
|
|
39
45
|
limit: fetchLimit,
|
|
@@ -62,7 +68,7 @@ export class DefaultHistoryAdapter extends AbstractHistoryAdapter {
|
|
|
62
68
|
}
|
|
63
69
|
async getAllModelHistory(modelId, modelName, user) {
|
|
64
70
|
try {
|
|
65
|
-
const history = await this.
|
|
71
|
+
const history = await this.historyModel().find({
|
|
66
72
|
where: { modelName: modelName, modelId: String(modelId) },
|
|
67
73
|
sort: "createdAt DESC"
|
|
68
74
|
});
|
|
@@ -74,19 +80,19 @@ export class DefaultHistoryAdapter extends AbstractHistoryAdapter {
|
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
async getModelFieldsHistory(historyId, user) {
|
|
77
|
-
const history = await this.
|
|
83
|
+
const history = await this.historyModel().findOne({ where: { id: historyId } });
|
|
78
84
|
return await this._getModelFieldsHistory(history, user);
|
|
79
85
|
}
|
|
80
86
|
async setHistory(data) {
|
|
81
87
|
try {
|
|
82
|
-
await this.
|
|
88
|
+
await this.historyModel().update({
|
|
83
89
|
where: {
|
|
84
90
|
modelId: String(data.modelId),
|
|
85
91
|
modelName: data.modelName,
|
|
86
92
|
isCurrent: true
|
|
87
93
|
}
|
|
88
94
|
}, { isCurrent: false });
|
|
89
|
-
await this.
|
|
95
|
+
await this.historyModel().create({
|
|
90
96
|
...data,
|
|
91
97
|
modelId: String(data.modelId),
|
|
92
98
|
isCurrent: true
|
|
@@ -13,7 +13,7 @@ export class HistoryHandler {
|
|
|
13
13
|
if (!instance) {
|
|
14
14
|
Adminizer.log.debug(`HistoryAdapter with id ${id} not found`);
|
|
15
15
|
}
|
|
16
|
-
Adminizer.log.debug(`ins`, instance)
|
|
16
|
+
// Adminizer.log.debug(`ins`, instance) // DEBUG: removed to reduce console noise
|
|
17
17
|
return instance;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Fields } from '../../helpers/fieldsHelper';
|
|
2
|
+
import { AbstractModel } from '../model/AbstractModel';
|
|
3
|
+
import { DataAccessor } from '../DataAccessor';
|
|
4
|
+
import { FilterOperator } from '../../models/FilterAP';
|
|
5
|
+
import { CustomFilterHandler } from '../filters/CustomFilterHandler';
|
|
6
|
+
import { ListQueryBuilderParams, ListQueryBuilderResult } from '../../interfaces/listQueryBuilder';
|
|
7
|
+
import { CriteriaWhere } from '../../interfaces/queryCriteria';
|
|
8
|
+
/**
|
|
9
|
+
* Security limits for filter conditions
|
|
10
|
+
*/
|
|
11
|
+
export declare const FILTER_SECURITY_LIMITS: {
|
|
12
|
+
MAX_DEPTH: number;
|
|
13
|
+
MAX_IN_VALUES: number;
|
|
14
|
+
MAX_CONDITIONS_PER_GROUP: number;
|
|
15
|
+
MAX_TOTAL_CONDITIONS: number;
|
|
16
|
+
MAX_STRING_LENGTH: number;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Custom field condition result
|
|
20
|
+
*/
|
|
21
|
+
export interface CustomFieldCondition {
|
|
22
|
+
rawSQL?: string;
|
|
23
|
+
params?: any[];
|
|
24
|
+
inMemory?: (record: any) => boolean;
|
|
25
|
+
criteria?: Record<string, any>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* ListQueryBuilder - replaces legacy NodeTable
|
|
29
|
+
*
|
|
30
|
+
* Key improvements:
|
|
31
|
+
* - Promise-based API (no callbacks)
|
|
32
|
+
* - Clean interface without DataTables.js format
|
|
33
|
+
* - Direct integration with FilterCondition
|
|
34
|
+
* - Support for CustomFilterHandler
|
|
35
|
+
* - TypeScript type safety
|
|
36
|
+
* - Full operator support (eq, neq, gt, gte, lt, lte, like, ilike, in, between, isNull, regex, custom)
|
|
37
|
+
* - Nested AND/OR/NOT groups
|
|
38
|
+
*/
|
|
39
|
+
export declare class ListQueryBuilder {
|
|
40
|
+
private model;
|
|
41
|
+
private fields;
|
|
42
|
+
private dataAccessor;
|
|
43
|
+
private customFilterHandler?;
|
|
44
|
+
private fieldsArray;
|
|
45
|
+
constructor(model: AbstractModel<any>, fields: Fields, dataAccessor: DataAccessor, customFilterHandler?: CustomFilterHandler);
|
|
46
|
+
/**
|
|
47
|
+
* Public method to build WHERE clause without executing query
|
|
48
|
+
* Useful for external execution (e.g., direct adapter calls)
|
|
49
|
+
*/
|
|
50
|
+
buildWhereClause(params: ListQueryBuilderParams): CriteriaWhere;
|
|
51
|
+
/**
|
|
52
|
+
* Execute query with Promise API
|
|
53
|
+
*/
|
|
54
|
+
execute(params: ListQueryBuilderParams): Promise<ListQueryBuilderResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Build WHERE clause from FilterCondition[]
|
|
57
|
+
* Supports nested AND/OR/NOT groups
|
|
58
|
+
*/
|
|
59
|
+
private buildWhere;
|
|
60
|
+
/**
|
|
61
|
+
* Recursive condition group builder
|
|
62
|
+
* Key method for complex filter support
|
|
63
|
+
*/
|
|
64
|
+
private buildConditionGroup;
|
|
65
|
+
/**
|
|
66
|
+
* Validate condition
|
|
67
|
+
*/
|
|
68
|
+
private isValidCondition;
|
|
69
|
+
/**
|
|
70
|
+
* Build single condition
|
|
71
|
+
*/
|
|
72
|
+
private buildSingleCondition;
|
|
73
|
+
/**
|
|
74
|
+
* Map filter operators to adapter-neutral criteria operators.
|
|
75
|
+
*/
|
|
76
|
+
private mapOperatorToCondition;
|
|
77
|
+
/**
|
|
78
|
+
* Validate operator-value combination
|
|
79
|
+
*/
|
|
80
|
+
private validateOperatorValue;
|
|
81
|
+
private getDayRange;
|
|
82
|
+
private getMonthRangeByValue;
|
|
83
|
+
private getYearRangeByValue;
|
|
84
|
+
private getMonthRangeBetween;
|
|
85
|
+
private getYearRangeBetween;
|
|
86
|
+
private isYearValue;
|
|
87
|
+
private parseYearValue;
|
|
88
|
+
/**
|
|
89
|
+
* Build relation condition
|
|
90
|
+
*/
|
|
91
|
+
private buildRelationCondition;
|
|
92
|
+
/**
|
|
93
|
+
* Handle custom condition
|
|
94
|
+
*/
|
|
95
|
+
private handleCustomCondition;
|
|
96
|
+
/**
|
|
97
|
+
* Build global search condition
|
|
98
|
+
* Searches in string/text/ref fields (same behavior as NodeTable)
|
|
99
|
+
* Date/time fields are excluded from global search to avoid moment.js warnings
|
|
100
|
+
*/
|
|
101
|
+
private buildGlobalSearch;
|
|
102
|
+
/**
|
|
103
|
+
* Build ORDER clause
|
|
104
|
+
*/
|
|
105
|
+
private buildOrder;
|
|
106
|
+
private sanitizeSortDirection;
|
|
107
|
+
/**
|
|
108
|
+
* Map data for output
|
|
109
|
+
*/
|
|
110
|
+
private mapData;
|
|
111
|
+
private buildSelect;
|
|
112
|
+
/**
|
|
113
|
+
* Get allowed operators for field type
|
|
114
|
+
*/
|
|
115
|
+
static getOperatorsForFieldType(fieldType: string): FilterOperator[];
|
|
116
|
+
}
|
|
117
|
+
export { ListQueryBuilder as ModernListQueryBuilder };
|