RequestListHeaderContextMenu.js (3306B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { 8 showMenu, 9 } = require("resource://devtools/client/shared/components/menu/utils.js"); 10 const { 11 HEADERS, 12 } = require("resource://devtools/client/netmonitor/src/constants.js"); 13 const { 14 L10N, 15 } = require("resource://devtools/client/netmonitor/src/utils/l10n.js"); 16 const { 17 getVisibleColumns, 18 } = require("resource://devtools/client/netmonitor/src/selectors/index.js"); 19 20 const stringMap = HEADERS.filter(header => 21 header.hasOwnProperty("label") 22 ).reduce((acc, { name, label }) => Object.assign(acc, { [name]: label }), {}); 23 24 const subMenuMap = HEADERS.filter(header => 25 header.hasOwnProperty("subMenu") 26 ).reduce( 27 (acc, { name, subMenu }) => Object.assign(acc, { [name]: subMenu }), 28 {} 29 ); 30 31 const nonLocalizedHeaders = HEADERS.filter(header => 32 header.hasOwnProperty("noLocalization") 33 ).map(header => header.name); 34 35 class RequestListHeaderContextMenu { 36 constructor(props) { 37 this.props = props; 38 } 39 40 /** 41 * Handle the context menu opening. 42 */ 43 open(event = {}, columns) { 44 const menu = []; 45 const subMenu = { timings: [], responseHeaders: [] }; 46 const onlyOneColumn = 47 getVisibleColumns(columns).filter(([column]) => column !== "override") 48 .length === 1; 49 50 for (const column in columns) { 51 const shown = columns[column]; 52 const label = nonLocalizedHeaders.includes(column) 53 ? stringMap[column] || column 54 : L10N.getStr(`netmonitor.toolbar.${stringMap[column] || column}`); 55 const entry = { 56 id: `request-list-header-${column}-toggle`, 57 label, 58 type: "checkbox", 59 checked: shown, 60 click: () => this.props.toggleColumn(column), 61 // We don't want to allow hiding the last visible column, 62 // or to modify the visibility of the override column. 63 disabled: (onlyOneColumn && shown) || column === "override", 64 }; 65 subMenuMap.hasOwnProperty(column) 66 ? subMenu[subMenuMap[column]].push(entry) 67 : menu.push(entry); 68 } 69 70 menu.push({ type: "separator" }); 71 menu.push({ 72 label: L10N.getStr("netmonitor.toolbar.timings"), 73 submenu: subMenu.timings, 74 }); 75 menu.push({ 76 label: L10N.getStr("netmonitor.toolbar.responseHeaders"), 77 submenu: subMenu.responseHeaders, 78 }); 79 80 menu.push({ type: "separator" }); 81 menu.push({ 82 id: "request-list-header-reset-columns", 83 label: L10N.getStr("netmonitor.toolbar.resetColumns"), 84 click: () => this.props.resetColumns(), 85 }); 86 87 menu.push({ 88 id: "request-list-header-reset-sorting", 89 label: L10N.getStr("netmonitor.toolbar.resetSorting"), 90 click: () => this.props.resetSorting(), 91 }); 92 93 const columnName = event.target.getAttribute("data-name"); 94 95 menu.push({ 96 id: "request-list-header-resize-column-to-fit-content", 97 label: L10N.getStr("netmonitor.toolbar.resizeColumnToFitContent"), 98 click: () => this.props.resizeColumnToFitContent(columnName), 99 }); 100 101 showMenu(menu, { 102 screenX: event.screenX, 103 screenY: event.screenY, 104 }); 105 } 106 } 107 108 module.exports = RequestListHeaderContextMenu;