|
|
|
import * as moment from "moment";
|
|
|
|
import * as React from "react";
|
|
|
|
import { Form, Icon, Input, InputOnChangeData } from "semantic-ui-react";
|
|
|
|
|
|
|
|
import { DateOfYear } from "@common/sprinklersRpc";
|
|
|
|
|
|
|
|
const HTML_DATE_INPUT_FORMAT = "YYYY-MM-DD";
|
|
|
|
|
|
|
|
export interface ScheduleDateProps {
|
|
|
|
date: DateOfYear | null | undefined;
|
|
|
|
label: string | React.ReactNode | undefined;
|
|
|
|
editing: boolean | undefined;
|
|
|
|
onChange: (newDate: DateOfYear | null) => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface ScheduleDateState {
|
|
|
|
rawValue: string | "";
|
|
|
|
lastDate: DateOfYear | null | undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default class ScheduleDate extends React.Component<
|
|
|
|
ScheduleDateProps,
|
|
|
|
ScheduleDateState
|
|
|
|
> {
|
|
|
|
static getDerivedStateFromProps(
|
|
|
|
props: ScheduleDateProps,
|
|
|
|
state: ScheduleDateState
|
|
|
|
): Partial<ScheduleDateState> {
|
|
|
|
if (!DateOfYear.equals(props.date, state.lastDate)) {
|
|
|
|
const thisYear = moment().year();
|
|
|
|
const rawValue =
|
|
|
|
props.date == null
|
|
|
|
? ""
|
|
|
|
: moment(props.date)
|
|
|
|
.year(thisYear)
|
|
|
|
.format(HTML_DATE_INPUT_FORMAT);
|
|
|
|
return { lastDate: props.date, rawValue };
|
|
|
|
}
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor(p: ScheduleDateProps) {
|
|
|
|
super(p);
|
|
|
|
this.state = { rawValue: "", lastDate: undefined };
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const { date, label, editing } = this.props;
|
|
|
|
|
|
|
|
let dayNode: React.ReactNode;
|
|
|
|
if (editing) {
|
|
|
|
// tslint:disable-line:prefer-conditional-expression
|
|
|
|
let clearIcon: React.ReactNode | undefined;
|
|
|
|
if (date) {
|
|
|
|
clearIcon = <Icon name="ban" link onClick={this.onClear} />;
|
|
|
|
}
|
|
|
|
dayNode = (
|
|
|
|
<Input
|
|
|
|
type="date"
|
|
|
|
icon={clearIcon}
|
|
|
|
value={this.state.rawValue}
|
|
|
|
onChange={this.onChange}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
const m = moment(date || "");
|
|
|
|
let dayString: string;
|
|
|
|
if (m.isValid()) {
|
|
|
|
const format = m.year() === 0 ? "M/D" : "l";
|
|
|
|
dayString = m.format(format);
|
|
|
|
} else {
|
|
|
|
dayString = "N/A";
|
|
|
|
}
|
|
|
|
dayNode = <span>{dayString}</span>;
|
|
|
|
}
|
|
|
|
|
|
|
|
let labelNode: React.ReactNode = null;
|
|
|
|
if (typeof label === "string") {
|
|
|
|
labelNode = <label>{label}</label>;
|
|
|
|
} else if (label != null) {
|
|
|
|
labelNode = label;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Form.Field inline>
|
|
|
|
{labelNode}
|
|
|
|
{dayNode}
|
|
|
|
</Form.Field>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private onChange = (
|
|
|
|
e: React.SyntheticEvent<HTMLInputElement>,
|
|
|
|
data: InputOnChangeData
|
|
|
|
) => {
|
|
|
|
const { onChange } = this.props;
|
|
|
|
if (!onChange) return;
|
|
|
|
const m = moment(data.value, HTML_DATE_INPUT_FORMAT);
|
|
|
|
onChange(DateOfYear.fromMoment(m).with({ year: 0 }));
|
|
|
|
};
|
|
|
|
|
|
|
|
private onClear = () => {
|
|
|
|
const { onChange } = this.props;
|
|
|
|
if (!onChange) return;
|
|
|
|
onChange(null);
|
|
|
|
};
|
|
|
|
}
|