adminizer 4.6.0 → 4.7.0-build.221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +12 -0
- package/assets/RelationDialogStack-CnHFOYyR.css +1 -0
- package/assets/RelationDialogStack-DI2bZxQX.js +20 -0
- package/assets/add-4213XScp.js +1 -0
- package/assets/add-group--F1XxfJ1.js +1 -0
- package/assets/add-group-form-DKRXC2n-.js +1 -0
- package/assets/add-user-b9HfMq7z.js +1 -0
- package/assets/add-user-form-UXAToWQd.js +1 -0
- package/assets/app-Clx8f5hd.css +1 -0
- package/assets/app-layout-C02ja4OI.js +1 -0
- package/assets/app-shell-D8wtkECO.js +1 -0
- package/assets/app-sidebar-BR5_zwxj.js +1 -0
- package/assets/app-sidebar-header-BZbIBQjq.js +1 -0
- package/assets/app.js +59 -7990
- package/assets/breadcrumbs-CODaqVkB.js +1 -0
- package/assets/catalog-6ZZjWdFs.js +6 -0
- package/assets/dashboard-CftAdKiH.js +3 -0
- package/assets/date-picker-DSOkNiNo.js +1 -0
- package/assets/del-modal-Cd4M7af8.js +1 -0
- package/assets/dynamic-controls-BsrJhPDY.js +1 -0
- package/assets/geo-json-CzR5JBXL.js +1 -0
- package/assets/handsontable-BI98OF5R.js +336 -0
- package/assets/history-DLHSU7Ak.js +1 -0
- package/assets/home-NcQ7nnU0.js +2 -0
- package/assets/icon-C2JNaLxH.js +1 -0
- package/assets/init-user-D2HSyXup.js +1 -0
- package/assets/input-error-CH2caTtO.js +1 -0
- package/assets/jsoneditor-DVNQmA6G.js +3869 -0
- package/assets/list-CFU0-TgN.js +4 -0
- package/assets/login-DFSLEO17.js +1 -0
- package/assets/manifest.json +246 -273
- package/assets/material-icon-Bx9pGQiQ.js +1 -0
- package/assets/media-manager-WcKe1EvD.js +6 -0
- package/assets/module-CT7PC6pc.js +1 -0
- package/assets/monaco-Bl4zdWCn.js +11 -0
- package/assets/nav-footer-BiSQkPt4.js +1 -0
- package/assets/nav-main-rTH0PfDw.js +1 -0
- package/assets/nav-user-Bj6cWs0a.js +1 -0
- package/assets/notification-Bi-PX87D.js +20 -0
- package/assets/pagination-render-AKJvTIRA.js +1 -0
- package/assets/register-BTP4uxsK.js +1 -0
- package/assets/ru-eW0WKkga.js +1 -0
- package/assets/theme-switcher-Dm8EOGzx.js +1 -0
- package/assets/toast-editor-DOg_gvSp.js +668 -0
- package/assets/user-filters-list-YUfR4XMI.js +1 -0
- package/assets/user-info-BgSbT02v.js +1 -0
- package/assets/user-menu-content-TQTXHIv6.js +1 -0
- package/assets/{vanilla-picker-l5rcX3cq.js → vanilla-picker-B3LgXoKV.js} +1 -7
- package/assets/welcome-vLwTu1R6.js +1 -0
- package/controllers/add.d.ts +1 -1
- package/controllers/add.js +20 -26
- package/controllers/addGroup.d.ts +1 -1
- package/controllers/addGroup.js +7 -15
- package/controllers/addUser.d.ts +1 -1
- package/controllers/addUser.js +10 -16
- package/controllers/catalog/Catalog.d.ts +1 -1
- package/controllers/catalog/Catalog.js +1 -10
- package/controllers/catalog/FrontendCatalogAdapter.d.ts +3 -3
- package/controllers/catalog/FrontendCatalogAdapter.js +0 -6
- package/controllers/catalog/FrontentCatalogAdapter.d.ts +3 -3
- package/controllers/catalog/FrontentCatalogAdapter.js +0 -4
- package/controllers/ckeditorUpload.js +2 -18
- package/controllers/dashboard.d.ts +1 -1
- package/controllers/dashboard.js +2 -5
- package/controllers/edit.js +24 -37
- package/controllers/editGroup.d.ts +1 -1
- package/controllers/editGroup.js +10 -21
- package/controllers/editUser.d.ts +1 -1
- package/controllers/editUser.js +11 -23
- package/controllers/exportData.d.ts +6 -0
- package/controllers/exportData.js +315 -0
- package/controllers/feed.d.ts +6 -0
- package/controllers/feed.js +73 -0
- package/controllers/feedback/feedbackController.d.ts +1 -1
- package/controllers/feedback/feedbackController.js +5 -7
- package/controllers/filter-fields/columns.d.ts +11 -0
- package/controllers/filter-fields/columns.js +106 -0
- package/controllers/filter-fields/filterFields.d.ts +10 -0
- package/controllers/filter-fields/filterFields.js +141 -0
- package/controllers/filter-fields/getAllUserFilters.d.ts +6 -0
- package/controllers/filter-fields/getAllUserFilters.js +115 -0
- package/controllers/filter-fields/groups.d.ts +5 -0
- package/controllers/filter-fields/groups.js +26 -0
- package/controllers/filter-fields/savedFilters.d.ts +25 -0
- package/controllers/filter-fields/savedFilters.js +317 -0
- package/controllers/getAllWidgets.d.ts +1 -1
- package/controllers/getAllWidgets.js +1 -9
- package/controllers/history-actions/HistoryController.js +6 -31
- package/controllers/initUser.js +6 -5
- package/controllers/inlineUpdate.d.ts +7 -0
- package/controllers/inlineUpdate.js +148 -0
- package/controllers/list.d.ts +1 -1
- package/controllers/list.js +383 -70
- package/controllers/listUserFilters.d.ts +5 -0
- package/controllers/listUserFilters.js +26 -0
- package/controllers/login.js +2 -2
- package/controllers/media-manager/mediaManagerApi.js +0 -9
- package/controllers/navigation/edit.js +3 -9
- package/controllers/notifications/NotificationController.d.ts +1 -1
- package/controllers/notifications/NotificationController.js +12 -36
- package/controllers/register.js +10 -9
- package/controllers/remove.js +10 -19
- package/controllers/timezones.d.ts +1 -1
- package/controllers/timezones.js +0 -6
- package/controllers/userApiKey.d.ts +7 -0
- package/controllers/userApiKey.js +36 -0
- package/controllers/view.js +14 -26
- package/controllers/welcome.d.ts +1 -1
- package/controllers/welcome.js +0 -4
- package/controllers/widgets/Action.d.ts +1 -1
- package/controllers/widgets/Action.js +1 -9
- package/controllers/widgets/Custom.d.ts +1 -1
- package/controllers/widgets/Custom.js +1 -9
- package/controllers/widgets/Info.d.ts +1 -1
- package/controllers/widgets/Info.js +1 -9
- package/controllers/widgets/filterInfo.d.ts +1 -0
- package/controllers/widgets/filterInfo.js +44 -0
- package/controllers/widgets/switch.d.ts +1 -1
- package/controllers/widgets/switch.js +1 -9
- package/controllers/widgetsDB.d.ts +1 -1
- package/controllers/widgetsDB.js +2 -8
- package/helpers/accessRightsHelper.d.ts +1 -1
- package/helpers/accessRightsHelper.js +5 -4
- package/helpers/apiKeyHelper.d.ts +5 -0
- package/helpers/apiKeyHelper.js +8 -0
- package/helpers/configHelper.js +12 -15
- package/helpers/controllerHelper.d.ts +14 -21
- package/helpers/controllerHelper.js +50 -83
- package/helpers/fieldsHelper.js +3 -3
- package/helpers/filterDatetimeHelper.d.ts +5 -0
- package/helpers/filterDatetimeHelper.js +84 -0
- package/helpers/inertiaActionsHelper.d.ts +2 -2
- package/helpers/inertiaActionsHelper.js +5 -4
- package/helpers/inertiaAddHelper.d.ts +3 -414
- package/helpers/inertiaAddHelper.js +39 -15
- package/helpers/inertiaGroupHelper.d.ts +2 -2
- package/helpers/inertiaGroupHelper.js +3 -3
- package/helpers/inertiaListHelper.d.ts +7 -3
- package/helpers/inertiaListHelper.js +26 -12
- package/helpers/inertiaMenuHelper.d.ts +1 -0
- package/helpers/inertiaMenuHelper.js +15 -3
- package/helpers/inertiaUserHelper.d.ts +3 -2
- package/helpers/inertiaUserHelper.js +7 -3
- package/helpers/menuHelper.d.ts +5 -2
- package/helpers/menuHelper.js +64 -12
- package/helpers/viteHelper.js +1 -2
- package/index.d.ts +6 -2
- package/index.js +6 -2
- package/interfaces/adminpanelConfig.d.ts +126 -39
- package/interfaces/internalModelAccess.d.ts +37 -0
- package/interfaces/internalModelAccess.js +1 -0
- package/interfaces/listQueryBuilder.d.ts +22 -0
- package/interfaces/listQueryBuilder.js +1 -0
- package/interfaces/queryCriteria.d.ts +54 -0
- package/interfaces/queryCriteria.js +1 -0
- package/interfaces/types.d.ts +1 -13
- package/lib/Adminizer.d.ts +4 -2
- package/lib/Adminizer.js +29 -10
- package/lib/DataAccessor.d.ts +8 -5
- package/lib/DataAccessor.js +89 -42
- package/lib/I18n.d.ts +5 -1
- package/lib/I18n.js +45 -19
- package/lib/MiddlewareManager.d.ts +8 -0
- package/lib/MiddlewareManager.js +53 -0
- package/lib/ai-assistant/OpenAiModelService.d.ts +3 -3
- package/lib/ai-assistant/OpenAiModelService.js +23 -24
- package/lib/catalog/Navigation.d.ts +1 -0
- package/lib/catalog/Navigation.js +12 -11
- package/lib/controls/jsoneditor/JsonEditor.d.ts +1 -2
- package/lib/controls/markdown/ToastUiEditor.d.ts +1 -2
- package/lib/feedback/FeedbackHandler.js +2 -2
- package/lib/filters/ConditionValidator.d.ts +107 -0
- package/lib/filters/ConditionValidator.js +483 -0
- package/lib/filters/CustomFilterHandler.d.ts +122 -0
- package/lib/filters/CustomFilterHandler.js +131 -0
- package/lib/filters/FilterCustomFieldHandler.d.ts +2 -0
- package/lib/filters/FilterCustomFieldHandler.js +2 -0
- package/lib/filters/FilterService.d.ts +82 -0
- package/lib/filters/FilterService.js +323 -0
- package/lib/filters/index.d.ts +6 -0
- package/lib/filters/index.js +4 -0
- package/lib/history-actions/AbstractHistoryAdapter.d.ts +5 -4
- package/lib/history-actions/AbstractHistoryAdapter.js +45 -30
- package/lib/history-actions/DefaultHistoryAdapter.d.ts +2 -0
- package/lib/history-actions/DefaultHistoryAdapter.js +12 -6
- package/lib/history-actions/HistoryHandler.js +1 -1
- package/lib/list-query-builder/ListQueryBuilder.d.ts +117 -0
- package/lib/list-query-builder/ListQueryBuilder.js +707 -0
- package/lib/media-manager/AbstractMediaManager.d.ts +9 -8
- package/lib/media-manager/DefaultMediaManager.d.ts +2 -0
- package/lib/media-manager/DefaultMediaManager.js +27 -15
- package/lib/media-manager/Items.d.ts +4 -1
- package/lib/media-manager/Items.js +62 -59
- package/lib/media-manager/MediaManagerHandler.js +1 -1
- package/lib/media-manager/helpers/MediaManagerHelper.d.ts +5 -1
- package/lib/media-manager/helpers/MediaManagerHelper.js +38 -4
- package/lib/model/AbstractModel.d.ts +33 -25
- package/lib/model/AbstractModel.js +54 -2
- package/lib/model/InternalModelAccessFactory.d.ts +18 -0
- package/lib/model/InternalModelAccessFactory.js +82 -0
- package/lib/model/ModelHandler.d.ts +6 -0
- package/lib/model/ModelHandler.js +14 -0
- package/lib/model/adapter/sequelize.d.ts +32 -10
- package/lib/model/adapter/sequelize.js +409 -62
- package/lib/model/adapter/typeorm.d.ts +62 -0
- package/lib/model/adapter/typeorm.js +777 -0
- package/lib/model/internalModelAccessToken.d.ts +1 -0
- package/lib/model/internalModelAccessToken.js +1 -0
- package/lib/model/internalModelRepository.d.ts +3 -0
- package/lib/model/internalModelRepository.js +4 -0
- package/lib/notifications/AbstractNotificationService.d.ts +3 -0
- package/lib/notifications/AbstractNotificationService.js +42 -36
- package/lib/notifications/GeneralNotificationService.js +37 -40
- package/lib/notifications/SystemNotificationService.js +33 -36
- package/lib/requestProcessor.js +0 -3
- package/lib/ui-i18n/getUiTranslations.d.ts +1 -0
- package/lib/ui-i18n/getUiTranslations.js +3 -0
- package/lib/ui-i18n/uiTranslationKeys.d.ts +6 -0
- package/lib/ui-i18n/uiTranslationKeys.js +268 -0
- package/lib/widgets/widgetHandler.d.ts +7 -2
- package/lib/widgets/widgetHandler.js +98 -18
- package/models/FilterAP.d.ts +116 -0
- package/models/FilterAP.js +68 -0
- package/models/FilterColumnAP.d.ts +32 -0
- package/models/FilterColumnAP.js +21 -0
- package/models/GroupAP.d.ts +1 -1
- package/models/HistoryActionsAP.d.ts +3 -3
- package/models/MediaManagerMetaAP.d.ts +1 -1
- package/models/NavigationAP.d.ts +1 -1
- package/models/UserAP.d.ts +6 -1
- package/models/UserAP.js +4 -0
- package/package.json +39 -32
- package/policies/authPolicies.d.ts +12 -0
- package/policies/authPolicies.js +104 -0
- package/policies/permissionResolvers.d.ts +12 -0
- package/policies/permissionResolvers.js +52 -0
- package/services/FeedService.d.ts +70 -0
- package/services/FeedService.js +334 -0
- package/system/Router.d.ts +1 -0
- package/system/Router.js +136 -59
- package/system/bindAccessRights.js +11 -30
- package/system/bindAuthorization.js +18 -18
- package/system/bindCors.js +16 -1
- package/system/bindCustomFilterHandlers.d.ts +2 -0
- package/system/bindCustomFilterHandlers.js +4 -0
- package/system/bindInertia.js +18 -61
- package/system/bindReqFunctions.js +10 -2
- package/system/bindTranslations.js +7 -3
- package/system/buildInternalModelAccess.d.ts +4 -0
- package/system/buildInternalModelAccess.js +59 -0
- package/system/defaults.js +18 -14
- package/system/routePolicies.d.ts +2 -0
- package/system/routePolicies.js +29 -0
- package/translations/en.json +151 -39
- package/translations/ru.json +211 -64
- package/ui/components/handsontable.js +13 -27
- package/ui/components/ui/dialog-stack.js +1 -3
- package/ui/components/ui/popover.js +1 -1
- package/ui/components/ui/sidebar.js +1 -1
- package/assets/RelationDialogStack-D9UVEF9s.js +0 -407
- package/assets/RelationDialogStack-DV8OITPR.css +0 -4
- package/assets/add-BlvzWQKF.js +0 -1
- package/assets/add-group-1Uoq9NWe.js +0 -1
- package/assets/add-group-form-B01gwDGu.js +0 -1
- package/assets/add-user-BQCAsaRy.js +0 -1
- package/assets/add-user-form-Cgwc9JkI.js +0 -1
- package/assets/app-DaOMy1nl.css +0 -72
- package/assets/app-layout-CAm60qoE.js +0 -1
- package/assets/app-shell-QWCtn9ye.js +0 -1
- package/assets/app-sidebar-CfaYbnSy.js +0 -1
- package/assets/app-sidebar-header-BsPFDhZ8.js +0 -1
- package/assets/breadcrumbs-CZZirDj8.js +0 -1
- package/assets/catalog-k5myk7fk.js +0 -6
- package/assets/dashboard-BkL9ybBw.js +0 -3
- package/assets/date-picker-B5AZ_7Q9.js +0 -1
- package/assets/del-modal-BoyXZloG.js +0 -1
- package/assets/dynamic-controls-k61T9W2P.js +0 -1
- package/assets/form-1WGY0YgG.js +0 -1
- package/assets/form-DJapG3qF.js +0 -1
- package/assets/geo-json-DsMUHo0l.js +0 -4
- package/assets/handsontable-PxYdjN8c.js +0 -298
- package/assets/history-CluyR-yJ.js +0 -1
- package/assets/home-Dug9zBzM.js +0 -2
- package/assets/icon-DfDLMG5f.js +0 -1
- package/assets/init-user-CF80MEnT.js +0 -1
- package/assets/input-error-DuuqFgZa.js +0 -1
- package/assets/jsoneditor-De1FvcYu.js +0 -3882
- package/assets/list-CuexshNt.js +0 -1
- package/assets/list-table-BsEWjTKY.js +0 -22
- package/assets/login-eDemYzN-.js +0 -1
- package/assets/material-icon-DMT8KdmE.js +0 -1
- package/assets/media-manager-DfYa_mT_.js +0 -14
- package/assets/module-Cd4Tm6uq.js +0 -1
- package/assets/monaco-BhBYtg3d.js +0 -11
- package/assets/nav-footer-D3olYxtz.js +0 -1
- package/assets/nav-main-BctqyzeV.js +0 -1
- package/assets/nav-user-Bn1Lt-BZ.js +0 -1
- package/assets/notification-D64qvni-.js +0 -27
- package/assets/pagination-render-DxD78ahJ.js +0 -1
- package/assets/register-349PwYbe.js +0 -1
- package/assets/theme-switcher-DfExsHW2.js +0 -1
- package/assets/toast-editor-ESK5iWPx.js +0 -845
- package/assets/user-info-DtBK5Kh8.js +0 -1
- package/assets/user-menu-content-0XYOCMaA.js +0 -1
- package/assets/welcome-PDp-gUei.js +0 -1
- package/controllers/form.d.ts +0 -1
- package/controllers/form.js +0 -86
- package/helpers/formHelper.d.ts +0 -6
- package/helpers/formHelper.js +0 -38
- package/helpers/inertiaFromHelper.d.ts +0 -11
- package/helpers/inertiaFromHelper.js +0 -98
- package/helpers/runtimeMode.d.ts +0 -1
- package/helpers/runtimeMode.js +0 -3
- package/lib/PolicyManager.d.ts +0 -8
- package/lib/PolicyManager.js +0 -53
- package/lib/datatable/NodeTable.d.ts +0 -49
- package/lib/datatable/NodeTable.js +0 -207
- package/lib/model/adapter/waterline.d.ts +0 -32
- package/lib/model/adapter/waterline.js +0 -180
- package/migrations/index.d.ts +0 -3
- package/migrations/index.js +0 -4
- package/migrations/knex/20250106000001_adminizer_init.d.ts +0 -8
- package/migrations/knex/20250106000001_adminizer_init.js +0 -164
- package/migrations/umzug/0001.d.ts +0 -7
- package/migrations/umzug/0001.js +0 -121
- package/migrations/umzugExports.d.ts +0 -2
- package/migrations/umzugExports.js +0 -9
- package/system/bindForms.d.ts +0 -2
- package/system/bindForms.js +0 -20
- /package/{policies → middlewares}/addMessages.d.ts +0 -0
- /package/{policies → middlewares}/addMessages.js +0 -0
- /package/{policies → middlewares}/checkAuth.d.ts +0 -0
- /package/{policies → middlewares}/checkAuth.js +0 -0
- /package/{policies → middlewares}/setLocale.d.ts +0 -0
- /package/{policies → middlewares}/setLocale.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as a,bJ as l,bK as i,bL as o}from"./app.js";import{r as c}from"./handsontable-PxYdjN8c.js";import"./jsoneditor-De1FvcYu.js";import"./monaco-BhBYtg3d.js";function m(){return c.useCallback(r=>{const t=r.trim().split(" ");if(t.length===0)return"";if(t.length===1)return t[0].charAt(0).toUpperCase();const n=t[0].charAt(0),s=t[t.length-1].charAt(0);return`${n}${s}`.toUpperCase()},[])}function u({user:e,showEmail:r=!1}){const t=m();return a.jsxs(a.Fragment,{children:[a.jsxs(l,{className:"h-8 w-8 overflow-hidden rounded-full",children:[a.jsx(i,{src:e.avatar,alt:e.login}),a.jsx(o,{className:"rounded-lg bg-neutral-200 text-black dark:bg-neutral-700 dark:text-white",children:t(e.login)})]}),a.jsxs("div",{className:"grid flex-1 text-left text-sm leading-tight",children:[a.jsx("span",{className:"truncate font-medium",children:e.login}),r&&a.jsx("span",{className:"text-muted-foreground truncate text-xs",children:e.email})]})]})}export{u as UserInfo};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e,bM as n,aU as a,aT as l,ai as i,bN as c}from"./app.js";import{UserInfo as m}from"./user-info-DtBK5Kh8.js";import{r as p}from"./handsontable-PxYdjN8c.js";import"./jsoneditor-De1FvcYu.js";import"./monaco-BhBYtg3d.js";function u(){return p.useCallback(()=>{document.body.style.removeProperty("pointer-events")},[])}function b({user:t,logout:r,logoutBtn:s}){const o=u();return e.jsxs(e.Fragment,{children:[e.jsx(n,{className:"p-0 font-normal",children:e.jsx("div",{className:"flex items-center gap-2 px-1 py-1.5 text-left text-sm",children:e.jsx(m,{user:t,showEmail:!0})})}),e.jsx(a,{}),e.jsx(l,{asChild:!0,children:e.jsxs(i,{className:"block w-full cursor-pointer",method:"get",href:r,as:"button",onClick:o,children:[e.jsx(c,{className:"mr-2"}),s]})})]})}export{b as UserMenuContent};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as o,j as t}from"./app.js";import{A as p}from"./app-layout-CAm60qoE.js";import"./jsoneditor-De1FvcYu.js";import"./handsontable-PxYdjN8c.js";import"./monaco-BhBYtg3d.js";import"./app-shell-QWCtn9ye.js";import"./app-sidebar-CfaYbnSy.js";import"./nav-main-BctqyzeV.js";import"./material-icon-DMT8KdmE.js";import"./app-sidebar-header-BsPFDhZ8.js";import"./breadcrumbs-CZZirDj8.js";import"./nav-user-Bn1Lt-BZ.js";import"./user-info-DtBK5Kh8.js";import"./user-menu-content-0XYOCMaA.js";import"./theme-switcher-DfExsHW2.js";import"./icon-DfDLMG5f.js";import"./RelationDialogStack-D9UVEF9s.js";import"./dynamic-controls-k61T9W2P.js";import"./input-error-DuuqFgZa.js";const i=[];function L(){const r=o();return t.jsx(p,{breadcrumbs:i,children:t.jsxs("div",{className:"flex h-full flex-1 flex-col gap-4 rounded-xl p-4",children:[r.props.title&&t.jsx("div",{className:"text-3xl mb-8",children:r.props.title}),t.jsx("div",{className:"text-3xl mb-8",children:"Adminizer"}),r.props.text&&t.jsx("div",{dangerouslySetInnerHTML:{__html:r.props.text}})]})})}export{L as default};
|
package/controllers/form.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function form(req: ReqType, res: ResType): Promise<void | import("express").Response<any, Record<string, any>>>;
|
package/controllers/form.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { FormHelper } from "../helpers/formHelper.js";
|
|
2
|
-
import { Adminizer } from "../lib/Adminizer.js";
|
|
3
|
-
import inertiaFormHelper from "../helpers/inertiaFromHelper.js";
|
|
4
|
-
import { getRelationsMediaManager } from "../lib/media-manager/helpers/MediaManagerHelper.js";
|
|
5
|
-
import { redirectToLogin } from '../helpers/inertiaAutHelper.js';
|
|
6
|
-
export default async function form(req, res) {
|
|
7
|
-
let slug = req.params.slug;
|
|
8
|
-
// Check slug
|
|
9
|
-
if (!slug) {
|
|
10
|
-
return res.status(404).send({ error: 'Not Found' });
|
|
11
|
-
}
|
|
12
|
-
if (req.adminizer.config.auth.enable) {
|
|
13
|
-
if (!req.user) {
|
|
14
|
-
return redirectToLogin(req, res);
|
|
15
|
-
}
|
|
16
|
-
else if (!req.adminizer.accessRightsHelper.hasPermission(`update-${slug}-form`, req.user)) {
|
|
17
|
-
return res.sendStatus(403);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
let form = FormHelper.get(req.adminizer, slug);
|
|
21
|
-
if (!form) {
|
|
22
|
-
return res.status(404).send("Adminpanel > Form not found");
|
|
23
|
-
}
|
|
24
|
-
if (req.method.toUpperCase() === "POST") {
|
|
25
|
-
if (!req.body) {
|
|
26
|
-
return res.status(500).send("Data is empty");
|
|
27
|
-
}
|
|
28
|
-
for (let prop in req.body) {
|
|
29
|
-
if (form[prop].type === 'json' && typeof req.body[prop] === 'string') {
|
|
30
|
-
try {
|
|
31
|
-
req.body[prop] = JSON.parse(req.body[prop]);
|
|
32
|
-
}
|
|
33
|
-
catch (e) {
|
|
34
|
-
if (typeof req.body[prop] === "string" && req.body[prop].replace(/(\r\n|\n|\r|\s{2,})/gm, "") && e.message !== "Unexpected end of JSON input" && !/Unexpected (token .|number) in JSON at position \d/.test(e.message)) {
|
|
35
|
-
Adminizer.log.error(JSON.stringify(req.body[prop]), e);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// checkboxes processing
|
|
41
|
-
let checkboxes = [];
|
|
42
|
-
for (let key in form) {
|
|
43
|
-
if (form[key].type === "boolean") {
|
|
44
|
-
checkboxes.push(key);
|
|
45
|
-
}
|
|
46
|
-
if (form[key].type === "mediamanager") {
|
|
47
|
-
let options = form[key].options;
|
|
48
|
-
let mediaManager = req.adminizer.mediaManagerHandler.get(options?.id ?? "default");
|
|
49
|
-
if (req.body[key])
|
|
50
|
-
await mediaManager.setRelations(req.body[key], `${slug}_${key}`, 0, key);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
for (let field of Object.keys(req.body)) {
|
|
54
|
-
await req.adminizer.config.forms.set(slug, field, req.body[field]);
|
|
55
|
-
}
|
|
56
|
-
for (let field of checkboxes) {
|
|
57
|
-
if (!req.body[field]) {
|
|
58
|
-
await req.adminizer.config.forms.set(slug, field, false);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return req.Inertia.redirect(`${req.adminizer.config.routePrefix}/form/${slug}`);
|
|
62
|
-
}
|
|
63
|
-
for (let key of Object.keys(form)) {
|
|
64
|
-
try {
|
|
65
|
-
if (form[key].type === 'mediamanager') {
|
|
66
|
-
form[key].value = await getRelationsMediaManager(req.adminizer, {
|
|
67
|
-
mediaManagerId: form[key].options?.id ?? "default",
|
|
68
|
-
model: `${slug}_${key}`,
|
|
69
|
-
widgetName: key,
|
|
70
|
-
modelId: 0
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
form[key].value = await req.adminizer.config.forms.get(slug, key);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (e) {
|
|
78
|
-
Adminizer.log.silly(`'${slug}' property was not found in storage, using source file`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const props = inertiaFormHelper(req, `${req.adminizer.config.routePrefix}/form/${slug}`, form);
|
|
82
|
-
return req.Inertia.render({
|
|
83
|
-
component: 'form',
|
|
84
|
-
props: props
|
|
85
|
-
});
|
|
86
|
-
}
|
package/helpers/formHelper.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { AdminpanelConfig } from "../interfaces/adminpanelConfig";
|
|
2
|
-
import { Adminizer } from "../lib/Adminizer";
|
|
3
|
-
export declare class FormHelper {
|
|
4
|
-
static get(adminizer: Adminizer, slug: string): AdminpanelConfig["forms"]["data"][0];
|
|
5
|
-
static loadForms(adminizer: Adminizer, formsPath: string): void;
|
|
6
|
-
}
|
package/helpers/formHelper.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import * as path from "path";
|
|
2
|
-
import * as fs from "fs";
|
|
3
|
-
import { Adminizer } from "../lib/Adminizer.js";
|
|
4
|
-
export class FormHelper {
|
|
5
|
-
static get(adminizer, slug) {
|
|
6
|
-
if (adminizer.config.forms) {
|
|
7
|
-
return adminizer.config.forms.data[slug];
|
|
8
|
-
}
|
|
9
|
-
else {
|
|
10
|
-
throw `Form with slug ${slug} not found`;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
static loadForms(adminizer, formsPath) {
|
|
14
|
-
try {
|
|
15
|
-
let formsDirectoryPath = path.resolve(formsPath);
|
|
16
|
-
let forms = fs.readdirSync(formsDirectoryPath).filter(function (file) {
|
|
17
|
-
return path.extname(file).toLowerCase() === ".json";
|
|
18
|
-
});
|
|
19
|
-
for (let formJson of forms) {
|
|
20
|
-
if (path.extname(formJson).toLowerCase() !== ".json") {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
let form = path.basename(formJson, '.json');
|
|
24
|
-
try {
|
|
25
|
-
const filePath = path.join(formsDirectoryPath, formJson);
|
|
26
|
-
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
27
|
-
adminizer.config.forms.data[form] = JSON.parse(fileContent);
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
Adminizer.log.error(`Adminpanel > Error when reading ${formJson}: ${error}`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
catch (e) {
|
|
35
|
-
Adminizer.log.error("Adminpanel > Error when loading forms", e);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { PropsField } from "../interfaces/types";
|
|
2
|
-
import { AdminpanelConfig } from "../interfaces/adminpanelConfig";
|
|
3
|
-
interface FormProps extends Record<string | number | symbol, unknown> {
|
|
4
|
-
fields: PropsField[];
|
|
5
|
-
btnSave: {
|
|
6
|
-
title: string;
|
|
7
|
-
};
|
|
8
|
-
postLink: string;
|
|
9
|
-
}
|
|
10
|
-
export default function inertiaFormHelper(req: ReqType, postLink: string, formData: AdminpanelConfig["forms"]["data"][0]): FormProps;
|
|
11
|
-
export {};
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { inputText, setSelectMany, getControlsOptions } from "./inertiaAddHelper.js";
|
|
2
|
-
export default function inertiaFormHelper(req, postLink, formData) {
|
|
3
|
-
let props = {
|
|
4
|
-
fields: [],
|
|
5
|
-
btnSave: {
|
|
6
|
-
title: req.i18n.__('Save')
|
|
7
|
-
},
|
|
8
|
-
postLink: postLink
|
|
9
|
-
};
|
|
10
|
-
for (const key of Object.keys(formData)) {
|
|
11
|
-
let field = formData[key];
|
|
12
|
-
const type = (field.type || field.type).toLowerCase();
|
|
13
|
-
const isIn = field.isIn ?? [];
|
|
14
|
-
let label = field.title ?? '';
|
|
15
|
-
let tooltip = field.tooltip ?? '';
|
|
16
|
-
let name = key;
|
|
17
|
-
let fieldType = 'text';
|
|
18
|
-
let disabled = false;
|
|
19
|
-
let required = field.required ?? false;
|
|
20
|
-
let options = {};
|
|
21
|
-
let value = field.value ?? undefined;
|
|
22
|
-
if (['string', 'password', 'date', 'datetime', 'time', 'integer', 'number', 'float', 'email', 'month', 'week', 'range'].includes(type)) {
|
|
23
|
-
fieldType = inputText(type, isIn);
|
|
24
|
-
if (type === 'range') {
|
|
25
|
-
options = { ...field.options };
|
|
26
|
-
if ("min" in field.options) {
|
|
27
|
-
value = value ? value : field.options.min ? field.options.min : 0;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
if (type === 'color') {
|
|
32
|
-
fieldType = 'color';
|
|
33
|
-
value = value ?? '#000000';
|
|
34
|
-
}
|
|
35
|
-
if (type === 'select') {
|
|
36
|
-
fieldType = 'select';
|
|
37
|
-
}
|
|
38
|
-
if (type === 'boolean' || type === 'binary') {
|
|
39
|
-
fieldType = 'checkbox';
|
|
40
|
-
}
|
|
41
|
-
if (['text', 'longtext', 'mediumtext'].includes(type)) {
|
|
42
|
-
fieldType = 'textarea';
|
|
43
|
-
}
|
|
44
|
-
if (type === 'select-many') {
|
|
45
|
-
fieldType = 'select-many';
|
|
46
|
-
const { initValue, initOptions } = setSelectMany(isIn, value);
|
|
47
|
-
options = initOptions;
|
|
48
|
-
value = initValue;
|
|
49
|
-
}
|
|
50
|
-
if (['ckeditor', 'wysiwyg', 'texteditor', 'word'].includes(type)) {
|
|
51
|
-
fieldType = 'wysiwyg';
|
|
52
|
-
options = getControlsOptions(field, req, fieldType, 'ckeditor');
|
|
53
|
-
}
|
|
54
|
-
if (['tui', 'tuieditor', 'toast-ui'].includes(type)) {
|
|
55
|
-
fieldType = 'markdown';
|
|
56
|
-
options = getControlsOptions(field, req, fieldType, 'toast-ui');
|
|
57
|
-
}
|
|
58
|
-
if (type === 'table') {
|
|
59
|
-
fieldType = 'table';
|
|
60
|
-
options = getControlsOptions(field, req, fieldType, 'handsontable');
|
|
61
|
-
}
|
|
62
|
-
if (['jsoneditor', 'json', 'array', 'object'].includes(type)) {
|
|
63
|
-
fieldType = 'jsonEditor';
|
|
64
|
-
options = getControlsOptions(field, req, fieldType, 'jsoneditor');
|
|
65
|
-
}
|
|
66
|
-
if (['ace', 'html', 'xml', 'aceeditor', 'code'].includes(type)) {
|
|
67
|
-
fieldType = 'codeEditor';
|
|
68
|
-
options = getControlsOptions(field, req, fieldType, 'monaco');
|
|
69
|
-
}
|
|
70
|
-
if (['geojson', 'geo-polygon', 'geo-marker'].includes(type)) {
|
|
71
|
-
fieldType = 'geoJson';
|
|
72
|
-
options = getControlsOptions(field, req, fieldType, 'leaflet');
|
|
73
|
-
}
|
|
74
|
-
if (type === 'mediamanager') {
|
|
75
|
-
const mOptions = field.options;
|
|
76
|
-
const mediaManager = req.adminizer.mediaManagerHandler.get(mOptions.id || 'default');
|
|
77
|
-
if (!mediaManager) {
|
|
78
|
-
options = {};
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
fieldType = 'mediamanager';
|
|
82
|
-
options = mOptions;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
props.fields.push({
|
|
86
|
-
label: label,
|
|
87
|
-
tooltip: tooltip,
|
|
88
|
-
name: name,
|
|
89
|
-
type: fieldType,
|
|
90
|
-
value: value,
|
|
91
|
-
disabled: disabled,
|
|
92
|
-
required: required,
|
|
93
|
-
isIn: isIn,
|
|
94
|
-
options: options
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
return props;
|
|
98
|
-
}
|
package/helpers/runtimeMode.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function isAdminizerViteDevMode(): boolean;
|
package/helpers/runtimeMode.js
DELETED
package/lib/PolicyManager.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Adminizer } from "./Adminizer";
|
|
2
|
-
declare class PolicyManager {
|
|
3
|
-
private readonly _adminizer;
|
|
4
|
-
constructor(adminizer: Adminizer);
|
|
5
|
-
loadPolicies(): Promise<void>;
|
|
6
|
-
bindPolicies(policies: MiddlewareType[], action: MiddlewareType): MiddlewareType[];
|
|
7
|
-
}
|
|
8
|
-
export default PolicyManager;
|
package/lib/PolicyManager.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { Adminizer } from "./Adminizer.js";
|
|
4
|
-
import { pathToFileURL } from "url";
|
|
5
|
-
class PolicyManager {
|
|
6
|
-
_adminizer;
|
|
7
|
-
constructor(adminizer) {
|
|
8
|
-
this._adminizer = adminizer;
|
|
9
|
-
}
|
|
10
|
-
async loadPolicies() {
|
|
11
|
-
try {
|
|
12
|
-
const policiesDirPath = path.join(import.meta.dirname, "../policies");
|
|
13
|
-
const policiesDir = fs.readdirSync(policiesDirPath);
|
|
14
|
-
for (const policyFile of policiesDir) {
|
|
15
|
-
if (path.extname(policyFile).toLowerCase() === ".js") {
|
|
16
|
-
const policyPath = path.join(policiesDirPath, policyFile);
|
|
17
|
-
const policy = (await import(pathToFileURL(policyPath).href)).default;
|
|
18
|
-
if (typeof policy === "function" &&
|
|
19
|
-
Array.isArray(this._adminizer.config.policies)) {
|
|
20
|
-
this._adminizer.config.policies.push(policy);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
Adminizer.log.error(`Adminizer > Policy ${policyFile} is not a function`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
Adminizer.log.info("Adminizer policies loaded");
|
|
28
|
-
}
|
|
29
|
-
catch (e) {
|
|
30
|
-
Adminizer.log.error("Adminizer > Could not load policies", e);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
bindPolicies(policies, action) {
|
|
34
|
-
const result = [];
|
|
35
|
-
const bindPolicy = (policy) => {
|
|
36
|
-
if (typeof policy === "function") {
|
|
37
|
-
result.push(policy);
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
Adminizer.log.error("AdminPanel: Policy format unknown: " + policy);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
if (Array.isArray(policies)) {
|
|
44
|
-
policies.forEach(bindPolicy);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
bindPolicy(policies);
|
|
48
|
-
}
|
|
49
|
-
result.push(action);
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export default PolicyManager;
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Fields } from '../../helpers/fieldsHelper';
|
|
2
|
-
import { AbstractModel } from '../model/AbstractModel';
|
|
3
|
-
import { DataAccessor } from "../DataAccessor";
|
|
4
|
-
interface Request {
|
|
5
|
-
start: string;
|
|
6
|
-
length: string;
|
|
7
|
-
order: Order[];
|
|
8
|
-
columns: Column[];
|
|
9
|
-
search: Search;
|
|
10
|
-
draw: string;
|
|
11
|
-
}
|
|
12
|
-
interface Order {
|
|
13
|
-
column: string;
|
|
14
|
-
dir: string;
|
|
15
|
-
}
|
|
16
|
-
export interface Column {
|
|
17
|
-
data: string;
|
|
18
|
-
searchable: string;
|
|
19
|
-
orderable: string;
|
|
20
|
-
search: {
|
|
21
|
-
value: string;
|
|
22
|
-
regex: 'true' | 'false' | boolean;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
interface Search {
|
|
26
|
-
value: string;
|
|
27
|
-
}
|
|
28
|
-
export interface NodeOutput {
|
|
29
|
-
draw: string | number;
|
|
30
|
-
recordsTotal: number;
|
|
31
|
-
recordsFiltered: number;
|
|
32
|
-
data: object[];
|
|
33
|
-
}
|
|
34
|
-
export declare class NodeTable {
|
|
35
|
-
request: Request;
|
|
36
|
-
model: AbstractModel<any>;
|
|
37
|
-
fields: Fields;
|
|
38
|
-
fieldsArray: string[];
|
|
39
|
-
constructor(request: Request, model: AbstractModel<any>, fields: Fields);
|
|
40
|
-
limit(): Promise<number[]>;
|
|
41
|
-
order(): string;
|
|
42
|
-
filter(): any;
|
|
43
|
-
buildQuery(): Promise<any>;
|
|
44
|
-
output(callback: (err: Error, output: NodeOutput) => void, dataAccessor: DataAccessor): Promise<void>;
|
|
45
|
-
mapData(data: {
|
|
46
|
-
[key: string]: any;
|
|
47
|
-
}): object[];
|
|
48
|
-
}
|
|
49
|
-
export {};
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
export class NodeTable {
|
|
2
|
-
request;
|
|
3
|
-
// TODO should be operated by DataModel, because we need access right apply
|
|
4
|
-
model;
|
|
5
|
-
fields;
|
|
6
|
-
fieldsArray = ['actions'];
|
|
7
|
-
constructor(request, model, fields) {
|
|
8
|
-
this.request = request;
|
|
9
|
-
this.model = model;
|
|
10
|
-
this.fields = fields;
|
|
11
|
-
this.fieldsArray = this.fieldsArray.concat(Object.keys(this.fields));
|
|
12
|
-
}
|
|
13
|
-
async limit() {
|
|
14
|
-
let limit = [];
|
|
15
|
-
if (this.request.start !== "" && this.request.length !== "") {
|
|
16
|
-
limit = [parseInt(this.request.start), parseInt(this.request.length)];
|
|
17
|
-
}
|
|
18
|
-
return limit;
|
|
19
|
-
}
|
|
20
|
-
order() {
|
|
21
|
-
if (this.request.order.length > 0) {
|
|
22
|
-
let element = this.request.order[0];
|
|
23
|
-
let columnIdx = parseInt(element.column);
|
|
24
|
-
let requestColumn = this.request.columns[columnIdx];
|
|
25
|
-
if (requestColumn && requestColumn.data && requestColumn.orderable === "true") {
|
|
26
|
-
let columnName = requestColumn.data;
|
|
27
|
-
if (columnName + "" === 0 + "") {
|
|
28
|
-
columnName = "1";
|
|
29
|
-
}
|
|
30
|
-
return `${this.fieldsArray[parseInt(columnName)]} ${element.dir.toUpperCase()}`;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// Set default order
|
|
34
|
-
return `createdAt DESC`;
|
|
35
|
-
}
|
|
36
|
-
filter() {
|
|
37
|
-
let globalSearch = [];
|
|
38
|
-
let localSearch = [];
|
|
39
|
-
let hasLocalSearch = false;
|
|
40
|
-
if (typeof this.request.columns === 'object' && this.request.columns !== null) {
|
|
41
|
-
for (const key in this.request.columns) {
|
|
42
|
-
if (Object.prototype.hasOwnProperty.call(this.request.columns, key)) {
|
|
43
|
-
const column = this.request.columns[key];
|
|
44
|
-
if (column && column.search && column.search.value !== '') {
|
|
45
|
-
hasLocalSearch = true;
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if ((this.request.search !== undefined && this.request.search.value !== "") || hasLocalSearch) {
|
|
52
|
-
let searchStrGlobal = this.request.search.value;
|
|
53
|
-
const columns = this.request.columns;
|
|
54
|
-
const fieldsArray = this.fieldsArray;
|
|
55
|
-
for (let index = 0; index < columns.length; index++) {
|
|
56
|
-
let searchStr = searchStrGlobal;
|
|
57
|
-
let columnQuery = null;
|
|
58
|
-
const requestColumn = columns[index];
|
|
59
|
-
let isLocalSearch = false;
|
|
60
|
-
if (hasLocalSearch && requestColumn['search']['value']) {
|
|
61
|
-
searchStr = requestColumn['search']['value'];
|
|
62
|
-
isLocalSearch = true;
|
|
63
|
-
}
|
|
64
|
-
const columnName = requestColumn.data;
|
|
65
|
-
if (!searchStr)
|
|
66
|
-
continue;
|
|
67
|
-
// Skip actions first column
|
|
68
|
-
if (fieldsArray[parseInt(columnName)] === 'actions') {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
if (requestColumn.searchable === "true") {
|
|
72
|
-
const fieldType = this.fields[fieldsArray[parseInt(columnName)]].model.type;
|
|
73
|
-
switch (fieldType) {
|
|
74
|
-
case 'boolean':
|
|
75
|
-
if (searchStr + "" === "true" || searchStr + "" === "false") {
|
|
76
|
-
columnQuery = { [fieldsArray[parseInt(columnName)]]: searchStr.toLowerCase() === 'true' };
|
|
77
|
-
}
|
|
78
|
-
break;
|
|
79
|
-
case 'number':
|
|
80
|
-
if (searchStr.startsWith(">") || searchStr.startsWith("<")) {
|
|
81
|
-
if (Number.isNaN(parseFloat(searchStr.substring(1)))) {
|
|
82
|
-
break;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (searchStr.startsWith(">")) {
|
|
86
|
-
columnQuery = { [fieldsArray[parseInt(columnName)]]: { '>=': parseFloat(searchStr.substring(1)) } };
|
|
87
|
-
}
|
|
88
|
-
else if (searchStr.startsWith("<")) {
|
|
89
|
-
columnQuery = { [fieldsArray[parseInt(columnName)]]: { '<=': parseFloat(searchStr.substring(1)) } };
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
if (!Number.isNaN(parseFloat(searchStr))) {
|
|
93
|
-
columnQuery = { [fieldsArray[parseInt(columnName)]]: parseFloat(searchStr) };
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
break;
|
|
97
|
-
case 'string':
|
|
98
|
-
columnQuery = { [fieldsArray[parseInt(columnName)]]: { contains: searchStr } };
|
|
99
|
-
break;
|
|
100
|
-
default:
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (columnQuery) {
|
|
105
|
-
if (isLocalSearch) {
|
|
106
|
-
localSearch.push(columnQuery);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
globalSearch.push(columnQuery);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
let criteria = {};
|
|
115
|
-
if (globalSearch.length || localSearch.length) {
|
|
116
|
-
if (globalSearch.length) {
|
|
117
|
-
criteria['or'] = globalSearch;
|
|
118
|
-
}
|
|
119
|
-
if (localSearch.length) {
|
|
120
|
-
criteria['and'] = localSearch;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return criteria;
|
|
124
|
-
}
|
|
125
|
-
async buildQuery() {
|
|
126
|
-
const limit = await this.limit();
|
|
127
|
-
const order = await this.order();
|
|
128
|
-
const filter = await this.filter();
|
|
129
|
-
return { where: filter, sort: order, skip: limit[0], limit: limit[1] };
|
|
130
|
-
}
|
|
131
|
-
async output(callback, dataAccessor) {
|
|
132
|
-
try {
|
|
133
|
-
const queryOptions = await this.buildQuery();
|
|
134
|
-
const totalRecords = await this.model.count({}, dataAccessor);
|
|
135
|
-
const filteredRecords = await this.model.count(queryOptions.where, dataAccessor);
|
|
136
|
-
const data = await this.model.find(queryOptions, dataAccessor);
|
|
137
|
-
const output = {
|
|
138
|
-
draw: this.request.draw !== "" ? this.request.draw : 0,
|
|
139
|
-
recordsTotal: totalRecords,
|
|
140
|
-
recordsFiltered: filteredRecords,
|
|
141
|
-
data: this.mapData(data)
|
|
142
|
-
};
|
|
143
|
-
if (typeof callback === 'function') {
|
|
144
|
-
callback(null, output);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
throw new Error('Provide a callable function!');
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
callback(error, null);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
mapData(data) {
|
|
155
|
-
let out = [];
|
|
156
|
-
data.forEach((elem) => {
|
|
157
|
-
let row = {};
|
|
158
|
-
// Add primary key first
|
|
159
|
-
row[this.model.primaryKey ?? 'id'] = elem[this.model.primaryKey ?? 'id'];
|
|
160
|
-
Object.keys(this.fields).forEach((key) => {
|
|
161
|
-
let fieldConfigConfig = this.fields[key].config;
|
|
162
|
-
let fieldName = key;
|
|
163
|
-
let displayField = this.fields[key].modelConfig?.titleField ?? typeof row["title"] !== "undefined" ? 'title'
|
|
164
|
-
: typeof row["name"] !== "undefined" ? 'name'
|
|
165
|
-
: typeof row[this.fields[key].modelConfig?.identifierField] !== "undefined" ? this.fields[key].modelConfig?.identifierField : this.fields[key].modelConfig?.identifierField;
|
|
166
|
-
if (fieldConfigConfig.displayModifier) {
|
|
167
|
-
row[fieldName] = fieldConfigConfig.displayModifier(elem[key]);
|
|
168
|
-
}
|
|
169
|
-
else if (this.fields[key].model && this.fields[key].model.model) {
|
|
170
|
-
// Handle "belongsTo" relationships
|
|
171
|
-
if (!elem[key]) {
|
|
172
|
-
row[fieldName] = null;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
row[fieldName] = elem[key][displayField];
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else if (this.fields[key].model.type === "association-many" || this.fields[key].model.type === "association") {
|
|
179
|
-
if (!elem[key] || elem[key].length === 0) {
|
|
180
|
-
row[fieldName] = null;
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
let displayValues = [];
|
|
184
|
-
elem[key].forEach((item) => {
|
|
185
|
-
if (item[displayField]) {
|
|
186
|
-
displayValues.push(item[displayField]);
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
displayValues.push(item[fieldConfigConfig.identifierField]);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
row[fieldName] = displayValues.join(', ');
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
else if (this.fields[key].model.type === "json") {
|
|
196
|
-
let str = JSON.stringify(elem[key]);
|
|
197
|
-
row[fieldName] = str === "{}" ? "" : str;
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
row[fieldName] = elem[key];
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
out.push(row);
|
|
204
|
-
});
|
|
205
|
-
return out;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { AbstractAdapter, AbstractModel } from "../AbstractModel";
|
|
2
|
-
import { FindOptions } from "../AbstractModel";
|
|
3
|
-
import Waterline from "waterline";
|
|
4
|
-
export declare class WaterlineModel<T> extends AbstractModel<T> {
|
|
5
|
-
private model;
|
|
6
|
-
constructor(modelName: string, model: any);
|
|
7
|
-
protected _create(data: T): Promise<T>;
|
|
8
|
-
/** Custom populate all function */
|
|
9
|
-
private populateAll;
|
|
10
|
-
protected _findOne(criteria: Partial<T>): Promise<T | null>;
|
|
11
|
-
protected _find(criteria?: Partial<any>, options?: FindOptions): Promise<T[]>;
|
|
12
|
-
protected _updateOne(criteria: Partial<T>, data: Partial<T>): Promise<T | null>;
|
|
13
|
-
protected _update(criteria: Partial<T>, data: Partial<T>): Promise<T[]>;
|
|
14
|
-
protected _destroyOne(criteria: Partial<T>): Promise<T | null>;
|
|
15
|
-
protected _destroy(criteria: Partial<T>): Promise<T[]>;
|
|
16
|
-
protected _count(criteria?: Partial<T>): Promise<number>;
|
|
17
|
-
}
|
|
18
|
-
export declare class WaterlineAdapter extends AbstractAdapter {
|
|
19
|
-
Model: any;
|
|
20
|
-
/** In case of waterline, we are storing complex object in "orm" field of our AbstractAdapter.
|
|
21
|
-
* It contains waterline orm and waterline ontology. One for storing methods like registerModel and initialize,
|
|
22
|
-
* the other for storing collections with methods find, create etc. Also, we need waterlineConfig */
|
|
23
|
-
constructor(orm: {
|
|
24
|
-
orm: Waterline.Waterline;
|
|
25
|
-
ontology: Waterline.Ontology;
|
|
26
|
-
});
|
|
27
|
-
get models(): Record<string, any>;
|
|
28
|
-
getModel(modelName: string): Record<string, any>;
|
|
29
|
-
getAttributes(modelName: string): Waterline.Attributes;
|
|
30
|
-
/** Method that processes custom waterline model creation. Is used for system models. Replaces beforeCreate method in waterline */
|
|
31
|
-
static registerSystemModels(waterlineORM: Waterline.Waterline): Promise<void>;
|
|
32
|
-
}
|