UNPKG

5.19 kBJavaScriptView Raw
1import { a as __extends } from './tslib.es6-f952ba6f.js';
2import { select } from 'd3';
3import { C as Component } from './Component-5173b5ea.js';
4
5var EllipsisMenu = /** @class */ (function (_super) {
6 __extends(EllipsisMenu, _super);
7 function EllipsisMenu(renderTarget) {
8 return _super.call(this, renderTarget) || this;
9 }
10 EllipsisMenu.prototype.createIconPath = function (iconName, theme) {
11 var supportedNames = ["flag", "grid", "download"];
12 return (supportedNames.indexOf(iconName) != -1) ? iconName + "Icon" : "";
13 };
14 EllipsisMenu.prototype.setMenuVisibility = function (isVisible) {
15 this.menuIsVisible = isVisible;
16 this.containerElement.classed("tsi-ellipsisMenuShown", this.menuIsVisible);
17 };
18 EllipsisMenu.prototype.focusOnMenuItem = function (itemIndex) {
19 if (itemIndex === void 0) { itemIndex = 0; }
20 itemIndex = (itemIndex + this.menuItems.length) % this.menuItems.length;
21 var menuItem = this.menuElement.selectAll(".tsi-ellipsisMenuItem").filter(function (d, i) {
22 return (itemIndex === i);
23 });
24 menuItem.node().focus();
25 };
26 EllipsisMenu.prototype.menuItemKeyHandler = function (event, d, i) {
27 switch (event.keyCode) {
28 case 9: //tab
29 this.focusOnMenuItem(i + 1);
30 event.preventDefault();
31 break;
32 case 27: //escape
33 this.setMenuVisibility(false);
34 this.buttonElement.node().focus();
35 event.preventDefault();
36 break;
37 case 38: // up arrow
38 this.focusOnMenuItem(i - 1);
39 event.preventDefault();
40 break;
41 case 40: // down arrow
42 this.focusOnMenuItem(i + 1);
43 event.preventDefault();
44 break;
45 }
46 };
47 EllipsisMenu.prototype.render = function (menuItems, options) {
48 var _this = this;
49 if (options === void 0) { options = {}; }
50 this.menuIsVisible = false;
51 this.chartOptions.setOptions(options);
52 this.containerElement = select(this.renderTarget).classed("tsi-ellipsisMenuContainer", true);
53 this.setMenuItems(menuItems);
54 select(this.renderTarget).selectAll("*").remove();
55 _super.prototype.themify.call(this, this.containerElement, this.chartOptions.theme);
56 var self = this;
57 this.buttonElement = select(this.renderTarget).insert("button")
58 .attr("class", "tsi-ellipsisButton")
59 .attr("aria-label", this.getString("Show ellipsis menu"))
60 .attr("title", this.getString("Show ellipsis menu"))
61 .attr("type", "button")
62 .on("click", function () {
63 select(this).attr("aria-label", !self.menuIsVisible ? self.getString("Show ellipsis menu") : self.getString("Hide ellipsis menu"))
64 .attr("title", !self.menuIsVisible ? self.getString("Show ellipsis menu") : self.getString("Hide ellipsis menu"));
65 self.setMenuVisibility(!self.menuIsVisible);
66 if (self.menuIsVisible) {
67 self.focusOnMenuItem(0);
68 }
69 });
70 this.menuElement = select(this.renderTarget).insert("div")
71 .attr("class", "tsi-ellipsisMenu")
72 .attr("role", "menu");
73 var menuElementEntered = this.menuElement.selectAll(".tsi-ellipsisMenuItem").data(this.menuItems)
74 .enter()
75 .append("button")
76 .classed("tsi-ellipsisMenuItem", true)
77 .attr("aria-label", function (d) { return d.label; })
78 .attr("type", "button")
79 .attr("role", "menuitem")
80 .on('keydown', function (event, d) {
81 var e = menuElementEntered.nodes();
82 var i = e.indexOf(event.currentTarget);
83 _this.menuItemKeyHandler(event, d, i);
84 })
85 .on("click", function (event, d) {
86 d.action();
87 })
88 .each(function () {
89 select(this)
90 .append("div")
91 .attr("class", function (d) { return "tsi-ellipsisMenuIcon " + self.createIconPath(d.iconClass, self.chartOptions.theme); });
92 select(this)
93 .append("div")
94 .classed("tsi-ellipsisMenuLabel", true)
95 .text(function (d) { return d.label; });
96 select(this)
97 .append("div")
98 .classed("tsi-ellipsisMenuDescription", true)
99 .style("display", "none");
100 });
101 };
102 EllipsisMenu.prototype.setMenuItems = function (rawMenuItems) {
103 this.menuItems = rawMenuItems.reduce(function (menuItems, currMenuItem) {
104 menuItems.push({
105 iconClass: currMenuItem.iconClass,
106 label: currMenuItem.label,
107 action: currMenuItem.action,
108 description: currMenuItem.description
109 });
110 return menuItems;
111 }, []);
112 };
113 return EllipsisMenu;
114}(Component));
115
116export { EllipsisMenu as E };