adminizer 4.1.0-commit.ad1476a → 4.1.1

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 (292) hide show
  1. package/Readme.md +46 -0
  2. package/assets/{VanillaJSONEditor-FUe77pIA.js → VanillaJSONEditor-DfRefswH.js} +104 -104
  3. package/assets/add-CJ1-zeA1.js +1 -0
  4. package/assets/add-form-CbNl0wdS.js +1 -0
  5. package/assets/add-group-form-Bt_Dx9wm.js +1 -0
  6. package/assets/add-group-pIFJV5qL.js +1 -0
  7. package/assets/add-user-D2US8hL_.js +1 -0
  8. package/assets/add-user-form-Bt8Jy6S2.js +1 -0
  9. package/assets/{app-DMmad2-f.css → app-B6cCPfWk.css} +1 -1
  10. package/assets/app-layout-B86jl9bH.js +1 -0
  11. package/assets/app-shell-CiGyzQ0C.js +1 -0
  12. package/assets/app-sidebar-Bz-SRwBg.js +1 -0
  13. package/assets/app-sidebar-header-7CNCx7Rs.js +11 -0
  14. package/assets/app.js +45 -37
  15. package/assets/breadcrumbs-_jhtTcOi.js +1 -0
  16. package/assets/catalog-CON6moaA.js +16 -0
  17. package/assets/catalog-Cc6Mk9sX.css +1 -0
  18. package/assets/checkbox-CQdZw5mb.js +1 -0
  19. package/assets/dashboard-BOltB2Hq.css +1 -0
  20. package/assets/dashboard-es9ZT8qk.js +3 -0
  21. package/assets/{date-picker-B__dVVqj.js → date-picker-Dz-d-YWX.js} +2 -2
  22. package/assets/debounce-qdyXyOeG.js +1 -0
  23. package/assets/del-modal-D0mrZvki.js +11 -0
  24. package/assets/dialog-stack-BiMbfm58.js +1 -0
  25. package/assets/dropdown-menu-BSBcRiXx.js +1 -0
  26. package/assets/{field-renderer-CapylJU9.js → field-renderer-B6hFAeiU.js} +3 -3
  27. package/assets/form-Buslty7y.js +1 -0
  28. package/assets/form-aqiRmPix.js +1 -0
  29. package/assets/{geo-json-CwteYDGB.js → geo-json-BKmYmu3d.js} +2 -2
  30. package/assets/{handsontable-BCnjOpBr.js → handsontable-B8xVeMAQ.js} +5 -5
  31. package/assets/home-Dr72Jk-w.js +2 -0
  32. package/assets/icon-B-a7xg54.js +1 -0
  33. package/assets/index-B68_akQe.js +1 -0
  34. package/assets/index-B7-xTDyy.js +1 -0
  35. package/assets/index-BJFFlCSo.js +1 -0
  36. package/assets/{index-DTRTjOmh.js → index-BOuMo_nl.js} +3 -3
  37. package/assets/index-BzOcGsBq.js +1 -0
  38. package/assets/index-CFbQ2Rv0.js +1 -0
  39. package/assets/{index-D5ir9iUV.js → index-Cq31rrfZ.js} +1 -1
  40. package/assets/{index-BcE9FUM6.js → index-D5UDXTFs.js} +1 -1
  41. package/assets/index-oxIQWAdI.js +41 -0
  42. package/assets/init-user-5H689LP0.js +1 -0
  43. package/assets/input-CSJjrf2i.js +1 -0
  44. package/assets/input-error-CK92Shhm.js +1 -0
  45. package/assets/label-Muj0-Efy.js +1 -0
  46. package/assets/list-Cvh7zbyG.js +1 -0
  47. package/assets/list-table-Bs_vbQiV.js +52 -0
  48. package/assets/login-DliJrjMQ.js +6 -0
  49. package/assets/manifest.json +589 -666
  50. package/assets/material-icon-BRS58Qpk.js +1 -0
  51. package/assets/module-CjG21VCT.js +1 -0
  52. package/assets/{monaco-editor-DqAqwxw4.js → monaco-editor-9fDiyfuW.js} +2 -2
  53. package/assets/{multi-select-oabtVhUP.js → multi-select-CMQIJ0JT.js} +2 -2
  54. package/assets/nav-footer-IGMn9NiE.js +1 -0
  55. package/assets/nav-main-DBE4rMiZ.js +1 -0
  56. package/assets/nav-user-CjyLRyq-.js +1 -0
  57. package/assets/pagination-render-DUAq2klc.js +1 -0
  58. package/assets/popover-C_cww-4_.js +1 -0
  59. package/assets/register-UzQn3J0g.js +1 -0
  60. package/assets/{select-D1N8zRPY.js → select-DzBno-dc.js} +2 -2
  61. package/assets/{sidebar-4D-sX2l4.js → sidebar-Dc4iqfu-.js} +2 -2
  62. package/assets/skeleton-Dkmj2o2Z.js +1 -0
  63. package/assets/sonner-De1t71Gj.js +1 -0
  64. package/assets/{toast-editor-FbrFd1ft.js → toast-editor-1Pul3oMs.js} +2 -2
  65. package/assets/tooltip-CwPrC-HD.js +1 -0
  66. package/assets/use-appearance-J8J2w43p.js +1 -0
  67. package/assets/use-window-size-DLSEoR6e.js +1 -0
  68. package/assets/{user-info-DBYoAJYJ.js → user-info-8RyDk7qh.js} +2 -2
  69. package/assets/user-menu-content-CpxTLH56.js +6 -0
  70. package/assets/welcome-BYKI6yO-.js +1 -0
  71. package/controllers/add.js +10 -10
  72. package/controllers/addGroup.js +2 -4
  73. package/controllers/addUser.js +4 -6
  74. package/controllers/catalog/Catalog.d.ts +1 -1
  75. package/controllers/catalog/Catalog.js +42 -37
  76. package/controllers/catalog/FrontentCatalogAdapter.d.ts +36 -26
  77. package/controllers/catalog/FrontentCatalogAdapter.js +71 -73
  78. package/controllers/ckeditorUpload.js +2 -3
  79. package/controllers/dashboard.js +16 -2
  80. package/controllers/edit.js +10 -14
  81. package/controllers/editGroup.js +2 -4
  82. package/controllers/editUser.js +3 -5
  83. package/controllers/form.js +2 -3
  84. package/controllers/getAllWidgets.js +3 -3
  85. package/controllers/initUser.js +1 -2
  86. package/controllers/list.js +6 -6
  87. package/controllers/login.js +43 -18
  88. package/controllers/media-manager/mediaManagerAdapter.js +1 -2
  89. package/controllers/media-manager/mediaManagerApi.js +2 -2
  90. package/controllers/navigation/edit.js +2 -2
  91. package/controllers/register.js +1 -4
  92. package/controllers/remove.js +3 -3
  93. package/controllers/timezones.js +1 -1
  94. package/controllers/view.js +3 -3
  95. package/controllers/welcome.js +1 -1
  96. package/controllers/widgets/Action.js +2 -2
  97. package/controllers/widgets/Custom.js +2 -2
  98. package/controllers/widgets/Info.js +2 -2
  99. package/controllers/widgets/switch.js +2 -2
  100. package/controllers/widgetsDB.js +5 -5
  101. package/helpers/JsUtils.d.ts +1 -0
  102. package/helpers/JsUtils.js +3 -0
  103. package/helpers/accessRightsHelper.d.ts +6 -2
  104. package/helpers/accessRightsHelper.js +28 -5
  105. package/helpers/configHelper.js +2 -1
  106. package/helpers/controllerHelper.js +39 -18
  107. package/helpers/fieldsHelper.d.ts +4 -3
  108. package/helpers/fieldsHelper.js +5 -1
  109. package/helpers/inertiaActionsHelper.js +1 -1
  110. package/helpers/inertiaAddHelper.d.ts +3 -4
  111. package/helpers/inertiaAddHelper.js +27 -7
  112. package/helpers/inertiaFromHelper.js +2 -0
  113. package/helpers/inertiaGroupHelper.d.ts +4 -2
  114. package/helpers/inertiaGroupHelper.js +1 -1
  115. package/helpers/inertiaListHelper.js +5 -5
  116. package/helpers/inertiaMenuHelper.d.ts +1 -1
  117. package/helpers/inertiaMenuHelper.js +2 -2
  118. package/helpers/inertiaUserHelper.d.ts +7 -1
  119. package/helpers/inertiaUserHelper.js +5 -1
  120. package/helpers/menuHelper.d.ts +8 -3
  121. package/helpers/menuHelper.js +26 -17
  122. package/index.d.ts +6 -3
  123. package/index.js +9 -3
  124. package/interfaces/adminpanelConfig.d.ts +41 -32
  125. package/interfaces/global.d.ts +10 -28
  126. package/interfaces/types.d.ts +1 -1
  127. package/lib/Adminizer.d.ts +11 -3
  128. package/lib/Adminizer.js +49 -17
  129. package/lib/media-manager/AbstractMediaManager.d.ts +2 -2
  130. package/lib/media-manager/AbstractMediaManager.js +1 -1
  131. package/lib/media-manager/Items.js +0 -3
  132. package/lib/requestProcessor.js +10 -3
  133. package/lib/v4/DataAccessor.d.ts +5 -2
  134. package/lib/v4/DataAccessor.js +44 -19
  135. package/lib/v4/I18n.js +2 -0
  136. package/lib/v4/POWCaptcha.js +0 -1
  137. package/lib/v4/PolicyManager.js +0 -1
  138. package/lib/{catalog → v4/catalog}/AbstractCatalog.d.ts +89 -60
  139. package/lib/{catalog → v4/catalog}/AbstractCatalog.js +59 -55
  140. package/lib/v4/catalog/Navigation.d.ts +43 -0
  141. package/lib/v4/catalog/Navigation.js +457 -0
  142. package/lib/{controls → v4/controls}/AbstractControls.d.ts +1 -1
  143. package/lib/{controls → v4/controls}/codeEditor/MonacoEditor.d.ts +1 -1
  144. package/lib/{controls → v4/controls}/geojsoneditor/GeoEditor.d.ts +1 -1
  145. package/lib/{controls → v4/controls}/jsoneditor/JsonEditor.d.ts +1 -1
  146. package/lib/{controls → v4/controls}/markdown/ToastUiEditor.d.ts +1 -1
  147. package/lib/{controls → v4/controls}/table/Handsontable.d.ts +1 -1
  148. package/lib/{controls → v4/controls}/wysiwyg/CKeditor.d.ts +1 -1
  149. package/lib/{datatable → v4/datatable}/NodeTable.d.ts +3 -3
  150. package/lib/{datatable → v4/datatable}/NodeTable.js +8 -8
  151. package/lib/v4/helper/jwt.d.ts +10 -0
  152. package/lib/v4/helper/jwt.js +18 -0
  153. package/lib/{inertia → v4/inertia}/inertiaAdapter.js +0 -1
  154. package/lib/v4/model/AbstractModel.d.ts +5 -1
  155. package/lib/v4/model/AbstractModel.js +2 -3
  156. package/lib/v4/model/ModelHandler.js +1 -4
  157. package/lib/v4/model/adapter/sequelize.d.ts +11 -2
  158. package/lib/v4/model/adapter/sequelize.js +451 -118
  159. package/lib/v4/model/adapter/waterline.js +5 -3
  160. package/lib/{widgets → v4/widgets}/abstractAction.d.ts +1 -1
  161. package/lib/v4/widgets/abstractCustom.d.ts +28 -0
  162. package/lib/v4/widgets/abstractCustom.js +9 -0
  163. package/lib/{widgets → v4/widgets}/abstractInfo.d.ts +1 -1
  164. package/lib/{widgets → v4/widgets}/abstractInfo.js +1 -1
  165. package/lib/{widgets → v4/widgets}/abstractLink.d.ts +2 -1
  166. package/lib/{widgets → v4/widgets}/abstractSwitch.d.ts +1 -1
  167. package/lib/{widgets → v4/widgets}/abstractWidgetBase.d.ts +2 -2
  168. package/lib/{widgets → v4/widgets}/widgetHandler.d.ts +29 -5
  169. package/lib/{widgets → v4/widgets}/widgetHandler.js +25 -25
  170. package/models/GroupAP.d.ts +8 -0
  171. package/models/NavigationAP.d.ts +7 -3
  172. package/models/NavigationAP.js +5 -6
  173. package/models/UserAP.d.ts +24 -2
  174. package/models/UserAP.js +2 -2
  175. package/package.json +29 -11
  176. package/policies/checkAuth.js +4 -3
  177. package/policies/setLocale.js +2 -2
  178. package/system/Router.js +14 -17
  179. package/system/bindAccessRights.js +0 -4
  180. package/system/bindAuthorization.js +4 -5
  181. package/system/bindControls.js +6 -6
  182. package/system/bindDev.js +1 -0
  183. package/system/bindInertia.js +17 -12
  184. package/system/bindMediaManager.js +0 -1
  185. package/system/bindModels.js +9 -6
  186. package/system/bindNavigation.d.ts +2 -0
  187. package/system/bindNavigation.js +42 -42
  188. package/system/bindReqFunctions.js +15 -0
  189. package/system/defaults.js +13 -6
  190. package/translations/ar.json +70 -1
  191. package/translations/cn.json +70 -1
  192. package/translations/de.json +71 -3
  193. package/translations/en.json +70 -102
  194. package/translations/es.json +70 -1
  195. package/translations/fr.json +70 -1
  196. package/translations/hi.json +70 -1
  197. package/translations/jp.json +70 -1
  198. package/translations/ko.json +70 -1
  199. package/translations/pt.json +70 -1
  200. package/translations/ru.json +71 -94
  201. package/translations/ua.json +70 -1
  202. package/translations/uz.json +72 -0
  203. package/translations/vi.json +70 -1
  204. package/assets/add-ZITr43GJ.js +0 -1
  205. package/assets/add-form-CYOfr0Ef.js +0 -1
  206. package/assets/add-group-B332wN8K.js +0 -1
  207. package/assets/add-group-form-dzadPSfL.js +0 -1
  208. package/assets/add-user-TC-mYdsB.js +0 -1
  209. package/assets/add-user-form-y2f_1_lM.js +0 -1
  210. package/assets/app-layout-D1m9Kvxq.js +0 -1
  211. package/assets/app-shell-BWMRMkHM.js +0 -1
  212. package/assets/app-sidebar-BCtaEFGb.js +0 -1
  213. package/assets/app-sidebar-header-DLAFi13E.js +0 -11
  214. package/assets/breadcrumbs-CQNon4Vl.js +0 -1
  215. package/assets/button-CQ9t1kLz.js +0 -1
  216. package/assets/checkbox-W0nGAXIj.js +0 -1
  217. package/assets/compiler-runtime-tM4jBQ-T.js +0 -9
  218. package/assets/dashboard-BR602KhL.js +0 -1
  219. package/assets/dropdown-menu-SEBnEIiL.js +0 -1
  220. package/assets/form-DOUNk3o2.js +0 -1
  221. package/assets/form-lOKv4Qbw.js +0 -1
  222. package/assets/home-Ch6QfTIt.js +0 -2
  223. package/assets/icon-Bz9BMaD0.js +0 -1
  224. package/assets/index-BC0yfOHo.js +0 -1
  225. package/assets/index-BbXEMx9n.js +0 -1
  226. package/assets/index-C0SL3SHw.js +0 -41
  227. package/assets/index-Cdb9ACvz.js +0 -1
  228. package/assets/index-DEk3sC8d.js +0 -1
  229. package/assets/index-DrWfGwtf.js +0 -1
  230. package/assets/index-K81GbF6O.js +0 -1
  231. package/assets/init-user-D9mW-g14.js +0 -1
  232. package/assets/input-DF7Ue23C.js +0 -1
  233. package/assets/input-error-BBygona6.js +0 -1
  234. package/assets/label-Z506NKsW.js +0 -1
  235. package/assets/list-Qyd7ecQH.js +0 -1
  236. package/assets/list-table-DB1sEQLF.js +0 -62
  237. package/assets/login-DrGaTWhY.js +0 -6
  238. package/assets/material-icon-CItZiB53.js +0 -1
  239. package/assets/module-DBaykv8l.js +0 -1
  240. package/assets/nav-footer-CM-yHiRs.js +0 -1
  241. package/assets/nav-main-Q3xofGRT.js +0 -1
  242. package/assets/nav-user-Ds8i0Pa2.js +0 -1
  243. package/assets/pagination-render-B57pOpFy.js +0 -1
  244. package/assets/popover-I249Gg2O.js +0 -1
  245. package/assets/register-C9FQIDtS.js +0 -1
  246. package/assets/sonner-Dzckw3U3.js +0 -1
  247. package/assets/tooltip-D2ehgLlB.js +0 -1
  248. package/assets/use-appearance-Co6mO0dV.js +0 -1
  249. package/assets/use-window-size-B8l6Bpkf.js +0 -1
  250. package/assets/user-menu-content-qkvdkUVd.js +0 -6
  251. package/assets/utils-DjqsqOe8.js +0 -1
  252. package/assets/welcome-D2adQ8EU.js +0 -1
  253. package/controllers/processInstallFinalize.d.ts +0 -1
  254. package/controllers/processInstallFinalize.js +0 -16
  255. package/controllers/processInstallStep.d.ts +0 -1
  256. package/controllers/processInstallStep.js +0 -132
  257. package/lib/catalog/Navigation.d.ts +0 -0
  258. package/lib/catalog/Navigation.js +0 -532
  259. package/lib/installStepper/InstallStepAbstract.d.ts +0 -52
  260. package/lib/installStepper/InstallStepAbstract.js +0 -69
  261. package/lib/installStepper/finalizeStep.d.ts +0 -21
  262. package/lib/installStepper/finalizeStep.js +0 -48
  263. package/lib/installStepper/installStepper.d.ts +0 -40
  264. package/lib/installStepper/installStepper.js +0 -195
  265. package/lib/widgets/abstractCustom.d.ts +0 -13
  266. package/lib/widgets/abstractCustom.js +0 -3
  267. package/models/MediaManagerAP.d.ts +0 -46
  268. package/models/MediaManagerAP.js +0 -45
  269. package/models/MediaManagerAssociationsAP.d.ts +0 -28
  270. package/models/MediaManagerAssociationsAP.js +0 -27
  271. package/models/MediaManagerMetaAP.d.ts +0 -22
  272. package/models/MediaManagerMetaAP.js +0 -21
  273. package/system/bindInstallStepper.d.ts +0 -2
  274. package/system/bindInstallStepper.js +0 -23
  275. /package/lib/{catalog → v4/catalog}/CatalogHandler.d.ts +0 -0
  276. /package/lib/{catalog → v4/catalog}/CatalogHandler.js +0 -0
  277. /package/lib/{controls → v4/controls}/AbstractControls.js +0 -0
  278. /package/lib/{controls → v4/controls}/ControlsHandler.d.ts +0 -0
  279. /package/lib/{controls → v4/controls}/ControlsHandler.js +0 -0
  280. /package/lib/{controls → v4/controls}/codeEditor/MonacoEditor.js +0 -0
  281. /package/lib/{controls → v4/controls}/geojsoneditor/GeoEditor.js +0 -0
  282. /package/lib/{controls → v4/controls}/jsoneditor/JsonEditor.js +0 -0
  283. /package/lib/{controls → v4/controls}/markdown/ToastUiEditor.js +0 -0
  284. /package/lib/{controls → v4/controls}/table/Handsontable.js +0 -0
  285. /package/lib/{controls → v4/controls}/wysiwyg/CKeditor.js +0 -0
  286. /package/lib/{inertia → v4/inertia}/flash.d.ts +0 -0
  287. /package/lib/{inertia → v4/inertia}/flash.js +0 -0
  288. /package/lib/{inertia → v4/inertia}/inertiaAdapter.d.ts +0 -0
  289. /package/lib/{widgets → v4/widgets}/abstractAction.js +0 -0
  290. /package/lib/{widgets → v4/widgets}/abstractLink.js +0 -0
  291. /package/lib/{widgets → v4/widgets}/abstractSwitch.js +0 -0
  292. /package/lib/{widgets → v4/widgets}/abstractWidgetBase.js +0 -0
@@ -1,15 +1,15 @@
1
1
  export default async function getAllWidgets(req, res) {
2
2
  if (req.adminizer.config.auth.enable) {
3
- if (!req.session.UserAP) {
3
+ if (!req.user) {
4
4
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
5
5
  }
6
- else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.session.UserAP)) {
6
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.user)) {
7
7
  return res.sendStatus(403);
8
8
  }
9
9
  }
10
10
  if (req.method.toUpperCase() === 'GET') {
11
11
  try {
12
- return res.json({ widgets: await req.adminizer.widgetHandler.getAll(req.session.UserAP) });
12
+ return res.json({ widgets: await req.adminizer.widgetHandler.getAll(req.user, req.i18n) });
13
13
  }
14
14
  catch (e) {
15
15
  return res.status(500).send({ error: e.message || 'Internal Server Error' });
@@ -29,12 +29,11 @@ export default async function initUser(req, res) {
29
29
  }
30
30
  try {
31
31
  Adminizer.log.debug(`Created admin`);
32
- let passwordHashed = generate(login + password);
32
+ let passwordHashed = generate(login + password + process.env.AP_PASSWORD_SALT);
33
33
  password = 'masked';
34
34
  // TODO refactor CRUD functions for DataAccessor usage
35
35
  await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
36
36
  login: login,
37
- password: password,
38
37
  passwordHashed: passwordHashed,
39
38
  fullName: "Administrator",
40
39
  isActive: true,
@@ -1,6 +1,6 @@
1
1
  import { ControllerHelper } from "../helpers/controllerHelper";
2
2
  import { DataAccessor } from "../lib/v4/DataAccessor";
3
- import { NodeTable } from "../lib/datatable/NodeTable";
3
+ import { NodeTable } from "../lib/v4/datatable/NodeTable";
4
4
  import { Adminizer } from "../lib/Adminizer";
5
5
  import { inertiaListHelper } from "../helpers/inertiaListHelper";
6
6
  export default async function list(req, res) {
@@ -9,14 +9,14 @@ export default async function list(req, res) {
9
9
  return res.status(404).send({ error: 'Not Found' });
10
10
  }
11
11
  if (req.adminizer.config.auth.enable) {
12
- if (!req.session.UserAP) {
12
+ if (!req.user) {
13
13
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
14
14
  }
15
- else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.session.UserAP)) {
15
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
16
16
  return res.sendStatus(403);
17
17
  }
18
18
  }
19
- let dataAccessor = new DataAccessor(req, entity, "list");
19
+ let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "list");
20
20
  let fields = dataAccessor.getFieldsConfig();
21
21
  const header = inertiaListHelper(entity, req, fields);
22
22
  let start = "0";
@@ -46,8 +46,8 @@ export default async function list(req, res) {
46
46
  const searchMap = new Map();
47
47
  for (let i = 0; i < searchColumns.length; i++) {
48
48
  const column = searchColumns[i];
49
- const value = searchColumnValues[i] || ""; // Если нет значения, ставим пустую строку
50
- searchMap.set(column, value); // Если column повторяется, перезаписываем
49
+ const value = searchColumnValues[i] || "";
50
+ searchMap.set(column, value);
51
51
  }
52
52
  const searchPairs = Array.from(searchMap.entries()).map(([column, value]) => ({
53
53
  column,
@@ -1,6 +1,9 @@
1
1
  import { POWCaptcha } from "../lib/v4/POWCaptcha";
2
2
  import passwordHash from "password-hash";
3
3
  import { inertiaLoginHelper } from "../helpers/inertiaAutHelper";
4
+ import { Adminizer } from "../lib/Adminizer";
5
+ import { signUser } from "../lib/v4/helper/jwt";
6
+ import { serialize } from "cookie";
4
7
  export default async function login(req, res) {
5
8
  const powCaptcha = new POWCaptcha();
6
9
  if (req.originalUrl.indexOf("login") >= 0) {
@@ -11,11 +14,6 @@ export default async function login(req, res) {
11
14
  let login = req.body.login;
12
15
  let password = req.body.password;
13
16
  let captchaSolution = req.body.captchaSolution;
14
- // Verify CAPTCHA solution
15
- const isCaptchaValid = powCaptcha.check(captchaSolution, `login:${req.ip}`);
16
- if (!isCaptchaValid) {
17
- return inertiaAdminMessage(req, "Invalid CAPTCHA solution", 'captchaSolution');
18
- }
19
17
  let user;
20
18
  try {
21
19
  // TODO refactor CRUD functions for DataAccessor usage
@@ -28,10 +26,18 @@ export default async function login(req, res) {
28
26
  if (!user) {
29
27
  return res.sendStatus(404);
30
28
  }
31
- if (req.session.UserAP.isAdministrator) {
32
- req.session.adminPretender = req.session.UserAP;
33
- req.session.UserAP = user;
34
- return res.sendStatus(200);
29
+ if (req.user.isAdministrator) {
30
+ req.session.userPretended = user;
31
+ // return res.sendStatus(200);
32
+ return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
33
+ }
34
+ return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/`);
35
+ }
36
+ // Verify CAPTCHA solution if enabled
37
+ if (req.adminizer.config.auth.captcha !== false) {
38
+ const isCaptchaValid = powCaptcha.check(captchaSolution, `login:${req.ip}`);
39
+ if (!isCaptchaValid) {
40
+ return inertiaAdminMessage(req, "Invalid CAPTCHA solution", 'captchaSolution');
35
41
  }
36
42
  }
37
43
  if (!user) {
@@ -42,12 +48,18 @@ export default async function login(req, res) {
42
48
  //Here we use the captchaSolution key to output messages unrelated to the form fields.
43
49
  return inertiaAdminMessage(req, "Profile is not confirmed, please contact to administrator", 'captchaSolution');
44
50
  }
45
- if (passwordHash.verify(login + password, user.passwordHashed)) {
51
+ if (passwordHash.verify(login + password + process.env.AP_PASSWORD_SALT, user.passwordHashed)) {
46
52
  if (user.expires && Date.now() > Date.parse(user.expires)) {
47
53
  //Here we use the captchaSolution key to output messages unrelated to the form fields.
48
54
  return inertiaAdminMessage(req, "Profile expired, contact the administrator", 'captchaSolution');
49
55
  }
50
- req.session.UserAP = user;
56
+ const token = signUser(user, req.adminizer.jwtSecret);
57
+ res.setHeader('Set-Cookie', serialize('adminizer_jwt', token, {
58
+ httpOnly: true,
59
+ sameSite: 'lax',
60
+ path: '/',
61
+ maxAge: 60 * 60 * 24 * 7 * 2,
62
+ }));
51
63
  return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
52
64
  }
53
65
  else {
@@ -56,8 +68,11 @@ export default async function login(req, res) {
56
68
  }
57
69
  }
58
70
  if (req.method.toUpperCase() === "GET") {
59
- // Generate new CAPTCHA job
60
- const captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
71
+ // Generate new CAPTCHA task if enabled
72
+ let captchaTask = [];
73
+ if (req.adminizer.config.auth.captcha !== false) {
74
+ captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
75
+ }
61
76
  return req.Inertia.render({
62
77
  component: 'login',
63
78
  props: {
@@ -69,19 +84,29 @@ export default async function login(req, res) {
69
84
  }
70
85
  }
71
86
  else if (req.originalUrl.indexOf("logout") >= 0) {
72
- if (req.session.adminPretender && req.session.adminPretender.id && req.session.UserAP && req.session.UserAP.id) {
73
- req.session.UserAP = req.session.adminPretender;
74
- req.session.adminPretender = {};
87
+ if (req.session.userPretended && req.session.userPretended.id && req.user && req.user.id) {
88
+ delete (req.session.userPretended);
75
89
  return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/`);
76
90
  }
77
- req.session.UserAP = undefined;
91
+ req.user = undefined;
92
+ res.setHeader('Set-Cookie', serialize('adminizer_jwt', '', {
93
+ httpOnly: true,
94
+ sameSite: 'lax',
95
+ path: '/',
96
+ expires: new Date(0),
97
+ }));
78
98
  req.Inertia.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
79
99
  }
80
100
  return res.status(404);
81
101
  }
82
102
  async function inertiaAdminMessage(req, message, messageType) {
103
+ Adminizer.log.warn(message);
83
104
  const powCaptcha = new POWCaptcha();
84
- const captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
105
+ // Generate new CAPTCHA task if enabled
106
+ let captchaTask = [];
107
+ if (req.adminizer.config.auth.captcha !== false) {
108
+ captchaTask = await powCaptcha.getJob(`login:${req.ip}`);
109
+ }
85
110
  let errors = {};
86
111
  errors[messageType] = message;
87
112
  return req.Inertia.render({
@@ -123,7 +123,6 @@ export class MediaManagerAdapter {
123
123
  }
124
124
  try {
125
125
  const item = await this.manager.upload(req.file, filename, origFileName, group);
126
- console.log(item);
127
126
  if (item) {
128
127
  return res.send({
129
128
  msg: "success",
@@ -150,7 +149,7 @@ export class MediaManagerAdapter {
150
149
  return;
151
150
  }
152
151
  catch (e) {
153
- console.log(e);
152
+ console.error(e);
154
153
  }
155
154
  }
156
155
  }
@@ -4,10 +4,10 @@ export async function mediaManagerController(req, res) {
4
4
  const method = req.method.toUpperCase();
5
5
  let id = req.params.id ? req.params.id : '';
6
6
  if (req.adminizer.config.auth.enable) {
7
- if (!req.session.UserAP) {
7
+ if (!req.user) {
8
8
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
9
9
  }
10
- else if (!req.adminizer.accessRightsHelper.hasPermission(`catalog-${id}`, req.session.UserAP)) {
10
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`catalog-${id}`, req.user)) {
11
11
  return res.sendStatus(403);
12
12
  }
13
13
  }
@@ -2,12 +2,12 @@ import { ControllerHelper } from "../../helpers/controllerHelper";
2
2
  import { DataAccessor } from "../../lib/v4/DataAccessor";
3
3
  export default async function edit(req, res) {
4
4
  if (req.adminizer.config.auth.enable) {
5
- if (!req.session.UserAP) {
5
+ if (!req.user) {
6
6
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
7
7
  }
8
8
  }
9
9
  let entity = ControllerHelper.findEntityObject(req);
10
- let dataAccessor = new DataAccessor(req, entity, "edit");
10
+ let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "edit");
11
11
  let record = await entity.model.findOne({ id: req.params.id }, dataAccessor);
12
12
  return res.redirect(`${req.adminizer.config.routePrefix}/catalog/navigation/${record.label}`);
13
13
  }
@@ -5,7 +5,6 @@ export default async function register(req, res) {
5
5
  return res.redirect(`${req.adminizer.config.routePrefix}/`);
6
6
  }
7
7
  if (req.method.toUpperCase() === "POST") {
8
- // console.log("req.body", req.body);
9
8
  for (const key of ["login", "fullName", "password"]) {
10
9
  if (!req.body[key]) {
11
10
  let errors = {};
@@ -40,12 +39,11 @@ export default async function register(req, res) {
40
39
  }
41
40
  else {
42
41
  try {
43
- let passwordHashed = generate(req.body.login + req.body.password);
42
+ let passwordHashed = generate(req.body.login + req.body.password + process.env.AP_PASSWORD_SALT);
44
43
  let password = 'masked';
45
44
  // TODO refactor CRUD functions for DataAccessor usage
46
45
  let userap = await req.adminizer.modelHandler.model.get("UserAP")["_create"]({
47
46
  login: req.body.login,
48
- password: password,
49
47
  passwordHashed: passwordHashed,
50
48
  fullName: req.body.fullName,
51
49
  email: req.body.email,
@@ -53,7 +51,6 @@ export default async function register(req, res) {
53
51
  });
54
52
  // TODO refactor CRUD functions for DataAccessor usage
55
53
  let defaultUserGroup = await req.adminizer.modelHandler.model.get("GroupAP")["_findOne"]({ name: req.adminizer.config.registration.defaultUserGroup });
56
- console.log(userap);
57
54
  // TODO refactor CRUD functions for DataAccessor usage
58
55
  await req.adminizer.modelHandler.model.get("UserAP")["_updateOne"]({ id: userap.id }, {
59
56
  groups: [defaultUserGroup.id]
@@ -18,10 +18,10 @@ export default async function remove(req, res) {
18
18
  return res.redirect(`${req.adminizer.config.routePrefix}/${entity.uri}`);
19
19
  }
20
20
  if (req.adminizer.config.auth.enable) {
21
- if (!req.session.UserAP) {
21
+ if (!req.user) {
22
22
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
23
23
  }
24
- else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.session.UserAP)) {
24
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.user)) {
25
25
  return res.sendStatus(403);
26
26
  }
27
27
  }
@@ -31,7 +31,7 @@ export default async function remove(req, res) {
31
31
  let record;
32
32
  let dataAccessor;
33
33
  try {
34
- dataAccessor = new DataAccessor(req, entity, "remove");
34
+ dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "remove");
35
35
  record = await entity.model.findOne({ id: req.params.id }, dataAccessor);
36
36
  }
37
37
  catch (e) {
@@ -1,6 +1,6 @@
1
1
  export default async function timezones(req, res) {
2
2
  if (req.adminizer.config.auth.enable) {
3
- if (!req.session.UserAP) {
3
+ if (!req.user) {
4
4
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
5
5
  }
6
6
  }
@@ -18,14 +18,14 @@ export default async function view(req, res) {
18
18
  return res.status(404).send({ error: 'Not Found' });
19
19
  }
20
20
  if (req.adminizer.config.auth.enable) {
21
- if (!req.session.UserAP) {
21
+ if (!req.user) {
22
22
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
23
23
  }
24
- else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.session.UserAP)) {
24
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
25
25
  return res.sendStatus(403);
26
26
  }
27
27
  }
28
- let dataAccessor = new DataAccessor(req, entity, "view");
28
+ let dataAccessor = new DataAccessor(req.adminizer, req.user, entity, "view");
29
29
  let fields = dataAccessor.getFieldsConfig();
30
30
  let record;
31
31
  try {
@@ -2,7 +2,7 @@
2
2
  * Welcome text
3
3
  */
4
4
  export default function welcome(req, res) {
5
- if (req.adminizer.config.auth.enable && !req.session.UserAP) {
5
+ if (!req.user) {
6
6
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
7
7
  }
8
8
  let text = '';
@@ -4,10 +4,10 @@ export async function widgetActionController(req, res) {
4
4
  return res.status(404).send({ error: 'Not Found' });
5
5
  }
6
6
  if (req.adminizer.config.auth.enable) {
7
- if (!req.session.UserAP) {
7
+ if (!req.user) {
8
8
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
9
9
  }
10
- else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.session.UserAP)) {
10
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
11
11
  return res.sendStatus(403);
12
12
  }
13
13
  }
@@ -4,10 +4,10 @@ export async function widgetCustomController(req, res) {
4
4
  return res.status(404).send({ error: 'Not Found' });
5
5
  }
6
6
  if (req.adminizer.config.auth.enable) {
7
- if (!req.session.UserAP) {
7
+ if (!req.user) {
8
8
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
9
9
  }
10
- else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.session.UserAP)) {
10
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
11
11
  return res.sendStatus(403);
12
12
  }
13
13
  }
@@ -4,10 +4,10 @@ export async function widgetInfoController(req, res) {
4
4
  return res.status(404).send({ error: 'Not Found' });
5
5
  }
6
6
  if (req.adminizer.config.auth.enable) {
7
- if (!req.session.UserAP) {
7
+ if (!req.user) {
8
8
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
9
9
  }
10
- else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.session.UserAP)) {
10
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
11
11
  return res.sendStatus(403);
12
12
  }
13
13
  }
@@ -4,10 +4,10 @@ export async function widgetSwitchController(req, res) {
4
4
  return res.status(404).send({ error: 'Not Found' });
5
5
  }
6
6
  if (req.adminizer.config.auth.enable) {
7
- if (!req.session.UserAP) {
7
+ if (!req.user) {
8
8
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
9
9
  }
10
- else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.session.UserAP)) {
10
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`widget-${widgetId}`, req.user)) {
11
11
  return res.sendStatus(403);
12
12
  }
13
13
  }
@@ -2,17 +2,17 @@ export default async function widgetsDB(req, res) {
2
2
  let id = 0;
3
3
  let auth = req.adminizer.config.auth.enable;
4
4
  if (auth) {
5
- if (!req.session.UserAP) {
5
+ if (!req.user) {
6
6
  return res.redirect(`${req.adminizer.config.routePrefix}/model/userap/login`);
7
7
  }
8
- else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.session.UserAP)) {
8
+ else if (!req.adminizer.accessRightsHelper.hasPermission(`widgets`, req.user)) {
9
9
  return res.sendStatus(403);
10
10
  }
11
- id = req.session.UserAP.id;
11
+ id = req.user.id;
12
12
  }
13
13
  if (req.method.toUpperCase() === 'GET') {
14
14
  try {
15
- let widgets = await req.adminizer.widgetHandler.getWidgetsDB(id, auth);
15
+ let widgets = await req.adminizer.widgetHandler.getWidgetsDB(id, auth, req.i18n);
16
16
  return res.json({ widgetsDB: widgets });
17
17
  }
18
18
  catch (e) {
@@ -25,7 +25,7 @@ export default async function widgetsDB(req, res) {
25
25
  }
26
26
  try {
27
27
  return res.json({
28
- userID: await req.adminizer.widgetHandler.setWidgetsDB(id, req.body.widgets, auth),
28
+ userID: await req.adminizer.widgetHandler.setWidgetsDB(id, req.body, auth),
29
29
  status: 'ok'
30
30
  });
31
31
  }
@@ -0,0 +1 @@
1
+ export declare function isObject(obj: unknown): obj is object;
@@ -0,0 +1,3 @@
1
+ export function isObject(obj) {
2
+ return typeof obj === "object" && obj !== null;
3
+ }
@@ -1,3 +1,4 @@
1
+ import { UserAP } from "models/UserAP";
1
2
  import { AccessRightsToken } from "../interfaces/types";
2
3
  import { Adminizer } from "../lib/Adminizer";
3
4
  export declare class AccessRightsHelper {
@@ -9,6 +10,9 @@ export declare class AccessRightsHelper {
9
10
  getTokens(): AccessRightsToken[];
10
11
  getTokensByDepartment(department: string): AccessRightsToken[];
11
12
  getAllDepartments(): string[];
12
- enoughPermissions(tokens: string[], user: ModelsAP["UserAP"]): boolean;
13
- hasPermission(tokenId: string, user: ModelsAP["UserAP"]): boolean;
13
+ enoughPermissions(tokens: string[], user: UserAP): boolean;
14
+ hasPermission(tokenId: string, user: UserAP): boolean;
15
+ }
16
+ export declare class GroupsAccessRightsHelper {
17
+ static hasAccess(user: UserAP, groupsAccessRights?: string[]): boolean;
14
18
  }
@@ -6,12 +6,14 @@ export class AccessRightsHelper {
6
6
  this.adminizer = adminizer;
7
7
  }
8
8
  registerToken(accessRightsToken) {
9
+ accessRightsToken.id = accessRightsToken.id.toLowerCase();
9
10
  if (!accessRightsToken.id || !accessRightsToken.name || !accessRightsToken.description || !accessRightsToken.department) {
10
11
  throw new Error("Adminpanel > Can not register token: Missed one or more required parameters");
11
12
  }
12
- for (let token of this._tokens) {
13
- if (token.id === accessRightsToken.id) {
14
- throw new Error("Adminpanel > Can not register token: Token with this id already registered");
13
+ for (let i = 0; i < this._tokens.length; i++) {
14
+ if (this._tokens[i].id === accessRightsToken.id) {
15
+ this._tokens.splice(i, 1);
16
+ break;
15
17
  }
16
18
  }
17
19
  this._tokens.push(accessRightsToken);
@@ -42,6 +44,11 @@ export class AccessRightsHelper {
42
44
  return tokens.some((token) => this.hasPermission(token, user));
43
45
  }
44
46
  hasPermission(tokenId, user) {
47
+ if (!tokenId) {
48
+ Adminizer.log.error(`AccessRightsHelper > hasPermission no tokenId: ${tokenId}`);
49
+ return false;
50
+ }
51
+ tokenId = tokenId.toLowerCase();
45
52
  if (!this.adminizer.config.auth.enable) {
46
53
  return true;
47
54
  }
@@ -50,9 +57,25 @@ export class AccessRightsHelper {
50
57
  }
51
58
  const tokenIsValid = this._tokens.some((token) => token.id === tokenId);
52
59
  if (!tokenIsValid) {
53
- Adminizer.log.error("Adminpanel > Token is not valid");
60
+ Adminizer.log.error("Adminpanel > Token is not valid", tokenId, user.login);
54
61
  return false;
55
62
  }
56
- return user.groups.some((group) => group.tokens.includes(tokenId));
63
+ if (!user.groups) {
64
+ Adminizer.log.error('User has no groups');
65
+ return false;
66
+ }
67
+ return user.groups.some((group) => group.tokens?.includes(tokenId));
68
+ }
69
+ }
70
+ export class GroupsAccessRightsHelper {
71
+ static hasAccess(user, groupsAccessRights) {
72
+ const userGroups = user.groups?.map(group => group.name.toLowerCase());
73
+ if (groupsAccessRights) {
74
+ const allowedGroups = groupsAccessRights.map(item => item.toLowerCase());
75
+ return userGroups?.some(group => allowedGroups.includes(group)) ?? false;
76
+ }
77
+ else {
78
+ return true;
79
+ }
57
80
  }
58
81
  }
@@ -77,7 +77,7 @@ export class ConfigHelper {
77
77
  }
78
78
  // Boolean notation: `true` means field is visible; `false` means field is hidden.
79
79
  if (typeof config === "boolean") {
80
- return config ? { title: key } : false;
80
+ return config ? { title: key } : { visible: false };
81
81
  }
82
82
  // String notation: Interpreted as the field title.
83
83
  if (typeof config === "string") {
@@ -86,6 +86,7 @@ export class ConfigHelper {
86
86
  // Object notation: Allows full customization of the field.
87
87
  if (typeof config === "object" && config !== null) {
88
88
  config.title = config.title || key;
89
+ config.visible = config.visible === undefined ? true : Boolean(config.visible);
89
90
  // For association types, determine display field by checking model attributes.
90
91
  if (["association", "association-many"].includes(config.type)) {
91
92
  let associatedModelAttributes = {};
@@ -28,7 +28,15 @@ export class ControllerHelper {
28
28
  * @private
29
29
  */
30
30
  static _isValidModelConfig(config) {
31
- return (typeof config === "object" && typeof config.model === "string");
31
+ try {
32
+ if (!config)
33
+ throw `Config is not defined ${config}`;
34
+ return (typeof config === "object" && typeof config.model === "string");
35
+ }
36
+ catch (error) {
37
+ Adminizer.log.error(error);
38
+ return false;
39
+ }
32
40
  }
33
41
  ;
34
42
  /**
@@ -84,7 +92,7 @@ export class ControllerHelper {
84
92
  const entityType = req.params.entityType;
85
93
  if (!entityType) {
86
94
  const extractedEntityType = req.originalUrl.split('/')[2];
87
- if (["form", "model", "wizard"].includes(extractedEntityType)) {
95
+ if (["form", "model"].includes(extractedEntityType)) {
88
96
  return extractedEntityType;
89
97
  }
90
98
  else {
@@ -101,22 +109,28 @@ export class ControllerHelper {
101
109
  * @returns {?string}
102
110
  */
103
111
  static findEntityName(req) {
104
- if (!req.params.entityName) {
105
- let entityType = req.originalUrl.split('/')[2];
106
- let entityName = req.originalUrl.split('/')[3];
107
- if (entityType === "form" && (!req.adminizer.config.forms || !req.adminizer.config.forms.data || !req.adminizer.config.forms.data[entityName])) {
108
- return null;
109
- }
110
- else if (entityType === "model" && (!req.adminizer.config.models || !req.adminizer.config.models[entityName])) {
111
- return null;
112
+ if (req.params.entityName) {
113
+ return req.params.entityName;
114
+ }
115
+ const urlParts = req.originalUrl.split('/');
116
+ const entityType = urlParts[2];
117
+ const entityName = urlParts[3];
118
+ if (entityType === 'form') {
119
+ const forms = req.adminizer.config.forms?.data;
120
+ if (!forms || !Object.keys(forms).some(key => key.toLowerCase() === entityName.toLowerCase())) {
121
+ throw new Error(`Form "${entityName}" not found`);
112
122
  }
113
- else {
114
- return entityName;
123
+ return Object.keys(forms).find(key => key.toLowerCase() === entityName.toLowerCase());
124
+ }
125
+ if (entityType === 'model') {
126
+ const models = req.adminizer.config.models;
127
+ if (!models || !Object.keys(models).some(key => key.toLowerCase() === entityName.toLowerCase())) {
128
+ throw new Error(`Model "${entityName}" not found`);
115
129
  }
130
+ return Object.keys(models).find(key => key.toLowerCase() === entityName.toLowerCase());
116
131
  }
117
- return req.params.entityName;
132
+ throw new Error(`Unsupported entity type "${entityType}" in URL`);
118
133
  }
119
- ;
120
134
  /**
121
135
  * Searches for config from admin panel
122
136
  *
@@ -125,11 +139,17 @@ export class ControllerHelper {
125
139
  * @returns {?Object}
126
140
  */
127
141
  static findModelConfig(req, entityName) {
128
- if (!req.adminizer.config.models || !req.adminizer.config.models[entityName]) {
129
- Adminizer.log.error('No such route exists');
142
+ const models = req.adminizer.config.models;
143
+ if (!models) {
144
+ Adminizer.log.error('No models configuration found');
145
+ return null;
146
+ }
147
+ const foundKey = Object.keys(models).find(key => key.toLowerCase() === entityName.toLowerCase());
148
+ if (!foundKey) {
149
+ Adminizer.log.error(`No such route exists: ${entityName}`);
130
150
  return null;
131
151
  }
132
- return this._normalizeModelConfig(entityName, req.adminizer.config.models[entityName]);
152
+ return this._normalizeModelConfig(foundKey, models[foundKey]);
133
153
  }
134
154
  /**
135
155
  * Will get action config from configuration file depending to given action
@@ -200,7 +220,8 @@ export class ControllerHelper {
200
220
  name: entityName,
201
221
  uri: entityUri,
202
222
  type: entityType,
203
- model: null
223
+ model: null,
224
+ config: null
204
225
  };
205
226
  // If the entity type is "model", add additional properties
206
227
  if (entityType === "model") {
@@ -1,20 +1,21 @@
1
- import { ActionType, BaseFieldConfig, FieldsTypes } from "../interfaces/adminpanelConfig";
1
+ import { ActionType, BaseFieldConfig, FieldsTypes, ModelConfig } from "../interfaces/adminpanelConfig";
2
2
  import { Attribute } from "../lib/v4/model/AbstractModel";
3
3
  export type Field = {
4
4
  config: BaseFieldConfig & {
5
5
  /** @deprecated record should not be in config anymore */
6
- records?: object[];
6
+ records?: Record<string, any>[];
7
7
  file?: string;
8
8
  key?: string;
9
9
  required?: boolean;
10
10
  type?: FieldsTypes;
11
11
  groupsAccessRights?: string[];
12
12
  } | string | boolean;
13
- /** for populated fields' configs */
13
+ /** For render associalitons fields */
14
14
  populated: {
15
15
  [key: string]: Field;
16
16
  } | undefined;
17
17
  model: Attribute;
18
+ modelConfig: ModelConfig;
18
19
  };
19
20
  export type Fields = {
20
21
  [key: string]: Field;