@progress/telerik-jquery-report-viewer
Version:
Progress® Telerik® Report Viewer for jQuery
320 lines (317 loc) • 10.3 kB
JavaScript
import { tryParseInt, stringFormat } from './utils.js';
import { stringResources } from './stringResources.js';
var lastSelectedMenuItem;
var lastSelectedSubmenuItem;
function MainMenu(dom, rootOptions, otherOptions) {
var options = $.extend({}, rootOptions, otherOptions);
var menu = $(dom).data("kendoMenu");
var childrenL1 = dom.childNodes;
var controller = options.controller;
var enableAccessibility = options.enableAccessibility;
if (!controller) {
throw "No controller (telerikReporting.ReportViewerController) has been specified.";
}
if (!menu) {
init();
}
controller.reportLoadComplete(function(e, args) {
if (!enableAccessibility) {
if (menu && menu._oldHoverItem) {
menu._oldHoverItem.toggleClass("k-focus");
}
}
if (!args.renderingExtensions) {
controller.getDocumentFormats().then(fillFormats);
} else {
fillFormats(args.renderingExtensions);
}
});
function init() {
try {
menu = $(dom).kendoMenu().data("kendoMenu");
} catch (e) {
console.error("Instantiation of Kendo Menu as Main Menu threw an exception", e);
throw e;
}
menu.bind("activate", onSubmenuActivate);
menu.bind("deactivate", onSubmenuDeactivate);
menu.element.off("keydown", onMenuKeyDown);
menu.element.on("keydown", onMenuKeyDown);
if (options.enableAccessibility) {
setTabIndexes();
}
replaceStringResources();
}
function setTabIndexes() {
var $menus = $('[data-role="telerik_ReportViewer_MainMenu"]');
Array.from($menus).forEach((menu2) => {
var $menuArea = $(menu2);
var listItems = $menuArea.find("li");
var menuTabIndex = 0;
var tabIndexAttr = $menuArea.attr("tabIndex");
if (tabIndexAttr) {
menuTabIndex = tryParseInt(tabIndexAttr);
if (!menuTabIndex || isNaN(menuTabIndex)) {
menuTabIndex = 0;
}
}
setMenuItemsTabIndexes(listItems, menuTabIndex);
var pager = listItems.find('input[data-role="telerik_ReportViewer_PageNumberInput"]');
if (pager.length > 0) {
pager.attr("tabindex", menuTabIndex);
}
});
}
function setMenuItemsTabIndexes(listItems, menuTabIndex) {
Array.from(listItems).forEach((item) => {
var $item = $(item);
$item.attr("tabindex", menuTabIndex);
$item.on("focus", (event) => {
$item.addClass("k-focus");
});
$item.on("blur", (event) => {
$item.removeClass("k-focus");
});
var anchor = $item.children("a");
if (anchor.length > 0) {
var $anchor = $(anchor);
$anchor.attr("tabindex", -1);
$item.attr("title", $anchor.attr("title"));
}
$item.off("keydown");
$item.on("keydown", function(event) {
if (event.which == kendo.keys.ENTER) {
clickOnMenuItem($item);
lastSelectedMenuItem = $item;
}
});
});
}
function fillFormats(formats) {
Array.from($(dom).find("ul[data-command-list=export-format-list]")).forEach((list) => {
var $list = $(list);
var $parent = $list.parents("li");
var tabIndex = enableAccessibility ? $parent.attr("tabindex") : -1;
if (!tabIndex) {
tabIndex = 1;
}
$list.empty();
Array.from(formats).forEach((format) => {
var ariaLabel = enableAccessibility ? stringFormat('aria-label="{localizedName}" ', format) : " ";
var li = "<li " + ariaLabel + stringFormat('tabindex="' + tabIndex + '"><a tabindex="-1" href="#" data-command="telerik_ReportViewer_export" data-command-parameter="{name}"><span>{localizedName}</span></a></li>', format);
menu.append(li, $parent);
});
if (enableAccessibility) {
setInternalListAccessibilityKeyEvents($parent.find("li"));
}
});
}
function setInternalListAccessibilityKeyEvents(listItems) {
Array.from(listItems).forEach((item) => {
var $item = $(item);
$item.off("keydown");
$item.on("keydown", (event) => {
switch (event.which) {
case kendo.keys.ENTER:
clickOnMenuItem($item);
break;
case kendo.keys.UP:
var $prev = $item.prev();
if ($prev.length > 0) {
$prev.trigger("focus");
} else {
$item.parents("li").trigger("focus");
}
break;
case kendo.keys.DOWN:
var $next = $item.next();
if ($next.length > 0) {
$next.trigger("focus");
} else {
$item.parent().children("li").first().trigger("focus");
}
break;
}
});
});
}
function clickOnMenuItem(item) {
if (isItemExportContainer(item)) {
clickOnExportDropdown();
} else if (item && item.length > 0) {
var anchor = item.children("a");
if (anchor.length > 0) {
anchor.click();
}
}
}
function clickOnExportDropdown() {
var dropDownItemID = "#trv-main-menu-export-command";
var mainMenu = $("[data-role='telerik_ReportViewer_MainMenu']").data("kendoMenu");
mainMenu.open(dropDownItemID);
}
function onSubmenuActivate(e) {
var $item = $(e.item);
focusOnFirstSubmenuItem($item);
}
function onSubmenuDeactivate(e) {
lastSelectedSubmenuItem = void 0;
}
function focusOnFirstSubmenuItem(parentItem) {
if (lastSelectedMenuItem && lastSelectedMenuItem.is(parentItem)) {
window.setTimeout(function() {
var li = parentItem.find("li");
if (li.length > 0) {
li[0].focus();
}
}, 100);
}
}
function onMenuKeyDown(e) {
switch (e.which) {
case kendo.keys.ENTER:
if (!enableAccessibility) {
var $item = getFocusedItem();
if ($item.length > 0) {
if (isItemExportContainer($item) && lastSelectedSubmenuItem) {
$item = lastSelectedSubmenuItem;
}
clickOnMenuItem($item);
}
}
break;
case kendo.keys.RIGHT:
enableAccessibility ? focusNextItemAccessibilitySelection() : focusNextItemNativeMenuSelection();
break;
case kendo.keys.LEFT:
enableAccessibility ? focusPreviousItemAccessibilitySelection() : focusPreviousItemNativeMenuSelection();
break;
case kendo.keys.DOWN:
case kendo.keys.UP:
if (!enableAccessibility) {
lastSelectedSubmenuItem = getKendoFocusedNestedItem();
}
}
}
function getFocusedItem() {
var $item;
var focusedItem = document.activeElement;
if (focusedItem && focusedItem.localName == "li") {
var items = $(childrenL1).filter("li.k-item");
for (var i = 0; i < items.length; i++) {
var listItem = items[i];
if (focusedItem === listItem) {
$item = $(listItem);
break;
}
}
} else if (focusedItem && focusedItem.localName == "input") {
$item = $(focusedItem).closest("li.k-item");
} else {
$item = menu.element.children("li.k-item.k-focus");
if ($item.length === 0) {
$item = menu.element.children("li.k-item").first();
}
}
return $item;
}
function focusNextItemAccessibilitySelection() {
var $item = getFocusedItem();
if (!$item || !$item.length > 0) {
return;
}
var $next = $item.next();
if ($next.css("display") == "none") {
$next = $next.next();
}
if (!$next.length > 0) {
$next = $(childrenL1).filter("li.k-item").first();
}
$next.focus();
}
var lastKendoFocusedItem;
function focusNextItemNativeMenuSelection() {
var allItems = menu.element.children("li.k-item");
var $focused = allItems.filter(".k-focus");
if (kendo.version >= "2017.3.913") {
lastKendoFocusedItem = $focused;
return;
}
if ($focused.hasClass("k-disabled")) {
if (!lastKendoFocusedItem || $focused.is(lastKendoFocusedItem)) {
var $next = $focused.next();
if (!$next.length > 0) {
$next = allItems.first();
}
$focused.toggleClass("k-focus");
$next.toggleClass("k-focus");
lastKendoFocusedItem = $next;
menu._oldHoverItem = $next;
} else {
lastKendoFocusedItem = $focused;
}
} else {
menu._oldHoverItem = $focused;
lastKendoFocusedItem = $focused;
}
}
function focusPreviousItemAccessibilitySelection() {
var $item = getFocusedItem();
if (!$item || !$item.length > 0) {
return;
}
var $prev = $item.prev();
if ($prev.css("display") == "none") {
$prev = $prev.prev();
}
if (!$prev.length > 0) {
$prev = $(childrenL1).filter("li.k-item").last();
}
$prev.focus();
}
function focusPreviousItemNativeMenuSelection() {
var $focused = menu.element.children("li.k-item.k-focus");
lastKendoFocusedItem = $focused;
}
function getKendoFocusedNestedItem() {
var $focused = menu.element.find('li.k-item.k-focus [data-command="telerik_ReportViewer_export"]');
if ($focused.length === 1) {
return $focused.parent("li");
}
return void 0;
}
function isItemExportContainer(item) {
if (item.length === 0) {
return;
}
var id = item.attr("id");
return id == "trv-main-menu-export-command" || id == "trv-side-menu-export-command";
}
function replaceStringResources() {
var menuAreas = findMenuArea();
if (!menuAreas) {
return;
}
Array.from(menuAreas).forEach((menu2) => {
var $menu = $(menu2);
var menuItems = $menu.children("li.k-item");
$menu.attr("aria-label", stringResources[$menu.attr("aria-label")]);
Array.from(menuItems).forEach((menuItem) => {
var $menuItem = $(menuItem);
$menuItem.attr("aria-label", stringResources[$menuItem.attr("aria-label")]);
if (!$menuItem.hasClass("trv-report-pager")) {
var $a = $menuItem.find("a");
if ($a) {
$a.attr("title", stringResources[$a.attr("title")]);
}
} else {
$menuItem.attr("title", stringResources[$menuItem.attr("title")]);
}
});
});
}
function findMenuArea() {
return $("ul[data-role=telerik_ReportViewer_MainMenu]");
}
}
export { MainMenu };