Restore copy on text

Summary:
Some folks were missing the copy as text ManagedTable used to have, so introduced both the options to either copy as text (visible columns or custom copy handler) or as JSON

Changelog: It is now possible to both copy as text or as JSON from data tables

Reviewed By: jknoxville

Differential Revision: D29712096

fbshipit-source-id: 27bd2e869a247bd0896ce2774c08651123fd531d
This commit is contained in:
Michel Weststrate
2021-07-16 03:42:14 -07:00
committed by Facebook GitHub Bot
parent 1e93055eb5
commit d23ccfcd44
13 changed files with 116 additions and 44 deletions

View File

@@ -0,0 +1,47 @@
/**
* 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 {ReactNode, ReactElement} from 'react';
function isReactElement(object: any) {
return (
typeof object === 'object' &&
object !== null &&
object.$$typeof === Symbol.for('react.element')
);
}
/**
* Recursively walks through all children of a React element and returns
* the string representation of the leafs concatenated.
*/
export function textContent(node: ReactNode): string {
let res = '';
const traverse = (node: ReactNode) => {
if (typeof node === 'string' || typeof node === 'number') {
// this is a leaf, add it to the result string
res += node;
} else if (Array.isArray(node)) {
// traverse all array members and recursively stringify them
node.forEach(traverse);
} else if (isReactElement(node)) {
// node is a react element access its children an recursively stringify them
const {children} = (node as ReactElement).props;
if (Array.isArray(children)) {
children.forEach(traverse);
} else {
traverse(children);
}
}
};
traverse(node);
return res;
}