mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update:Show tooltip for library item card titles that are truncated #2451
- Refactored tooltip so that they dont overflow the window
This commit is contained in:
		
							parent
							
								
									935e545caa
								
							
						
					
					
						commit
						e88c1fa329
					
				| @ -8,10 +8,10 @@ | ||||
|     <!-- Alternative bookshelf title/author/sort --> | ||||
|     <div v-if="isAlternativeBookshelfView || isAuthorBookshelfView" class="absolute left-0 z-50 w-full" :style="{ bottom: `-${titleDisplayBottomOffset}rem` }"> | ||||
|       <div :style="{ fontSize: 0.9 * sizeMultiplier + 'rem' }"> | ||||
|         <div class="flex items-center"> | ||||
|           <span class="truncate">{{ displayTitle }}</span> | ||||
|         <ui-tooltip :text="displayTitle" :disabled="!displayTitleTruncated" direction="bottom" :delayOnShow="500" class="flex items-center"> | ||||
|           <p ref="displayTitle" class="truncate">{{ displayTitle }}</p> | ||||
|           <widgets-explicit-indicator :explicit="isExplicit" /> | ||||
|         </div> | ||||
|         </ui-tooltip> | ||||
|       </div> | ||||
|       <p class="truncate text-gray-400" :style="{ fontSize: 0.8 * sizeMultiplier + 'rem' }">{{ displayLineTwo || ' ' }}</p> | ||||
|       <p v-if="displaySortLine" class="truncate text-gray-400" :style="{ fontSize: 0.8 * sizeMultiplier + 'rem' }">{{ displaySortLine }}</p> | ||||
| @ -164,6 +164,7 @@ export default { | ||||
|       imageReady: false, | ||||
|       selected: false, | ||||
|       isSelectionMode: false, | ||||
|       displayTitleTruncated: false, | ||||
|       showCoverBg: false | ||||
|     } | ||||
|   }, | ||||
| @ -642,6 +643,12 @@ export default { | ||||
|       } | ||||
| 
 | ||||
|       this.libraryItem = libraryItem | ||||
| 
 | ||||
|       this.$nextTick(() => { | ||||
|         if (this.$refs.displayTitle) { | ||||
|           this.displayTitleTruncated = this.$refs.displayTitle.scrollWidth > this.$refs.displayTitle.clientWidth | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     clickCard(e) { | ||||
|       if (this.processing) return | ||||
|  | ||||
| @ -15,6 +15,13 @@ export default { | ||||
|       type: String, | ||||
|       default: 'right' | ||||
|     }, | ||||
|     /** | ||||
|      * Delay showing the tooltip after X milliseconds of hovering | ||||
|      */ | ||||
|     delayOnShow: { | ||||
|       type: Number, | ||||
|       default: 0 | ||||
|     }, | ||||
|     disabled: Boolean | ||||
|   }, | ||||
|   data() { | ||||
| @ -22,7 +29,8 @@ export default { | ||||
|       tooltip: null, | ||||
|       tooltipId: null, | ||||
|       isShowing: false, | ||||
|       hideTimeout: null | ||||
|       hideTimeout: null, | ||||
|       delayOnShowTimeout: null | ||||
|     } | ||||
|   }, | ||||
|   watch: { | ||||
| @ -59,29 +67,44 @@ export default { | ||||
|       this.tooltip = tooltip | ||||
|     }, | ||||
|     setTooltipPosition(tooltip) { | ||||
|       var boxChow = this.$refs.box.getBoundingClientRect() | ||||
|       const boxRect = this.$refs.box.getBoundingClientRect() | ||||
| 
 | ||||
|       const shouldMount = !tooltip.isConnected | ||||
| 
 | ||||
|       var shouldMount = !tooltip.isConnected | ||||
|       // Calculate size of tooltip | ||||
|       if (shouldMount) document.body.appendChild(tooltip) | ||||
|       var { width, height } = tooltip.getBoundingClientRect() | ||||
|       const tooltipRect = tooltip.getBoundingClientRect() | ||||
|       if (shouldMount) tooltip.remove() | ||||
| 
 | ||||
|       var top = 0 | ||||
|       var left = 0 | ||||
|       // Subtracting scrollbar size | ||||
|       const windowHeight = window.innerHeight - 8 | ||||
|       const windowWidth = window.innerWidth - 8 | ||||
| 
 | ||||
|       let top = 0 | ||||
|       let left = 0 | ||||
|       if (this.direction === 'right') { | ||||
|         top = boxChow.top - height / 2 + boxChow.height / 2 | ||||
|         left = boxChow.left + boxChow.width + 4 | ||||
|         top = Math.max(0, boxRect.top - tooltipRect.height / 2 + boxRect.height / 2) | ||||
|         left = Math.max(0, boxRect.left + boxRect.width + 4) | ||||
|       } else if (this.direction === 'bottom') { | ||||
|         top = boxChow.top + boxChow.height + 4 | ||||
|         left = boxChow.left - width / 2 + boxChow.width / 2 | ||||
|         top = Math.max(0, boxRect.top + boxRect.height + 4) | ||||
|         left = Math.max(0, boxRect.left - tooltipRect.width / 2 + boxRect.width / 2) | ||||
|       } else if (this.direction === 'top') { | ||||
|         top = boxChow.top - height - 4 | ||||
|         left = boxChow.left - width / 2 + boxChow.width / 2 | ||||
|         top = Math.max(0, boxRect.top - tooltipRect.height - 4) | ||||
|         left = Math.max(0, boxRect.left - tooltipRect.width / 2 + boxRect.width / 2) | ||||
|       } else if (this.direction === 'left') { | ||||
|         top = boxChow.top - height / 2 + boxChow.height / 2 | ||||
|         left = boxChow.left - width - 4 | ||||
|         top = Math.max(0, boxRect.top - tooltipRect.height / 2 + boxRect.height / 2) | ||||
|         left = Math.max(0, boxRect.left - tooltipRect.width - 4) | ||||
|       } | ||||
| 
 | ||||
|       // Shift left if tooltip would overflow the window on the right | ||||
|       if (left + tooltipRect.width > windowWidth) { | ||||
|         left -= left + tooltipRect.width - windowWidth | ||||
|       } | ||||
|       // Shift up if tooltip would overflow the window on the bottom | ||||
|       if (top + tooltipRect.height > windowHeight) { | ||||
|         top -= top + tooltipRect.height - windowHeight | ||||
|       } | ||||
| 
 | ||||
|       tooltip.style.top = top + 'px' | ||||
|       tooltip.style.left = left + 'px' | ||||
|     }, | ||||
| @ -107,15 +130,33 @@ export default { | ||||
|       this.isShowing = false | ||||
|     }, | ||||
|     cancelHide() { | ||||
|       if (this.hideTimeout) clearTimeout(this.hideTimeout) | ||||
|       clearTimeout(this.hideTimeout) | ||||
|     }, | ||||
|     mouseover() { | ||||
|       if (!this.isShowing) this.showTooltip() | ||||
|       if (this.isShowing || this.disabled) return | ||||
| 
 | ||||
|       if (this.delayOnShow) { | ||||
|         if (this.delayOnShowTimeout) { | ||||
|           // Delay already running | ||||
|           return | ||||
|         } | ||||
| 
 | ||||
|         this.delayOnShowTimeout = setTimeout(() => { | ||||
|           this.showTooltip() | ||||
|           this.delayOnShowTimeout = null | ||||
|         }, this.delayOnShow) | ||||
|       } else { | ||||
|         this.showTooltip() | ||||
|       } | ||||
|     }, | ||||
|     mouseleave() { | ||||
|       if (this.isShowing) { | ||||
|         this.hideTimeout = setTimeout(this.hideTooltip, 100) | ||||
|       if (!this.isShowing) { | ||||
|         clearTimeout(this.delayOnShowTimeout) | ||||
|         this.delayOnShowTimeout = null | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       this.hideTimeout = setTimeout(this.hideTooltip, 100) | ||||
|     } | ||||
|   }, | ||||
|   beforeDestroy() { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user