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.
- package/Readme.md +2 -1
- package/assets/add-a4odXvQk.js +1 -0
- package/assets/add-group-D-NleXth.js +1 -0
- package/assets/add-user-B4SVJT5P.js +1 -0
- package/assets/app-CtWuWD5N.css +1 -0
- package/assets/app-layout-eaSzcROf.js +1 -0
- package/assets/app.js +35 -39
- package/assets/catalog-ByUICd5z.js +6 -0
- package/assets/controls/chunks/_commonjsHelpers-C6fGbg64.js +6 -0
- package/assets/controls/chunks/index-CjiZ2FIa.js +93 -0
- package/assets/controls/chunks/jsx-runtime-jIxVPx5o.js +31 -0
- package/assets/controls/chunks/use-appearance-CFLOwiSX.js +38 -0
- package/assets/controls/chunks/use-window-size-BXgBKW65.js +19 -0
- package/assets/controls/chunks/vanilla-picker-Dg97NL4h.js +529 -0
- package/assets/{RelationDialogStack-CnHFOYyR.css → controls/ckeditor.css} +1 -1
- package/assets/controls/ckeditor.es.js +83663 -0
- package/assets/controls/handsontable.css +1 -0
- package/assets/controls/handsontable.es.js +70550 -0
- package/assets/controls/jsoneditor.css +1 -0
- package/assets/controls/jsoneditor.es.js +42009 -0
- package/assets/controls/leaflet.css +1 -0
- package/assets/controls/leaflet.es.js +10299 -0
- package/assets/controls/monaco.es.js +618 -0
- package/assets/controls/toast-ui.css +1 -0
- package/assets/controls/toast-ui.es.js +41768 -0
- package/assets/dashboard-BYd8G2cW.js +3 -0
- package/assets/debounce-BMmXVQ06.js +1 -0
- package/assets/history-B8KIDy44.js +1 -0
- package/assets/init-user-8aUohVDq.js +1 -0
- package/assets/list-ChmtBGjG.js +4 -0
- package/assets/login-CO4laf6m.js +1 -0
- package/assets/manifest.json +60 -615
- package/assets/{media-manager-WcKe1EvD.js → media-manager-BDbpSSjH.js} +3 -3
- package/assets/module-D59aE9uv.js +1 -0
- package/assets/notification-DNoyfNmT.js +20 -0
- package/assets/register-DBYIMXGQ.js +1 -0
- package/assets/{ru-eW0WKkga.js → ru-rYKdQbWF.js} +1 -1
- package/assets/use-appearance-_EbbjHTh.js +1 -0
- package/assets/user-filters-list-BMFRwkYF.js +1 -0
- package/assets/welcome-37rNVUHt.js +1 -0
- package/controllers/add.d.ts +1 -1
- package/controllers/addGroup.js +3 -3
- package/controllers/addUser.js +3 -3
- package/controllers/catalog/Catalog.d.ts +1 -1
- package/controllers/catalog/Catalog.js +2 -1
- package/controllers/catalog/FrontendCatalogAdapter.d.ts +2 -12
- package/controllers/catalog/FrontendCatalogAdapter.js +3 -16
- package/controllers/catalog/FrontentCatalogAdapter.d.ts +2 -12
- package/controllers/catalog/FrontentCatalogAdapter.js +0 -16
- package/controllers/edit.js +6 -11
- package/controllers/editGroup.d.ts +1 -1
- package/controllers/editGroup.js +3 -3
- package/controllers/editUser.d.ts +1 -1
- package/controllers/editUser.js +3 -3
- package/controllers/feed.js +1 -1
- package/controllers/filter-fields/columns.js +1 -1
- package/controllers/filter-fields/getAllUserFilters.js +2 -2
- package/controllers/filter-fields/groups.js +2 -2
- package/controllers/filter-fields/savedFilters.js +1 -1
- package/controllers/history-actions/HistoryController.js +1 -1
- package/controllers/initUser.js +2 -2
- package/controllers/list.d.ts +1 -1
- package/controllers/login.d.ts +1 -1
- package/controllers/login.js +3 -3
- package/controllers/media-manager/ThumbController.js +2 -2
- package/controllers/media-manager/mediaManagerApi.js +13 -15
- package/controllers/register.d.ts +1 -1
- package/controllers/register.js +5 -5
- package/controllers/remove.d.ts +1 -1
- package/controllers/userApiKey.js +2 -2
- package/controllers/view.d.ts +1 -1
- package/controllers/view.js +5 -5
- package/controllers/widgets/Action.js +5 -2
- package/controllers/widgets/Info.js +1 -1
- package/controllers/widgets/filterInfo.js +1 -1
- package/files/favicon.png +0 -0
- package/helpers/accessRightsHelper.d.ts +6 -4
- package/helpers/accessRightsHelper.js +13 -0
- package/helpers/diffHelpers.js +1 -1
- package/helpers/fieldsHelper.d.ts +1 -1
- package/helpers/fieldsHelper.js +8 -4
- package/helpers/filterDatetimeHelper.d.ts +1 -1
- package/helpers/inertiaAddHelper.d.ts +6 -5
- package/helpers/inertiaAddHelper.js +45 -37
- package/helpers/inertiaAutHelper.js +5 -5
- package/helpers/inertiaGroupHelper.d.ts +4 -4
- package/helpers/inertiaMenuHelper.js +1 -1
- package/helpers/inertiaUserHelper.d.ts +3 -3
- package/helpers/inertiaUserHelper.js +1 -1
- package/helpers/menuHelper.d.ts +2 -2
- package/index.d.ts +18 -6
- package/index.js +18 -6
- package/interfaces/adminpanelConfig.d.ts +10 -33
- package/interfaces/global.d.ts +10 -15
- package/interfaces/listQueryBuilder.d.ts +1 -1
- package/lib/Adminizer.d.ts +25 -2
- package/lib/Adminizer.js +124 -50
- package/lib/DataAccessor.d.ts +9 -5
- package/lib/DataAccessor.js +89 -42
- package/lib/access-rights/AccessRightsHandler.d.ts +17 -0
- package/lib/access-rights/AccessRightsHandler.js +63 -0
- package/lib/ai-assistant/AbstractAiModelService.d.ts +5 -8
- package/lib/ai-assistant/AbstractAiModelService.js +3 -14
- package/lib/ai-assistant/AiAssistantHandler.d.ts +2 -2
- package/lib/app-manager/AdminizerApp.d.ts +228 -0
- package/lib/app-manager/AdminizerApp.js +17 -0
- package/lib/app-manager/AppManager.d.ts +18 -0
- package/lib/app-manager/AppManager.js +537 -0
- package/lib/app-manager/AssetHandler.d.ts +17 -0
- package/lib/app-manager/AssetHandler.js +67 -0
- package/lib/app-manager/ConfigLayerHandler.d.ts +18 -0
- package/lib/app-manager/ConfigLayerHandler.js +119 -0
- package/lib/app-manager/ControllerHandler.d.ts +25 -0
- package/lib/app-manager/ControllerHandler.js +140 -0
- package/lib/catalog/AbstractCatalog.d.ts +28 -19
- package/lib/catalog/AbstractCatalog.js +41 -10
- package/lib/catalog/CatalogHandler.d.ts +13 -0
- package/lib/catalog/CatalogHandler.js +48 -2
- package/lib/catalog/CatalogTemplateComponentHandler.d.ts +23 -0
- package/lib/catalog/CatalogTemplateComponentHandler.js +59 -0
- package/lib/controls/Control.d.ts +17 -0
- package/lib/controls/Control.js +1 -0
- package/lib/controls/ControlsHandler.d.ts +5 -6
- package/lib/controls/ControlsHandler.js +0 -13
- package/lib/controls/codeEditor/MonacoEditor.d.ts +3 -4
- package/lib/controls/codeEditor/MonacoEditor.js +13 -8
- package/lib/controls/geojsoneditor/GeoEditor.d.ts +3 -4
- package/lib/controls/geojsoneditor/GeoEditor.js +14 -9
- package/lib/controls/jsoneditor/JsonEditor.d.ts +5 -6
- package/lib/controls/jsoneditor/JsonEditor.js +14 -13
- package/lib/controls/markdown/ToastUiEditor.d.ts +5 -6
- package/lib/controls/markdown/ToastUiEditor.js +14 -13
- package/lib/controls/table/Handsontable.d.ts +5 -6
- package/lib/controls/table/Handsontable.js +14 -13
- package/lib/controls/wysiwyg/CKeditor.d.ts +5 -6
- package/lib/controls/wysiwyg/CKeditor.js +14 -13
- package/lib/filters/ConditionValidator.d.ts +1 -1
- package/lib/filters/FilterService.d.ts +18 -18
- package/lib/filters/FilterService.js +11 -11
- package/lib/history-actions/AbstractHistoryAdapter.d.ts +14 -14
- package/lib/history-actions/AbstractHistoryAdapter.js +5 -6
- package/lib/history-actions/DefaultHistoryAdapter.d.ts +7 -7
- package/lib/history-actions/DefaultHistoryAdapter.js +2 -2
- package/lib/list-query-builder/ListQueryBuilder.d.ts +1 -1
- package/lib/media-manager/AbstractMediaManager.d.ts +14 -3
- package/lib/media-manager/AbstractMediaManager.js +16 -5
- package/lib/media-manager/MediaManagerHandler.d.ts +3 -0
- package/lib/media-manager/MediaManagerHandler.js +30 -5
- package/lib/media-manager/Thumb.js +7 -13
- package/lib/media-manager/helpers/MediaManagerHelper.d.ts +6 -4
- package/lib/media-manager/helpers/MediaManagerHelper.js +18 -18
- package/lib/model/AbstractModel.d.ts +9 -5
- package/lib/model/AbstractModel.js +9 -13
- package/lib/model/InternalModelAccessFactory.js +9 -10
- package/lib/model/ModelHandler.d.ts +45 -7
- package/lib/model/ModelHandler.js +168 -11
- package/lib/model/adapter/sequelize.d.ts +2 -4
- package/lib/model/adapter/sequelize.js +16 -193
- package/lib/model/adapter/typeorm.d.ts +2 -4
- package/lib/model/adapter/typeorm.js +2 -35
- package/lib/notifications/AbstractNotificationService.d.ts +9 -9
- package/lib/notifications/AbstractNotificationService.js +8 -8
- package/lib/notifications/GeneralNotificationService.js +1 -1
- package/lib/notifications/SystemNotificationService.js +1 -1
- package/lib/ui-i18n/uiTranslationKeys.d.ts +1 -1
- package/lib/ui-i18n/uiTranslationKeys.js +1 -0
- package/lib/widgets/abstractCustom.d.ts +7 -2
- package/lib/widgets/abstractCustom.js +6 -0
- package/lib/widgets/abstractInfo.d.ts +4 -1
- package/lib/widgets/abstractWidgetBase.d.ts +2 -0
- package/lib/widgets/abstractWidgetBase.js +2 -0
- package/lib/widgets/widgetHandler.d.ts +6 -2
- package/lib/widgets/widgetHandler.js +70 -19
- package/models/{FilterAP.d.ts → Filter.d.ts} +4 -70
- package/models/Filter.js +1 -0
- package/models/FilterColumn.d.ts +10 -0
- package/models/FilterColumn.js +1 -0
- package/models/Group.d.ts +8 -0
- package/models/Group.js +1 -0
- package/models/HistoryActions.d.ts +14 -0
- package/models/HistoryActions.js +1 -0
- package/models/MediaManagerAP.d.ts +2 -54
- package/models/MediaManagerAP.js +1 -51
- package/models/MediaManagerAssociationsAP.d.ts +1 -35
- package/models/MediaManagerAssociationsAP.js +1 -33
- package/models/MediaManagerMetaAP.d.ts +2 -30
- package/models/MediaManagerMetaAP.js +1 -27
- package/models/Notification.d.ts +13 -0
- package/models/Notification.js +1 -0
- package/models/User.d.ts +23 -0
- package/models/User.js +1 -0
- package/models/UserNotification.d.ts +7 -0
- package/models/UserNotification.js +1 -0
- package/package.json +25 -30
- package/services/FeedService.d.ts +5 -5
- package/services/FeedService.js +1 -1
- package/system/Router.js +2 -10
- package/system/bindAccessRights.js +1 -1
- package/system/bindAuthorization.js +2 -2
- package/system/bindControls.js +7 -6
- package/system/bindDashboardWidgets.js +3 -2
- package/system/bindDev.js +1 -1
- package/system/bindHistory.d.ts +1 -1
- package/system/bindHistory.js +1 -1
- package/system/bindInertia.js +0 -6
- package/system/bindMediaManager.js +4 -17
- package/system/bindNotifications.d.ts +1 -1
- package/system/bindNotifications.js +1 -1
- package/system/bindReqFunctions.d.ts +1 -0
- package/system/bindReqFunctions.js +20 -3
- package/system/buildInternalModelAccess.js +2 -15
- package/system/defaults.js +5 -10
- package/system/systemModelContracts.d.ts +22 -0
- package/system/systemModelContracts.js +155 -0
- package/system/validateSystemModels.d.ts +2 -0
- package/system/validateSystemModels.js +101 -0
- package/translations/ar.json +2 -1
- package/translations/cn.json +2 -1
- package/translations/de.json +2 -1
- package/translations/en.json +1 -0
- package/translations/es.json +2 -1
- package/translations/fr.json +2 -1
- package/translations/hi.json +2 -1
- package/translations/jp.json +2 -1
- package/translations/ko.json +2 -1
- package/translations/pt.json +2 -1
- package/translations/ru.json +2 -1
- package/translations/ua.json +2 -1
- package/translations/uz.json +2 -1
- package/translations/vi.json +2 -1
- package/ui/components/VanillaJSONEditor.d.ts +1 -1
- package/ui/components/handsontable.d.ts +1 -1
- package/ui/components/ui/avatar.d.ts +3 -3
- package/ui/components/ui/badge.d.ts +1 -1
- package/ui/components/ui/breadcrumb.d.ts +7 -7
- package/ui/components/ui/button.d.ts +1 -1
- package/ui/components/ui/calendar.d.ts +1 -1
- package/ui/components/ui/card.d.ts +7 -7
- package/ui/components/ui/checkbox.d.ts +1 -1
- package/ui/components/ui/collapsible.d.ts +3 -3
- package/ui/components/ui/command.d.ts +9 -9
- package/ui/components/ui/context-menu.d.ts +15 -15
- package/ui/components/ui/dialog-stack.d.ts +10 -10
- package/ui/components/ui/dialog.d.ts +10 -10
- package/ui/components/ui/dropdown-menu.d.ts +15 -15
- package/ui/components/ui/input.d.ts +1 -1
- package/ui/components/ui/label.d.ts +1 -1
- package/ui/components/ui/menubar.d.ts +16 -16
- package/ui/components/ui/pagination.d.ts +7 -7
- package/ui/components/ui/popover.d.ts +4 -4
- package/ui/components/ui/select.d.ts +10 -10
- package/ui/components/ui/separator.d.ts +1 -1
- package/ui/components/ui/sheet.d.ts +8 -8
- package/ui/components/ui/sidebar.d.ts +23 -23
- package/ui/components/ui/skeleton.d.ts +1 -1
- package/ui/components/ui/slider.d.ts +1 -1
- package/ui/components/ui/sonner.d.ts +1 -1
- package/ui/components/ui/switch.d.ts +1 -1
- package/ui/components/ui/table.d.ts +8 -8
- package/ui/components/ui/tabs.d.ts +4 -4
- package/ui/components/ui/textarea.d.ts +1 -1
- package/ui/components/ui/tooltip.d.ts +4 -4
- package/assets/RelationDialogStack-DI2bZxQX.js +0 -20
- package/assets/add-DCQ7ZW4B.js +0 -1
- package/assets/add-group-DCVPryBo.js +0 -1
- package/assets/add-group-form-DKRXC2n-.js +0 -1
- package/assets/add-user-B7OOiYxv.js +0 -1
- package/assets/add-user-form-UXAToWQd.js +0 -1
- package/assets/app-AKbNCggP.css +0 -1
- package/assets/app-layout-6EwNBvnR.js +0 -1
- package/assets/app-shell-D8wtkECO.js +0 -1
- package/assets/app-sidebar-DfGjL-2K.js +0 -1
- package/assets/app-sidebar-header-BZbIBQjq.js +0 -1
- package/assets/breadcrumbs-CODaqVkB.js +0 -1
- package/assets/catalog-DVvFGa2X.js +0 -6
- package/assets/dashboard-BadoiH_a.js +0 -3
- package/assets/date-picker-DSOkNiNo.js +0 -1
- package/assets/del-modal-Cd4M7af8.js +0 -1
- package/assets/dynamic-controls-BsrJhPDY.js +0 -1
- package/assets/geo-json-CzR5JBXL.js +0 -1
- package/assets/handsontable-BI98OF5R.js +0 -336
- package/assets/history-D1iLA6rs.js +0 -1
- package/assets/home-DbWj-W_k.js +0 -2
- package/assets/icon-C2JNaLxH.js +0 -1
- package/assets/init-user-D2HSyXup.js +0 -1
- package/assets/input-error-CH2caTtO.js +0 -1
- package/assets/jsoneditor-DVNQmA6G.js +0 -3869
- package/assets/list-CVoljVUw.js +0 -4
- package/assets/login-DFSLEO17.js +0 -1
- package/assets/material-icon-Bx9pGQiQ.js +0 -1
- package/assets/module-DJsC37CM.js +0 -1
- package/assets/monaco-Bl4zdWCn.js +0 -11
- package/assets/nav-footer-BiSQkPt4.js +0 -1
- package/assets/nav-main-rTH0PfDw.js +0 -1
- package/assets/nav-user-Bj6cWs0a.js +0 -1
- package/assets/notification-DKrNfaAB.js +0 -20
- package/assets/pagination-render-AKJvTIRA.js +0 -1
- package/assets/register-BTP4uxsK.js +0 -1
- package/assets/theme-switcher-Dm8EOGzx.js +0 -1
- package/assets/toast-editor-DOg_gvSp.js +0 -668
- package/assets/user-filters-list-C9R9J6Om.js +0 -1
- package/assets/user-info-BgSbT02v.js +0 -1
- package/assets/user-menu-content-TQTXHIv6.js +0 -1
- package/assets/vanilla-picker-B3LgXoKV.js +0 -2
- package/assets/vendor-l0sNRNKZ.js +0 -1
- package/assets/welcome-BwDlAOGh.js +0 -1
- package/controllers/navigation/edit.d.ts +0 -1
- package/controllers/navigation/edit.js +0 -8
- package/lib/ai-assistant/DummyAiModelService.d.ts +0 -8
- package/lib/ai-assistant/DummyAiModelService.js +0 -14
- package/lib/ai-assistant/OpenAiModelService.d.ts +0 -24
- package/lib/ai-assistant/OpenAiModelService.js +0 -184
- package/lib/catalog/Navigation.d.ts +0 -49
- package/lib/catalog/Navigation.js +0 -492
- package/lib/controls/AbstractControls.d.ts +0 -30
- package/lib/controls/AbstractControls.js +0 -14
- package/lib/media-manager/DefaultMediaManager.d.ts +0 -20
- package/lib/media-manager/DefaultMediaManager.js +0 -127
- package/lib/media-manager/Items.d.ts +0 -50
- package/lib/media-manager/Items.js +0 -296
- package/models/FilterAP.js +0 -68
- package/models/FilterColumnAP.d.ts +0 -32
- package/models/FilterColumnAP.js +0 -21
- package/models/GroupAP.d.ts +0 -31
- package/models/GroupAP.js +0 -22
- package/models/HistoryActionsAP.d.ts +0 -56
- package/models/HistoryActionsAP.js +0 -42
- package/models/NavigationAP.d.ts +0 -22
- package/models/NavigationAP.js +0 -16
- package/models/NotificationAP.d.ts +0 -44
- package/models/NotificationAP.js +0 -30
- package/models/UserAP.d.ts +0 -81
- package/models/UserAP.js +0 -57
- package/models/UserNotificationAP.d.ts +0 -26
- package/models/UserNotificationAP.js +0 -18
- package/system/bindAiAssistant.d.ts +0 -2
- package/system/bindAiAssistant.js +0 -30
- package/system/bindModels.d.ts +0 -2
- package/system/bindModels.js +0 -48
- package/system/bindNavigation.d.ts +0 -2
- package/system/bindNavigation.js +0 -38
package/controllers/editUser.js
CHANGED
|
@@ -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("
|
|
9
|
-
const groupModel = internalUsers.get("
|
|
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/
|
|
65
|
+
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/model/User`);
|
|
66
66
|
}
|
|
67
67
|
catch (e) {
|
|
68
68
|
Adminizer.log.error(e);
|
package/controllers/feed.js
CHANGED
|
@@ -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("
|
|
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
|
|
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('
|
|
11
|
-
const groupModel = req.adminizer.modelHandler.model.get('
|
|
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('
|
|
7
|
+
const groupModel = req.adminizer.modelHandler.model.get('Group');
|
|
8
8
|
if (!groupModel) {
|
|
9
|
-
return res.status(500).send({ error: req.i18n.__('
|
|
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('
|
|
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('
|
|
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(),
|
package/controllers/initUser.js
CHANGED
|
@@ -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("
|
|
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/
|
|
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;
|
package/controllers/list.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function list(req: ReqType, res: ResType): Promise<
|
|
1
|
+
export default function list(req: ReqType, res: ResType): Promise<ResType>;
|
package/controllers/login.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function login(req: ReqType, res: ResType): Promise<void | (import("express-session").Session & Partial<import("express-session").SessionData> & reqSession) |
|
|
1
|
+
export default function login(req: ReqType, res: ResType): Promise<void | (import("express-session").Session & Partial<import("express-session").SessionData> & reqSession) | ResType>;
|
package/controllers/login.js
CHANGED
|
@@ -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("
|
|
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/
|
|
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/
|
|
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 ===
|
|
7
|
-
res.setHeader(
|
|
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
|
-
|
|
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
|
|
11
|
-
const manager = new MediaManagerAdapter(
|
|
12
|
-
if (method ===
|
|
13
|
-
if (req.query._method ===
|
|
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 ===
|
|
19
|
-
if (req.path.endsWith(
|
|
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(
|
|
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
|
|
24
|
+
case "addMeta":
|
|
27
25
|
return await manager.setMeta(req, res);
|
|
28
|
-
case
|
|
26
|
+
case "getMeta":
|
|
29
27
|
return await manager.getMeta(req, res);
|
|
30
|
-
case
|
|
28
|
+
case "getChildren":
|
|
31
29
|
return await manager.getVariants(req, res);
|
|
32
|
-
case
|
|
30
|
+
case "search":
|
|
33
31
|
return await manager.search(req, res);
|
|
34
32
|
}
|
|
35
33
|
}
|
|
36
|
-
if (method ===
|
|
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 |
|
|
1
|
+
export default function register(req: ReqType, res: ResType): Promise<void | ResType>;
|
package/controllers/register.js
CHANGED
|
@@ -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("
|
|
10
|
-
const groupModel = authModels.get("
|
|
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
|
|
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:
|
|
56
|
+
await userModel.updateOne({ where: { id: User.id } }, {
|
|
57
57
|
groups: [defaultUserGroup.id]
|
|
58
|
-
}); // instead of
|
|
58
|
+
}); // instead of User.addToCollection;
|
|
59
59
|
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}`);
|
|
60
60
|
}
|
|
61
61
|
catch (e) {
|
package/controllers/remove.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function remove(req: ReqType, res: ResType): Promise<void |
|
|
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("
|
|
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("
|
|
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 });
|
package/controllers/view.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function view(req: ReqType, res: ResType): Promise<void |
|
|
1
|
+
export default function view(req: ReqType, res: ResType): Promise<void | ResType>;
|
package/controllers/view.js
CHANGED
|
@@ -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 '
|
|
33
|
+
case 'User':
|
|
34
34
|
let groups;
|
|
35
35
|
try {
|
|
36
|
-
groups = await req.adminizer.modelHandler.internal("users").get("
|
|
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 '
|
|
46
|
+
case 'Group':
|
|
47
47
|
let users;
|
|
48
48
|
try {
|
|
49
|
-
users = await req.adminizer.modelHandler.internal("users").get("
|
|
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("
|
|
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
|
-
|
|
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("
|
|
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 {
|
|
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:
|
|
15
|
-
hasPermission(tokenId: string | undefined, user:
|
|
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:
|
|
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);
|
package/helpers/diffHelpers.js
CHANGED
|
@@ -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
|
|
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
|
}
|
package/helpers/fieldsHelper.js
CHANGED
|
@@ -8,8 +8,9 @@ export class FieldsHelper {
|
|
|
8
8
|
* @param {Object} fields
|
|
9
9
|
* @param user
|
|
10
10
|
* @param action
|
|
11
|
-
* @deprecated
|
|
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
|
-
|
|
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:
|
|
43
|
-
|
|
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,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 {
|
|
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" | "
|
|
33
|
-
export declare function getControl(req: ReqType, type: ControlType, name: string | undefined, defaultControlName: string):
|
|
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
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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 || {}),
|
|
196
|
+
...(shouldUseFieldConfig ? fieldOptions?.config || {} : {}),
|
|
191
197
|
},
|
|
192
|
-
path: control
|
|
198
|
+
path: control.getJsPath(),
|
|
199
|
+
cssPath: control.getCssPath(),
|
|
193
200
|
};
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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
|
|
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
|
|
293
|
+
const displayField = typeof field.modelConfig?.titleField !== 'undefined'
|
|
286
294
|
? field.modelConfig.titleField
|
|
287
295
|
: typeof optAny.title !== 'undefined'
|
|
288
296
|
? 'title'
|