flipper-plugin
Version:
Flipper Desktop plugin SDK and components
109 lines • 6.46 kB
JavaScript
"use strict";
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.tableContextMenuFactory = void 0;
const icons_1 = require("@ant-design/icons");
const antd_1 = require("antd");
const DataTableWithPowerSearchManager_1 = require("./DataTableWithPowerSearchManager");
const react_1 = __importDefault(require("react"));
const toFirstUpper_1 = require("../../utils/toFirstUpper");
const TableRow_1 = require("./TableRow");
const textContent_1 = require("../../utils/textContent");
const FlipperLib_1 = require("../../plugin/FlipperLib");
const { Item, SubMenu } = antd_1.Menu;
function tableContextMenuFactory(dataView, dispatch, selection, columns, visibleColumns, onCopyRows = defaultOnCopyRows, onContextMenu, sideBySideOption) {
const lib = (0, FlipperLib_1.tryGetFlipperLibImplementation)();
if (!lib) {
return (react_1.default.createElement(antd_1.Menu, null,
react_1.default.createElement(Item, null, "Menu not ready")));
}
const hasSelection = selection.items.size > 0 ?? false;
return (react_1.default.createElement(antd_1.Menu, null,
onContextMenu
? onContextMenu((0, DataTableWithPowerSearchManager_1.getSelectedItem)(dataView, selection))
: null,
react_1.default.createElement(SubMenu, { key: "filter same", title: "Filter on same", icon: react_1.default.createElement(icons_1.FilterOutlined, null), disabled: !hasSelection }, visibleColumns.map((column, idx) => (react_1.default.createElement(Item, { key: column.key ?? idx, onClick: () => {
dispatch({
type: 'setSearchExpressionFromSelection',
column,
});
} }, friendlyColumnTitle(column))))),
react_1.default.createElement(SubMenu, { key: "copy rows", title: "Copy row(s)", icon: react_1.default.createElement(icons_1.TableOutlined, null), disabled: !hasSelection },
react_1.default.createElement(Item, { key: "copyToClipboard", disabled: !hasSelection, onClick: () => {
const items = (0, DataTableWithPowerSearchManager_1.getSelectedItems)(dataView, selection);
if (items.length) {
lib.writeTextToClipboard(onCopyRows(items, visibleColumns));
}
} }, "Copy row(s)"),
lib.isFB && (react_1.default.createElement(Item, { key: "createPaste", disabled: !hasSelection, onClick: () => {
const items = (0, DataTableWithPowerSearchManager_1.getSelectedItems)(dataView, selection);
if (items.length) {
lib.createPaste(onCopyRows(items, visibleColumns));
}
} }, "Create paste")),
react_1.default.createElement(Item, { key: "copyToClipboardJSON", disabled: !hasSelection, onClick: () => {
const items = (0, DataTableWithPowerSearchManager_1.getSelectedItems)(dataView, selection);
if (items.length) {
lib.writeTextToClipboard(rowsToJson(items));
}
} }, "Copy row(s) (JSON)"),
lib.isFB && (react_1.default.createElement(Item, { key: "createPasteJSON", disabled: !hasSelection, onClick: () => {
const items = (0, DataTableWithPowerSearchManager_1.getSelectedItems)(dataView, selection);
if (items.length) {
lib.createPaste(rowsToJson(items));
}
} }, "Create paste (JSON)"))),
react_1.default.createElement(SubMenu, { key: "copy cells", title: "Copy cell(s)", icon: react_1.default.createElement(icons_1.CopyOutlined, null), disabled: !hasSelection }, visibleColumns.map((column, idx) => (react_1.default.createElement(Item, { key: `copy cell${column.key ?? idx}`, onClick: () => {
const items = (0, DataTableWithPowerSearchManager_1.getSelectedItems)(dataView, selection);
if (items.length) {
lib.writeTextToClipboard(items
.map((item) => `${(0, DataTableWithPowerSearchManager_1.getValueAtPath)(item, column.key)}`)
.join('\n'));
}
} }, friendlyColumnTitle(column))))),
react_1.default.createElement(antd_1.Menu.Divider, null),
react_1.default.createElement(SubMenu, { title: "Visible columns", key: "visible columns" }, columns.map((column, idx) => (react_1.default.createElement(antd_1.Menu.Item, { key: `visible column ${column.key ?? idx}` },
react_1.default.createElement(antd_1.Checkbox, { checked: column.visible, onClick: (e) => {
e.stopPropagation();
e.preventDefault();
dispatch({ type: 'toggleColumnVisibility', column: column.key });
} }, friendlyColumnTitle(column)))))),
react_1.default.createElement(antd_1.Menu.Item, { key: "resetFilters", onClick: () => {
dispatch({ type: 'resetFilters' });
} }, "Reset filters"),
react_1.default.createElement(antd_1.Menu.Item, { key: "reset", onClick: () => {
dispatch({ type: 'reset' });
} }, "Reset view"),
sideBySideOption));
}
exports.tableContextMenuFactory = tableContextMenuFactory;
function friendlyColumnTitle(column) {
const name = column.title || column.key;
return (0, toFirstUpper_1.toFirstUpper)(name);
}
function defaultOnCopyRows(items, visibleColumns) {
return `${visibleColumns.map(friendlyColumnTitle).join('\t')}\n${items
.map((row, idx) => visibleColumns
.map((col) => (0, textContent_1.textContent)((0, TableRow_1.renderColumnValue)(col, row, true, idx)))
.join('\t'))
.join('\n')}`;
}
function rowsToJson(items) {
return JSON.stringify(items.length > 1 ? items : items[0], function (_key, value) {
if (typeof value === 'bigint') {
return `${value.toString()}n`;
}
return value;
}, 2);
}
//# sourceMappingURL=PowerSearchTableContextMenu.js.map