')
+ .addClass('breadcrumb-item')
+ .append(item);
});
- return '';
+ let $div = $('
')
+ .addClass('header-breadcrumbs');
+
+ $itemList.forEach(($item, i) => {
+ $div.append($item);
+
+ if (i === $itemList.length - 1) {
+ return;
+ }
+
+ $div.append(
+ $('
')
+ .addClass('breadcrumb-separator')
+ .append(
+ $('
').addClass('chevron-right')
+ )
+ )
+ });
+
+ return $div.get(0).outerHTML;
},
diff --git a/client/src/views/modal.js b/client/src/views/modal.js
index 0c77921e3a..6357274d0c 100644
--- a/client/src/views/modal.js
+++ b/client/src/views/modal.js
@@ -32,6 +32,7 @@ define('views/modal', ['view'], function (Dep) {
* A base modal view. Can be extended or used directly.
*
* Options:
+ * - `headerElement`
* - `headerHtml`
* - `headerText`
* - `$header`
@@ -88,13 +89,29 @@ define('views/modal', ['view'], function (Dep) {
header: false,
/**
- * A header HTML.
+ * A header HTML. Beware of XSS.
*
* @protected
* @type {string}
*/
headerHtml: null,
+ /**
+ * A header JQuery instance.
+ *
+ * @protected
+ * @type {JQuery}
+ */
+ $header: null,
+
+ /**
+ * A header element.
+ *
+ * @protected
+ * @type {Element}
+ */
+ headerElement: null,
+
/**
* A dialog instance.
*
@@ -228,6 +245,7 @@ define('views/modal', ['view'], function (Dep) {
this.header = this.options.header || this.header;
this.headerHtml = this.options.headerHtml || this.headerHtml;
this.$header = this.options.$header || this.$header;
+ this.headerElement = this.options.headerElement || this.headerElement;
if (this.options.headerText) {
this.headerHtml = Handlebars.Utils.escapeExpression(this.options.headerText);
@@ -272,6 +290,10 @@ define('views/modal', ['view'], function (Dep) {
headerHtml = this.$header.get(0).outerHTML;
}
+ if (this.headerElement) {
+ headerHtml = this.headerElement.outerHTML;
+ }
+
this.dialog = new Espo.Ui.Dialog({
backdrop: this.backdrop,
header: headerHtml,
diff --git a/client/src/views/modals/view-map.js b/client/src/views/modals/view-map.js
index b3945049a7..98de722941 100644
--- a/client/src/views/modals/view-map.js
+++ b/client/src/views/modals/view-map.js
@@ -26,7 +26,7 @@
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
-define('views/modals/view-map', 'views/modal', function (Dep) {
+define('views/modals/view-map', ['views/modal'], function (Dep) {
return Dep.extend({
@@ -46,13 +46,19 @@ define('views/modals/view-map', 'views/modal', function (Dep) {
},
setup: function () {
- var field = this.options.field;
+ let field = this.options.field;
- this.headerHtml = this.getHelper().sanitizeHtml(
- this.translate(field, 'fields', this.model.entityType)
- );
+ let url = '#AddressMap/view/' + this.model.entityType + '/' + this.model.id + '/' + field;
+ let fieldLabel = this.translate(field, 'fields', this.model.entityType);
- var viewName = this.model.getFieldParam(field + 'Map', 'view') || this.getFieldManager().getViewName('map');
+ this.headerElement =
+ $('')
+ .attr('href', '#' + url)
+ .text(fieldLabel)
+ .get(0);
+
+ let viewName = this.model.getFieldParam(field + 'Map', 'view') ||
+ this.getFieldManager().getViewName('map');
this.createView('map', viewName, {
model: this.model,
@@ -61,6 +67,5 @@ define('views/modals/view-map', 'views/modal', function (Dep) {
height: 'auto',
});
},
-
});
});