/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format */ import {CopyOutlined, FilterOutlined} from '@ant-design/icons'; import {Checkbox, Menu} from 'antd'; import { DataTableDispatch, getSelectedItem, getSelectedItems, Selection, } from './DataTableManager'; import React from 'react'; import {tryGetFlipperLibImplementation} from '../../plugin/FlipperLib'; import {DataTableColumn} from './DataTable'; import {DataSource} from '../../state/DataSource'; import {toFirstUpper} from '../../utils/toFirstUpper'; const {Item, SubMenu} = Menu; function defaultOnCopyRows(items: T[]) { return JSON.stringify(items.length > 1 ? items : items[0], null, 2); } export function tableContextMenuFactory( datasource: DataSource, dispatch: DataTableDispatch, selection: Selection, columns: DataTableColumn[], visibleColumns: DataTableColumn[], onCopyRows: (rows: T[]) => string = defaultOnCopyRows, onContextMenu?: (selection: undefined | T) => React.ReactElement, ) { const lib = tryGetFlipperLibImplementation(); if (!lib) { return ( Menu not ready ); } const hasSelection = selection.items.size > 0 ?? false; return ( {onContextMenu ? onContextMenu(getSelectedItem(datasource, selection)) : null} } disabled={!hasSelection}> {visibleColumns.map((column) => ( { dispatch({ type: 'setColumnFilterFromSelection', column: column.key, }); }}> {friendlyColumnTitle(column)} ))} } disabled={!hasSelection}> {visibleColumns.map((column) => ( { const items = getSelectedItems(datasource, selection); if (items.length) { lib.writeTextToClipboard( items.map((item) => '' + item[column.key]).join('\n'), ); } }}> {friendlyColumnTitle(column)} ))} { const items = getSelectedItems(datasource, selection); if (items.length) { lib.writeTextToClipboard(onCopyRows(items)); } }}> Copy row(s) {lib.isFB && ( { const items = getSelectedItems(datasource, selection); if (items.length) { lib.createPaste(onCopyRows(items)); } }}> Create paste )} {columns.map((column) => ( { e.stopPropagation(); e.preventDefault(); dispatch({type: 'toggleColumnVisibility', column: column.key}); }}> {friendlyColumnTitle(column)} ))} { dispatch({type: 'reset'}); }}> Reset view ); } function friendlyColumnTitle(column: DataTableColumn): string { const name = column.title || column.key; return toFirstUpper(name); }