adminizer 4.7.0-build.222 → 5.0.0-build.0

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 (341) hide show
  1. package/Readme.md +2 -1
  2. package/assets/add-a4odXvQk.js +1 -0
  3. package/assets/add-group-D-NleXth.js +1 -0
  4. package/assets/add-user-B4SVJT5P.js +1 -0
  5. package/assets/app-CtWuWD5N.css +1 -0
  6. package/assets/app-layout-eaSzcROf.js +1 -0
  7. package/assets/app.js +35 -39
  8. package/assets/catalog-ByUICd5z.js +6 -0
  9. package/assets/controls/chunks/_commonjsHelpers-C6fGbg64.js +6 -0
  10. package/assets/controls/chunks/index-CjiZ2FIa.js +93 -0
  11. package/assets/controls/chunks/jsx-runtime-jIxVPx5o.js +31 -0
  12. package/assets/controls/chunks/use-appearance-CFLOwiSX.js +38 -0
  13. package/assets/controls/chunks/use-window-size-BXgBKW65.js +19 -0
  14. package/assets/controls/chunks/vanilla-picker-Dg97NL4h.js +529 -0
  15. package/assets/{RelationDialogStack-CnHFOYyR.css → controls/ckeditor.css} +1 -1
  16. package/assets/controls/ckeditor.es.js +83663 -0
  17. package/assets/controls/handsontable.css +1 -0
  18. package/assets/controls/handsontable.es.js +70550 -0
  19. package/assets/controls/jsoneditor.css +1 -0
  20. package/assets/controls/jsoneditor.es.js +42009 -0
  21. package/assets/controls/leaflet.css +1 -0
  22. package/assets/controls/leaflet.es.js +10299 -0
  23. package/assets/controls/monaco.es.js +618 -0
  24. package/assets/controls/toast-ui.css +1 -0
  25. package/assets/controls/toast-ui.es.js +41768 -0
  26. package/assets/dashboard-BYd8G2cW.js +3 -0
  27. package/assets/debounce-BMmXVQ06.js +1 -0
  28. package/assets/history-B8KIDy44.js +1 -0
  29. package/assets/init-user-8aUohVDq.js +1 -0
  30. package/assets/list-ChmtBGjG.js +4 -0
  31. package/assets/login-CO4laf6m.js +1 -0
  32. package/assets/manifest.json +60 -615
  33. package/assets/{media-manager-WcKe1EvD.js → media-manager-BDbpSSjH.js} +3 -3
  34. package/assets/module-D59aE9uv.js +1 -0
  35. package/assets/notification-DNoyfNmT.js +20 -0
  36. package/assets/register-DBYIMXGQ.js +1 -0
  37. package/assets/{ru-eW0WKkga.js → ru-rYKdQbWF.js} +1 -1
  38. package/assets/use-appearance-_EbbjHTh.js +1 -0
  39. package/assets/user-filters-list-BMFRwkYF.js +1 -0
  40. package/assets/welcome-37rNVUHt.js +1 -0
  41. package/controllers/add.d.ts +1 -1
  42. package/controllers/addGroup.js +3 -3
  43. package/controllers/addUser.js +3 -3
  44. package/controllers/catalog/Catalog.d.ts +1 -1
  45. package/controllers/catalog/Catalog.js +2 -1
  46. package/controllers/catalog/FrontendCatalogAdapter.d.ts +2 -12
  47. package/controllers/catalog/FrontendCatalogAdapter.js +3 -16
  48. package/controllers/catalog/FrontentCatalogAdapter.d.ts +2 -12
  49. package/controllers/catalog/FrontentCatalogAdapter.js +0 -16
  50. package/controllers/edit.js +6 -11
  51. package/controllers/editGroup.d.ts +1 -1
  52. package/controllers/editGroup.js +3 -3
  53. package/controllers/editUser.d.ts +1 -1
  54. package/controllers/editUser.js +3 -3
  55. package/controllers/feed.js +1 -1
  56. package/controllers/filter-fields/columns.js +1 -1
  57. package/controllers/filter-fields/getAllUserFilters.js +2 -2
  58. package/controllers/filter-fields/groups.js +2 -2
  59. package/controllers/filter-fields/savedFilters.js +1 -1
  60. package/controllers/history-actions/HistoryController.js +1 -1
  61. package/controllers/initUser.js +2 -2
  62. package/controllers/list.d.ts +1 -1
  63. package/controllers/login.d.ts +1 -1
  64. package/controllers/login.js +3 -3
  65. package/controllers/media-manager/ThumbController.js +2 -2
  66. package/controllers/media-manager/mediaManagerApi.js +13 -15
  67. package/controllers/register.d.ts +1 -1
  68. package/controllers/register.js +5 -5
  69. package/controllers/remove.d.ts +1 -1
  70. package/controllers/userApiKey.js +2 -2
  71. package/controllers/view.d.ts +1 -1
  72. package/controllers/view.js +5 -5
  73. package/controllers/widgets/Action.js +5 -2
  74. package/controllers/widgets/Info.js +1 -1
  75. package/controllers/widgets/filterInfo.js +1 -1
  76. package/files/favicon.png +0 -0
  77. package/helpers/accessRightsHelper.d.ts +6 -4
  78. package/helpers/accessRightsHelper.js +13 -0
  79. package/helpers/diffHelpers.js +1 -1
  80. package/helpers/fieldsHelper.d.ts +1 -1
  81. package/helpers/fieldsHelper.js +8 -4
  82. package/helpers/filterDatetimeHelper.d.ts +1 -1
  83. package/helpers/inertiaAddHelper.d.ts +6 -5
  84. package/helpers/inertiaAddHelper.js +45 -37
  85. package/helpers/inertiaAutHelper.js +5 -5
  86. package/helpers/inertiaGroupHelper.d.ts +4 -4
  87. package/helpers/inertiaMenuHelper.js +1 -1
  88. package/helpers/inertiaUserHelper.d.ts +3 -3
  89. package/helpers/inertiaUserHelper.js +1 -1
  90. package/helpers/menuHelper.d.ts +2 -2
  91. package/index.d.ts +18 -6
  92. package/index.js +18 -6
  93. package/interfaces/adminpanelConfig.d.ts +10 -33
  94. package/interfaces/global.d.ts +10 -15
  95. package/interfaces/listQueryBuilder.d.ts +1 -1
  96. package/lib/Adminizer.d.ts +25 -2
  97. package/lib/Adminizer.js +124 -50
  98. package/lib/DataAccessor.d.ts +9 -5
  99. package/lib/DataAccessor.js +89 -42
  100. package/lib/access-rights/AccessRightsHandler.d.ts +17 -0
  101. package/lib/access-rights/AccessRightsHandler.js +63 -0
  102. package/lib/ai-assistant/AbstractAiModelService.d.ts +5 -8
  103. package/lib/ai-assistant/AbstractAiModelService.js +3 -14
  104. package/lib/ai-assistant/AiAssistantHandler.d.ts +2 -2
  105. package/lib/app-manager/AdminizerApp.d.ts +228 -0
  106. package/lib/app-manager/AdminizerApp.js +17 -0
  107. package/lib/app-manager/AppManager.d.ts +18 -0
  108. package/lib/app-manager/AppManager.js +537 -0
  109. package/lib/app-manager/AssetHandler.d.ts +17 -0
  110. package/lib/app-manager/AssetHandler.js +67 -0
  111. package/lib/app-manager/ConfigLayerHandler.d.ts +18 -0
  112. package/lib/app-manager/ConfigLayerHandler.js +119 -0
  113. package/lib/app-manager/ControllerHandler.d.ts +25 -0
  114. package/lib/app-manager/ControllerHandler.js +140 -0
  115. package/lib/catalog/AbstractCatalog.d.ts +28 -19
  116. package/lib/catalog/AbstractCatalog.js +41 -10
  117. package/lib/catalog/CatalogHandler.d.ts +13 -0
  118. package/lib/catalog/CatalogHandler.js +48 -2
  119. package/lib/catalog/CatalogTemplateComponentHandler.d.ts +23 -0
  120. package/lib/catalog/CatalogTemplateComponentHandler.js +59 -0
  121. package/lib/controls/Control.d.ts +17 -0
  122. package/lib/controls/Control.js +1 -0
  123. package/lib/controls/ControlsHandler.d.ts +5 -6
  124. package/lib/controls/ControlsHandler.js +0 -13
  125. package/lib/controls/codeEditor/MonacoEditor.d.ts +3 -4
  126. package/lib/controls/codeEditor/MonacoEditor.js +13 -8
  127. package/lib/controls/geojsoneditor/GeoEditor.d.ts +3 -4
  128. package/lib/controls/geojsoneditor/GeoEditor.js +14 -9
  129. package/lib/controls/jsoneditor/JsonEditor.d.ts +5 -6
  130. package/lib/controls/jsoneditor/JsonEditor.js +14 -13
  131. package/lib/controls/markdown/ToastUiEditor.d.ts +5 -6
  132. package/lib/controls/markdown/ToastUiEditor.js +14 -13
  133. package/lib/controls/table/Handsontable.d.ts +5 -6
  134. package/lib/controls/table/Handsontable.js +14 -13
  135. package/lib/controls/wysiwyg/CKeditor.d.ts +5 -6
  136. package/lib/controls/wysiwyg/CKeditor.js +14 -13
  137. package/lib/filters/ConditionValidator.d.ts +1 -1
  138. package/lib/filters/FilterService.d.ts +18 -18
  139. package/lib/filters/FilterService.js +11 -11
  140. package/lib/history-actions/AbstractHistoryAdapter.d.ts +14 -14
  141. package/lib/history-actions/AbstractHistoryAdapter.js +5 -6
  142. package/lib/history-actions/DefaultHistoryAdapter.d.ts +7 -7
  143. package/lib/history-actions/DefaultHistoryAdapter.js +2 -2
  144. package/lib/list-query-builder/ListQueryBuilder.d.ts +1 -1
  145. package/lib/media-manager/AbstractMediaManager.d.ts +14 -3
  146. package/lib/media-manager/AbstractMediaManager.js +16 -5
  147. package/lib/media-manager/MediaManagerHandler.d.ts +3 -0
  148. package/lib/media-manager/MediaManagerHandler.js +30 -5
  149. package/lib/media-manager/Thumb.js +7 -13
  150. package/lib/media-manager/helpers/MediaManagerHelper.d.ts +6 -4
  151. package/lib/media-manager/helpers/MediaManagerHelper.js +18 -18
  152. package/lib/model/AbstractModel.d.ts +9 -5
  153. package/lib/model/AbstractModel.js +9 -13
  154. package/lib/model/InternalModelAccessFactory.js +9 -10
  155. package/lib/model/ModelHandler.d.ts +45 -7
  156. package/lib/model/ModelHandler.js +168 -11
  157. package/lib/model/adapter/sequelize.d.ts +2 -4
  158. package/lib/model/adapter/sequelize.js +16 -193
  159. package/lib/model/adapter/typeorm.d.ts +2 -4
  160. package/lib/model/adapter/typeorm.js +2 -35
  161. package/lib/notifications/AbstractNotificationService.d.ts +9 -9
  162. package/lib/notifications/AbstractNotificationService.js +8 -8
  163. package/lib/notifications/GeneralNotificationService.js +1 -1
  164. package/lib/notifications/SystemNotificationService.js +1 -1
  165. package/lib/ui-i18n/uiTranslationKeys.d.ts +1 -1
  166. package/lib/ui-i18n/uiTranslationKeys.js +1 -0
  167. package/lib/widgets/abstractCustom.d.ts +7 -2
  168. package/lib/widgets/abstractCustom.js +6 -0
  169. package/lib/widgets/abstractInfo.d.ts +4 -1
  170. package/lib/widgets/abstractWidgetBase.d.ts +2 -0
  171. package/lib/widgets/abstractWidgetBase.js +2 -0
  172. package/lib/widgets/widgetHandler.d.ts +6 -2
  173. package/lib/widgets/widgetHandler.js +70 -19
  174. package/models/{FilterAP.d.ts → Filter.d.ts} +4 -70
  175. package/models/Filter.js +1 -0
  176. package/models/FilterColumn.d.ts +10 -0
  177. package/models/FilterColumn.js +1 -0
  178. package/models/Group.d.ts +8 -0
  179. package/models/Group.js +1 -0
  180. package/models/HistoryActions.d.ts +14 -0
  181. package/models/HistoryActions.js +1 -0
  182. package/models/MediaManagerAP.d.ts +2 -54
  183. package/models/MediaManagerAP.js +1 -51
  184. package/models/MediaManagerAssociationsAP.d.ts +1 -35
  185. package/models/MediaManagerAssociationsAP.js +1 -33
  186. package/models/MediaManagerMetaAP.d.ts +2 -30
  187. package/models/MediaManagerMetaAP.js +1 -27
  188. package/models/Notification.d.ts +13 -0
  189. package/models/Notification.js +1 -0
  190. package/models/User.d.ts +23 -0
  191. package/models/User.js +1 -0
  192. package/models/UserNotification.d.ts +7 -0
  193. package/models/UserNotification.js +1 -0
  194. package/package.json +25 -30
  195. package/services/FeedService.d.ts +5 -5
  196. package/services/FeedService.js +1 -1
  197. package/system/Router.js +2 -10
  198. package/system/bindAccessRights.js +1 -1
  199. package/system/bindAuthorization.js +2 -2
  200. package/system/bindControls.js +7 -6
  201. package/system/bindDashboardWidgets.js +3 -2
  202. package/system/bindDev.js +1 -1
  203. package/system/bindHistory.d.ts +1 -1
  204. package/system/bindHistory.js +1 -1
  205. package/system/bindInertia.js +0 -6
  206. package/system/bindMediaManager.js +4 -17
  207. package/system/bindNotifications.d.ts +1 -1
  208. package/system/bindNotifications.js +1 -1
  209. package/system/bindReqFunctions.d.ts +1 -0
  210. package/system/bindReqFunctions.js +20 -3
  211. package/system/buildInternalModelAccess.js +2 -15
  212. package/system/defaults.js +5 -10
  213. package/system/systemModelContracts.d.ts +22 -0
  214. package/system/systemModelContracts.js +155 -0
  215. package/system/validateSystemModels.d.ts +2 -0
  216. package/system/validateSystemModels.js +101 -0
  217. package/translations/ar.json +2 -1
  218. package/translations/cn.json +2 -1
  219. package/translations/de.json +2 -1
  220. package/translations/en.json +1 -0
  221. package/translations/es.json +2 -1
  222. package/translations/fr.json +2 -1
  223. package/translations/hi.json +2 -1
  224. package/translations/jp.json +2 -1
  225. package/translations/ko.json +2 -1
  226. package/translations/pt.json +2 -1
  227. package/translations/ru.json +2 -1
  228. package/translations/ua.json +2 -1
  229. package/translations/uz.json +2 -1
  230. package/translations/vi.json +2 -1
  231. package/ui/components/VanillaJSONEditor.d.ts +1 -1
  232. package/ui/components/handsontable.d.ts +1 -1
  233. package/ui/components/ui/avatar.d.ts +3 -3
  234. package/ui/components/ui/badge.d.ts +1 -1
  235. package/ui/components/ui/breadcrumb.d.ts +7 -7
  236. package/ui/components/ui/button.d.ts +1 -1
  237. package/ui/components/ui/calendar.d.ts +1 -1
  238. package/ui/components/ui/card.d.ts +7 -7
  239. package/ui/components/ui/checkbox.d.ts +1 -1
  240. package/ui/components/ui/collapsible.d.ts +3 -3
  241. package/ui/components/ui/command.d.ts +9 -9
  242. package/ui/components/ui/context-menu.d.ts +15 -15
  243. package/ui/components/ui/dialog-stack.d.ts +10 -10
  244. package/ui/components/ui/dialog.d.ts +10 -10
  245. package/ui/components/ui/dropdown-menu.d.ts +15 -15
  246. package/ui/components/ui/input.d.ts +1 -1
  247. package/ui/components/ui/label.d.ts +1 -1
  248. package/ui/components/ui/menubar.d.ts +16 -16
  249. package/ui/components/ui/pagination.d.ts +7 -7
  250. package/ui/components/ui/popover.d.ts +4 -4
  251. package/ui/components/ui/select.d.ts +10 -10
  252. package/ui/components/ui/separator.d.ts +1 -1
  253. package/ui/components/ui/sheet.d.ts +8 -8
  254. package/ui/components/ui/sidebar.d.ts +23 -23
  255. package/ui/components/ui/skeleton.d.ts +1 -1
  256. package/ui/components/ui/slider.d.ts +1 -1
  257. package/ui/components/ui/sonner.d.ts +1 -1
  258. package/ui/components/ui/switch.d.ts +1 -1
  259. package/ui/components/ui/table.d.ts +8 -8
  260. package/ui/components/ui/tabs.d.ts +4 -4
  261. package/ui/components/ui/textarea.d.ts +1 -1
  262. package/ui/components/ui/tooltip.d.ts +4 -4
  263. package/assets/RelationDialogStack-DI2bZxQX.js +0 -20
  264. package/assets/add-DCQ7ZW4B.js +0 -1
  265. package/assets/add-group-DCVPryBo.js +0 -1
  266. package/assets/add-group-form-DKRXC2n-.js +0 -1
  267. package/assets/add-user-B7OOiYxv.js +0 -1
  268. package/assets/add-user-form-UXAToWQd.js +0 -1
  269. package/assets/app-AKbNCggP.css +0 -1
  270. package/assets/app-layout-6EwNBvnR.js +0 -1
  271. package/assets/app-shell-D8wtkECO.js +0 -1
  272. package/assets/app-sidebar-DfGjL-2K.js +0 -1
  273. package/assets/app-sidebar-header-BZbIBQjq.js +0 -1
  274. package/assets/breadcrumbs-CODaqVkB.js +0 -1
  275. package/assets/catalog-DVvFGa2X.js +0 -6
  276. package/assets/dashboard-BadoiH_a.js +0 -3
  277. package/assets/date-picker-DSOkNiNo.js +0 -1
  278. package/assets/del-modal-Cd4M7af8.js +0 -1
  279. package/assets/dynamic-controls-BsrJhPDY.js +0 -1
  280. package/assets/geo-json-CzR5JBXL.js +0 -1
  281. package/assets/handsontable-BI98OF5R.js +0 -336
  282. package/assets/history-D1iLA6rs.js +0 -1
  283. package/assets/home-DbWj-W_k.js +0 -2
  284. package/assets/icon-C2JNaLxH.js +0 -1
  285. package/assets/init-user-D2HSyXup.js +0 -1
  286. package/assets/input-error-CH2caTtO.js +0 -1
  287. package/assets/jsoneditor-DVNQmA6G.js +0 -3869
  288. package/assets/list-CVoljVUw.js +0 -4
  289. package/assets/login-DFSLEO17.js +0 -1
  290. package/assets/material-icon-Bx9pGQiQ.js +0 -1
  291. package/assets/module-DJsC37CM.js +0 -1
  292. package/assets/monaco-Bl4zdWCn.js +0 -11
  293. package/assets/nav-footer-BiSQkPt4.js +0 -1
  294. package/assets/nav-main-rTH0PfDw.js +0 -1
  295. package/assets/nav-user-Bj6cWs0a.js +0 -1
  296. package/assets/notification-DKrNfaAB.js +0 -20
  297. package/assets/pagination-render-AKJvTIRA.js +0 -1
  298. package/assets/register-BTP4uxsK.js +0 -1
  299. package/assets/theme-switcher-Dm8EOGzx.js +0 -1
  300. package/assets/toast-editor-DOg_gvSp.js +0 -668
  301. package/assets/user-filters-list-C9R9J6Om.js +0 -1
  302. package/assets/user-info-BgSbT02v.js +0 -1
  303. package/assets/user-menu-content-TQTXHIv6.js +0 -1
  304. package/assets/vanilla-picker-B3LgXoKV.js +0 -2
  305. package/assets/vendor-l0sNRNKZ.js +0 -1
  306. package/assets/welcome-BwDlAOGh.js +0 -1
  307. package/controllers/navigation/edit.d.ts +0 -1
  308. package/controllers/navigation/edit.js +0 -8
  309. package/lib/ai-assistant/DummyAiModelService.d.ts +0 -8
  310. package/lib/ai-assistant/DummyAiModelService.js +0 -14
  311. package/lib/ai-assistant/OpenAiModelService.d.ts +0 -24
  312. package/lib/ai-assistant/OpenAiModelService.js +0 -184
  313. package/lib/catalog/Navigation.d.ts +0 -49
  314. package/lib/catalog/Navigation.js +0 -492
  315. package/lib/controls/AbstractControls.d.ts +0 -30
  316. package/lib/controls/AbstractControls.js +0 -14
  317. package/lib/media-manager/DefaultMediaManager.d.ts +0 -20
  318. package/lib/media-manager/DefaultMediaManager.js +0 -127
  319. package/lib/media-manager/Items.d.ts +0 -50
  320. package/lib/media-manager/Items.js +0 -296
  321. package/models/FilterAP.js +0 -68
  322. package/models/FilterColumnAP.d.ts +0 -32
  323. package/models/FilterColumnAP.js +0 -21
  324. package/models/GroupAP.d.ts +0 -31
  325. package/models/GroupAP.js +0 -22
  326. package/models/HistoryActionsAP.d.ts +0 -56
  327. package/models/HistoryActionsAP.js +0 -42
  328. package/models/NavigationAP.d.ts +0 -22
  329. package/models/NavigationAP.js +0 -16
  330. package/models/NotificationAP.d.ts +0 -44
  331. package/models/NotificationAP.js +0 -30
  332. package/models/UserAP.d.ts +0 -81
  333. package/models/UserAP.js +0 -57
  334. package/models/UserNotificationAP.d.ts +0 -26
  335. package/models/UserNotificationAP.js +0 -18
  336. package/system/bindAiAssistant.d.ts +0 -2
  337. package/system/bindAiAssistant.js +0 -30
  338. package/system/bindModels.d.ts +0 -2
  339. package/system/bindModels.js +0 -48
  340. package/system/bindNavigation.d.ts +0 -2
  341. package/system/bindNavigation.js +0 -38
@@ -5,8 +5,8 @@ import { inertiaUserHelper } from "../helpers/inertiaUserHelper.js";
5
5
  export default async function (req, res) {
6
6
  let modelResource = ControllerHelper.findModelResource(req);
7
7
  const internalUsers = req.adminizer.modelHandler.internal("users");
8
- const userModel = internalUsers.get("UserAP");
9
- const groupModel = internalUsers.get("GroupAP");
8
+ const userModel = internalUsers.get("User");
9
+ const groupModel = internalUsers.get("Group");
10
10
  // Check id
11
11
  if (!req.params.id) {
12
12
  return res.status(404).send({ error: 'Not Found' });
@@ -62,7 +62,7 @@ export default async function (req, res) {
62
62
  }
63
63
  Adminizer.log.debug(`User was updated: `, updatedUser);
64
64
  req.flash.setFlashMessage('success', 'User was updated !');
65
- return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/model/userap`);
65
+ return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/model/User`);
66
66
  }
67
67
  catch (e) {
68
68
  Adminizer.log.error(e);
@@ -36,7 +36,7 @@ export default async function feedController(req, res) {
36
36
  }
37
37
  const user = await req.adminizer.modelHandler
38
38
  .internal("feed")
39
- .get("UserAP")
39
+ .get("User")
40
40
  .findOne({ where: { apiKey: userKey } });
41
41
  if (!user) {
42
42
  return res.status(403).json({ error: 'Invalid userKey' });
@@ -85,7 +85,7 @@ export async function updateFilterColumns(req, res) {
85
85
  if (!filter) {
86
86
  return res.status(404).send({ error: req.i18n.__('Filter not found or access denied') });
87
87
  }
88
- // Convert frontend column format to FilterColumnAP format
88
+ // Convert frontend column format to FilterColumn format
89
89
  const filterColumns = columns.map((col, index) => ({
90
90
  fieldName: col.fieldName,
91
91
  order: col.order !== undefined ? col.order : index
@@ -7,8 +7,8 @@ import { Adminizer } from "../../lib/Adminizer.js";
7
7
  */
8
8
  export async function getAllUserFilters(req, res) {
9
9
  const filterService = new FilterService(req.adminizer);
10
- const userModel = req.adminizer.modelHandler.model.get('userap');
11
- const groupModel = req.adminizer.modelHandler.model.get('groupap');
10
+ const userModel = req.adminizer.modelHandler.model.get('User');
11
+ const groupModel = req.adminizer.modelHandler.model.get('Group');
12
12
  // Cache for group names: { groupId: groupName }
13
13
  const groupNamesCache = {};
14
14
  const getGroupName = async (groupId) => {
@@ -4,9 +4,9 @@
4
4
  */
5
5
  export async function getAllGroups(req, res) {
6
6
  try {
7
- const groupModel = req.adminizer.modelHandler.model.get('groupap');
7
+ const groupModel = req.adminizer.modelHandler.model.get('Group');
8
8
  if (!groupModel) {
9
- return res.status(500).send({ error: req.i18n.__('GroupAP model not found') });
9
+ return res.status(500).send({ error: req.i18n.__('Group model not found') });
10
10
  }
11
11
  const groups = await groupModel['_find']({});
12
12
  return res.json({
@@ -71,7 +71,7 @@ export async function getSavedFilters(req, res) {
71
71
  includeSystem: false
72
72
  });
73
73
  // Load owner info for each filter
74
- const userModel = req.adminizer.modelHandler.model.get('userap');
74
+ const userModel = req.adminizer.modelHandler.model.get('User');
75
75
  const filtersWithOwner = await Promise.all(filters.map(async (filter) => {
76
76
  let ownerInfo = null;
77
77
  if (userModel && filter.ownerId) {
@@ -13,7 +13,7 @@ export class HistoryController {
13
13
  `users-history-${adapter.id}`
14
14
  ], req.user);
15
15
  if (accessToUsersHistory)
16
- users = await req.adminizer.modelHandler.model.get('userap')['_find']({});
16
+ users = await req.adminizer.modelHandler.model.get('User')['_find']({});
17
17
  // Getting an array of config.models keys in lowercase for comparison
18
18
  const normalizedModelConfig = new Map(Object.entries(req.adminizer.config.models || {}).map(([key, value]) => [
19
19
  key.toLowerCase(),
@@ -6,10 +6,10 @@ export default async function initUser(req, res) {
6
6
  if (!req.adminizer.config.auth.enable) {
7
7
  return res.redirect(`${req.adminizer.config.routePrefix}/`);
8
8
  }
9
- const userModel = req.adminizer.modelHandler.internal("auth").get("UserAP");
9
+ const userModel = req.adminizer.modelHandler.internal("auth").get("User");
10
10
  let admins = await userModel.find({ where: { isAdministrator: true } });
11
11
  if (admins.length) {
12
- res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
12
+ res.redirect(`${req.adminizer.config.routePrefix}/model/User/login`);
13
13
  }
14
14
  if (req.method.toUpperCase() === "POST") {
15
15
  let login = req.body.login;
@@ -1 +1 @@
1
- export default function list(req: ReqType, res: ResType): Promise<import("express").Response<any, Record<string, any>>>;
1
+ export default function list(req: ReqType, res: ResType): Promise<ResType>;
@@ -1 +1 @@
1
- export default function login(req: ReqType, res: ResType): Promise<void | (import("express-session").Session & Partial<import("express-session").SessionData> & reqSession) | import("express").Response<any, Record<string, any>>>;
1
+ export default function login(req: ReqType, res: ResType): Promise<void | (import("express-session").Session & Partial<import("express-session").SessionData> & reqSession) | ResType>;
@@ -14,7 +14,7 @@ export default async function login(req, res) {
14
14
  let login = req.body.login;
15
15
  let password = req.body.password;
16
16
  let captchaSolution = req.body.captchaSolution;
17
- const userModel = req.adminizer.modelHandler.internal("auth").get("UserAP");
17
+ const userModel = req.adminizer.modelHandler.internal("auth").get("User");
18
18
  let user;
19
19
  try {
20
20
  user = await userModel.findOne({ where: { login: login } });
@@ -122,9 +122,9 @@ export default async function login(req, res) {
122
122
  }));
123
123
  // Force full page reload after logout
124
124
  if (req.headers['x-inertia']) {
125
- return res.writeHead(409, { 'x-inertia-location': `${req.adminizer.config.routePrefix}/model/userap/login` }).end();
125
+ return res.writeHead(409, { 'x-inertia-location': `${req.adminizer.config.routePrefix}/model/User/login` }).end();
126
126
  }
127
- return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
127
+ return res.redirect(`${req.adminizer.config.routePrefix}/model/User/login`);
128
128
  }
129
129
  return res.status(404);
130
130
  }
@@ -3,8 +3,8 @@ export async function thumbController(req, res) {
3
3
  const method = req.method.toUpperCase();
4
4
  const id = req.query.id;
5
5
  const managerId = req.query.managerId;
6
- if (method === 'GET') {
7
- res.setHeader('Content-Type', 'image/webp');
6
+ if (method === "GET") {
7
+ res.setHeader("Content-Type", "image/webp");
8
8
  res.send(await MediaManagerThumb.getThumb(id, managerId, req.adminizer));
9
9
  }
10
10
  }
@@ -1,39 +1,37 @@
1
1
  import { MediaManagerAdapter } from "./mediaManagerAdapter.js";
2
2
  export async function mediaManagerController(req, res) {
3
3
  const method = req.method.toUpperCase();
4
- let id = req.params.id ? req.params.id : '';
5
- // const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
6
- // await delay(1000);
4
+ const id = req.params.id ? req.params.id : "";
7
5
  if (!id) {
8
6
  return res.sendStatus(404);
9
7
  }
10
- const _manager = req.adminizer.mediaManagerHandler.get(id);
11
- const manager = new MediaManagerAdapter(_manager);
12
- if (method === 'GET') {
13
- if (req.query._method === 'getLocales') {
8
+ const mediaManager = req.adminizer.mediaManagerHandler.get(id);
9
+ const manager = new MediaManagerAdapter(mediaManager);
10
+ if (method === "GET") {
11
+ if (req.query._method === "getLocales") {
14
12
  return res.json({ data: manager.getLocales(req) });
15
13
  }
16
14
  return await manager.get(req, res);
17
15
  }
18
- if (method === 'POST') {
19
- if (req.path.endsWith('/upload')) {
16
+ if (method === "POST") {
17
+ if (req.path.endsWith("/upload")) {
20
18
  return await manager.upload(req, res);
21
19
  }
22
- if (req.path.endsWith('/upload-variant')) {
20
+ if (req.path.endsWith("/upload-variant")) {
23
21
  return await manager.uploadVariant(req, res);
24
22
  }
25
23
  switch (req.body._method) {
26
- case 'addMeta':
24
+ case "addMeta":
27
25
  return await manager.setMeta(req, res);
28
- case 'getMeta':
26
+ case "getMeta":
29
27
  return await manager.getMeta(req, res);
30
- case 'getChildren':
28
+ case "getChildren":
31
29
  return await manager.getVariants(req, res);
32
- case 'search':
30
+ case "search":
33
31
  return await manager.search(req, res);
34
32
  }
35
33
  }
36
- if (method === 'DELETE') {
34
+ if (method === "DELETE") {
37
35
  return await manager.delete(req, res);
38
36
  }
39
37
  }
@@ -1 +1 @@
1
- export default function register(req: ReqType, res: ResType): Promise<void | import("express").Response<any, Record<string, any>>>;
1
+ export default function register(req: ReqType, res: ResType): Promise<void | ResType>;
@@ -6,8 +6,8 @@ export default async function register(req, res) {
6
6
  return res.redirect(`${req.adminizer.config.routePrefix}/`);
7
7
  }
8
8
  const authModels = req.adminizer.modelHandler.internal("auth");
9
- const userModel = authModels.get("UserAP");
10
- const groupModel = authModels.get("GroupAP");
9
+ const userModel = authModels.get("User");
10
+ const groupModel = authModels.get("Group");
11
11
  if (req.method.toUpperCase() === "POST") {
12
12
  for (const key of ["login", "fullName", "password"]) {
13
13
  if (!req.body[key]) {
@@ -44,7 +44,7 @@ export default async function register(req, res) {
44
44
  try {
45
45
  let passwordHashed = generate(req.body.login + req.body.password + process.env.AP_PASSWORD_SALT);
46
46
  let password = 'masked';
47
- let userap = await userModel.create({
47
+ let User = await userModel.create({
48
48
  login: req.body.login,
49
49
  passwordHashed: passwordHashed,
50
50
  fullName: req.body.fullName,
@@ -53,9 +53,9 @@ export default async function register(req, res) {
53
53
  apiKey: generateUserApiKey()
54
54
  });
55
55
  let defaultUserGroup = await groupModel.findOne({ where: { name: req.adminizer.config.registration.defaultUserGroup } });
56
- await userModel.updateOne({ where: { id: userap.id } }, {
56
+ await userModel.updateOne({ where: { id: User.id } }, {
57
57
  groups: [defaultUserGroup.id]
58
- }); // instead of UserAP.addToCollection;
58
+ }); // instead of User.addToCollection;
59
59
  return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
60
60
  }
61
61
  catch (e) {
@@ -1 +1 @@
1
- export default function remove(req: ReqType, res: ResType): Promise<void | import("express").Response<any, Record<string, any>>>;
1
+ export default function remove(req: ReqType, res: ResType): Promise<void | ResType>;
@@ -10,7 +10,7 @@ export async function getUserApiKey(req, res) {
10
10
  if (!req.user.apiKey) {
11
11
  const newKey = generateUserApiKey();
12
12
  try {
13
- const userModel = req.adminizer.modelHandler.internal("auth").get("UserAP");
13
+ const userModel = req.adminizer.modelHandler.internal("auth").get("User");
14
14
  await userModel.updateOne({ where: { id: req.user.id } }, { apiKey: newKey });
15
15
  req.user.apiKey = newKey;
16
16
  }
@@ -24,7 +24,7 @@ export async function getUserApiKey(req, res) {
24
24
  export async function regenerateUserApiKey(req, res) {
25
25
  const newKey = generateUserApiKey();
26
26
  try {
27
- const userModel = req.adminizer.modelHandler.internal("auth").get("UserAP");
27
+ const userModel = req.adminizer.modelHandler.internal("auth").get("User");
28
28
  await userModel.updateOne({ where: { id: req.user.id } }, { apiKey: newKey });
29
29
  Adminizer.log.debug(`User ${req.user.id} regenerated their API key`);
30
30
  return res.json({ apiKey: newKey });
@@ -1 +1 @@
1
- export default function view(req: ReqType, res: ResType): Promise<void | import("express").Response<any, Record<string, any>>>;
1
+ export default function view(req: ReqType, res: ResType): Promise<void | ResType>;
@@ -30,10 +30,10 @@ export default async function view(req, res) {
30
30
  return res.status(500).send({ error: 'Internal Server Error' });
31
31
  }
32
32
  switch (modelResource.config.model) {
33
- case 'userap':
33
+ case 'User':
34
34
  let groups;
35
35
  try {
36
- groups = await req.adminizer.modelHandler.internal("users").get("GroupAP").find({});
36
+ groups = await req.adminizer.modelHandler.internal("users").get("Group").find({});
37
37
  }
38
38
  catch (e) {
39
39
  Adminizer.log.error(e);
@@ -43,17 +43,17 @@ export default async function view(req, res) {
43
43
  component: 'add-user',
44
44
  props: userProps
45
45
  });
46
- case 'groupap':
46
+ case 'Group':
47
47
  let users;
48
48
  try {
49
- users = await req.adminizer.modelHandler.internal("users").get("UserAP").find({ where: { isAdministrator: false } });
49
+ users = await req.adminizer.modelHandler.internal("users").get("User").find({ where: { isAdministrator: false } });
50
50
  }
51
51
  catch (e) {
52
52
  Adminizer.log.error(e);
53
53
  }
54
54
  let group;
55
55
  try {
56
- group = await req.adminizer.modelHandler.internal("users").get("GroupAP").findOne({ where: { id: Number(req.params.id) } });
56
+ group = await req.adminizer.modelHandler.internal("users").get("Group").findOne({ where: { id: Number(req.params.id) } });
57
57
  }
58
58
  catch (e) {
59
59
  Adminizer.log.error('Admin edit error: ');
@@ -9,8 +9,11 @@ export async function widgetActionController(req, res) {
9
9
  }
10
10
  else if (req.method.toUpperCase() === 'POST') {
11
11
  try {
12
- await widget.action();
13
- return res.json({ ok: true });
12
+ const data = await widget.action();
13
+ if (data && typeof data === "object" && !Array.isArray(data)) {
14
+ return res.json({ ok: true, ...data });
15
+ }
16
+ return res.json({ ok: true, data });
14
17
  }
15
18
  catch (error) {
16
19
  return res.json(error);
@@ -10,7 +10,7 @@ export async function widgetInfoController(req, res) {
10
10
  /** get state */
11
11
  if (req.method.toUpperCase() === 'GET') {
12
12
  try {
13
- let text = await widget.getInfo();
13
+ let text = await widget.getInfo({ user: req.user });
14
14
  return res.send(text);
15
15
  }
16
16
  catch (e) {
@@ -4,7 +4,7 @@ async function resolveDashboardUser(req) {
4
4
  return req.user;
5
5
  }
6
6
  const adminLogin = req.adminizer.config.administrator?.login ?? "admin";
7
- const userModel = req.adminizer.modelHandler.internal("widgets").get("UserAP");
7
+ const userModel = req.adminizer.modelHandler.internal("widgets").get("User");
8
8
  const user = await userModel.findOne({ where: { login: adminLogin } });
9
9
  return user ?? null;
10
10
  }
package/files/favicon.png CHANGED
Binary file
@@ -1,4 +1,4 @@
1
- import { UserAP } from "../models/UserAP";
1
+ import { User } from "../models/User";
2
2
  import { AccessRightsToken } from "../interfaces/types";
3
3
  import { Adminizer } from "../lib/Adminizer";
4
4
  export declare class AccessRightsHelper {
@@ -6,14 +6,16 @@ export declare class AccessRightsHelper {
6
6
  adminizer: Adminizer;
7
7
  constructor(adminizer: Adminizer);
8
8
  registerToken(accessRightsToken: AccessRightsToken): void;
9
+ unregisterToken(tokenId: string): boolean;
10
+ hasToken(tokenId: string): boolean;
9
11
  registerTokens(accessRightsTokens: AccessRightsToken[]): void;
10
12
  registerModelTokens(modelName: string, department?: string): void;
11
13
  getTokens(): AccessRightsToken[];
12
14
  getTokensByDepartment(department: string): AccessRightsToken[];
13
15
  getAllDepartments(): string[];
14
- enoughPermissions(tokens: string[], user: UserAP): boolean;
15
- hasPermission(tokenId: string | undefined, user: UserAP, context?: string): boolean;
16
+ enoughPermissions(tokens: string[], user: User): boolean;
17
+ hasPermission(tokenId: string | undefined, user: User, context?: string): boolean;
16
18
  }
17
19
  export declare class GroupsAccessRightsHelper {
18
- static hasAccess(user: UserAP, groupsAccessRights?: string[]): boolean;
20
+ static hasAccess(user: User, groupsAccessRights?: string[]): boolean;
19
21
  }
@@ -18,6 +18,19 @@ export class AccessRightsHelper {
18
18
  }
19
19
  this._tokens.push(accessRightsToken);
20
20
  }
21
+ unregisterToken(tokenId) {
22
+ const normalizedTokenId = tokenId.toLowerCase();
23
+ const index = this._tokens.findIndex((token) => token.id === normalizedTokenId);
24
+ if (index === -1) {
25
+ return false;
26
+ }
27
+ this._tokens.splice(index, 1);
28
+ return true;
29
+ }
30
+ hasToken(tokenId) {
31
+ const normalizedTokenId = tokenId.toLowerCase();
32
+ return this._tokens.some((token) => token.id === normalizedTokenId);
33
+ }
21
34
  registerTokens(accessRightsTokens) {
22
35
  for (let token of accessRightsTokens) {
23
36
  this.registerToken(token);
@@ -6,7 +6,7 @@ export function sanitizeForDiff(data) {
6
6
  const systemFields = ['id', 'createdAt', 'updatedAt', 'deletedAt', '__v', '_id'];
7
7
  systemFields.forEach(field => delete result[field]);
8
8
  // Cleaning sensitive data
9
- // TODO: Place in environment variables or config
9
+ // TODO: Place in environment variables or config & put in docs
10
10
  const sensitiveFields = ['password', 'token', 'secret', 'apiKey', 'creditCard'];
11
11
  sensitiveFields.forEach(field => {
12
12
  if (result[field] !== undefined) {
@@ -28,7 +28,7 @@ export declare class FieldsHelper {
28
28
  * @param {Object} fields
29
29
  * @param user
30
30
  * @param action
31
- * @deprecated use DataModel class
31
+ * @deprecated this method has overload association tree on each request that is not optimize
32
32
  */
33
33
  static loadAssociations(req: ReqType, fields: Fields, action?: ActionType): Promise<Fields>;
34
34
  }
@@ -8,8 +8,9 @@ export class FieldsHelper {
8
8
  * @param {Object} fields
9
9
  * @param user
10
10
  * @param action
11
- * @deprecated use DataModel class
11
+ * @deprecated this method has overload association tree on each request that is not optimize
12
12
  */
13
+ // TODO: make separate request for all dropdown relations by api call
13
14
  static async loadAssociations(req, fields, action) {
14
15
  /**
15
16
  * Load all associated records for given field key
@@ -29,7 +30,8 @@ export class FieldsHelper {
29
30
  Adminizer.log.error('No model found for field: ', fields[key]);
30
31
  return;
31
32
  }
32
- let Model = req.adminizer.modelHandler.model.get(modelName);
33
+ const resolvedModelName = req.adminizer.modelHandler.resolveModelName(modelName);
34
+ let Model = req.adminizer.modelHandler.model.get(resolvedModelName);
33
35
  if (!Model) {
34
36
  return;
35
37
  }
@@ -39,8 +41,10 @@ export class FieldsHelper {
39
41
  Adminizer.log.warn("Warning: executing malicious job trying to add a huge amount of records in field config," +
40
42
  " please rewrite this part of code in the nearest future");
41
43
  let modelResource = {
42
- name: modelName, config: req.adminizer.config.models[modelName],
43
- model: Model, uri: `${req.adminizer.config.routePrefix}/model/${modelName}`
44
+ name: resolvedModelName,
45
+ config: req.adminizer.config.models[resolvedModelName],
46
+ model: Model,
47
+ uri: `${req.adminizer.config.routePrefix}/model/${resolvedModelName}`
44
48
  };
45
49
  let dataAccessor = new DataAccessor(req.adminizer, req.user, modelResource, "view");
46
50
  list = await Model.find({}, dataAccessor);
@@ -1,4 +1,4 @@
1
- import { FilterCondition } from "../models/FilterAP";
1
+ import { FilterCondition } from "../models/Filter";
2
2
  export interface ConvertDatetimeConditionsOptions {
3
3
  dropEmptyValues?: boolean;
4
4
  }
@@ -1,7 +1,7 @@
1
1
  import { ModelResource, PropsField } from "../interfaces/types";
2
2
  import { Actions } from "./inertiaActionsHelper";
3
3
  import { Fields, Field } from "./fieldsHelper";
4
- import { AbstractControls, ControlType } from "../lib/controls/AbstractControls";
4
+ import { Control, ControlType } from "../lib/controls/Control";
5
5
  export type PropsFieldType = 'text' | 'number' | 'range' | 'week' | 'month' | 'email' | 'color' | 'time' | 'date' | 'datetime-local' | 'password' | 'select' | 'select-many' | 'association-many' | 'association' | 'textarea' | 'mediamanager' | 'single-file' | 'checkbox' | ControlType;
6
6
  interface FieldProps extends Record<string | number | symbol, unknown> {
7
7
  edit: boolean;
@@ -24,13 +24,14 @@ interface FieldProps extends Record<string | number | symbol, unknown> {
24
24
  model: string;
25
25
  }
26
26
  export default function inertiaAddHelper(req: ReqType, modelResource: ModelResource, fields: Fields, record?: Record<string, string | boolean | number | string[]>, view?: boolean): FieldProps;
27
- export declare function getControlsOptions(fieldConfig: Field["config"], req: ReqType, type: ControlType, defaultControlName: string): {
27
+ export declare function getControlsOptions(fieldConfig: Field["config"], req: ReqType, type: ControlType, defaultControlName: string, context?: string): {
28
28
  name: string;
29
29
  config: any;
30
- path: {};
30
+ path: string;
31
+ cssPath: string;
31
32
  };
32
- export declare function inputText(type: string, isIn: string[]): "email" | "password" | "date" | "time" | "number" | "color" | "month" | "week" | "range" | "text" | "select" | "datetime-local";
33
- export declare function getControl(req: ReqType, type: ControlType, name: string | undefined, defaultControlName: string): AbstractControls;
33
+ export declare function inputText(type: string, isIn: string[]): "email" | "password" | "month" | "text" | "number" | "date" | "time" | "color" | "week" | "range" | "select" | "datetime-local";
34
+ export declare function getControl(req: ReqType, type: ControlType, name: string | undefined, defaultControlName: string, context?: string): Control;
34
35
  export declare function setAssociationValues(field: Field, value: string[]): {
35
36
  initOptions: {
36
37
  label: any;
@@ -1,6 +1,7 @@
1
1
  import inertiaActionsHelper from "./inertiaActionsHelper.js";
2
- import chalk from "chalk";
3
2
  import { isObject } from "./JsUtils.js";
3
+ import { Adminizer } from "../lib/Adminizer.js";
4
+ const missingControlWarnings = new Set();
4
5
  /**
5
6
  * Get ISO week number from date
6
7
  * @param date - Date object
@@ -59,6 +60,7 @@ export default function inertiaAddHelper(req, modelResource, fields, record, vie
59
60
  let value = record ? record[key] : undefined;
60
61
  let relatedModel = undefined;
61
62
  let canCreateRelated = false;
63
+ const controlContext = `${modelResource.name}.${key}`;
62
64
  //@ts-ignore TODO: fix field type
63
65
  if (modelResource.config.model && req.adminizer.configHelper.isId(field, modelResource.config.model)) {
64
66
  disabled = true;
@@ -111,7 +113,10 @@ export default function inertiaAddHelper(req, modelResource, fields, record, vie
111
113
  const { initValue, initOptions } = setAssociationValues(field, value);
112
114
  options = initOptions;
113
115
  value = initValue;
114
- relatedModel = (field.model?.model || field.model?.collection);
116
+ const rawRelatedModel = (field.model?.model || field.model?.collection);
117
+ relatedModel = rawRelatedModel
118
+ ? req.adminizer.modelHandler.resolveModelName(rawRelatedModel)
119
+ : undefined;
115
120
  if (relatedModel && req.user) {
116
121
  canCreateRelated = req.adminizer.accessRightsHelper.hasPermission(`create-${relatedModel}-model`, req.user);
117
122
  }
@@ -127,27 +132,27 @@ export default function inertiaAddHelper(req, modelResource, fields, record, vie
127
132
  }
128
133
  if (['ckeditor', 'wysiwyg', 'texteditor', 'word'].includes(type)) {
129
134
  fieldType = 'wysiwyg';
130
- options = getControlsOptions(fieldConfig, req, fieldType, 'ckeditor');
135
+ options = getControlsOptions(fieldConfig, req, fieldType, 'ckeditor', controlContext);
131
136
  }
132
137
  if (['tui', 'tuieditor', 'toast-ui'].includes(type)) {
133
138
  fieldType = 'markdown';
134
- options = getControlsOptions(fieldConfig, req, fieldType, 'toast-ui');
139
+ options = getControlsOptions(fieldConfig, req, fieldType, 'toast-ui', controlContext);
135
140
  }
136
141
  if (type === 'table') {
137
142
  fieldType = 'table';
138
- options = getControlsOptions(fieldConfig, req, fieldType, 'handsontable');
143
+ options = getControlsOptions(fieldConfig, req, fieldType, 'handsontable', controlContext);
139
144
  }
140
145
  if (['jsoneditor', 'json', 'array', 'object'].includes(type)) {
141
146
  fieldType = 'jsonEditor';
142
- options = getControlsOptions(fieldConfig, req, fieldType, 'jsoneditor');
147
+ options = getControlsOptions(fieldConfig, req, fieldType, 'jsoneditor', controlContext);
143
148
  }
144
149
  if (['ace', 'html', 'xml', 'aceeditor', 'code'].includes(type)) {
145
150
  fieldType = 'codeEditor';
146
- options = getControlsOptions(fieldConfig, req, fieldType, 'monaco');
151
+ options = getControlsOptions(fieldConfig, req, fieldType, 'monaco', controlContext);
147
152
  }
148
153
  if (['geojson', 'geo-polygon', 'geo-marker'].includes(type)) {
149
154
  fieldType = 'geoJson';
150
- options = getControlsOptions(fieldConfig, req, fieldType, 'leaflet');
155
+ options = getControlsOptions(fieldConfig, req, fieldType, 'leaflet', controlContext);
151
156
  }
152
157
  if (type === 'mediamanager' || type === 'single-file') {
153
158
  const mConfig = field.config;
@@ -177,30 +182,28 @@ export default function inertiaAddHelper(req, modelResource, fields, record, vie
177
182
  }
178
183
  return props;
179
184
  }
180
- export function getControlsOptions(fieldConfig, req, type, defaultControlName) {
185
+ export function getControlsOptions(fieldConfig, req, type, defaultControlName, context) {
181
186
  if (!isObject(fieldConfig))
182
187
  throw `Type error: fieldConfig is object`;
183
188
  const fieldOptions = fieldConfig?.options;
184
- let control = getControl(req, type, fieldOptions?.name, defaultControlName);
185
- let editorName = control.getName();
186
- let options = {
189
+ const control = getControl(req, type, fieldOptions?.name, defaultControlName, context);
190
+ const editorName = control.getName();
191
+ const shouldUseFieldConfig = !fieldOptions?.name || fieldOptions.name === editorName;
192
+ const options = {
187
193
  name: editorName,
188
194
  config: {
189
195
  ...(control?.getConfig() || {}), // Base config of the editor
190
- ...(fieldOptions?.config || {}), // Additional config provided in the field config
196
+ ...(shouldUseFieldConfig ? fieldOptions?.config || {} : {}),
191
197
  },
192
- path: control?.getJsPath() || {},
198
+ path: control.getJsPath(),
199
+ cssPath: control.getCssPath(),
193
200
  };
194
- if (type === 'wysiwyg') {
195
- let options = {
196
- name: editorName,
197
- config: control?.getConfig() || {},
198
- path: control?.getJsPath() || {},
199
- };
200
- // If items are provided, use them instead of the editor's config
201
- if (fieldOptions?.config?.items && editorName === 'ckeditor') {
202
- options.config = { items: fieldOptions.config.items };
203
- }
201
+ // If items are provided, use them instead of the CKEditor defaults.
202
+ if (type === 'wysiwyg'
203
+ && editorName === 'ckeditor'
204
+ && shouldUseFieldConfig
205
+ && fieldOptions?.config?.items) {
206
+ options.config = { items: fieldOptions.config.items };
204
207
  }
205
208
  return options;
206
209
  }
@@ -237,21 +240,26 @@ export function inputText(type, isIn) {
237
240
  }
238
241
  }
239
242
  }
240
- export function getControl(req, type, name, defaultControlName) {
241
- let control;
242
- let editorName = defaultControlName; // default editor name
243
- // Determine which editor to use
243
+ export function getControl(req, type, name, defaultControlName, context) {
244
+ const requestedControlName = name ?? defaultControlName;
245
+ const requestedControl = req.adminizer.controlsHandler.get(type, requestedControlName);
246
+ if (requestedControl) {
247
+ return requestedControl;
248
+ }
244
249
  if (name) {
245
- editorName = name;
250
+ const warningKey = `${context ?? "unknown"}:${type}:${name}:${defaultControlName}`;
251
+ if (!missingControlWarnings.has(warningKey)) {
252
+ missingControlWarnings.add(warningKey);
253
+ Adminizer.log.warn(`Control "${name}" for ${context ?? `type "${type}"`} is unavailable; ` +
254
+ `falling back to "${defaultControlName}".`);
255
+ }
246
256
  }
247
- // Get the editor instance
248
- control = req.adminizer.controlsHandler.get(type, editorName);
249
- // Fallback to ckeditor if specified editor not found
250
- if (!control) {
251
- console.log(chalk.yellow(`Control ${type} - ${name} not found, falling back to default`));
252
- control = req.adminizer.controlsHandler.get(type, defaultControlName);
257
+ const defaultControl = req.adminizer.controlsHandler.get(type, defaultControlName);
258
+ if (!defaultControl) {
259
+ throw new Error(`Default control "${defaultControlName}" for type "${type}" is not registered` +
260
+ (context ? ` (${context})` : ""));
253
261
  }
254
- return control;
262
+ return defaultControl;
255
263
  }
256
264
  export function setAssociationValues(field, value) {
257
265
  let options = [];
@@ -282,7 +290,7 @@ export function setAssociationValues(field, value) {
282
290
  };
283
291
  for (let opt of config.records) {
284
292
  const optAny = opt;
285
- const displayField = typeof field.modelConfig.titleField !== 'undefined'
293
+ const displayField = typeof field.modelConfig?.titleField !== 'undefined'
286
294
  ? field.modelConfig.titleField
287
295
  : typeof optAny.title !== 'undefined'
288
296
  ? 'title'