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}}
-
+
{{/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 {