UNPKG

@ribajs/bs4

Version:

Bootstrap 4 module for Riba.js

231 lines 21 kB
import { extend } from "@ribajs/utils"; import { Component } from "@ribajs/core"; import { hasChildNodesTrim } from "@ribajs/utils/src/dom.js"; import template from "./bs4-tagged-image.component.html?raw"; import { debounce } from "@ribajs/utils/src/control.js"; export class Bs4TaggedImageComponent extends Component { static tagName = "bs4-tagged-image"; autobind = true; _debug = false; static get observedAttributes() { return ["tags", "options", "debug"]; } image; scope = { debug: false, tags: [], options: { popoverOptions: {}, multiPopover: false, tagOptions: {}, }, fillPopoverOptions: (options) => { return { ...this.scope.options.popoverOptions, ...this.scope.options.tagOptions.popoverOptions, ...options, }; }, triggerOnFocus: (options) => { return this.scope.fillPopoverOptions(options).trigger ? 0 : null; }, onClick: this.onClick.bind(this), onPopoverBound: this.onPopoverBound.bind(this), onPopoverShown: this.onPopoverShown.bind(this), onPopoverHidden: this.onPopoverHidden.bind(this), updateTagPositions: debounce(this.updateTagPositions.bind(this)), }; constructor() { super(); this.scope.options.popoverOptions.container = this; } parsedAttributeChangedCallback(attributeName, oldValue, newValue) { if (attributeName === "options") { if (this.bound) { this.scope.options = newValue; } else { this.scope.options = extend({ deep: true }, oldValue, newValue); } const po = this.scope.options.popoverOptions; if (po && typeof po.container === "string") { po.container = document.querySelector(po.container) || undefined; } } } template() { if (hasChildNodesTrim(this)) { this.parseChildTags(); } return template; } async beforeBind() { await super.beforeBind(); this.image = this.querySelector("img"); this.addEventListeners(); this.initTags(); } addEventListeners() { const img = this.image; img.addEventListener("load", this.scope.updateTagPositions); img.addEventListener("click", this.scope.onClick); window.addEventListener("resize", this.scope.updateTagPositions, { passive: true, }); } removeEventListeners() { const img = this.image; img.removeEventListener("load", this.scope.updateTagPositions); img.removeEventListener("click", this.scope.onClick); window.removeEventListener("resize", this.scope.updateTagPositions); } async afterBind() { this.passImageAttributes(); await super.afterBind(); } connectedCallback() { super.connectedCallback(); this.init(Bs4TaggedImageComponent.observedAttributes); } disconnectedCallback() { this.removeEventListener("click", this.scope.onClick); window.removeEventListener("resize", this.scope.updateTagPositions); } parseChildTags() { this.debug(`parseChildTags()`); for (const tagEl of Array.from(this.querySelectorAll("tag"))) { const title = tagEl.getAttribute("title") || ""; const content = tagEl.innerHTML; const x = ((v) => (isNaN(v) ? Math.random() : v))(parseFloat(tagEl.getAttribute("x") || "")); const y = ((v) => (isNaN(v) ? Math.random() : v))(parseFloat(tagEl.getAttribute("y") || "")); const shape = tagEl.getAttribute("shape") || undefined; const color = tagEl.getAttribute("color") || undefined; const borderRadius = tagEl.getAttribute("border-radius") || undefined; const fullSize = tagEl.getAttribute("full-size") || undefined; const smallSize = tagEl.getAttribute("small-size") || undefined; const tagData = { ...this.scope.options.tagOptions, popoverOptions: this.scope.fillPopoverOptions({ title, content, html: true, }), x, y, shape, color, borderRadius, fullSize, smallSize, }; this.scope.tags.push(tagData); } } initTags() { const scopeTagOptions = this.scope.options.tagOptions; for (const [index, tag] of this.scope.tags.entries()) { tag.index = index; tag.shape = tag.shape || scopeTagOptions.shape; tag.borderRadius = tag.borderRadius || scopeTagOptions.borderRadius; tag.smallSize = tag.smallSize || scopeTagOptions.smallSize; tag.fullSize = tag.fullSize || scopeTagOptions.fullSize; tag.color = tag.color || scopeTagOptions.color; } } passImageAttributes() { const img = this.image; const attrs = this.attributes; for (let i = attrs.length - 1; i >= 0; i--) { if (attrs[i].name.startsWith("img-")) { img.setAttribute(attrs[i].name.substr(4), attrs[i].value); } } } onClick(e) { if (this.scope.debug) { const img = this.image; const { clientTop, clientLeft, width, height, naturalWidth, naturalHeight, } = img; const { clientX, clientY } = e; let x = clientX - clientLeft; let y = clientY - clientTop; const wRatio = width / naturalWidth; const hRatio = height / naturalHeight; let actualWidth = width; let actualHeight = height; if (wRatio < hRatio) { actualWidth = (width * hRatio) / wRatio; x += (actualWidth - width) / 2; } else if (hRatio < wRatio) { actualHeight = (height * wRatio) / hRatio; y += (actualHeight - height) / 2; } x *= 100 / actualWidth; y *= 100 / actualHeight; console.log({ x, y }); } } onPopoverBound(event) { const boundIndexAttr = event.target.getAttribute("index"); if (boundIndexAttr === null) { throw new Error("popup bound on no index"); } const boundIndex = parseInt(boundIndexAttr); if (isNaN(boundIndex)) { throw new Error(`boundIndex "${boundIndexAttr}" is not a number!`); } const foundTag = this.scope.tags.find((tag) => tag.index === boundIndex); if (foundTag) { foundTag.el = event.target; } else { throw new Error(`Tag with index (${boundIndex}, "${boundIndexAttr}") not found`); } } onPopoverShown(event) { for (const tag of this.scope.tags) { if (tag.el === event.target) { tag.el.classList.add("active"); } else { if (!this.scope.options.multiPopover) { tag.el?.classList.remove("active"); tag.el?.dispatchEvent(new CustomEvent("trigger-hide")); } } } } onPopoverHidden(event) { const found = this.scope.tags.find((tag) => tag.el === event.target); if (found) { found.el?.classList.remove("active"); } } updateTagPositions() { const img = this.image; const { width, height, naturalWidth, naturalHeight } = img; const wRatio = naturalWidth / width; const hRatio = naturalHeight / height; const fit = window.getComputedStyle(img).getPropertyValue("object-fit"); if ((fit === "cover" && wRatio > hRatio) || (fit === "contain" && hRatio > wRatio)) { for (const tag of this.scope.tags) { tag.top = tag.y * 100 + "%"; tag.left = ((wRatio / hRatio) * (tag.x - 0.5) + 0.5) * 100 + "%"; } } else if (fit === "cover" || fit === "contain") { for (const tag of this.scope.tags) { tag.left = tag.x * 100 + "%"; tag.top = ((hRatio / wRatio) * (tag.y - 0.5) + 0.5) * 100 + "%"; } } else { for (const tag of this.scope.tags) { tag.left = tag.x * 100 + "%"; tag.top = tag.y * 100 + "%"; } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnM0LXRhZ2dlZC1pbWFnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9iczQtdGFnZ2VkLWltYWdlL2JzNC10YWdnZWQtaW1hZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLFNBQVMsRUFBK0IsTUFBTSxjQUFjLENBQUM7QUFFdEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0QsT0FBTyxRQUFRLE1BQU0sdUNBQXVDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBdUJ4RCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsU0FBUztJQUk3QyxNQUFNLENBQUMsT0FBTyxHQUFHLGtCQUFrQixDQUFDO0lBRWpDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDbkIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLEtBQUssa0JBQWtCO1FBQzNCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQW9CO0lBRWxCLEtBQUssR0FBVTtRQUNwQixLQUFLLEVBQUUsS0FBSztRQUNaLElBQUksRUFBRSxFQUFFO1FBQ1IsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLEVBQUU7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsVUFBVSxFQUFFLEVBQUU7U0FDZjtRQUNELGtCQUFrQixFQUFFLENBQUMsT0FBZ0MsRUFBRSxFQUFFO1lBQ3ZELE9BQU87Z0JBQ0wsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUNwQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjO2dCQUMv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