carbon-components-angular
Version:
Next generation components
127 lines • 14.7 kB
JavaScript
import { Directive, Input } from "@angular/core";
import { getAttributes } from "@carbon/icon-helpers";
import * as i0 from "@angular/core";
import * as i1 from "./icon.service";
/**
* A directive for populating a svg element based on the provided carbon icon name.
*
* Get started with importing the module:
*
* ```typescript
* import { IconModule } from 'carbon-components-angular';
* ```
*
* [See demo](../../?path=/story/components-icon--basic)
*/
export class IconDirective {
constructor(elementRef, iconService) {
this.elementRef = elementRef;
this.iconService = iconService;
this.cdsIcon = "";
this.size = "16";
this.title = "";
this.ariaLabel = "";
this.ariaLabelledBy = "";
this.ariaHidden = "";
this.isFocusable = false;
}
/**
* @deprecated since v5 - Use `cdsIcon` input property instead
*/
set ibmIcon(iconName) {
this.cdsIcon = iconName;
}
renderIcon(iconName) {
const root = this.elementRef.nativeElement;
let icon;
try {
icon = this.iconService.get(iconName, this.size.toString());
}
catch (error) {
console.warn(error);
// bail out
return;
}
const domParser = new DOMParser();
const rawSVG = icon.svg;
const svgElement = domParser.parseFromString(rawSVG, "image/svg+xml").documentElement;
let node = root.tagName.toUpperCase() !== "SVG" ? svgElement : svgElement.firstChild;
root.innerHTML = ""; // Clear root element
while (node) {
// importNode makes a clone of the node
// this ensures we keep looping over the nodes in the parsed document
root.appendChild(root.ownerDocument.importNode(node, true));
// type the node because the angular compiler freaks out if it
// ends up thinking it's a `Node` instead of a `ChildNode`
node = node.nextSibling;
}
const svg = root.tagName.toUpperCase() !== "SVG" ? svgElement : root;
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
const attributes = getAttributes({
width: icon.attrs.width,
height: icon.attrs.height,
viewBox: icon.attrs.viewBox,
title: this.title,
"aria-label": this.ariaLabel,
"aria-labelledby": this.ariaLabelledBy,
"aria-hidden": this.ariaHidden,
focusable: this.isFocusable.toString()
});
const attrKeys = Object.keys(attributes);
for (let i = 0; i < attrKeys.length; i++) {
const key = attrKeys[i];
const value = attributes[key];
if (key === "title") {
continue;
}
if (value) {
svg.setAttribute(key, value);
}
}
if (attributes["title"]) {
const title = document.createElement("title");
title.textContent = attributes.title;
IconDirective.titleIdCounter++;
title.setAttribute("id", `${icon.name}-title-${IconDirective.titleIdCounter}`);
// title must be first for screen readers
svg.insertBefore(title, svg.firstElementChild);
svg.setAttribute("aria-labelledby", `${icon.name}-title-${IconDirective.titleIdCounter}`);
}
}
ngAfterViewInit() {
this.renderIcon(this.cdsIcon);
}
ngOnChanges({ cdsIcon }) {
// We want to ignore first change to let the icon register
// and add only after view has been initialized
if (cdsIcon && !cdsIcon.isFirstChange()) {
this.renderIcon(this.cdsIcon);
}
}
}
IconDirective.titleIdCounter = 0;
IconDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconDirective, deps: [{ token: i0.ElementRef }, { token: i1.IconService }], target: i0.ɵɵFactoryTarget.Directive });
IconDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: { ibmIcon: "ibmIcon", cdsIcon: "cdsIcon", size: "size", title: "title", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", ariaHidden: "ariaHidden", isFocusable: "isFocusable" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: IconDirective, decorators: [{
type: Directive,
args: [{
selector: "[cdsIcon], [ibmIcon]"
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.IconService }]; }, propDecorators: { ibmIcon: [{
type: Input
}], cdsIcon: [{
type: Input
}], size: [{
type: Input
}], title: [{
type: Input
}], ariaLabel: [{
type: Input
}], ariaLabelledBy: [{
type: Input
}], ariaHidden: [{
type: Input
}], isFocusable: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaWNvbi9pY29uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sU0FBUyxFQUVULEtBQUssRUFHTCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUVyRDs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFPLGFBQWE7SUF5QnpCLFlBQ1csVUFBc0IsRUFDdEIsV0FBd0I7UUFEeEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWhCMUIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLFNBQUksR0FBRyxJQUFJLENBQUM7UUFFWixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXBCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFLMUIsQ0FBQztJQTFCSjs7T0FFRztJQUNILElBQWEsT0FBTyxDQUFDLFFBQWdCO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUF1QkQsVUFBVSxDQUFDLFFBQWdCO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBNEIsQ0FBQztRQUUxRCxJQUFJLElBQUksQ0FBQztRQUNULElBQUk7WUFDSCxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQixXQUFX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QUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDMUY7SUFDRixDQUFDO0lBRUQsZUFBZTtRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQWlCO1FBQ3JDLDBEQUEwRDtRQUMxRCwrQ0FBK0M7UUFDL0MsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUI7SUFDRixDQUFDOztBQWpHTSw0QkFBYyxHQUFHLENBQUMsQ0FBQzswR0FUZCxhQUFhOzhGQUFiLGFBQWE7MkZBQWIsYUFBYTtrQkFIekIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsc0JBQXNCO2lCQUNoQzsySEFNYSxPQUFPO3NCQUFuQixLQUFLO2dCQU1HLE9BQU87c0JBQWYsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBZnRlclZpZXdJbml0LFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdElucHV0LFxuXHRPbkNoYW5nZXMsXG5cdFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEljb25TZXJ2aWNlIH0gZnJvbSBcIi4vaWNvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBnZXRBdHRyaWJ1dGVzIH0gZnJvbSBcIkBjYXJib24vaWNvbi1oZWxwZXJzXCI7XG5cbi8qKlxuICogQSBkaXJlY3RpdmUgZm9yIHBvcHVsYXRpbmcgYSBzdmcgZWxlbWVudCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY2FyYm9uIGljb24gbmFtZS5cbiAqXG4gKiBHZXQgc3RhcnRlZCB3aXRoIGltcG9ydGluZyB0aGUgbW9kdWxlOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtaWNvbi0tYmFzaWMpXG4gKi9cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogXCJbY2RzSWNvbl0sIFtpYm1JY29uXVwiXG59KVxuZXhwb3J0IGNsYXNzIEljb25EaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2NSAtIFVzZSBgY2RzSWNvbmAgaW5wdXQgcHJvcGVydHkgaW5zdGVhZFxuXHQgKi9cblx0QElucHV0KCkgc2V0IGlibUljb24oaWNvbk5hbWU6IHN0cmluZykge1xuXHRcdHRoaXMuY2RzSWNvbiA9IGljb25OYW1lO1xuXHR9XG5cblx0c3RhdGljIHRpdGxlSWRDb3VudGVyID0gMDtcblxuXHRASW5wdXQoKSBjZHNJY29uID0gXCJcIjtcblxuXHRASW5wdXQoKSBzaXplID0gXCIxNlwiO1xuXG5cdEBJbnB1dCgpIHRpdGxlID0gXCJcIjtcblxuXHRASW5wdXQoKSBhcmlhTGFiZWwgPSBcIlwiO1xuXG5cdEBJbnB1dCgpIGFyaWFMYWJlbGxlZEJ5ID0gXCJcIjtcblxuXHRASW5wdXQoKSBhcmlhSGlkZGVuID0gXCJcIjtcblxuXHRASW5wdXQoKSBpc0ZvY3VzYWJsZSA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuXHRcdHByb3RlY3RlZCBpY29uU2VydmljZTogSWNvblNlcnZpY2Vcblx0KSB7fVxuXG5cdHJlbmRlckljb24oaWNvbk5hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IHJvb3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuXHRcdGxldCBpY29uO1xuXHRcdHRyeSB7XG5cdFx0XHRpY29uID0gdGhpcy5pY29uU2VydmljZS5nZXQoaWNvbk5hbWUsIHRoaXMuc2l6ZS50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS53YXJuKGVycm9yKTtcblx0XHRcdC8vIGJhaWwgb3V0XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdGNvbnN0IHJhd1NWRyA9IGljb24uc3ZnO1xuXHRcdGNvbnN0IHN2Z0VsZW1lbnQgPSBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJhd1NWRywgXCJpbWFnZS9zdmcreG1sXCIpLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdGxldCBub2RlOiBDaGlsZE5vZGUgPSByb290LnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJTVkdcIiA/IHN2Z0VsZW1lbnQgOiBzdmdFbGVtZW50LmZpcnN0Q2hpbGQ7XG5cdFx0cm9vdC5pbm5lckhUTUwgPSBcIlwiOyAvLyBDbGVhciByb290IGVsZW1lbnRcblx0XHR3aGlsZSAobm9kZSkge1xuXHRcdFx0Ly8gaW1wb3J0Tm9kZSBtYWtlcyBhIGNsb25lIG9mIHRoZSBub2RlXG5cdFx0XHQvLyB0aGlzIGVuc3VyZXMgd2Uga2VlcCBsb29waW5nIG92ZXIgdGhlIG5vZGVzIGluIHRoZSBwYXJzZWQgZG9jdW1lbnRcblx0XHRcdHJvb3QuYXBwZW5kQ2hpbGQocm9vdC5vd25lckRvY3VtZW50LmltcG9ydE5vZGUobm9kZSwgdHJ1ZSkpO1xuXHRcdFx0Ly8gdHlwZSB0aGUgbm9kZSBiZWNhdXNlIHRoZSBhbmd1bGFyIGNvbXBpbGVyIGZyZWFrcyBvdXQgaWYgaXRcblx0XHRcdC8vIGVuZHMgdXAgdGhpbmtpbmcgaXQncyBhIGBOb2RlYCBpbnN0ZWFkIG9mIGEgYENoaWxkTm9kZWBcblx0XHRcdG5vZGUgPSBub2RlLm5leHRTaWJsaW5nIGFzIENoaWxkTm9kZTtcblx0XHR9XG5cblx0XHRjb25zdCBzdmcgPSByb290LnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJTVkdcIiA/IHN2Z0VsZW1lbnQgOiByb290O1xuXHRcdHN2Zy5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIpO1xuXG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoe1xuXHRcdFx0d2lkdGg6IGljb24uYXR0cnMud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGljb24uYXR0cnMuaGVpZ2h0LFxuXHRcdFx0dmlld0JveDogaWNvbi5hdHRycy52aWV3Qm94LFxuXHRcdFx0dGl0bGU6IHRoaXMudGl0bGUsXG5cdFx0XHRcImFyaWEtbGFiZWxcIjogdGhpcy5hcmlhTGFiZWwsXG5cdFx0XHRcImFyaWEtbGFiZWxsZWRieVwiOiB0aGlzLmFyaWFMYWJlbGxlZEJ5LFxuXHRcdFx0XCJhcmlhLWhpZGRlblwiOiB0aGlzLmFyaWFIaWRkZW4sXG5cdFx0XHRmb2N1c2FibGU6IHRoaXMuaXNGb2N1c2FibGUudG9TdHJpbmcoKVxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgYXR0cktleXMgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJLZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBhdHRyS2V5c1tpXTtcblx0XHRcdGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc1trZXldO1xuXG5cdFx0XHRpZiAoa2V5ID09PSBcInRpdGxlXCIpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRzdmcuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhdHRyaWJ1dGVzW1widGl0bGVcIl0pIHtcblx0XHRcdGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRpdGxlXCIpO1xuXHRcdFx0dGl0bGUudGV4dENvbnRlbnQgPSBhdHRyaWJ1dGVzLnRpdGxlO1xuXHRcdFx0SWNvbkRpcmVjdGl2ZS50aXRsZUlkQ291bnRlcisrO1xuXHRcdFx0dGl0bGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgYCR7aWNvbi5uYW1lfS10aXRsZS0ke0ljb25EaXJlY3RpdmUudGl0bGVJZENvdW50ZXJ9YCk7XG5cdFx0XHQvLyB0aXRsZSBtdXN0IGJlIGZpcnN0IGZvciBzY3JlZW4gcmVhZGVyc1xuXHRcdFx0c3ZnLmluc2VydEJlZm9yZSh0aXRsZSwgc3ZnLmZpcnN0RWxlbWVudENoaWxkKTtcblx0XHRcdHN2Zy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIiwgYCR7aWNvbi5uYW1lfS10aXRsZS0ke0ljb25EaXJlY3RpdmUudGl0bGVJZENvdW50ZXJ9YCk7XG5cdFx0fVxuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdHRoaXMucmVuZGVySWNvbih0aGlzLmNkc0ljb24pO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoeyBjZHNJY29uIH06IFNpbXBsZUNoYW5nZXMpIHtcblx0XHQvLyBXZSB3YW50IHRvIGlnbm9yZSBmaXJzdCBjaGFuZ2UgdG8gbGV0IHRoZSBpY29uIHJlZ2lzdGVyXG5cdFx0Ly8gYW5kIGFkZCBvbmx5IGFmdGVyIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWRcblx0XHRpZiAoY2RzSWNvbiAmJiAhY2RzSWNvbi5pc0ZpcnN0Q2hhbmdlKCkpIHtcblx0XHRcdHRoaXMucmVuZGVySWNvbih0aGlzLmNkc0ljb24pO1xuXHRcdH1cblx0fVxufVxuIl19