|
|
|
import { flatMap } from "lodash";
|
|
|
|
import { observer } from "mobx-react";
|
|
|
|
import * as moment from "moment";
|
|
|
|
import * as React from "react";
|
|
|
|
import { Button, Table } from "semantic-ui-react";
|
|
|
|
|
|
|
|
import { Duration } from "@common/Duration";
|
|
|
|
import { DateOfYear, Program, Schedule, Section, TimeOfDay, Weekday } from "@common/sprinklers";
|
|
|
|
|
|
|
|
function timeToString(time: TimeOfDay) {
|
|
|
|
return moment(time).format("LTS");
|
|
|
|
}
|
|
|
|
|
|
|
|
function formatDateOfYear(day: DateOfYear | null, prefix: string) {
|
|
|
|
if (day == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return prefix + moment(day).format("l");
|
|
|
|
}
|
|
|
|
|
|
|
|
@observer
|
|
|
|
export class ScheduleView extends React.Component<{ schedule: Schedule }> {
|
|
|
|
render() {
|
|
|
|
const { schedule } = this.props;
|
|
|
|
const times = schedule.times.map((time, i) => timeToString(time))
|
|
|
|
.join(", ");
|
|
|
|
const weekdays = schedule.weekdays.map((weekday) =>
|
|
|
|
Weekday[weekday]).join(", ");
|
|
|
|
const from = formatDateOfYear(schedule.from, "From ");
|
|
|
|
const to = formatDateOfYear(schedule.to, "To ");
|
|
|
|
return (
|
|
|
|
<div>
|
|
|
|
At {times} <br />
|
|
|
|
On {weekdays} <br />
|
|
|
|
{from} <br />
|
|
|
|
{to}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@observer
|
|
|
|
export default class ProgramTable extends React.Component<{ programs: Program[], sections: Section[] }> {
|
|
|
|
render() {
|
|
|
|
const programRows = Array.prototype.concat.apply([],
|
|
|
|
this.props.programs.map(this.renderRows));
|
|
|
|
|
|
|
|
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--running">Running?</Table.HeaderCell>
|
|
|
|
<Table.HeaderCell className="program--enabled">Enabled?</Table.HeaderCell>
|
|
|
|
</Table.Row>
|
|
|
|
</Table.Header>
|
|
|
|
<Table.Body>
|
|
|
|
{programRows}
|
|
|
|
</Table.Body>
|
|
|
|
</Table>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private renderRows = (program: Program, i: number): JSX.Element[] | null => {
|
|
|
|
if (!program) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
const { name, running, enabled, schedule, sequence } = program;
|
|
|
|
const sequenceItems = flatMap(sequence, (item, index) => {
|
|
|
|
const section = this.props.sections[item.section];
|
|
|
|
const duration = Duration.fromSeconds(item.duration);
|
|
|
|
return [
|
|
|
|
<em key={index}>"{section.name}"</em>, ` for ${duration.toString()}, `,
|
|
|
|
];
|
|
|
|
});
|
|
|
|
const cancelOrRun = () => running ? program.cancel() : program.run();
|
|
|
|
return [(
|
|
|
|
<Table.Row key={i}>
|
|
|
|
<Table.Cell className="program--number">{"" + (i + 1)}</Table.Cell>
|
|
|
|
<Table.Cell className="program--name">{name}</Table.Cell>
|
|
|
|
<Table.Cell className="program--running">
|
|
|
|
{running ? "Running" : "Not running"}
|
|
|
|
<Button className="program--runningButton" onClick={cancelOrRun}>
|
|
|
|
{running ? "Cancel" : "Run"}
|
|
|
|
</Button>
|
|
|
|
</Table.Cell>
|
|
|
|
<Table.Cell className="program--enabled">{enabled ? "Enabled" : "Not enabled"}</Table.Cell>
|
|
|
|
</Table.Row>
|
|
|
|
), (
|
|
|
|
<Table.Row key={i + .5}>
|
|
|
|
<Table.Cell className="program--sequence" colSpan="4">
|
|
|
|
<h4>Sequence: </h4> {sequenceItems}
|
|
|
|
<h4>Schedule: </h4> <ScheduleView schedule={schedule} />
|
|
|
|
</Table.Cell>
|
|
|
|
</Table.Row>
|
|
|
|
)];
|
|
|
|
}
|
|
|
|
}
|