| import {MDCTooltip} from '@material/tooltip'; |
| |
| import {shouldImplement} from '../../../../common/commonUtils.js'; |
| import {createExtBadge} from '../../utils/common.js'; |
| |
| export default class BaseExtraInfoInjection { |
| constructor(infoHandler, optionsWatcher) { |
| if (this.constructor == BaseExtraInfoInjection) { |
| throw new Error('The base class cannot be instantiated.'); |
| } |
| |
| this.infoHandler = infoHandler; |
| this.optionsWatcher = optionsWatcher; |
| } |
| |
| /** |
| * Method which actually injects the extra information. It should be |
| * implemented by the extending class. |
| */ |
| inject() { |
| shouldImplement('inject'); |
| } |
| |
| /** |
| * Overridable method which is called when an error ocurred while retrieving |
| * the info needed to inject the extra information. This is useful to show an |
| * error component in the screen. |
| */ |
| injectOnInfoRetrievalError() {} |
| |
| async isEnabled() { |
| return await this.optionsWatcher.isEnabled('extrainfo'); |
| } |
| |
| /** |
| * This is the method which should be called when injecting extra information. |
| */ |
| async injectIfEnabled(injectionDetails) { |
| const isEnabled = await this.isEnabled(); |
| if (!isEnabled) return; |
| |
| return this.infoHandler.getCurrentInfo(injectionDetails) |
| .catch(err => { |
| this.injectOnInfoRetrievalError(); |
| throw err; |
| }) |
| .then(info => this.inject(info, injectionDetails)) |
| .catch(err => { |
| console.error( |
| `${this.constructor.name}: error while injecting extra info: `, |
| err); |
| }); |
| } |
| |
| /** |
| * Add chips which contain |chipContentList| to |node|. If |withContainer| is |
| * set to true, a container will contain all the chips. |
| */ |
| addExtraInfoChips(chipContentList, node, withContainer = false) { |
| if (chipContentList.length == 0) return; |
| |
| let container; |
| if (withContainer) { |
| container = document.createElement('div'); |
| container.classList.add('TWPT-extrainfo-container'); |
| } else { |
| container = node; |
| } |
| |
| let tooltips = []; |
| |
| for (const content of chipContentList) { |
| const tooltip = this.addChipToContainer(content, container); |
| tooltips.push(tooltip); |
| } |
| |
| if (withContainer) node.append(container); |
| |
| for (const tooltip of tooltips) new MDCTooltip(tooltip); |
| } |
| |
| /** |
| * Adds a chip to the container and returns a tooltip element to be |
| * instantiated. |
| */ |
| addChipToContainer(chipContent, container) { |
| let chip = document.createElement('div'); |
| chip.classList.add('TWPT-extrainfo-chip'); |
| |
| const [badge, badgeTooltip] = createExtBadge(); |
| |
| let span = document.createElement('span'); |
| span.append(chipContent); |
| |
| chip.append(badge, span); |
| container.append(chip); |
| |
| return badgeTooltip; |
| } |
| } |