@postnord/web-components
Version:
PostNord Web Components
249 lines (248 loc) • 9.16 kB
JavaScript
/*!
* Built with Stencil
* By PostNord.
*/
import { h, Host } from "@stencil/core";
import { awaitTopbar } from "../../../globals/helpers";
/**
* There are no events or features other than the `icon`, `small` and `language` prop.
*
* Our rule is to not have disabled buttons.
* However, this component is an exception for a very specific use case regarding portal users.
*/
export class PnReadOnlyButton {
hostElement;
readOnlyModeText = '';
tooltipOpen = false;
tooltipEl;
tooltipDx;
/** The SVG content of the icon you want. */
icon;
/** Icon on the left side instead of on the right. */
leftIcon = false;
/** If you're using a button with only an icon, button text is still REQUIRED for the tooltip. */
iconOnly = false;
/** Smaller button. */
small = false;
/** Set the language manually. */
language = null;
setReadOnlyModeText() {
const translations = {
en: 'You cannot complete this action while in read only mode',
sv: 'Du kan inte utföra denna handling i skrivskyddat läge',
da: 'Du kan ikke gennemføre denne handling i skrivebeskyttet tilstand',
fi: 'Et voi suorittaa tätä toimintoa vain luku -tilassa',
no: 'Du kan ikke utføre denne handlingen i skrivebeskyttet modus',
};
this.readOnlyModeText = translations[this.language];
}
async componentWillLoad() {
this.setReadOnlyModeText();
if (this.language)
return;
await awaitTopbar(this.hostElement);
}
componentDidLoad() {
this.initTooltip();
}
/*---------------------------------------TOOLTIP LOGIC-------------------------------------------*/
openHandler() {
if (this.tooltipOpen) {
this.checkTooltipPosition();
return;
}
this.setTooltipOffset();
}
initTooltip() {
this.tooltipEl = this.hostElement.querySelector('.button-tooltip');
const tooltipAnchor = this.hostElement;
const openEvents = ['mouseenter', 'focus'];
const closeEvents = ['mouseleave', 'blur'];
const eventListeners = [...openEvents, ...closeEvents];
eventListeners.forEach(e => {
tooltipAnchor.addEventListener(e, event => {
// Should open?
if (openEvents.includes(event.type)) {
this.tooltipOpen = true;
return;
}
// Should close?
if (closeEvents.includes(event.type)) {
this.tooltipOpen = false;
}
});
});
}
setTooltipOffset() {
this.tooltipEl.style.transform = `translateX(-50%) translateX(${this.tooltipDx}px)`;
}
checkTooltipPosition() {
this.tooltipEl.style.transform = 'translateX(-50%)';
requestAnimationFrame(() => {
const { x, right } = this.tooltipEl.getBoundingClientRect();
const extraMargin = 8;
this.tooltipDx = '0';
this.tooltipEl.style.transform = '';
if (x < 0)
this.tooltipDx = `${x * -1 + extraMargin}`;
if (right > window.innerWidth)
this.tooltipDx = `${window.innerWidth - right - extraMargin}`;
requestAnimationFrame(() => {
this.setTooltipOffset();
});
});
}
/* ---------------------------------------/TOOLTIP--------------------------------------- */
getClassNames() {
let classNames = 'pn-button ';
if (this.small)
classNames += 'pn-button-small ';
if (this.leftIcon)
classNames += 'pn-button-left-icon ';
if (this.iconOnly)
classNames += 'icon-only ';
return classNames;
}
render() {
return (h(Host, { key: '1e29735dfe7c0036e154cd8c437d88545c9e1d15', class: "pn-read-only-button" }, h("button", { key: '1e7a05e95d74a546d99eecba43dda304cf06109a', class: this.getClassNames(), "data-tooltip-open": this.tooltipOpen, disabled: true }, !this.iconOnly && h("slot", { key: '9dfde2d830a8ddb3598621d0da2823b56c7ad179' }), this.icon && h("pn-icon", { key: 'a2e4e9233183d14069c36301f3c137d6924dc999', icon: this.icon }), this.iconOnly && (h("span", { key: '3b55118ec825dbdaef6c4c01985ad9b1d7bd4258', class: "read-only-icon-only" }, h("slot", { key: '34145eedc9f229ee2a46ce774d28152ec7f83189' }))), h("div", { key: '6ff21cdb9856d2f8d2c9958ef08fe31662a3885d', class: "button-tooltip" }, this.readOnlyModeText))));
}
static get is() { return "pn-read-only-button"; }
static get originalStyleUrls() {
return {
"$": ["pn-read-only-button.scss"]
};
}
static get styleUrls() {
return {
"$": ["pn-read-only-button.css"]
};
}
static get properties() {
return {
"icon": {
"type": "string",
"mutable": false,
"complexType": {
"original": "string",
"resolved": "string",
"references": {}
},
"required": false,
"optional": true,
"docs": {
"tags": [],
"text": "The SVG content of the icon you want."
},
"getter": false,
"setter": false,
"attribute": "icon",
"reflect": false
},
"leftIcon": {
"type": "boolean",
"mutable": false,
"complexType": {
"original": "boolean",
"resolved": "boolean",
"references": {}
},
"required": false,
"optional": false,
"docs": {
"tags": [],
"text": "Icon on the left side instead of on the right."
},
"getter": false,
"setter": false,
"attribute": "left-icon",
"reflect": false,
"defaultValue": "false"
},
"iconOnly": {
"type": "boolean",
"mutable": false,
"complexType": {
"original": "boolean",
"resolved": "boolean",
"references": {}
},
"required": false,
"optional": false,
"docs": {
"tags": [],
"text": "If you're using a button with only an icon, button text is still REQUIRED for the tooltip."
},
"getter": false,
"setter": false,
"attribute": "icon-only",
"reflect": false,
"defaultValue": "false"
},
"small": {
"type": "boolean",
"mutable": false,
"complexType": {
"original": "boolean",
"resolved": "boolean",
"references": {}
},
"required": false,
"optional": false,
"docs": {
"tags": [],
"text": "Smaller button."
},
"getter": false,
"setter": false,
"attribute": "small",
"reflect": false,
"defaultValue": "false"
},
"language": {
"type": "string",
"mutable": false,
"complexType": {
"original": "PnLanguages",
"resolved": "\"\" | \"da\" | \"en\" | \"fi\" | \"no\" | \"sv\"",
"references": {
"PnLanguages": {
"location": "import",
"path": "@/globals/types",
"id": "src/globals/types.ts::PnLanguages"
}
}
},
"required": false,
"optional": true,
"docs": {
"tags": [],
"text": "Set the language manually."
},
"getter": false,
"setter": false,
"attribute": "language",
"reflect": false,
"defaultValue": "null"
}
};
}
static get states() {
return {
"readOnlyModeText": {},
"tooltipOpen": {},
"tooltipEl": {},
"tooltipDx": {}
};
}
static get elementRef() { return "hostElement"; }
static get watchers() {
return [{
"propName": "language",
"methodName": "setReadOnlyModeText"
}, {
"propName": "tooltipOpen",
"methodName": "openHandler"
}];
}
}
//# sourceMappingURL=pn-read-only-button.js.map