sprinklers3/app/components/ProgramTable.tsx

146 lines
5.1 KiB
TypeScript
Raw Normal View History

2017-08-29 23:21:36 -06:00
import { observer } from "mobx-react";
2018-07-22 14:50:08 -06:00
import { RouterStore } from "mobx-react-router";
import * as React from "react";
2018-07-22 14:50:08 -06:00
import { Link } from "react-router-dom";
import { Button, ButtonProps, Icon, Table } from "semantic-ui-react";
2018-07-22 14:50:08 -06:00
import { ProgramSequenceView, ScheduleView } from "@app/components";
import * as rp from "@app/routePaths";
import { Program, SprinklersDevice } from "@common/sprinklersRpc";
@observer
2018-07-22 14:50:08 -06:00
class ProgramRows extends React.Component<{
program: Program, device: SprinklersDevice,
routerStore: RouterStore,
expanded: boolean, toggleExpanded: (program: Program) => void,
}> {
render() {
const { program, device, expanded } = this.props;
2018-07-22 14:50:08 -06:00
const { sections } = device;
const { name, running, enabled, schedule, sequence } = program;
const buttonStyle: ButtonProps = { size: "small", compact: false };
2018-07-22 14:50:08 -06:00
const detailUrl = rp.program(device.id, program.id);
const stopStartButton = (
<Button onClick={this.cancelOrRun} {...buttonStyle} positive={!running} negative={running}>
<Icon name={running ? "stop" : "play"} />
{running ? "Stop" : "Run"}
</Button>
);
2018-07-22 14:50:08 -06:00
const mainRow = (
<Table.Row>
<Table.Cell className="program--number">{"" + program.id}</Table.Cell>
<Table.Cell className="program--name">{name}</Table.Cell>
<Table.Cell className="program--enabled">{enabled ? "Enabled" : "Not enabled"}</Table.Cell>
<Table.Cell className="program--running">
<span>{running ? "Running" : "Not running"}</span>
</Table.Cell>
<Table.Cell>
{stopStartButton}
2018-07-22 14:50:08 -06:00
<Button as={Link} to={detailUrl} {...buttonStyle} primary>
<Icon name="edit"/>
2018-07-22 14:50:08 -06:00
Open
</Button>
<Button onClick={this.toggleExpanded} {...buttonStyle}>
<Icon name="list"/>
2018-07-22 14:50:08 -06:00
{expanded ? "Hide Details" : "Show Details"}
</Button>
</Table.Cell>
</Table.Row>
);
const detailRow = expanded && (
<Table.Row>
<Table.Cell className="program--sequence" colSpan="5">
2018-07-22 14:50:08 -06:00
<h4>Sequence: </h4> <ProgramSequenceView sequence={sequence} sections={sections}/>
<h4>Schedule: </h4> <ScheduleView schedule={schedule}/>
</Table.Cell>
</Table.Row>
);
return (
2018-07-22 14:50:08 -06:00
<React.Fragment>
{mainRow}
{detailRow}
</React.Fragment>
);
}
2018-07-22 14:50:08 -06:00
private cancelOrRun = () => {
const { program } = this.props;
program.running ? program.cancel() : program.run();
}
private toggleExpanded = () => {
this.props.toggleExpanded(this.props.program);
}
}
@observer
2018-06-26 11:53:22 -06:00
export default class ProgramTable extends React.Component<{
2018-07-22 14:50:08 -06:00
device: SprinklersDevice, routerStore: RouterStore,
2018-06-26 11:53:22 -06:00
}, {
expandedPrograms: Program[],
}> {
constructor(p: any) {
super(p);
this.state = { expandedPrograms: [] };
}
2017-10-31 17:23:27 -06:00
render() {
const { programs } = this.props.device;
2018-07-22 14:50:08 -06:00
const programRows = programs.map(this.renderRows);
2017-10-31 17:23:27 -06:00
return (
<Table celled>
<Table.Header>
<Table.Row>
<Table.HeaderCell colSpan="7">Programs</Table.HeaderCell>
</Table.Row>
<Table.Row>
<Table.HeaderCell className="program--number">#</Table.HeaderCell>
<Table.HeaderCell className="program--name">Name</Table.HeaderCell>
<Table.HeaderCell className="program--enabled">Enabled?</Table.HeaderCell>
2018-06-26 11:53:22 -06:00
<Table.HeaderCell className="program--running">Running?</Table.HeaderCell>
2018-07-22 14:50:08 -06:00
<Table.HeaderCell className="program--actions">Actions</Table.HeaderCell>
2017-10-31 17:23:27 -06:00
</Table.Row>
</Table.Header>
<Table.Body>
{programRows}
</Table.Body>
</Table>
);
}
2018-06-29 21:30:55 -06:00
private renderRows = (program: Program, i: number): JSX.Element | null => {
if (!program) {
return null;
}
2018-07-22 14:50:08 -06:00
const expanded = this.state.expandedPrograms.indexOf(program) !== -1;
2018-06-29 21:30:55 -06:00
return (
2018-07-22 14:50:08 -06:00
<ProgramRows
program={program}
device={this.props.device}
routerStore={this.props.routerStore}
expanded={expanded}
toggleExpanded={this.toggleExpanded}
key={i}
/>
2018-06-29 21:30:55 -06:00
);
}
2018-07-22 14:50:08 -06:00
private toggleExpanded = (program: Program) => {
const { expandedPrograms } = this.state;
const idx = expandedPrograms.indexOf(program);
if (idx !== -1) {
expandedPrograms.splice(idx, 1);
} else {
expandedPrograms.push(program);
}
this.setState({
expandedPrograms,
});
}
}