diff --git a/client/res/templates/record/kanban-item.tpl b/client/res/templates/record/kanban-item.tpl index 786689bd0a..c6771e2a4b 100644 --- a/client/res/templates/record/kanban-item.tpl +++ b/client/res/templates/record/kanban-item.tpl @@ -4,7 +4,7 @@
{{#if isFirst}} {{#unless rowActionsDisabled}} -
{{{../itemMenu}}}
+
{{{../itemMenu}}}
{{/unless}} {{/if}}
diff --git a/client/src/app.js b/client/src/app.js index 81954dae96..e88ed9f287 100644 --- a/client/src/app.js +++ b/client/src/app.js @@ -691,6 +691,14 @@ class App { if (!className) { const module = this.metadata.get(`scopes.${name}.module`); + if (!/^[A-Za-z0-9]+$/.test(name)) { + console.error(`Bad controller name ${name}.`); + + this.baseController.error404(); + + return; + } + className = Utils.composeClassName(module, name, 'controllers'); } diff --git a/client/src/loader.js b/client/src/loader.js index bab05c453d..c2b43ee8f2 100644 --- a/client/src/loader.js +++ b/client/src/loader.js @@ -763,7 +763,7 @@ } console.warn(`Could not obtain ${id}.`); - }); + }, errorCallback); return; } @@ -792,9 +792,10 @@ * @private * @param {string} url * @param {function} callback + * @param {function|null} [errorCallback] * @return {Promise} */ - _addScript(url, callback) { + _addScript(url, callback, errorCallback = null) { const script = document.createElement('script'); script.src = url; @@ -802,6 +803,10 @@ script.addEventListener('error', e => { console.error(`Could not load script '${url}'.`, e); + + if (errorCallback) { + errorCallback(); + } }); document.head.appendChild(script); diff --git a/client/src/ui/app-init.js b/client/src/ui/app-init.js index a2ddcc882d..37a4c36bef 100644 --- a/client/src/ui/app-init.js +++ b/client/src/ui/app-init.js @@ -112,8 +112,14 @@ function uiAppInit() { const $dashletBody = $(target).closest('.dashlet-body'); - if ($dashletBody.length) { - const $body = $dashletBody; + const fixPosition = e.target.parentElement.classList.contains('fix-position'); + + if ($dashletBody.length || fixPosition) { + let $body = $dashletBody; + + if (fixPosition) { + $body = $(window); + } $(target).removeClass('dropup'); @@ -152,10 +158,10 @@ function uiAppInit() { right: 'auto', }); - return; + //return; } - if (e.target.parentElement.classList.contains('fix-overflow')) { + /*if (e.target.parentElement.classList.contains('fix-overflow')) { $(target).removeClass('dropup'); const isRight = e.target.classList.contains('pull-right'); @@ -187,7 +193,7 @@ function uiAppInit() { left: left, right: 'auto', }); - } + }*/ }); } diff --git a/frontend/less/espo/elements/dropdown.less b/frontend/less/espo/elements/dropdown.less index 2b71630930..ea8e183178 100644 --- a/frontend/less/espo/elements/dropdown.less +++ b/frontend/less/espo/elements/dropdown.less @@ -204,11 +204,11 @@ ul.dropdown-menu { margin-right: var(--2px); } -.fix-overflow { +/*.fix-position { .btn-group { position: unset; } -} +}*/ .dropdown-menu { .quick-search-list-item {