| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | import noteDetailService from "./note_detail.js"; | 
					
						
							|  |  |  | import treeUtils from "./tree_utils.js"; | 
					
						
							|  |  |  | import linkService from "./link.js"; | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  | import server from "./server.js"; | 
					
						
							| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  | function setupGlobalTooltip() { | 
					
						
							|  |  |  |     $(document).on("mouseenter", "a", mouseEnterHandler); | 
					
						
							|  |  |  |     $(document).on("mouseleave", "a", mouseLeaveHandler); | 
					
						
							| 
									
										
										
										
											2018-08-15 18:22:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     // close any tooltip after click, this fixes the problem that sometimes tooltips remained on the screen
 | 
					
						
							|  |  |  |     $(document).on("click", () => $('.tooltip').remove()); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-08-15 18:22:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  | function setupElementTooltip($el) { | 
					
						
							|  |  |  |     $el.on('mouseenter', mouseEnterHandler); | 
					
						
							|  |  |  |     $el.on('mouseleave', mouseLeaveHandler); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-10-06 22:00:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  | async function mouseEnterHandler() { | 
					
						
							|  |  |  |     const $link = $(this); | 
					
						
							| 
									
										
										
										
											2018-07-28 17:59:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     if ($link.hasClass("no-tooltip-preview") || $link.hasClass("disabled")) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     // this is to avoid showing tooltip from inside CKEditor link editor dialog
 | 
					
						
							|  |  |  |     if ($link.closest(".ck-link-actions").length) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     let notePath = linkService.getNotePathFromUrl($link.attr("href")); | 
					
						
							| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     if (!notePath) { | 
					
						
							|  |  |  |         notePath = $link.attr("data-note-path"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     if (!notePath) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     const noteId = treeUtils.getNoteIdFromNotePath(notePath); | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     const notePromise = noteDetailService.loadNote(noteId); | 
					
						
							|  |  |  |     const attributePromise = server.get('notes/' + noteId + '/attributes'); | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     const [note, attributes] = await Promise.all([notePromise, attributePromise]); | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     const html = await renderTooltip(note, attributes); | 
					
						
							| 
									
										
										
										
											2018-11-14 14:52:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     // we need to check if we're still hovering over the element
 | 
					
						
							|  |  |  |     // since the operation to get tooltip content was async, it is possible that
 | 
					
						
							|  |  |  |     // we now create tooltip which won't close because it won't receive mouseleave event
 | 
					
						
							|  |  |  |     if ($(this).is(":hover")) { | 
					
						
							|  |  |  |         $(this).tooltip({ | 
					
						
							|  |  |  |             delay: {"show": 300, "hide": 100}, | 
					
						
							|  |  |  |             container: 'body', | 
					
						
							|  |  |  |             placement: 'auto', | 
					
						
							|  |  |  |             trigger: 'manual', | 
					
						
							|  |  |  |             boundary: 'window', | 
					
						
							|  |  |  |             title: html, | 
					
						
							|  |  |  |             html: true | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $(this).tooltip('show'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function mouseLeaveHandler() { | 
					
						
							|  |  |  |     $(this).tooltip('dispose'); | 
					
						
							| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  | async function renderTooltip(note, attributes) { | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  |     let content = ''; | 
					
						
							| 
									
										
										
										
											2018-08-27 13:35:45 +02:00
										 |  |  |     const promoted = attributes.filter(attr => | 
					
						
							|  |  |  |         (attr.type === 'label-definition' || attr.type === 'relation-definition') | 
					
						
							|  |  |  |         && !attr.name.startsWith("child:") | 
					
						
							|  |  |  |         && attr.value.isPromoted); | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (promoted.length > 0) { | 
					
						
							|  |  |  |         const $table = $("<table>").addClass("promoted-attributes-in-tooltip"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (const definitionAttr of promoted) { | 
					
						
							|  |  |  |             const definitionType = definitionAttr.type; | 
					
						
							|  |  |  |             const valueType = definitionType.substr(0, definitionType.length - 11); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             let valueAttrs = attributes.filter(el => el.name === definitionAttr.name && el.type === valueType); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (const valueAttr of valueAttrs) { | 
					
						
							| 
									
										
										
										
											2018-08-27 13:35:45 +02:00
										 |  |  |                 if (!valueAttr.value) { | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  |                 let $value = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (valueType === 'label') { | 
					
						
							|  |  |  |                     $value = $("<td>").text(valueAttr.value); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else if (valueType === 'relation' && valueAttr.value) { | 
					
						
							|  |  |  |                     $value = $("<td>").append(await linkService.createNoteLink(valueAttr.value)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 const $row = $("<tr>") | 
					
						
							|  |  |  |                     .append($("<th>").text(definitionAttr.name)) | 
					
						
							|  |  |  |                     .append($value); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $table.append($row); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         content += $table.prop('outerHTML'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (note.type === 'text') { | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |         // surround with <div> for a case when note.content is pure text (e.g. "[protected]") which
 | 
					
						
							|  |  |  |         // then fails the jquery non-empty text test
 | 
					
						
							|  |  |  |         content += '<div>' + note.content + '</div>'; | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     else if (note.type === 'code') { | 
					
						
							| 
									
										
										
										
											2018-11-14 08:36:19 +01:00
										 |  |  |         content += $("<pre>") | 
					
						
							|  |  |  |             .text(note.content) | 
					
						
							|  |  |  |             .prop('outerHTML'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (note.type === 'image') { | 
					
						
							|  |  |  |         content += $("<img>") | 
					
						
							|  |  |  |             .prop("src", `/api/images/${note.noteId}/${note.title}`) | 
					
						
							|  |  |  |             .prop('outerHTML'); | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     // other types of notes don't have tooltip preview
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-14 08:36:19 +01:00
										 |  |  |     if (!$(content).text().trim() && note.type !== 'image') { | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  |         return ""; | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-06 19:35:42 +01:00
										 |  |  |     return content; | 
					
						
							| 
									
										
										
										
											2018-08-22 15:31:36 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | export default { | 
					
						
							| 
									
										
										
										
											2018-12-22 20:57:09 +01:00
										 |  |  |     setupGlobalTooltip, | 
					
						
							|  |  |  |     setupElementTooltip | 
					
						
							| 
									
										
										
										
											2018-03-26 22:29:14 -04:00
										 |  |  | } |