diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js
index 3912373bde..e033ae4c5b 100644
--- a/frappe/public/js/frappe/desk.js
+++ b/frappe/public/js/frappe/desk.js
@@ -128,7 +128,7 @@ frappe.Application = Class.extend({
}
// REDESIGN-TODO: Fix preview popovers
- //this.link_preview = new frappe.ui.LinkPreview();
+ this.link_preview = new frappe.ui.LinkPreview();
if (!frappe.boot.developer_mode) {
setInterval(function() {
diff --git a/frappe/public/js/frappe/ui/link_preview.js b/frappe/public/js/frappe/ui/link_preview.js
index 141ca1408e..328cd23716 100644
--- a/frappe/public/js/frappe/ui/link_preview.js
+++ b/frappe/public/js/frappe/ui/link_preview.js
@@ -22,7 +22,6 @@ frappe.ui.LinkPreview = class {
}
});
this.handle_popover_hide();
-
}
identify_doc() {
@@ -122,7 +121,7 @@ frappe.ui.LinkPreview = class {
}
});
- $(window).on('hashchange', () => {
+ frappe.router.on('change', () => {
this.clear_all_popovers();
});
}
@@ -142,18 +141,22 @@ frappe.ui.LinkPreview = class {
let popover_content = this.get_popover_html(preview_data);
this.element.popover({
container: 'body',
+ template: `
+
+ `,
html: true,
+ sanitizeFn: (content) => content,
content: popover_content,
trigger: 'manual',
- placement: 'top auto',
- animation: false,
+ placement: 'top',
});
- const $popover = this.element.data('bs.popover').tip();
-
- $popover.addClass('link-preview-popover');
+ const $popover = $(this.element.data('bs.popover').tip);
$popover.toggleClass('control-field-popover', this.is_link);
-
this.popovers_list.push(this.element.data('bs.popover'));
}
@@ -167,53 +170,63 @@ frappe.ui.LinkPreview = class {
this.href = this.href.replace(new RegExp(' ', 'g'), '%20');
}
- let image_html = '';
- let id_html = '';
- let content_html = '';
-
- if (preview_data.preview_image) {
- let image_url = encodeURI(preview_data.preview_image);
- image_html = `
+ let popover_content =`
+
+
+
+ ${this.get_content_html(preview_data)}
+
+ `;
- if (preview_data.preview_title != preview_data.name) {
+ return popover_content;
+ }
+
+ get_id_html(preview_data) {
+ let id_html = '';
+ if (preview_data.preview_title !== preview_data.name) {
id_html = `${preview_data.name}`;
}
+ return id_html;
+ }
+
+ get_image_html(preview_data) {
+ let avatar_html = frappe.get_avatar(
+ "avatar-medium",
+ preview_data.preview_title,
+ preview_data.preview_image
+ );
+
+ return `
+ ${avatar_html}
+
`;
+ }
+
+ get_content_html(preview_data) {
+ let content_html = '';
+
Object.keys(preview_data).forEach(key => {
if (!['preview_image', 'preview_title', 'name'].includes(key)) {
let value = frappe.ellipsis(preview_data[key], 280);
let label = key;
content_html += `
-
${__(label)}
-
${value}
+
${__(label)}
+
${value}
`;
}
});
- content_html = `${content_html}
`;
- let popover_content =`
-
-
-
- ${content_html}
-
- `;
-
- return popover_content;
+ return `${content_html}
`;
}
};
diff --git a/frappe/public/js/frappe/utils/common.js b/frappe/public/js/frappe/utils/common.js
index cd3f35d830..8fec3b2611 100644
--- a/frappe/public/js/frappe/utils/common.js
+++ b/frappe/public/js/frappe/utils/common.js
@@ -20,27 +20,25 @@ frappe.avatar = function (user, css_class, title, image_url=null, remove_color=f
title = user_info.fullname;
}
- return frappe.get_avatar(
- user, css_class, title, image_url || user_info.image, remove_color, filterable
- );
-};
-
-frappe.get_avatar = function(user, css_class, title, image_url=null, remove_color, filterable) {
let data_attr = '';
-
- if (!css_class) {
- css_class = "avatar-small";
- }
-
if (filterable) {
css_class += " filterable";
data_attr = `data-filter="_assign,like,%${user}%"`;
}
+ return frappe.get_avatar(
+ css_class, title, image_url || user_info.image, remove_color, data_attr
+ );
+};
+
+frappe.get_avatar = function(css_class, title, image_url=null, remove_color, data_attributes) {
+ if (!css_class) {
+ css_class = "avatar-small";
+ }
+
if (image_url) {
const image = (window.cordova && image_url.indexOf('http') === -1) ? frappe.base_url + image_url : image_url;
-
- return `
+ return `
`;
@@ -55,7 +53,8 @@ frappe.get_avatar = function(user, css_class, title, image_url=null, remove_colo
if (css_class === 'avatar-small' || css_class == 'avatar-xs') {
abbr = abbr.substr(0, 1);
}
- return `
+
+ return `
${abbr}
diff --git a/frappe/public/scss/desk/global.scss b/frappe/public/scss/desk/global.scss
index 68744ffd24..b09d9146ae 100644
--- a/frappe/public/scss/desk/global.scss
+++ b/frappe/public/scss/desk/global.scss
@@ -252,6 +252,7 @@ select.input-xs {
/* popover */
.popover {
background-color: var(--popover-bg);
+ border: 0;
}
.bold {
diff --git a/frappe/public/scss/desk/link_preview.scss b/frappe/public/scss/desk/link_preview.scss
index af14c4d8ef..b2dd3ec425 100644
--- a/frappe/public/scss/desk/link_preview.scss
+++ b/frappe/public/scss/desk/link_preview.scss
@@ -1,48 +1,61 @@
.link-preview-popover {
- border-radius: 0;
max-width: 100%;
+
.popover-content {
- padding: 0;
- .preview-popover-header {
- padding: var(--padding-md);
+ padding: var(--padding-md) 25px;
- .preview-header {
- display: inline-block;
- vertical-align: top;
- }
+ .preview-header {
+ @include flex(flex, null, center, column);
+ }
- .preview-image {
- width: 70px;
- height: 70px;
- object-fit: cover;
- margin-right: var(--margin-sm);
- border-radius: var(--border-radius);
- }
+ .preview-image {
+ margin-bottom: var(--margin-sm);
- .preview-name {
- display: block;
- }
+ .avatar {
+ width: 52px;
+ height: 52px;
- .preview-title {
- display: block;
+ .standard-image {
+ font-size: var(--text-lg);
+ }
}
}
- hr {
- margin: 0;
+ .preview-name {
+ font-size: var(--text-base);
+ font-weight: 500;
}
- .preview-table {
- padding: var(--padding-md);
- padding-bottom: var(--padding-xs);
- max-width: 330px;
- min-width: 200px;
- overflow-wrap: break-word;
+ .preview-title:not(:empty) {
+ margin-top: var(--margin-xs);
+ font-size: var(--text-md);
+ }
- .preview-field {
- padding-bottom: var(--padding-sm);
- .preview-label {
- padding-bottom: 4px;
+ .popover-body {
+ padding: 0;
+ .preview-table {
+ padding-bottom: var(--padding-xs);
+ max-width: 330px;
+ min-width: 200px;
+ overflow-wrap: break-word;
+
+ .preview-field {
+
+ .preview-label {
+ padding-bottom: 4px;
+ }
+
+ .preview-value {
+ font-weight: 500;
+ }
+
+ .ql-snow .ql-editor {
+ min-height: 0;
+ }
+
+ &:not(:last-child) {
+ margin-bottom: var(--margin-md);
+ }
}
}
}
diff --git a/frappe/public/scss/desk/variables.scss b/frappe/public/scss/desk/variables.scss
index 26af534c6f..4f43f22b9d 100644
--- a/frappe/public/scss/desk/variables.scss
+++ b/frappe/public/scss/desk/variables.scss
@@ -98,7 +98,7 @@ $mark-padding: 0;
$enable-shadows: true;
$popover-border-radius: var(--border-radius);
$popover-bg: var(--popover-bg);
-$popover-box-shadow: var(--shadow-md);
+$popover-box-shadow: 0px 2px 6px rgba(17, 43, 66, 0.08), 0px 1px 4px rgba(17, 43, 66, 0.1);
$popover-body-padding-x: var(--padding-md);
$popover-body-padding-y: var(--padding-md);
$popover-border-color: var(--dark-border-color);