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.
Files changed (335) hide show
  1. package/Readme.md +12 -0
  2. package/assets/RelationDialogStack-CnHFOYyR.css +1 -0
  3. package/assets/RelationDialogStack-DI2bZxQX.js +20 -0
  4. package/assets/add-4213XScp.js +1 -0
  5. package/assets/add-group--F1XxfJ1.js +1 -0
  6. package/assets/add-group-form-DKRXC2n-.js +1 -0
  7. package/assets/add-user-b9HfMq7z.js +1 -0
  8. package/assets/add-user-form-UXAToWQd.js +1 -0
  9. package/assets/app-Clx8f5hd.css +1 -0
  10. package/assets/app-layout-C02ja4OI.js +1 -0
  11. package/assets/app-shell-D8wtkECO.js +1 -0
  12. package/assets/app-sidebar-BR5_zwxj.js +1 -0
  13. package/assets/app-sidebar-header-BZbIBQjq.js +1 -0
  14. package/assets/app.js +59 -7990
  15. package/assets/breadcrumbs-CODaqVkB.js +1 -0
  16. package/assets/catalog-6ZZjWdFs.js +6 -0
  17. package/assets/dashboard-CftAdKiH.js +3 -0
  18. package/assets/date-picker-DSOkNiNo.js +1 -0
  19. package/assets/del-modal-Cd4M7af8.js +1 -0
  20. package/assets/dynamic-controls-BsrJhPDY.js +1 -0
  21. package/assets/geo-json-CzR5JBXL.js +1 -0
  22. package/assets/handsontable-BI98OF5R.js +336 -0
  23. package/assets/history-DLHSU7Ak.js +1 -0
  24. package/assets/home-NcQ7nnU0.js +2 -0
  25. package/assets/icon-C2JNaLxH.js +1 -0
  26. package/assets/init-user-D2HSyXup.js +1 -0
  27. package/assets/input-error-CH2caTtO.js +1 -0
  28. package/assets/jsoneditor-DVNQmA6G.js +3869 -0
  29. package/assets/list-CFU0-TgN.js +4 -0
  30. package/assets/login-DFSLEO17.js +1 -0
  31. package/assets/manifest.json +246 -273
  32. package/assets/material-icon-Bx9pGQiQ.js +1 -0
  33. package/assets/media-manager-WcKe1EvD.js +6 -0
  34. package/assets/module-CT7PC6pc.js +1 -0
  35. package/assets/monaco-Bl4zdWCn.js +11 -0
  36. package/assets/nav-footer-BiSQkPt4.js +1 -0
  37. package/assets/nav-main-rTH0PfDw.js +1 -0
  38. package/assets/nav-user-Bj6cWs0a.js +1 -0
  39. package/assets/notification-Bi-PX87D.js +20 -0
  40. package/assets/pagination-render-AKJvTIRA.js +1 -0
  41. package/assets/register-BTP4uxsK.js +1 -0
  42. package/assets/ru-eW0WKkga.js +1 -0
  43. package/assets/theme-switcher-Dm8EOGzx.js +1 -0
  44. package/assets/toast-editor-DOg_gvSp.js +668 -0
  45. package/assets/user-filters-list-YUfR4XMI.js +1 -0
  46. package/assets/user-info-BgSbT02v.js +1 -0
  47. package/assets/user-menu-content-TQTXHIv6.js +1 -0
  48. package/assets/{vanilla-picker-l5rcX3cq.js → vanilla-picker-B3LgXoKV.js} +1 -7
  49. package/assets/welcome-vLwTu1R6.js +1 -0
  50. package/controllers/add.d.ts +1 -1
  51. package/controllers/add.js +20 -26
  52. package/controllers/addGroup.d.ts +1 -1
  53. package/controllers/addGroup.js +7 -15
  54. package/controllers/addUser.d.ts +1 -1
  55. package/controllers/addUser.js +10 -16
  56. package/controllers/catalog/Catalog.d.ts +1 -1
  57. package/controllers/catalog/Catalog.js +1 -10
  58. package/controllers/catalog/FrontendCatalogAdapter.d.ts +3 -3
  59. package/controllers/catalog/FrontendCatalogAdapter.js +0 -6
  60. package/controllers/catalog/FrontentCatalogAdapter.d.ts +3 -3
  61. package/controllers/catalog/FrontentCatalogAdapter.js +0 -4
  62. package/controllers/ckeditorUpload.js +2 -18
  63. package/controllers/dashboard.d.ts +1 -1
  64. package/controllers/dashboard.js +2 -5
  65. package/controllers/edit.js +24 -37
  66. package/controllers/editGroup.d.ts +1 -1
  67. package/controllers/editGroup.js +10 -21
  68. package/controllers/editUser.d.ts +1 -1
  69. package/controllers/editUser.js +11 -23
  70. package/controllers/exportData.d.ts +6 -0
  71. package/controllers/exportData.js +315 -0
  72. package/controllers/feed.d.ts +6 -0
  73. package/controllers/feed.js +73 -0
  74. package/controllers/feedback/feedbackController.d.ts +1 -1
  75. package/controllers/feedback/feedbackController.js +5 -7
  76. package/controllers/filter-fields/columns.d.ts +11 -0
  77. package/controllers/filter-fields/columns.js +106 -0
  78. package/controllers/filter-fields/filterFields.d.ts +10 -0
  79. package/controllers/filter-fields/filterFields.js +141 -0
  80. package/controllers/filter-fields/getAllUserFilters.d.ts +6 -0
  81. package/controllers/filter-fields/getAllUserFilters.js +115 -0
  82. package/controllers/filter-fields/groups.d.ts +5 -0
  83. package/controllers/filter-fields/groups.js +26 -0
  84. package/controllers/filter-fields/savedFilters.d.ts +25 -0
  85. package/controllers/filter-fields/savedFilters.js +317 -0
  86. package/controllers/getAllWidgets.d.ts +1 -1
  87. package/controllers/getAllWidgets.js +1 -9
  88. package/controllers/history-actions/HistoryController.js +6 -31
  89. package/controllers/initUser.js +6 -5
  90. package/controllers/inlineUpdate.d.ts +7 -0
  91. package/controllers/inlineUpdate.js +148 -0
  92. package/controllers/list.d.ts +1 -1
  93. package/controllers/list.js +383 -70
  94. package/controllers/listUserFilters.d.ts +5 -0
  95. package/controllers/listUserFilters.js +26 -0
  96. package/controllers/login.js +2 -2
  97. package/controllers/media-manager/mediaManagerApi.js +0 -9
  98. package/controllers/navigation/edit.js +3 -9
  99. package/controllers/notifications/NotificationController.d.ts +1 -1
  100. package/controllers/notifications/NotificationController.js +12 -36
  101. package/controllers/register.js +10 -9
  102. package/controllers/remove.js +10 -19
  103. package/controllers/timezones.d.ts +1 -1
  104. package/controllers/timezones.js +0 -6
  105. package/controllers/userApiKey.d.ts +7 -0
  106. package/controllers/userApiKey.js +36 -0
  107. package/controllers/view.js +14 -26
  108. package/controllers/welcome.d.ts +1 -1
  109. package/controllers/welcome.js +0 -4
  110. package/controllers/widgets/Action.d.ts +1 -1
  111. package/controllers/widgets/Action.js +1 -9
  112. package/controllers/widgets/Custom.d.ts +1 -1
  113. package/controllers/widgets/Custom.js +1 -9
  114. package/controllers/widgets/Info.d.ts +1 -1
  115. package/controllers/widgets/Info.js +1 -9
  116. package/controllers/widgets/filterInfo.d.ts +1 -0
  117. package/controllers/widgets/filterInfo.js +44 -0
  118. package/controllers/widgets/switch.d.ts +1 -1
  119. package/controllers/widgets/switch.js +1 -9
  120. package/controllers/widgetsDB.d.ts +1 -1
  121. package/controllers/widgetsDB.js +2 -8
  122. package/helpers/accessRightsHelper.d.ts +1 -1
  123. package/helpers/accessRightsHelper.js +5 -4
  124. package/helpers/apiKeyHelper.d.ts +5 -0
  125. package/helpers/apiKeyHelper.js +8 -0
  126. package/helpers/configHelper.js +12 -15
  127. package/helpers/controllerHelper.d.ts +14 -21
  128. package/helpers/controllerHelper.js +50 -83
  129. package/helpers/fieldsHelper.js +3 -3
  130. package/helpers/filterDatetimeHelper.d.ts +5 -0
  131. package/helpers/filterDatetimeHelper.js +84 -0
  132. package/helpers/inertiaActionsHelper.d.ts +2 -2
  133. package/helpers/inertiaActionsHelper.js +5 -4
  134. package/helpers/inertiaAddHelper.d.ts +3 -414
  135. package/helpers/inertiaAddHelper.js +39 -15
  136. package/helpers/inertiaGroupHelper.d.ts +2 -2
  137. package/helpers/inertiaGroupHelper.js +3 -3
  138. package/helpers/inertiaListHelper.d.ts +7 -3
  139. package/helpers/inertiaListHelper.js +26 -12
  140. package/helpers/inertiaMenuHelper.d.ts +1 -0
  141. package/helpers/inertiaMenuHelper.js +15 -3
  142. package/helpers/inertiaUserHelper.d.ts +3 -2
  143. package/helpers/inertiaUserHelper.js +7 -3
  144. package/helpers/menuHelper.d.ts +5 -2
  145. package/helpers/menuHelper.js +64 -12
  146. package/helpers/viteHelper.js +1 -2
  147. package/index.d.ts +6 -2
  148. package/index.js +6 -2
  149. package/interfaces/adminpanelConfig.d.ts +126 -39
  150. package/interfaces/internalModelAccess.d.ts +37 -0
  151. package/interfaces/internalModelAccess.js +1 -0
  152. package/interfaces/listQueryBuilder.d.ts +22 -0
  153. package/interfaces/listQueryBuilder.js +1 -0
  154. package/interfaces/queryCriteria.d.ts +54 -0
  155. package/interfaces/queryCriteria.js +1 -0
  156. package/interfaces/types.d.ts +1 -13
  157. package/lib/Adminizer.d.ts +4 -2
  158. package/lib/Adminizer.js +29 -10
  159. package/lib/DataAccessor.d.ts +8 -5
  160. package/lib/DataAccessor.js +89 -42
  161. package/lib/I18n.d.ts +5 -1
  162. package/lib/I18n.js +45 -19
  163. package/lib/MiddlewareManager.d.ts +8 -0
  164. package/lib/MiddlewareManager.js +53 -0
  165. package/lib/ai-assistant/OpenAiModelService.d.ts +3 -3
  166. package/lib/ai-assistant/OpenAiModelService.js +23 -24
  167. package/lib/catalog/Navigation.d.ts +1 -0
  168. package/lib/catalog/Navigation.js +12 -11
  169. package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -2
  170. package/lib/controls/markdown/ToastUiEditor.d.ts +1 -2
  171. package/lib/feedback/FeedbackHandler.js +2 -2
  172. package/lib/filters/ConditionValidator.d.ts +107 -0
  173. package/lib/filters/ConditionValidator.js +483 -0
  174. package/lib/filters/CustomFilterHandler.d.ts +122 -0
  175. package/lib/filters/CustomFilterHandler.js +131 -0
  176. package/lib/filters/FilterCustomFieldHandler.d.ts +2 -0
  177. package/lib/filters/FilterCustomFieldHandler.js +2 -0
  178. package/lib/filters/FilterService.d.ts +82 -0
  179. package/lib/filters/FilterService.js +323 -0
  180. package/lib/filters/index.d.ts +6 -0
  181. package/lib/filters/index.js +4 -0
  182. package/lib/history-actions/AbstractHistoryAdapter.d.ts +5 -4
  183. package/lib/history-actions/AbstractHistoryAdapter.js +45 -30
  184. package/lib/history-actions/DefaultHistoryAdapter.d.ts +2 -0
  185. package/lib/history-actions/DefaultHistoryAdapter.js +12 -6
  186. package/lib/history-actions/HistoryHandler.js +1 -1
  187. package/lib/list-query-builder/ListQueryBuilder.d.ts +117 -0
  188. package/lib/list-query-builder/ListQueryBuilder.js +707 -0
  189. package/lib/media-manager/AbstractMediaManager.d.ts +9 -8
  190. package/lib/media-manager/DefaultMediaManager.d.ts +2 -0
  191. package/lib/media-manager/DefaultMediaManager.js +27 -15
  192. package/lib/media-manager/Items.d.ts +4 -1
  193. package/lib/media-manager/Items.js +62 -59
  194. package/lib/media-manager/MediaManagerHandler.js +1 -1
  195. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -1
  196. package/lib/media-manager/helpers/MediaManagerHelper.js +38 -4
  197. package/lib/model/AbstractModel.d.ts +33 -25
  198. package/lib/model/AbstractModel.js +54 -2
  199. package/lib/model/InternalModelAccessFactory.d.ts +18 -0
  200. package/lib/model/InternalModelAccessFactory.js +82 -0
  201. package/lib/model/ModelHandler.d.ts +6 -0
  202. package/lib/model/ModelHandler.js +14 -0
  203. package/lib/model/adapter/sequelize.d.ts +32 -10
  204. package/lib/model/adapter/sequelize.js +409 -62
  205. package/lib/model/adapter/typeorm.d.ts +62 -0
  206. package/lib/model/adapter/typeorm.js +777 -0
  207. package/lib/model/internalModelAccessToken.d.ts +1 -0
  208. package/lib/model/internalModelAccessToken.js +1 -0
  209. package/lib/model/internalModelRepository.d.ts +3 -0
  210. package/lib/model/internalModelRepository.js +4 -0
  211. package/lib/notifications/AbstractNotificationService.d.ts +3 -0
  212. package/lib/notifications/AbstractNotificationService.js +42 -36
  213. package/lib/notifications/GeneralNotificationService.js +37 -40
  214. package/lib/notifications/SystemNotificationService.js +33 -36
  215. package/lib/requestProcessor.js +0 -3
  216. package/lib/ui-i18n/getUiTranslations.d.ts +1 -0
  217. package/lib/ui-i18n/getUiTranslations.js +3 -0
  218. package/lib/ui-i18n/uiTranslationKeys.d.ts +6 -0
  219. package/lib/ui-i18n/uiTranslationKeys.js +268 -0
  220. package/lib/widgets/widgetHandler.d.ts +7 -2
  221. package/lib/widgets/widgetHandler.js +98 -18
  222. package/models/FilterAP.d.ts +116 -0
  223. package/models/FilterAP.js +68 -0
  224. package/models/FilterColumnAP.d.ts +32 -0
  225. package/models/FilterColumnAP.js +21 -0
  226. package/models/GroupAP.d.ts +1 -1
  227. package/models/HistoryActionsAP.d.ts +3 -3
  228. package/models/MediaManagerMetaAP.d.ts +1 -1
  229. package/models/NavigationAP.d.ts +1 -1
  230. package/models/UserAP.d.ts +6 -1
  231. package/models/UserAP.js +4 -0
  232. package/package.json +39 -32
  233. package/policies/authPolicies.d.ts +12 -0
  234. package/policies/authPolicies.js +104 -0
  235. package/policies/permissionResolvers.d.ts +12 -0
  236. package/policies/permissionResolvers.js +52 -0
  237. package/services/FeedService.d.ts +70 -0
  238. package/services/FeedService.js +334 -0
  239. package/system/Router.d.ts +1 -0
  240. package/system/Router.js +136 -59
  241. package/system/bindAccessRights.js +11 -30
  242. package/system/bindAuthorization.js +18 -18
  243. package/system/bindCors.js +16 -1
  244. package/system/bindCustomFilterHandlers.d.ts +2 -0
  245. package/system/bindCustomFilterHandlers.js +4 -0
  246. package/system/bindInertia.js +18 -61
  247. package/system/bindReqFunctions.js +10 -2
  248. package/system/bindTranslations.js +7 -3
  249. package/system/buildInternalModelAccess.d.ts +4 -0
  250. package/system/buildInternalModelAccess.js +59 -0
  251. package/system/defaults.js +18 -14
  252. package/system/routePolicies.d.ts +2 -0
  253. package/system/routePolicies.js +29 -0
  254. package/translations/en.json +151 -39
  255. package/translations/ru.json +211 -64
  256. package/ui/components/handsontable.js +13 -27
  257. package/ui/components/ui/dialog-stack.js +1 -3
  258. package/ui/components/ui/popover.js +1 -1
  259. package/ui/components/ui/sidebar.js +1 -1
  260. package/assets/RelationDialogStack-D9UVEF9s.js +0 -407
  261. package/assets/RelationDialogStack-DV8OITPR.css +0 -4
  262. package/assets/add-BlvzWQKF.js +0 -1
  263. package/assets/add-group-1Uoq9NWe.js +0 -1
  264. package/assets/add-group-form-B01gwDGu.js +0 -1
  265. package/assets/add-user-BQCAsaRy.js +0 -1
  266. package/assets/add-user-form-Cgwc9JkI.js +0 -1
  267. package/assets/app-DaOMy1nl.css +0 -72
  268. package/assets/app-layout-CAm60qoE.js +0 -1
  269. package/assets/app-shell-QWCtn9ye.js +0 -1
  270. package/assets/app-sidebar-CfaYbnSy.js +0 -1
  271. package/assets/app-sidebar-header-BsPFDhZ8.js +0 -1
  272. package/assets/breadcrumbs-CZZirDj8.js +0 -1
  273. package/assets/catalog-k5myk7fk.js +0 -6
  274. package/assets/dashboard-BkL9ybBw.js +0 -3
  275. package/assets/date-picker-B5AZ_7Q9.js +0 -1
  276. package/assets/del-modal-BoyXZloG.js +0 -1
  277. package/assets/dynamic-controls-k61T9W2P.js +0 -1
  278. package/assets/form-1WGY0YgG.js +0 -1
  279. package/assets/form-DJapG3qF.js +0 -1
  280. package/assets/geo-json-DsMUHo0l.js +0 -4
  281. package/assets/handsontable-PxYdjN8c.js +0 -298
  282. package/assets/history-CluyR-yJ.js +0 -1
  283. package/assets/home-Dug9zBzM.js +0 -2
  284. package/assets/icon-DfDLMG5f.js +0 -1
  285. package/assets/init-user-CF80MEnT.js +0 -1
  286. package/assets/input-error-DuuqFgZa.js +0 -1
  287. package/assets/jsoneditor-De1FvcYu.js +0 -3882
  288. package/assets/list-CuexshNt.js +0 -1
  289. package/assets/list-table-BsEWjTKY.js +0 -22
  290. package/assets/login-eDemYzN-.js +0 -1
  291. package/assets/material-icon-DMT8KdmE.js +0 -1
  292. package/assets/media-manager-DfYa_mT_.js +0 -14
  293. package/assets/module-Cd4Tm6uq.js +0 -1
  294. package/assets/monaco-BhBYtg3d.js +0 -11
  295. package/assets/nav-footer-D3olYxtz.js +0 -1
  296. package/assets/nav-main-BctqyzeV.js +0 -1
  297. package/assets/nav-user-Bn1Lt-BZ.js +0 -1
  298. package/assets/notification-D64qvni-.js +0 -27
  299. package/assets/pagination-render-DxD78ahJ.js +0 -1
  300. package/assets/register-349PwYbe.js +0 -1
  301. package/assets/theme-switcher-DfExsHW2.js +0 -1
  302. package/assets/toast-editor-ESK5iWPx.js +0 -845
  303. package/assets/user-info-DtBK5Kh8.js +0 -1
  304. package/assets/user-menu-content-0XYOCMaA.js +0 -1
  305. package/assets/welcome-PDp-gUei.js +0 -1
  306. package/controllers/form.d.ts +0 -1
  307. package/controllers/form.js +0 -86
  308. package/helpers/formHelper.d.ts +0 -6
  309. package/helpers/formHelper.js +0 -38
  310. package/helpers/inertiaFromHelper.d.ts +0 -11
  311. package/helpers/inertiaFromHelper.js +0 -98
  312. package/helpers/runtimeMode.d.ts +0 -1
  313. package/helpers/runtimeMode.js +0 -3
  314. package/lib/PolicyManager.d.ts +0 -8
  315. package/lib/PolicyManager.js +0 -53
  316. package/lib/datatable/NodeTable.d.ts +0 -49
  317. package/lib/datatable/NodeTable.js +0 -207
  318. package/lib/model/adapter/waterline.d.ts +0 -32
  319. package/lib/model/adapter/waterline.js +0 -180
  320. package/migrations/index.d.ts +0 -3
  321. package/migrations/index.js +0 -4
  322. package/migrations/knex/20250106000001_adminizer_init.d.ts +0 -8
  323. package/migrations/knex/20250106000001_adminizer_init.js +0 -164
  324. package/migrations/umzug/0001.d.ts +0 -7
  325. package/migrations/umzug/0001.js +0 -121
  326. package/migrations/umzugExports.d.ts +0 -2
  327. package/migrations/umzugExports.js +0 -9
  328. package/system/bindForms.d.ts +0 -2
  329. package/system/bindForms.js +0 -20
  330. /package/{policies → middlewares}/addMessages.d.ts +0 -0
  331. /package/{policies → middlewares}/addMessages.js +0 -0
  332. /package/{policies → middlewares}/checkAuth.d.ts +0 -0
  333. /package/{policies → middlewares}/checkAuth.js +0 -0
  334. /package/{policies → middlewares}/setLocale.d.ts +0 -0
  335. /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 entity = this.findEntityObject(historyRecord);
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, entity, "edit");
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 entity = this.findEntityObject(history);
180
- const dataAccessor = new DataAccessor(this.adminizer, user, entity, "edit");
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.type === 'mediamanager') {
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
- if (history.data[field]) {
190
- for (const file of history.data[field]) {
191
- const media = await mediaManager.getFile(file.mimeType, file.id);
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 entity = this.findEntityObject(historyRecord);
227
- const { displayName } = entity.config;
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 model = this.adminizer.modelHandler.model.get(entity.name);
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.adminizer.modelHandler.model.get(model.toLowerCase())["_findOne"]({ id });
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 Entity object from a history record.
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 Entity object with name, URI, type, model instance, and config.
304
+ * @returns ModelResource object with name, URI, model instance, and config.
288
305
  * @protected
289
306
  */
290
- findEntityObject(history) {
291
- const entityName = history.modelName;
292
- const entityType = "model";
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() === entityName.toLowerCase());
296
- const entity = {
297
- name: entityName,
298
- uri: entityUri,
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 entity;
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 entity = {
354
+ let modelResource = {
340
355
  name: modelName, config: this.adminizer.config.models[modelName],
341
- model: Model, uri: `${this.adminizer.config.routePrefix}/model/${modelName}`, type: "model"
356
+ model: Model, uri: `${this.adminizer.config.routePrefix}/model/${modelName}`
342
357
  };
343
- let dataAccessor = new DataAccessor(this.adminizer, user, entity, "view");
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.adminizer.modelHandler.model.get('userap')["_findOne"]({ login: forUserName });
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.adminizer.modelHandler.model.get(this.model)["_find"]({
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.adminizer.modelHandler.model.get(this.model)["_find"]({
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.adminizer.modelHandler.model.get(this.model)["_findOne"]({ id: historyId });
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.adminizer.modelHandler.model.get(this.model)["_update"]({
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.adminizer.modelHandler.model.get(this.model)["_create"]({
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 };