Farmbot-Web-App/frontend/farm_designer/farm_events/farm_events.tsx

133 lines
4.3 KiB
TypeScript
Raw Normal View History

2017-06-29 12:54:02 -06:00
import * as React from "react";
import { connect } from "react-redux";
import { mapStateToProps } from "./map_state_to_props";
import {
2020-02-28 09:35:32 -07:00
FarmEventProps, CalendarOccurrence, FarmEventState,
} from "../interfaces";
2019-02-04 13:54:17 -07:00
import moment from "moment";
import { Content } from "../../constants";
2019-03-05 11:59:22 -07:00
import { Panel, DesignerNavTabs } from "../panel_header";
import { Link } from "../../link";
2019-03-05 11:59:22 -07:00
import {
2020-02-28 09:35:32 -07:00
DesignerPanel, DesignerPanelContent, DesignerPanelTop,
2019-12-10 13:09:52 -07:00
} from "../designer_panel";
2019-03-05 11:59:22 -07:00
import {
2020-02-28 09:35:32 -07:00
EmptyStateWrapper, EmptyStateGraphic,
2019-03-05 11:59:22 -07:00
} from "../../ui/empty_state_wrapper";
2019-02-06 18:36:11 -07:00
import { some, uniq, map, sortBy } from "lodash";
2019-04-02 13:59:37 -06:00
import { t } from "../../i18next_wrapper";
2020-04-13 19:15:11 -06:00
import { SearchField } from "../../ui/search_field";
2017-07-24 12:27:56 -06:00
2018-11-09 13:39:50 -07:00
const filterSearch = (term: string) => (item: CalendarOccurrence) =>
item.heading.toLowerCase().includes(term)
|| (item.subheading && item.subheading.toLowerCase().includes(term));
export class PureFarmEvents
extends React.Component<FarmEventProps, FarmEventState> {
state: FarmEventState = { searchTerm: "" };
get searchTerm() { return this.state.searchTerm.toLowerCase(); }
resetCalendar = () => {
this.setState({ searchTerm: "" });
const panel = document.querySelector(".farm-events");
if (panel) { panel.scrollTo(0, 0); }
}
2017-07-24 12:27:56 -06:00
innerRows = (items: CalendarOccurrence[]) => {
2019-02-06 18:36:11 -07:00
return sortBy(items, x => x.sortKey)
2018-11-09 13:39:50 -07:00
.filter(filterSearch(this.searchTerm))
2018-01-12 08:49:20 -07:00
.map((occur, index) => {
2019-04-09 19:52:12 -06:00
const url = `/app/designer/events/`
2018-01-12 12:54:37 -07:00
+ (occur.id || "UNSAVED_EVENT").toString();
const heading = occur.subheading
? occur.subheading
: occur.heading;
const subHeading = occur.subheading
? <p style={{ color: "gray" }}> {occur.heading} </p>
: <p />;
2017-07-24 12:27:56 -06:00
return <div
className="farm-event-data-block"
key={`${occur.sortKey}.${index}`}>
<div className="farm-event-data-time">
{occur.timeStr}
2017-07-24 12:27:56 -06:00
</div>
<div className="farm-event-data-executable">
{heading}
{subHeading}
</div>
<Link to={url}>
<i className="fa fa-pencil-square-o edit-icon" />
</Link>
</div>;
2017-07-24 12:27:56 -06:00
});
}
2017-06-29 12:54:02 -06:00
2017-08-09 22:04:06 -06:00
renderCalendarRowsInYear(year: number) {
return this.props.calendarRows.filter((day) => {
return day.year == year;
2018-11-09 13:39:50 -07:00
})
.filter(item => !this.searchTerm ||
2019-02-04 07:32:26 -07:00
some(item.items.map(filterSearch(this.searchTerm))))
2018-11-09 13:39:50 -07:00
.map(item => {
return <div className="farm-event" key={item.sortKey}>
<div className="farm-event-date">
<div className="farm-event-date-month">
{item.month}
</div>
<div className="farm-event-date-day">
<b>{item.day}</b>
</div>
2017-06-29 12:54:02 -06:00
</div>
2018-11-09 13:39:50 -07:00
<div className="farm-event-data">
{this.innerRows(item.items)}
2017-07-07 13:51:00 -06:00
</div>
2018-11-09 13:39:50 -07:00
</div>;
});
2017-06-29 12:54:02 -06:00
}
2017-08-09 22:04:06 -06:00
renderCalendarRows() {
2019-02-04 07:32:26 -07:00
const years = uniq(map(this.props.calendarRows, "year"));
2017-08-09 22:04:06 -06:00
return years.map(year => {
2019-03-05 11:59:22 -07:00
return <div key={moment(year, "YY").unix()}
className="farm-event-calendar-rows">
2017-12-29 11:08:32 -07:00
<div className="farm-event-year">
20{year}
</div>
{this.renderCalendarRowsInYear(year)}
</div>;
2017-08-09 22:04:06 -06:00
});
}
2020-01-03 13:17:56 -07:00
render() {
return <DesignerPanel panelName={"farm-event"} panel={Panel.FarmEvents}>
<DesignerNavTabs />
2019-03-05 11:59:22 -07:00
<DesignerPanelTop
panel={Panel.FarmEvents}
2019-04-09 19:52:12 -06:00
linkTo={"/app/designer/events/add"}
2020-04-13 19:15:11 -06:00
title={t("Add event")}>
<SearchField searchTerm={this.state.searchTerm}
customLeftIcon={
<i className="fa fa-calendar" onClick={this.resetCalendar} />}
placeholder={t("Search your events...")}
onChange={searchTerm => this.setState({ searchTerm })} />
2019-03-05 11:59:22 -07:00
</DesignerPanelTop>
<DesignerPanelContent panelName={"farm-event"}>
<div className="farm-events">
<EmptyStateWrapper
notEmpty={this.props.calendarRows.length > 0}
title={t("No events scheduled.")}
text={t(Content.NOTHING_SCHEDULED)}
colorScheme="events"
2019-09-09 10:10:08 -06:00
graphic={EmptyStateGraphic.farm_events}>
2019-03-05 11:59:22 -07:00
{this.renderCalendarRows()}
</EmptyStateWrapper>
</div>
</DesignerPanelContent>
</DesignerPanel>;
2017-06-29 12:54:02 -06:00
}
}
export const FarmEvents = connect(mapStateToProps)(PureFarmEvents);