All files / src/components/table-cell table-cell.tsx

90% Statements 36/40
88.89% Branches 16/18
66.67% Functions 4/6
90.63% Lines 29/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109                                    30x 30x   30x 30x   30x   30x 30x                     2x 2x 2x 2x                       30x 33x 33x     2x           27x 23x     4x 2x                 2x 2x                     33x 27x           27x 2x 25x 1x   24x     6x      
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { IconNames } from '@blueprintjs/icons';
import React, { useState } from 'react';
 
import { ShowValueDialog } from '../../dialogs/show-value-dialog/show-value-dialog';
import { ActionIcon } from '../action-icon/action-icon';
 
import './table-cell.scss';
 
const MAX_CHARS_TO_SHOW = 50;
const ABSOLUTE_MAX_CHARS_TO_SHOW = 5000;
 
interface ShortParts {
  prefix: string;
  omitted: string;
  suffix: string;
}
 
function shortenString(str: string): ShortParts {
  // Print something like:
  // BAAAArAAEiQKpDAEAACwZCBAGSBgiSEAAAAQpAIDwAg...23 omitted...gwiRoQBJIC
  const omit = str.length - (MAX_CHARS_TO_SHOW - 17);
  const prefix = str.substr(0, str.length - (omit + 10));
  const suffix = str.substr(str.length - 10);
  return {
    prefix,
    omitted: `...${omit} omitted...`,
    suffix,
  };
}
 
export interface TableCellProps {
  value: any;
  unlimited?: boolean;
}
 
export const TableCell = React.memo(function TableCell(props: TableCellProps) {
  const { value, unlimited } = props;
  const [showValue, setShowValue] = useState();
 
  function renderShowValueDialog(): JSX.Element | undefined {
    Eif (!showValue) return;
 
    return <ShowValueDialog onClose={() => setShowValue(undefined)} str={showValue} />;
  }
 
  function renderTruncated(str: string): JSX.Element {
    if (str.length <= MAX_CHARS_TO_SHOW) {
      return <span className="table-cell plain">{str}</span>;
    }
 
    if (unlimited) {
      return (
        <span className="table-cell plain">
          {str.length < ABSOLUTE_MAX_CHARS_TO_SHOW
            ? str
            : `${str.substr(0, ABSOLUTE_MAX_CHARS_TO_SHOW)}...`}
        </span>
      );
    }
 
    const { prefix, omitted, suffix } = shortenString(str);
    return (
      <span className="table-cell truncated">
        {prefix}
        <span className="omitted">{omitted}</span>
        {suffix}
        <ActionIcon icon={IconNames.MORE} onClick={() => setShowValue(str)} />
        {renderShowValueDialog()}
      </span>
    );
  }
 
  if (value !== '' && value != null) {
    Iif (value instanceof Date) {
      return (
        <span className="table-cell timestamp" title={String(value.valueOf())}>
          {value.toISOString()}
        </span>
      );
    } else if (Array.isArray(value)) {
      return renderTruncated(`[${value.join(', ')}]`);
    } else if (typeof value === 'object') {
      return renderTruncated(JSON.stringify(value));
    } else {
      return renderTruncated(String(value));
    }
  } else {
    return <span className="table-cell null">null</span>;
  }
});