TableRows can create vertical padding (#656)

This commit adds the `showPadding` prop to `TableRow`s. If showPadding
is true, then the row will have vertical padding above the row, and
below the last child of the row. The padding will match the background
color of the given row. The padding is implemented as extra `tr`
elements that themselves contain empty tds.

Test plan: The new behavior is pretty thoroughly covered by new unit
tests. Additionally, if you want to see padding in the live UI, you can
apply the following (slightly contrived) diff.

```
diff --git a/src/app/credExplorer/pagerankTable/Connection.js b/src/app/credExplorer/pagerankTable/Connection.js
index 3a882cd..633525b 100644
--- a/src/app/credExplorer/pagerankTable/Connection.js
+++ b/src/app/credExplorer/pagerankTable/Connection.js
@@ -70,7 +70,7 @@ export class ConnectionRow extends React.PureComponent<ConnectionRowProps> {
         depth={depth}
         description={connectionView}
         connectionProportion={connectionProportion}
-        showPadding={false}
+        showPadding={depth % 3 === 0}
         score={sourceScore}
       >
         <ConnectionRowList
```
This commit is contained in:
Dandelion Mané 2018-08-13 19:11:19 -07:00 committed by GitHub
parent 7f18e389ea
commit 080edb380d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 87 additions and 5 deletions

View File

@ -70,6 +70,7 @@ export class ConnectionRow extends React.PureComponent<ConnectionRowProps> {
depth={depth} depth={depth}
description={connectionView} description={connectionView}
connectionProportion={connectionProportion} connectionProportion={connectionProportion}
showPadding={false}
score={sourceScore} score={sourceScore}
> >
<ConnectionRowList <ConnectionRowList

View File

@ -50,6 +50,7 @@ export class NodeRow extends React.PureComponent<NodeRowProps> {
description={description} description={description}
connectionProportion={null} connectionProportion={null}
score={score} score={score}
showPadding={false}
> >
<ConnectionRowList depth={1} node={node} sharedProps={sharedProps} /> <ConnectionRowList depth={1} node={node} sharedProps={sharedProps} />
</TableRow> </TableRow>

View File

@ -15,6 +15,7 @@ type TableRowProps = {|
+score: number, +score: number,
// Children to show when the row is expanded // Children to show when the row is expanded
+children: ReactNode, +children: ReactNode,
+showPadding: boolean,
|}; |};
type TableRowState = {| type TableRowState = {|
expanded: boolean, expanded: boolean,
@ -40,18 +41,18 @@ export class TableRow extends React.PureComponent<
connectionProportion, connectionProportion,
score, score,
children, children,
showPadding,
} = this.props; } = this.props;
const {expanded} = this.state; const {expanded} = this.state;
const percent = const percent =
connectionProportion == null connectionProportion == null
? "" ? ""
: (connectionProportion * 100).toFixed(2) + "%"; : (connectionProportion * 100).toFixed(2) + "%";
const backgroundColor = `rgba(0,143.4375,0,${1 - 0.9 ** depth})`;
return ( return (
<React.Fragment> <React.Fragment>
<tr {showPadding && <PaddingRow backgroundColor={backgroundColor} />}
key="self" <tr key="self" style={{backgroundColor}}>
style={{backgroundColor: `rgba(0,143.4375,0,${1 - 0.9 ** depth})`}}
>
<td style={{display: "flex", alignItems: "flex-start"}}> <td style={{display: "flex", alignItems: "flex-start"}}>
<button <button
style={{ style={{
@ -72,7 +73,23 @@ export class TableRow extends React.PureComponent<
<td style={{textAlign: "right"}}>{scoreDisplay(score)}</td> <td style={{textAlign: "right"}}>{scoreDisplay(score)}</td>
</tr> </tr>
{expanded && children} {expanded && children}
{showPadding && <PaddingRow backgroundColor={backgroundColor} />}
</React.Fragment> </React.Fragment>
); );
} }
} }
export function PaddingRow(props: {|+backgroundColor: string|}) {
return (
<tr
style={{
height: 12,
backgroundColor: props.backgroundColor,
}}
>
<td />
<td />
<td />
</tr>
);
}

View File

@ -2,7 +2,7 @@
import React from "react"; import React from "react";
import {shallow} from "enzyme"; import {shallow} from "enzyme";
import {TableRow} from "./TableRow"; import {TableRow, PaddingRow} from "./TableRow";
import {COLUMNS} from "./sharedTestUtils"; import {COLUMNS} from "./sharedTestUtils";
require("../../testUtil").configureEnzyme(); require("../../testUtil").configureEnzyme();
@ -17,6 +17,7 @@ describe("app/credExplorer/pagerankTable/TableRow", () => {
connectionProportion={0.5} connectionProportion={0.5}
score={133.7} score={133.7}
children={<div data-test-children={true} />} children={<div data-test-children={true} />}
showPadding={false}
/> />
); );
} }
@ -26,6 +27,7 @@ describe("app/credExplorer/pagerankTable/TableRow", () => {
<TableRow <TableRow
depth={depth} depth={depth}
indent={1} indent={1}
showPadding={false}
description={<span data-test-description={true} />} description={<span data-test-description={true} />}
connectionProportion={0.5} connectionProportion={0.5}
score={133.7} score={133.7}
@ -43,6 +45,7 @@ describe("app/credExplorer/pagerankTable/TableRow", () => {
<TableRow <TableRow
depth={3} depth={3}
indent={indent} indent={indent}
showPadding={false}
description={<span data-test-description={true} />} description={<span data-test-description={true} />}
connectionProportion={0.5} connectionProportion={0.5}
score={133.7} score={133.7}
@ -116,4 +119,64 @@ describe("app/credExplorer/pagerankTable/TableRow", () => {
.at(index); .at(index);
expect(td.find({"data-test-description": true})).toHaveLength(1); expect(td.find({"data-test-description": true})).toHaveLength(1);
}); });
it("doesn't create extra padding rows if showPadding=false", () => {
const el = example();
expect(el.find("tr")).toHaveLength(1);
});
describe("can add padding rows above and below the row", () => {
function paddingExample() {
return shallow(
<TableRow
depth={2}
indent={1}
description={<span data-test-description={true} />}
connectionProportion={0.5}
score={133.7}
children={<div data-test-children={true} />}
showPadding={true}
/>
);
}
it("has two identical padding rows", () => {
const paddingRows = paddingExample().find(PaddingRow);
expect(paddingRows).toHaveLength(2);
expect(paddingRows.at(0)).toEqual(paddingRows.at(1));
});
it("padding rows are first and last children", () => {
const children = paddingExample().children();
expect(children.first().is(PaddingRow)).toBe(true);
expect(children.last().is(PaddingRow)).toBe(true);
});
it("padding rows are first and last children after expansion", () => {
const el = paddingExample();
el.setState({expanded: true});
const children = el.children();
expect(children.first().is(PaddingRow)).toBe(true);
expect(children.last().is(PaddingRow)).toBe(true);
});
it("padding rows have the right number of tds", () => {
const el = paddingExample();
const paddingRow = shallow(
<PaddingRow backgroundColor="rgba(0,0,0,0)" />
);
expect(paddingRow.find("td")).toHaveLength(el.find("td").length);
});
it("padding rows were passed the right color", () => {
const el = paddingExample();
const pr = el.find(PaddingRow).at(0);
const tr = el.find("tr");
expect(pr.props().backgroundColor).toEqual(
tr.props().style.backgroundColor
);
});
it("padding rows properly set the background color", () => {
const bgColor = "rgba(3, 13, 37, 0.1337)";
const pr = shallow(<PaddingRow backgroundColor={bgColor} />);
expect(pr.find("tr").props().style.backgroundColor).toEqual(bgColor);
});
it("padding rows set height > 0", () => {
const pr = shallow(<PaddingRow backgroundColor="rgba(0, 0, 0, 0)" />);
expect(pr.find("tr").props().style.height).toBeGreaterThan(0);
});
});
}); });