adminizer 5.0.0-build.2 → 5.0.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.
Files changed (300) hide show
  1. package/assets/abnfDiagram-VCTEODGH-CkmsvdDi.js +1 -0
  2. package/assets/add-CESPH_aI.js +1 -0
  3. package/assets/add-group-CQ4Xm8Ru.js +1 -0
  4. package/assets/add-user-B-QNjR4B.js +1 -0
  5. package/assets/ai-assistant/agent.es.js +28362 -0
  6. package/assets/app-C5Ju5Zra.css +1 -0
  7. package/assets/app-Ca5yUSBv.js +138 -0
  8. package/assets/arc-B-Dt8YNl.js +1 -0
  9. package/assets/architectureDiagram-5GKGNRK7-Ca58kq-l.js +36 -0
  10. package/assets/asmcrypto-DZeQH0LC.js +1 -0
  11. package/assets/blockDiagram-NRAW4CY4-CuqE52IG.js +129 -0
  12. package/assets/c4Diagram-UCG6FXSJ-Cx8z-0Bw.js +38 -0
  13. package/assets/catalog-CkSbxvx0.js +6 -0
  14. package/assets/channel-C9z6Pi_j.js +1 -0
  15. package/assets/chunk-2Q5K7J3B-CXISVKTC.js +1 -0
  16. package/assets/chunk-5VM5RSS4-DYGeeVYe.js +15 -0
  17. package/assets/chunk-F27PBJKO-BeY-dbKj.js +1 -0
  18. package/assets/chunk-G27WJ6UU-DeX_eH7C.js +231 -0
  19. package/assets/chunk-JWPE2WC7-DaxI9q0u.js +1 -0
  20. package/assets/chunk-LCL6LL3I-B7PkaEz_.js +206 -0
  21. package/assets/chunk-POPQ4Y6H-lwu6ZpsN.js +1 -0
  22. package/assets/chunk-SVP7TREG-CVFllgl1.js +88 -0
  23. package/assets/chunk-XXDRQBXY-DDLN0rcg.js +1 -0
  24. package/assets/classDiagram-DTDB5LWJ-BKtCIC3B.js +1 -0
  25. package/assets/classDiagram-v2-JRS7N3AN-BKtCIC3B.js +1 -0
  26. package/assets/controls/ckeditor.es.js +9370 -9306
  27. package/assets/controls/handsontable.es.js +11971 -11938
  28. package/assets/controls/jsoneditor.es.js +13104 -13008
  29. package/assets/controls/leaflet.es.js +1023 -1004
  30. package/assets/controls/toast-ui.es.js +1843 -1834
  31. package/assets/cose-bilkent-JH36ORCC-CWRyUkhQ.js +1 -0
  32. package/assets/cynefin-OW5HDTMX-B1iLDXCC.js +166 -0
  33. package/assets/cynefinDiagram-5FMLGOSQ-DaXQHr3l.js +62 -0
  34. package/assets/cytoscape.esm-yzknjiTM.js +321 -0
  35. package/assets/dagre-3AP2YEHR-DFORa4Hz.js +4 -0
  36. package/assets/dashboard-Ssa1_Of3.js +3 -0
  37. package/assets/debounce-B3mXI_sx.js +1 -0
  38. package/assets/defaultLocale-DX6XiGOO.js +1 -0
  39. package/assets/diagram-S7CK7UJ4-CgP6KBo0.js +30 -0
  40. package/assets/diagram-UQ7AKVKN-oYfQe6w0.js +41 -0
  41. package/assets/diagram-VSXAHHWV-DfCU5wgt.js +3 -0
  42. package/assets/diagram-VX7I27RA-BITJVrNY.js +24 -0
  43. package/assets/diagram-Z3DM3KII-D8J9Ssjy.js +24 -0
  44. package/assets/docs-DHMt_Rq1.js +1 -0
  45. package/assets/ebnfDiagram-PWID7BFC-qpNmoYgx.js +1 -0
  46. package/assets/erDiagram-SSCWMZ5O-DDF-Y0zs.js +99 -0
  47. package/assets/flowDiagram-A5DVABFB-CjKVkR9T.js +168 -0
  48. package/assets/ganttDiagram-EL5Y4UJY-BXGQ53w6.js +292 -0
  49. package/assets/gitGraphDiagram-WWUBYQGX-BLMevdLh.js +106 -0
  50. package/assets/history-tBOo2gd5.js +1 -0
  51. package/assets/infoDiagram-RXCK75RN-BAnPdnyw.js +2 -0
  52. package/assets/init-Gi6I4Gst.js +1 -0
  53. package/assets/init-user-DrNUHa6r.js +1 -0
  54. package/assets/isObject-DL-BuaBl.js +1 -0
  55. package/assets/ishikawaDiagram-5VMMS53U-PnL0Z4Li.js +70 -0
  56. package/assets/journeyDiagram-EYS64GPL-CLcsCSwF.js +139 -0
  57. package/assets/kanban-definition-3QL26DDD-C2eU3uBE.js +89 -0
  58. package/assets/katex-HP8lGamR.js +257 -0
  59. package/assets/layout-BXoYdHdx.js +1 -0
  60. package/assets/linear-BSzrP0oP.js +1 -0
  61. package/assets/list-CLg6xeIK.js +4 -0
  62. package/assets/login-Ce7o3-o_.js +1 -0
  63. package/assets/manifest.json +834 -58
  64. package/assets/{media-manager-BDbpSSjH.js → media-manager-D7G1P3fz.js} +3 -3
  65. package/assets/mermaid.core-aKMJHeEk.js +310 -0
  66. package/assets/mindmap-definition-FBJOCRG2-Dzbz5ghA.js +96 -0
  67. package/assets/module-BsXph_pA.js +1 -0
  68. package/assets/notification-D-Zz1gF_.js +20 -0
  69. package/assets/ordinal-Cboi1Yqb.js +1 -0
  70. package/assets/pegDiagram-XKGWAZYB-BTdWkU0Y.js +1 -0
  71. package/assets/pieDiagram-E7YTZNPT-Dnw8-TB-.js +39 -0
  72. package/assets/quadrantDiagram-AXDQQJYC-CALzLlg9.js +7 -0
  73. package/assets/railroadDiagram-O6MQD6OU-CTA1vzcv.js +1 -0
  74. package/assets/register-CNnBkzej.js +1 -0
  75. package/assets/requirementDiagram-EFPCY7ZU-UX2CF5HA.js +84 -0
  76. package/assets/ru-CoNgAwFK.js +1 -0
  77. package/assets/sankeyDiagram-P5KCCOFB-4aPp3ATV.js +40 -0
  78. package/assets/sequenceDiagram-WJ2MYXX4--kltkwJw.js +162 -0
  79. package/assets/sizeCapture-X5ZJPWSS-Ca9-g5QY.js +1 -0
  80. package/assets/stateDiagram-HBIQ2CUA-Diaf5Q7I.js +1 -0
  81. package/assets/stateDiagram-v2-4QOOHH4V-C6FlRp7u.js +1 -0
  82. package/assets/swimlanes-XN3QIQJK-DhqX_myE.js +1 -0
  83. package/assets/swimlanesDiagram-VK2B7HYN-i_3LTEBk.js +8 -0
  84. package/assets/timeline-definition-24CTP7MA-CwkJQbhq.js +120 -0
  85. package/assets/toNumber-DZb-r9sy.js +1 -0
  86. package/assets/use-appearance-DC-DESKB.js +1 -0
  87. package/assets/user-filters-list-W47DTBp2.js +1 -0
  88. package/assets/vennDiagram-4TSXK5OY-BNM3_cVS.js +34 -0
  89. package/assets/wardleyDiagram-VM6X3IG4-BODb1NP8.js +78 -0
  90. package/assets/welcome-BeBm6NIi.js +1 -0
  91. package/assets/with-app-layout-B90DtzYC.js +31 -0
  92. package/assets/xychartDiagram-S5SC5T6Z-DthqEh3g.js +7 -0
  93. package/controllers/access-rights/permissionOptions.d.ts +2 -0
  94. package/controllers/access-rights/permissionOptions.js +23 -0
  95. package/controllers/add.js +1 -1
  96. package/controllers/addGroup.js +15 -6
  97. package/controllers/ai/AiAgentController.d.ts +66 -0
  98. package/controllers/ai/AiAgentController.js +435 -0
  99. package/controllers/ai/AiAssistantController.d.ts +0 -4
  100. package/controllers/ai/AiAssistantController.js +4 -78
  101. package/controllers/catalog/FrontendCatalogAdapter.d.ts +1 -1
  102. package/controllers/catalog/FrontentCatalogAdapter.d.ts +1 -1
  103. package/controllers/docs/index.d.ts +22 -0
  104. package/controllers/docs/index.js +126 -0
  105. package/controllers/edit.js +1 -1
  106. package/controllers/editGroup.js +15 -6
  107. package/controllers/feedback/feedbackController.d.ts +1 -1
  108. package/controllers/filter-fields/savedFilters.js +1 -1
  109. package/controllers/history-actions/HistoryController.d.ts +1 -1
  110. package/controllers/history-actions/HistoryController.js +6 -6
  111. package/controllers/list.js +1 -1
  112. package/controllers/login.js +1 -1
  113. package/controllers/media-manager/mediaManagerAdapter.d.ts +1 -1
  114. package/controllers/notifications/NotificationController.js +14 -8
  115. package/controllers/view.js +2 -2
  116. package/controllers/widgets/filterInfo.js +1 -1
  117. package/helpers/accessRightsHelper.d.ts +11 -4
  118. package/helpers/accessRightsHelper.js +82 -12
  119. package/helpers/assetVersionHelper.d.ts +14 -0
  120. package/helpers/assetVersionHelper.js +42 -0
  121. package/helpers/configHelper.d.ts +3 -3
  122. package/helpers/configHelper.js +20 -18
  123. package/helpers/controllerHelper.d.ts +3 -2
  124. package/helpers/controllerHelper.js +25 -15
  125. package/helpers/fieldsHelper.d.ts +2 -2
  126. package/helpers/fieldsHelper.js +3 -3
  127. package/helpers/filterDatetimeHelper.d.ts +1 -1
  128. package/helpers/inertiaActionsHelper.d.ts +3 -3
  129. package/helpers/inertiaActionsHelper.js +4 -5
  130. package/helpers/inertiaAddHelper.d.ts +5 -5
  131. package/helpers/inertiaAddHelper.js +7 -6
  132. package/helpers/inertiaGroupHelper.d.ts +3 -3
  133. package/helpers/inertiaGroupHelper.js +10 -2
  134. package/helpers/inertiaListHelper.d.ts +4 -4
  135. package/helpers/inertiaListHelper.js +7 -8
  136. package/helpers/inertiaMenuHelper.d.ts +2 -3
  137. package/helpers/inertiaMenuHelper.js +3 -26
  138. package/helpers/inertiaUserHelper.d.ts +3 -3
  139. package/helpers/menuHelper.d.ts +2 -2
  140. package/helpers/modelResourceHelper.d.ts +9 -0
  141. package/helpers/modelResourceHelper.js +43 -0
  142. package/helpers/navigationAccessHelper.d.ts +13 -0
  143. package/helpers/navigationAccessHelper.js +40 -0
  144. package/helpers/translationHelper.d.ts +2 -2
  145. package/index.d.ts +69 -58
  146. package/index.js +11 -0
  147. package/interfaces/adminpanelConfig.d.ts +18 -5
  148. package/interfaces/global.d.ts +6 -6
  149. package/interfaces/internalModelAccess.d.ts +1 -1
  150. package/interfaces/listQueryBuilder.d.ts +1 -1
  151. package/interfaces/types.d.ts +171 -2
  152. package/lib/Adminizer.d.ts +46 -26
  153. package/lib/Adminizer.js +37 -1
  154. package/lib/DataAccessor.d.ts +7 -6
  155. package/lib/DataAccessor.js +50 -48
  156. package/lib/MiddlewareManager.d.ts +1 -1
  157. package/lib/access-rights/AccessRightsHandler.d.ts +2 -2
  158. package/lib/admin-links/AdminLinkHandler.d.ts +72 -0
  159. package/lib/admin-links/AdminLinkHandler.js +175 -0
  160. package/lib/ai-assistant/AbstractAiConversationHistoryService.d.ts +39 -0
  161. package/lib/ai-assistant/AbstractAiConversationHistoryService.js +98 -0
  162. package/lib/ai-assistant/AbstractAiModelService.d.ts +140 -3
  163. package/lib/ai-assistant/AbstractAiModelService.js +154 -1
  164. package/lib/ai-assistant/AiAgentRunManager.d.ts +35 -0
  165. package/lib/ai-assistant/AiAgentRunManager.js +109 -0
  166. package/lib/ai-assistant/AiAssistantAgentSkillHandler.d.ts +58 -0
  167. package/lib/ai-assistant/AiAssistantAgentSkillHandler.js +87 -0
  168. package/lib/ai-assistant/AiAssistantHandler.d.ts +16 -5
  169. package/lib/ai-assistant/AiAssistantHandler.js +35 -1
  170. package/lib/ai-assistant/AiAssistantUiMethodHandler.d.ts +60 -0
  171. package/lib/ai-assistant/AiAssistantUiMethodHandler.js +138 -0
  172. package/lib/ai-assistant/builtinAgentSkills.d.ts +9 -0
  173. package/lib/ai-assistant/builtinAgentSkills.js +256 -0
  174. package/lib/ai-assistant/jsonSafe.d.ts +13 -0
  175. package/lib/ai-assistant/jsonSafe.js +81 -0
  176. package/lib/app-manager/AdminizerApp.d.ts +40 -11
  177. package/lib/app-manager/AppManager.d.ts +2 -2
  178. package/lib/app-manager/AppManager.js +54 -50
  179. package/lib/app-manager/AssetHandler.d.ts +2 -2
  180. package/lib/app-manager/ConfigLayerHandler.d.ts +2 -2
  181. package/lib/app-manager/ControllerHandler.d.ts +2 -2
  182. package/lib/catalog/AbstractCatalog.d.ts +1 -1
  183. package/lib/catalog/CatalogHandler.d.ts +1 -1
  184. package/lib/controls/ControlsHandler.d.ts +1 -1
  185. package/lib/controls/codeEditor/MonacoEditor.d.ts +1 -1
  186. package/lib/controls/geojsoneditor/GeoEditor.d.ts +1 -1
  187. package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -1
  188. package/lib/controls/markdown/ToastUiEditor.d.ts +1 -1
  189. package/lib/controls/table/Handsontable.d.ts +1 -1
  190. package/lib/controls/wysiwyg/CKeditor.d.ts +1 -1
  191. package/lib/docs/AbstractDocumentation.d.ts +100 -0
  192. package/lib/docs/AbstractDocumentation.js +108 -0
  193. package/lib/docs/DocumentationHandler.d.ts +100 -0
  194. package/lib/docs/DocumentationHandler.js +198 -0
  195. package/lib/docs/FileDocumentation.d.ts +47 -0
  196. package/lib/docs/FileDocumentation.js +189 -0
  197. package/lib/docs/docsAgentSkills.d.ts +10 -0
  198. package/lib/docs/docsAgentSkills.js +93 -0
  199. package/lib/feedback/FeedbackHandler.d.ts +2 -2
  200. package/lib/filters/ConditionValidator.d.ts +1 -1
  201. package/lib/filters/FilterCustomFieldHandler.d.ts +2 -2
  202. package/lib/filters/FilterService.d.ts +4 -4
  203. package/lib/filters/FilterService.js +4 -3
  204. package/lib/filters/index.d.ts +6 -6
  205. package/lib/history-actions/AbstractHistoryAdapter.d.ts +6 -6
  206. package/lib/history-actions/AbstractHistoryAdapter.js +11 -9
  207. package/lib/history-actions/DefaultHistoryAdapter.d.ts +4 -4
  208. package/lib/history-actions/HistoryHandler.d.ts +1 -1
  209. package/lib/list-query-builder/ListQueryBuilder.d.ts +7 -7
  210. package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
  211. package/lib/media-manager/MediaManagerHandler.d.ts +1 -1
  212. package/lib/media-manager/Thumb.d.ts +1 -1
  213. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -5
  214. package/lib/model/AbstractModel.d.ts +11 -4
  215. package/lib/model/InternalModelAccessFactory.d.ts +2 -2
  216. package/lib/model/ModelHandler.d.ts +50 -5
  217. package/lib/model/ModelHandler.js +107 -8
  218. package/lib/model/adapter/sequelize.d.ts +7 -5
  219. package/lib/model/adapter/sequelize.js +79 -46
  220. package/lib/model/adapter/typeorm.d.ts +2 -2
  221. package/lib/model/adapter/typeorm.js +1 -1
  222. package/lib/model/internalModelRepository.d.ts +2 -2
  223. package/lib/notifications/AbstractNotificationService.d.ts +4 -4
  224. package/lib/notifications/GeneralNotificationService.d.ts +2 -2
  225. package/lib/notifications/GeneralNotificationService.js +6 -5
  226. package/lib/notifications/NotificationHandler.d.ts +2 -2
  227. package/lib/notifications/SystemNotificationService.d.ts +2 -2
  228. package/lib/notifications/SystemNotificationService.js +1 -1
  229. package/lib/requestProcessor.d.ts +1 -1
  230. package/lib/ui-i18n/uiTranslationKeys.d.ts +2 -1
  231. package/lib/ui-i18n/uiTranslationKeys.js +42 -1
  232. package/lib/widgets/abstractAction.d.ts +1 -1
  233. package/lib/widgets/abstractCustom.d.ts +2 -2
  234. package/lib/widgets/abstractInfo.d.ts +1 -1
  235. package/lib/widgets/abstractLink.d.ts +2 -2
  236. package/lib/widgets/abstractSwitch.d.ts +1 -1
  237. package/lib/widgets/abstractWidgetBase.d.ts +1 -1
  238. package/lib/widgets/widgetHandler.d.ts +9 -9
  239. package/lib/widgets/widgetHandler.js +5 -1
  240. package/models/Filter.d.ts +1 -1
  241. package/models/FilterColumn.d.ts +1 -1
  242. package/models/Group.d.ts +3 -2
  243. package/models/HistoryActions.d.ts +1 -1
  244. package/models/MediaManagerAP.d.ts +2 -2
  245. package/models/MediaManagerAssociationsAP.d.ts +1 -1
  246. package/models/MediaManagerMetaAP.d.ts +1 -1
  247. package/models/User.d.ts +2 -2
  248. package/models/UserNotification.d.ts +1 -1
  249. package/package.json +29 -20
  250. package/policies/authPolicies.js +6 -6
  251. package/policies/permissionResolvers.d.ts +1 -0
  252. package/policies/permissionResolvers.js +3 -0
  253. package/services/FeedService.d.ts +3 -3
  254. package/system/Router.d.ts +1 -1
  255. package/system/Router.js +27 -1
  256. package/system/bindAccessRights.d.ts +1 -1
  257. package/system/bindAccessRights.js +2 -3
  258. package/system/bindAuthorization.d.ts +1 -1
  259. package/system/bindControls.d.ts +1 -1
  260. package/system/bindCors.d.ts +1 -1
  261. package/system/bindCustomFilterHandlers.d.ts +1 -1
  262. package/system/bindDashboardWidgets.d.ts +1 -1
  263. package/system/bindDev.d.ts +1 -1
  264. package/system/bindDocs.d.ts +13 -0
  265. package/system/bindDocs.js +77 -0
  266. package/system/bindHistory.d.ts +1 -1
  267. package/system/bindInertia.d.ts +1 -1
  268. package/system/bindInertia.js +23 -1
  269. package/system/bindMediaManager.d.ts +1 -1
  270. package/system/bindNotifications.d.ts +1 -1
  271. package/system/bindReqFunctions.d.ts +1 -1
  272. package/system/bindTranslations.d.ts +1 -1
  273. package/system/buildInternalModelAccess.d.ts +3 -3
  274. package/system/buildInternalModelAccess.js +5 -2
  275. package/system/defaults.d.ts +1 -1
  276. package/system/routePolicies.d.ts +1 -1
  277. package/system/systemModelContracts.d.ts +1 -1
  278. package/system/systemModelContracts.js +11 -7
  279. package/system/validateSystemModels.d.ts +1 -1
  280. package/system/validateSystemModels.js +29 -9
  281. package/assets/add-group-BdHFzKng.js +0 -1
  282. package/assets/add-p6yGCoZ7.js +0 -1
  283. package/assets/add-user-CDspCLu4.js +0 -1
  284. package/assets/app-DNXiApCk.css +0 -1
  285. package/assets/app-layout-DCr_-JY3.js +0 -1
  286. package/assets/app.js +0 -138
  287. package/assets/catalog-XN-_p9TB.js +0 -6
  288. package/assets/dashboard-CHZO2QFY.js +0 -3
  289. package/assets/debounce-BMmXVQ06.js +0 -1
  290. package/assets/history-CQd0FojQ.js +0 -1
  291. package/assets/init-user-8aUohVDq.js +0 -1
  292. package/assets/list-PHWgTHsg.js +0 -4
  293. package/assets/login-CO4laf6m.js +0 -1
  294. package/assets/module-DVyQtIxm.js +0 -1
  295. package/assets/notification-B87XG8nQ.js +0 -20
  296. package/assets/register-DBYIMXGQ.js +0 -1
  297. package/assets/ru-rYKdQbWF.js +0 -1
  298. package/assets/use-appearance-_EbbjHTh.js +0 -1
  299. package/assets/user-filters-list-BRzDbPkx.js +0 -1
  300. package/assets/welcome-DiXmrTgc.js +0 -1
@@ -25,8 +25,9 @@ export class FilterService {
25
25
  if (!models) {
26
26
  return null;
27
27
  }
28
- // Find config (case-insensitive)
29
- const foundKey = Object.keys(models).find(key => key.toLowerCase() === modelName.toLowerCase());
28
+ const foundKey = Object.prototype.hasOwnProperty.call(models, modelName)
29
+ ? modelName
30
+ : Object.keys(models).find(key => key.toLowerCase() === modelName.toLowerCase());
30
31
  if (!foundKey) {
31
32
  return null;
32
33
  }
@@ -35,7 +36,7 @@ export class FilterService {
35
36
  return null;
36
37
  }
37
38
  // Get AbstractModel
38
- const model = this.adminizer.modelHandler.model.get(config.model);
39
+ const model = this.adminizer.modelHandler.getResource(foundKey);
39
40
  if (!model) {
40
41
  return null;
41
42
  }
@@ -1,6 +1,6 @@
1
- export { FilterService, default as FilterServiceDefault } from './FilterService';
2
- export { CustomFilterHandler, default as CustomFilterHandlerDefault } from './CustomFilterHandler';
3
- export { AbstractCustomFilter } from './CustomFilterHandler';
4
- export type { FilterCustomFieldCondition, RegisterOptions, FilterCustomFieldInputConfig, FilterCustomFieldInputDefinition, FilterCustomFieldInputType } from './CustomFilterHandler';
5
- export { ConditionValidator, default as ConditionValidatorDefault } from './ConditionValidator';
6
- export type { ValidationResult, ValidationError, FieldConfig, SecurityEvent, SecurityEventType } from './ConditionValidator';
1
+ export { FilterService, default as FilterServiceDefault } from './FilterService.js';
2
+ export { CustomFilterHandler, default as CustomFilterHandlerDefault } from './CustomFilterHandler.js';
3
+ export { AbstractCustomFilter } from './CustomFilterHandler.js';
4
+ export type { FilterCustomFieldCondition, RegisterOptions, FilterCustomFieldInputConfig, FilterCustomFieldInputDefinition, FilterCustomFieldInputType } from './CustomFilterHandler.js';
5
+ export { ConditionValidator, default as ConditionValidatorDefault } from './ConditionValidator.js';
6
+ export type { ValidationResult, ValidationError, FieldConfig, SecurityEvent, SecurityEventType } from './ConditionValidator.js';
@@ -1,9 +1,9 @@
1
- import { HistoryActions } from "../../models/HistoryActions";
2
- import { User } from "../../models/User";
3
- import { Adminizer } from "../Adminizer";
4
- import { Fields } from "../../helpers/fieldsHelper";
5
- import { ActionType } from "../../interfaces/adminpanelConfig";
6
- import { ModelResource } from "../../interfaces/types";
1
+ import { HistoryActions } from "../../models/HistoryActions.js";
2
+ import { User } from "../../models/User.js";
3
+ import { Adminizer } from "../Adminizer.js";
4
+ import { Fields } from "../../helpers/fieldsHelper.js";
5
+ import { ActionType } from "../../interfaces/adminpanelConfig.js";
6
+ import { ModelResource } from "../../interfaces/types.js";
7
7
  /**
8
8
  * Abstract base class for handling history operations in the AdminPanel.
9
9
  * Provides common methods and structure for retrieving, filtering, and formatting historical data.
@@ -86,9 +86,9 @@ export class AbstractHistoryAdapter {
86
86
  * @returns Array of model names (in lowercase) the user can access.
87
87
  */
88
88
  getModels(user) {
89
- const models = this.adminizer.modelHandler.all
90
- .filter(model => !this.excludedModels.has(model.modelname))
91
- .map(model => model.modelname.toLowerCase());
89
+ const models = Array.from(this.adminizer.modelHandler.model.entries())
90
+ .filter(([, model]) => !this.excludedModels.has(model.modelname))
91
+ .map(([resourceName]) => resourceName);
92
92
  const accessModels = [];
93
93
  for (const model of models) {
94
94
  const access = this.adminizer.accessRightsHelper.enoughPermissions([
@@ -304,14 +304,15 @@ export class AbstractHistoryAdapter {
304
304
  * @protected
305
305
  */
306
306
  findModelResource(history) {
307
- const modelResourceName = history.modelName;
307
+ const modelResourceName = this.adminizer.modelHandler.getResourceRecord(history.modelName)?.name
308
+ ?? history.modelName;
308
309
  const modelResourceUri = `${this.adminizer.config.routePrefix}/model/${modelResourceName}`;
309
310
  const models = this.adminizer.config.models;
310
311
  const foundKey = Object.keys(models).find(key => key.toLowerCase() === modelResourceName.toLowerCase());
311
312
  const modelResource = {
312
313
  name: modelResourceName,
313
314
  uri: modelResourceUri,
314
- model: this.adminizer.modelHandler.model.get(history.modelName),
315
+ model: this.adminizer.modelHandler.getResource(modelResourceName),
315
316
  config: models[foundKey]
316
317
  };
317
318
  return modelResource;
@@ -341,8 +342,9 @@ export class AbstractHistoryAdapter {
341
342
  Adminizer.log.error('No model found for field: ', fields[key]);
342
343
  return;
343
344
  }
344
- let Model = this.adminizer.modelHandler.model.get(modelName);
345
- if (!Model) {
345
+ const resourceName = this.adminizer.modelHandler.resolveAssociationResource(modelName, fields[key].model.resourceName);
346
+ let Model = resourceName ? this.adminizer.modelHandler.getResource(resourceName) : undefined;
347
+ if (!Model || !resourceName) {
346
348
  return;
347
349
  }
348
350
  let list;
@@ -351,8 +353,8 @@ export class AbstractHistoryAdapter {
351
353
  Adminizer.log.warn("Warning: executing malicious job trying to add a huge amount of records in field config," +
352
354
  " please rewrite this part of code in the nearest future");
353
355
  let modelResource = {
354
- name: modelName, config: this.adminizer.config.models[modelName],
355
- model: Model, uri: `${this.adminizer.config.routePrefix}/model/${modelName}`
356
+ name: resourceName, config: this.adminizer.config.models[resourceName],
357
+ model: Model, uri: `${this.adminizer.config.routePrefix}/model/${resourceName}`
356
358
  };
357
359
  let dataAccessor = new DataAccessor(this.adminizer, user, modelResource, "view");
358
360
  list = await Model.find({}, dataAccessor);
@@ -1,7 +1,7 @@
1
- import { HistoryActions } from "../../models/HistoryActions";
2
- import { User } from "../../models/User";
3
- import { Adminizer } from "../Adminizer";
4
- import { AbstractHistoryAdapter } from "./AbstractHistoryAdapter";
1
+ import { HistoryActions } from "../../models/HistoryActions.js";
2
+ import { User } from "../../models/User.js";
3
+ import { Adminizer } from "../Adminizer.js";
4
+ import { AbstractHistoryAdapter } from "./AbstractHistoryAdapter.js";
5
5
  export declare class DefaultHistoryAdapter extends AbstractHistoryAdapter {
6
6
  id: string;
7
7
  model: string;
@@ -1,4 +1,4 @@
1
- import { AbstractHistoryAdapter } from "./AbstractHistoryAdapter";
1
+ import { AbstractHistoryAdapter } from "./AbstractHistoryAdapter.js";
2
2
  export declare class HistoryHandler {
3
3
  private adapters;
4
4
  add(adapter: AbstractHistoryAdapter): void;
@@ -1,10 +1,10 @@
1
- import { Fields } from '../../helpers/fieldsHelper';
2
- import { AbstractModel } from '../model/AbstractModel';
3
- import { DataAccessor } from '../DataAccessor';
4
- import { FilterOperator } from '../../models/Filter';
5
- import { CustomFilterHandler } from '../filters/CustomFilterHandler';
6
- import { ListQueryBuilderParams, ListQueryBuilderResult } from '../../interfaces/listQueryBuilder';
7
- import { CriteriaWhere } from '../../interfaces/queryCriteria';
1
+ import { Fields } from '../../helpers/fieldsHelper.js';
2
+ import { AbstractModel } from '../model/AbstractModel.js';
3
+ import { DataAccessor } from '../DataAccessor.js';
4
+ import { FilterOperator } from '../../models/Filter.js';
5
+ import { CustomFilterHandler } from '../filters/CustomFilterHandler.js';
6
+ import { ListQueryBuilderParams, ListQueryBuilderResult } from '../../interfaces/listQueryBuilder.js';
7
+ import { CriteriaWhere } from '../../interfaces/queryCriteria.js';
8
8
  /**
9
9
  * Security limits for filter conditions
10
10
  */
@@ -1,5 +1,5 @@
1
- import type { MediaManagerMetaAP } from "../../models/MediaManagerMetaAP";
2
- import { Adminizer } from "../Adminizer";
1
+ import type { MediaManagerMetaAP } from "../../models/MediaManagerMetaAP.js";
2
+ import { Adminizer } from "../Adminizer.js";
3
3
  export interface MediaManagerItem {
4
4
  id?: string;
5
5
  parent: string | null;
@@ -1,4 +1,4 @@
1
- import { AbstractMediaManager } from "./AbstractMediaManager";
1
+ import { AbstractMediaManager } from "./AbstractMediaManager.js";
2
2
  export declare class MediaManagerHandler {
3
3
  private managers;
4
4
  add(manager: AbstractMediaManager): void;
@@ -1,4 +1,4 @@
1
- import { Adminizer } from "../Adminizer";
1
+ import { Adminizer } from "../Adminizer.js";
2
2
  export declare class MediaManagerThumb {
3
3
  static getThumb(id: string, managerId: string, adminizer: Adminizer): Promise<NonSharedBuffer>;
4
4
  }
@@ -1,8 +1,8 @@
1
- import { Fields } from "../../../helpers/fieldsHelper";
2
- import { MediaManagerWidgetData, MediaManagerItem, MediaManagerWidgetItem, MediaManagerWidgetJSON } from "../AbstractMediaManager";
3
- import { BaseFieldConfig } from "../../../interfaces/adminpanelConfig";
4
- import { Adminizer } from "../../Adminizer";
5
- import type { AppRuntime } from "../../app-manager/AdminizerApp";
1
+ import { Fields } from "../../../helpers/fieldsHelper.js";
2
+ import { MediaManagerWidgetData, MediaManagerItem, MediaManagerWidgetItem, MediaManagerWidgetJSON } from "../AbstractMediaManager.js";
3
+ import { BaseFieldConfig } from "../../../interfaces/adminpanelConfig.js";
4
+ import { Adminizer } from "../../Adminizer.js";
5
+ import type { AppRuntime } from "../../app-manager/AdminizerApp.js";
6
6
  type PostParams = Record<string, string | number | boolean | object | string[] | number[] | null>;
7
7
  export declare function isMediaManagerFieldConfig(fieldConfig: BaseFieldConfig): boolean;
8
8
  export declare function normalizeMediaManagerWidgetData(value: PostParams[string] | undefined, prop: string): MediaManagerWidgetData[];
@@ -1,14 +1,21 @@
1
- import { DataAccessor } from "../DataAccessor";
2
- import { QueryCriteria } from "../../interfaces/queryCriteria";
3
- import { InternalModelRepository } from "../../interfaces/internalModelAccess";
1
+ import { DataAccessor } from "../DataAccessor.js";
2
+ import { QueryCriteria } from "../../interfaces/queryCriteria.js";
3
+ import { InternalModelRepository } from "../../interfaces/internalModelAccess.js";
4
4
  export interface Attribute {
5
- type: 'association' | 'association-many' | 'number' | 'json' | 'string' | 'boolean' | 'ref';
5
+ /**
6
+ * `date` covers every temporal column (date, time, timestamp). It is deliberately
7
+ * separate from `string`: dates must not take part in LIKE search, and the UI
8
+ * renders them with date controls.
9
+ */
10
+ type: 'association' | 'association-many' | 'number' | 'json' | 'string' | 'boolean' | 'date' | 'ref';
6
11
  required?: boolean;
7
12
  unique?: boolean;
8
13
  defaultsTo?: any;
9
14
  columnName?: string;
10
15
  model?: string;
11
16
  collection?: string;
17
+ /** Canonical Adminizer resource target for a system-model association. */
18
+ resourceName?: string;
12
19
  via?: string;
13
20
  allowNull?: boolean;
14
21
  /**
@@ -1,5 +1,5 @@
1
- import { InternalModelAccessMap, InternalModelRepository } from "../../interfaces/internalModelAccess";
2
- import { AbstractModel } from "./AbstractModel";
1
+ import { InternalModelAccessMap, InternalModelRepository } from "../../interfaces/internalModelAccess.js";
2
+ import { AbstractModel } from "./AbstractModel.js";
3
3
  export declare const DEFAULT_INTERNAL_MODEL_ACCESS: InternalModelAccessMap;
4
4
  export declare class InternalModelScope {
5
5
  private readonly getModel;
@@ -1,6 +1,6 @@
1
- import { AbstractModel } from "./AbstractModel";
2
- import { InternalModelAccessMap, InternalModelRepository } from "../../interfaces/internalModelAccess";
3
- import { InternalModelScope } from "./InternalModelAccessFactory";
1
+ import { AbstractModel } from "./AbstractModel.js";
2
+ import { InternalModelAccessMap, InternalModelRepository } from "../../interfaces/internalModelAccess.js";
3
+ import { InternalModelScope } from "./InternalModelAccessFactory.js";
4
4
  export interface AppModelAccessRecord {
5
5
  id: string;
6
6
  appName: string;
@@ -9,10 +9,26 @@ export interface AppModelAccessRecord {
9
9
  export interface ModelRecord {
10
10
  id: string;
11
11
  name: string;
12
+ hostModelName: string;
13
+ primaryHostModel: boolean;
12
14
  model: AbstractModel<any>;
13
15
  ownerApp?: string;
14
16
  enabled: boolean;
15
17
  }
18
+ export interface ModelRegistrationOptions {
19
+ /** Physical ORM model name. It is intentionally independent from the Adminizer resource name. */
20
+ hostModelName?: string;
21
+ /**
22
+ * Selects this resource as the association target when multiple resources use the same host model.
23
+ * Exactly one resource must be primary for every shared host model.
24
+ */
25
+ primary?: boolean;
26
+ /**
27
+ * @deprecated Register and use the canonical Adminizer resource name instead.
28
+ * Kept only for compatibility with existing integrations. Host model names must not be used as aliases.
29
+ */
30
+ aliases?: string[];
31
+ }
16
32
  export declare class AppModelAccess {
17
33
  private readonly getModel;
18
34
  private readonly appName;
@@ -33,9 +49,12 @@ export declare class AppModelAccess {
33
49
  export declare class ModelHandler {
34
50
  private models;
35
51
  private modelAliases;
52
+ private hostModelResources;
36
53
  private internalAccess?;
37
54
  private appAccessRecords;
38
- add<T>(modelName: string, modelInstance: AbstractModel<T>, aliases?: string[]): void;
55
+ add<T>(resourceName: string, modelInstance: AbstractModel<T>, options?: ModelRegistrationOptions): void;
56
+ /** @deprecated Pass `{ aliases }` in ModelRegistrationOptions, or preferably use the canonical resource name. */
57
+ add<T>(resourceName: string, modelInstance: AbstractModel<T>, aliases?: string[]): void;
39
58
  register<T>(appName: string, modelName: string, modelInstance: AbstractModel<T>): string;
40
59
  unregister(id: string): void;
41
60
  disable(id: string): void;
@@ -45,7 +64,10 @@ export declare class ModelHandler {
45
64
  unregisterAppAccess(id: string): void;
46
65
  getAppAccessRecords(appName: string): AppModelAccessRecord[];
47
66
  createAppAccess(appName: string): AppModelAccess;
48
- /** Improved model getter with case-insensitive lookup and configured alias support. */
67
+ /**
68
+ * Improved model getter with case-insensitive lookup and configured alias support.
69
+ * @deprecated New code should use getResource() and getByHostModel() explicitly.
70
+ */
49
71
  get model(): {
50
72
  get: (modelName: string) => AbstractModel<any>;
51
73
  has: (modelName: string) => boolean;
@@ -53,6 +75,26 @@ export declare class ModelHandler {
53
75
  keys: () => IterableIterator<string>;
54
76
  values: () => IterableIterator<AbstractModel<any>>;
55
77
  };
78
+ /**
79
+ * Returns a model by its Adminizer resource name or an explicit deprecated compatibility alias.
80
+ * New code must use canonical resource names.
81
+ */
82
+ getResource(resourceName: string): AbstractModel<any> | undefined;
83
+ getResourceRecord(resourceName: string): ModelRecord | undefined;
84
+ /**
85
+ * Resolves a physical ORM model name to its Adminizer resource.
86
+ * This lookup is deliberately separate from getResource(): a host model may have the
87
+ * same name as a system resource while being exposed under a project resource alias.
88
+ */
89
+ resolveResourceByHostModel(hostModelName: string): string | undefined;
90
+ getByHostModel(hostModelName: string): AbstractModel<any> | undefined;
91
+ /**
92
+ * Resolves an ORM association target. Adapter-provided host model names take precedence;
93
+ * system-model relations may pass their explicit canonical resource name instead.
94
+ */
95
+ resolveAssociationResource(targetName: string, resourceName?: string): string | undefined;
96
+ /** Validates that every host ORM model used by multiple resources has one primary resource. */
97
+ validateHostModelMappings(): void;
56
98
  resolveModelName(modelName: string): string;
57
99
  configureInternalAccess(accessMap?: InternalModelAccessMap): void;
58
100
  internal(scopeName: string): InternalModelScope;
@@ -63,6 +105,9 @@ export declare class ModelHandler {
63
105
  get all(): AbstractModel<any>[];
64
106
  private getAllowedAppModels;
65
107
  private registerAliases;
108
+ private registerHostModel;
109
+ private unregisterHostModel;
110
+ private getSharedHostModelError;
66
111
  private resolveName;
67
112
  private enabledModelEntries;
68
113
  private enabledModelKeys;
@@ -40,18 +40,27 @@ export class AppModelAccess {
40
40
  export class ModelHandler {
41
41
  models = new Map();
42
42
  modelAliases = new Map();
43
+ hostModelResources = new Map();
43
44
  internalAccess;
44
45
  appAccessRecords = new Map();
45
- add(modelName, modelInstance, aliases = []) {
46
- const modelname = modelName.toLowerCase();
47
- this.models.set(modelname, {
48
- id: modelname,
49
- name: modelName,
46
+ add(resourceName, modelInstance, options = {}) {
47
+ const resourceId = normalizeName(resourceName);
48
+ if (this.models.has(resourceId)) {
49
+ throw new Error(`Model resource "${resourceName}" is already registered`);
50
+ }
51
+ const normalizedOptions = Array.isArray(options) ? { aliases: options } : options;
52
+ const hostModelName = normalizedOptions.hostModelName ?? resourceName;
53
+ this.registerHostModel(resourceName, hostModelName, true);
54
+ this.models.set(resourceId, {
55
+ id: resourceId,
56
+ name: resourceName,
57
+ hostModelName,
58
+ primaryHostModel: normalizedOptions.primary === true,
50
59
  model: modelInstance,
51
60
  enabled: true,
52
61
  });
53
- this.registerAliases(modelName, aliases);
54
- Adminizer.log.debug(`Model with name [${modelname}] was registered`);
62
+ this.registerAliases(resourceName, normalizedOptions.aliases ?? []);
63
+ Adminizer.log.debug(`Model resource [${resourceName}] was registered for host model [${hostModelName}]`);
55
64
  }
56
65
  register(appName, modelName, modelInstance) {
57
66
  const normalizedModelName = normalizeName(modelName);
@@ -61,10 +70,13 @@ export class ModelHandler {
61
70
  this.models.set(normalizedModelName, {
62
71
  id: normalizedModelName,
63
72
  name: modelName,
73
+ hostModelName: modelName,
74
+ primaryHostModel: true,
64
75
  model: modelInstance,
65
76
  ownerApp: appName,
66
77
  enabled: true,
67
78
  });
79
+ this.registerHostModel(modelName, modelName, false);
68
80
  Adminizer.log.debug(`Model with name [${normalizedModelName}] was registered by app [${appName}]`);
69
81
  return normalizedModelName;
70
82
  }
@@ -74,6 +86,7 @@ export class ModelHandler {
74
86
  return;
75
87
  }
76
88
  this.models.delete(normalizeName(id));
89
+ this.unregisterHostModel(record.hostModelName, record.name);
77
90
  }
78
91
  disable(id) {
79
92
  const record = this.models.get(normalizeName(id));
@@ -118,7 +131,10 @@ export class ModelHandler {
118
131
  return new AppModelAccess((modelName) => this.model.get(modelName), appName, () => this.getAllowedAppModels(appName));
119
132
  }
120
133
  // TODO: 'hot reload' need add method for delete model & unbind
121
- /** Improved model getter with case-insensitive lookup and configured alias support. */
134
+ /**
135
+ * Improved model getter with case-insensitive lookup and configured alias support.
136
+ * @deprecated New code should use getResource() and getByHostModel() explicitly.
137
+ */
122
138
  get model() {
123
139
  return {
124
140
  get: (modelName) => this.models.get(this.resolveName(modelName))?.enabled
@@ -130,6 +146,65 @@ export class ModelHandler {
130
146
  values: () => this.enabledModelValues(),
131
147
  };
132
148
  }
149
+ /**
150
+ * Returns a model by its Adminizer resource name or an explicit deprecated compatibility alias.
151
+ * New code must use canonical resource names.
152
+ */
153
+ getResource(resourceName) {
154
+ return this.model.get(resourceName);
155
+ }
156
+ getResourceRecord(resourceName) {
157
+ const record = this.models.get(this.resolveName(resourceName));
158
+ return record?.enabled ? record : undefined;
159
+ }
160
+ /**
161
+ * Resolves a physical ORM model name to its Adminizer resource.
162
+ * This lookup is deliberately separate from getResource(): a host model may have the
163
+ * same name as a system resource while being exposed under a project resource alias.
164
+ */
165
+ resolveResourceByHostModel(hostModelName) {
166
+ const resourceIds = this.hostModelResources.get(normalizeName(hostModelName));
167
+ const records = Array.from(resourceIds ?? [])
168
+ .map((resourceId) => this.models.get(resourceId))
169
+ .filter((record) => Boolean(record?.enabled));
170
+ if (records.length === 1) {
171
+ return records[0].name;
172
+ }
173
+ const primaryRecords = records.filter((record) => record.primaryHostModel);
174
+ if (primaryRecords.length === 1) {
175
+ return primaryRecords[0].name;
176
+ }
177
+ if (records.length > 1) {
178
+ throw new Error(this.getSharedHostModelError(hostModelName, records));
179
+ }
180
+ return undefined;
181
+ }
182
+ getByHostModel(hostModelName) {
183
+ const resourceName = this.resolveResourceByHostModel(hostModelName);
184
+ return resourceName ? this.getResource(resourceName) : undefined;
185
+ }
186
+ /**
187
+ * Resolves an ORM association target. Adapter-provided host model names take precedence;
188
+ * system-model relations may pass their explicit canonical resource name instead.
189
+ */
190
+ resolveAssociationResource(targetName, resourceName) {
191
+ if (resourceName) {
192
+ return this.getResourceRecord(resourceName)?.name;
193
+ }
194
+ return this.resolveResourceByHostModel(targetName)
195
+ ?? this.getResourceRecord(targetName)?.name;
196
+ }
197
+ /** Validates that every host ORM model used by multiple resources has one primary resource. */
198
+ validateHostModelMappings() {
199
+ for (const [normalizedHostModelName, resourceIds] of this.hostModelResources) {
200
+ const records = Array.from(resourceIds)
201
+ .map((resourceId) => this.models.get(resourceId))
202
+ .filter((record) => Boolean(record?.enabled));
203
+ if (records.length > 1 && records.filter((record) => record.primaryHostModel).length !== 1) {
204
+ throw new Error(this.getSharedHostModelError(records[0]?.hostModelName ?? normalizedHostModelName, records));
205
+ }
206
+ }
207
+ }
133
208
  resolveModelName(modelName) {
134
209
  const resolvedName = this.resolveName(modelName);
135
210
  return this.models.get(resolvedName)?.name ?? modelName;
@@ -184,6 +259,30 @@ export class ModelHandler {
184
259
  this.modelAliases.set(normalizedAlias, normalizedModelName);
185
260
  }
186
261
  }
262
+ registerHostModel(resourceName, hostModelName, allowMultipleResources) {
263
+ const normalizedHostModelName = normalizeName(hostModelName);
264
+ const resourceId = normalizeName(resourceName);
265
+ const resourceIds = this.hostModelResources.get(normalizedHostModelName) ?? new Set();
266
+ if (!allowMultipleResources && resourceIds.size && !resourceIds.has(resourceId)) {
267
+ const existingResourceId = resourceIds.values().next().value;
268
+ const existingResource = this.models.get(existingResourceId)?.name ?? existingResourceId;
269
+ throw new Error(`Host model "${hostModelName}" is already registered for Adminizer resource "${existingResource}"`);
270
+ }
271
+ resourceIds.add(resourceId);
272
+ this.hostModelResources.set(normalizedHostModelName, resourceIds);
273
+ }
274
+ unregisterHostModel(hostModelName, resourceName) {
275
+ const normalizedHostModelName = normalizeName(hostModelName);
276
+ const resourceIds = this.hostModelResources.get(normalizedHostModelName);
277
+ resourceIds?.delete(normalizeName(resourceName));
278
+ if (!resourceIds?.size) {
279
+ this.hostModelResources.delete(normalizedHostModelName);
280
+ }
281
+ }
282
+ getSharedHostModelError(hostModelName, records) {
283
+ return (`Host model "${hostModelName}" is mapped to multiple Adminizer resources: ` +
284
+ `${records.map((record) => record.name).join(", ")}. Configure exactly one with primary: true.`);
285
+ }
187
286
  resolveName(modelName) {
188
287
  const normalizedModelName = normalizeName(modelName);
189
288
  return this.modelAliases.get(normalizedModelName) ?? normalizedModelName;
@@ -1,9 +1,11 @@
1
- import { Sequelize, ModelStatic } from "sequelize";
2
- import { AbstractAdapter, AbstractAdapterOptions, AbstractModel, Attribute } from "../AbstractModel";
3
- import { QueryCriteria } from "../../../interfaces/queryCriteria";
1
+ import type { ModelStatic, Sequelize as SequelizeType } from "sequelize";
2
+ import { AbstractAdapter, AbstractAdapterOptions, AbstractModel, Attribute } from "../AbstractModel.js";
3
+ import { QueryCriteria } from "../../../interfaces/queryCriteria.js";
4
4
  export declare function mapSequelizeToAdminizerAttributes(model: ModelStatic<any>): Record<string, Attribute>;
5
5
  export declare class SequelizeModel<T> extends AbstractModel<T> {
6
6
  private model;
7
+ private _init;
8
+ private _ensure;
7
9
  constructor(modelName: string, model: ModelStatic<any>);
8
10
  private _buildJsonContainsCondition;
9
11
  _convertCriteriaToSequelize(criteria: any): any;
@@ -45,9 +47,9 @@ export declare class SequelizeModel<T> extends AbstractModel<T> {
45
47
  private _buildCriteriaIncludes;
46
48
  }
47
49
  export declare class SequelizeAdapter extends AbstractAdapter {
48
- sequelize: Sequelize;
50
+ sequelize: SequelizeType;
49
51
  Model: typeof SequelizeModel;
50
- constructor(sequelize: Sequelize, options?: AbstractAdapterOptions);
52
+ constructor(sequelize: SequelizeType, options?: AbstractAdapterOptions);
51
53
  get models(): Record<string, any>;
52
54
  getModel(modelName: string): any;
53
55
  getAttributes(modelName: string): any;