ywana-core8 0.0.238 → 0.0.242

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,208 @@
1
+ import React, { useEffect, useMemo, useState } from "react";
2
+ import { DropDown, Header, Icon, Text, TextField } from "../../html";
3
+ import moment from "moment";
4
+ import { extendMoment } from "moment-range";
5
+ import "./Planner.css";
6
+
7
+ const ranges = extendMoment(moment);
8
+
9
+ const DATE_RANGE = [
10
+ { label: "Week", value: "week" },
11
+ { label: "Month", value: "month" },
12
+ ];
13
+
14
+ /**
15
+ * Planner
16
+ */
17
+ export const Planner = ({ title, events = [], lanes = [], selected = false, editable = false, navigation = true, onSelect, onAdd, onDelete, onMove }) => {
18
+
19
+ const [dateRange, setDateRange] = useState("month");
20
+ const [from, setFrom] = useState("2021-02-26");
21
+ const [to, setTo] = useState("2021-04-01");
22
+
23
+ useEffect(() => {
24
+ const today = moment();
25
+ const from_date = today.startOf(dateRange).format("YYYY-MM-DD");
26
+ const to_date = today.endOf(dateRange).format("YYYY-MM-DD");
27
+ setFrom(from_date);
28
+ setTo(to_date);
29
+ }, [dateRange]);
30
+
31
+ function next() {
32
+ const actual = moment(from);
33
+ const next = actual.add(1, dateRange);
34
+ const from_date = next.startOf(dateRange).format("YYYY-MM-DD");
35
+ const to_date = next.endOf(dateRange).format("YYYY-MM-DD");
36
+ setFrom(from_date);
37
+ setTo(to_date);
38
+ }
39
+
40
+ function prev() {
41
+ const actual = moment(from);
42
+ const next = actual.subtract(1, dateRange);
43
+ const from_date = next.startOf(dateRange).format("YYYY-MM-DD");
44
+ const to_date = next.endOf(dateRange).format("YYYY-MM-DD");
45
+ setFrom(from_date);
46
+ setTo(to_date);
47
+ }
48
+
49
+ function add(set, date) {
50
+ if (onAdd) onAdd(date, set);
51
+ }
52
+
53
+ function remove(id) {
54
+ if (onDelete) onDelete(id);
55
+ }
56
+
57
+ function move(form) {
58
+ if (onMove) onMove(form);
59
+ }
60
+
61
+ function select({ id, plan }) {
62
+ if (onSelect) onSelect(plan);
63
+ }
64
+
65
+ const period = useMemo(() => {
66
+ const start = ranges(from, "YYYY-MM-DD");
67
+ const end = ranges(to, "YYYY-MM-DD");
68
+ const range = ranges.range(start, end);
69
+ const period = Array.from(range.by("day")).map((m) => ({
70
+ year: m.year(),
71
+ month: m.month(),
72
+ day: m.date(),
73
+ moment: m,
74
+ }));
75
+ return period;
76
+ }, [from, to]);
77
+
78
+ const label = <Text use="headline6">{title}</Text>;
79
+ return (
80
+ <div className="planner-box">
81
+
82
+ {navigation ? (
83
+ <Header title={label}>
84
+ <Icon icon="chevron_right" clickable action={next} />
85
+ <TextField id="to" type="date" label="To" value={to} onChange={(id, value) => setTo(value)} />
86
+ <div className="expand"></div>
87
+ <DropDown id="ranges" label="Date Range" options={DATE_RANGE} value={dateRange} onChange={(id, value) => setDateRange(value)} />
88
+ <div className="expand"></div>
89
+ <TextField id="from" type="date" label="From" value={from} onChange={(id, value) => setFrom(value)} />
90
+ <Icon icon="chevron_left" clickable action={prev} />
91
+ </Header>
92
+ ) : null}
93
+
94
+
95
+ <main className="planner">
96
+
97
+ <div className="column0">
98
+ <div className="column-header"></div>
99
+ {lanes.map((lane) => (
100
+ <div className="row-header">
101
+ {lane.label}
102
+ </div>
103
+ ))}
104
+ </div>
105
+
106
+ <div className="rows">
107
+ <div className="row row0">
108
+ {period.map((date, index) => {
109
+ const first = index === 0 || date.day === 1 ? "first" : "";
110
+ return (
111
+ <div className="column-header">
112
+ <div className={`month-header ${first}`}>
113
+ <Text use="overline">{date.moment.format("MMM")}</Text>
114
+ </div>
115
+ </div>
116
+ );
117
+ })}
118
+ </div>
119
+ <div className="row row1">
120
+ {period.map((date) => {
121
+ const isWekend = [0, 6].includes(date.moment.day());
122
+ const weekend = isWekend ? "weekend" : "";
123
+ return (
124
+ <div className="column-header">
125
+ <div className={`date-header ${weekend}`}>
126
+ <Text use="headline6">{date.moment.format("DD")}</Text>
127
+ &nbsp;
128
+ <Text use="caption">{date.moment.format("ddd")}</Text>
129
+ </div>
130
+ </div>
131
+ );
132
+ })}
133
+ </div>
134
+
135
+ {lanes.map((lane) => <PlannerRow lane={lane} events={events} period={period} />)}
136
+
137
+ </div>
138
+ </main>
139
+ </div>
140
+ );
141
+ };
142
+
143
+ /**
144
+ * Planner Row
145
+ */
146
+ const PlannerRow = (props) => {
147
+
148
+ const { lane, events = [], period } = props
149
+ const rowEvents = events.filter(event => event.lane === lane.id)
150
+
151
+ return (
152
+ <div className="row">
153
+ {period.map((date) => {
154
+ const slotDate = new Date(date.year, date.month, date.day);
155
+ slotDate.setHours(0, 0, 0);
156
+ const cellEvents = rowEvents.filter( event => {
157
+ const eventDate = new Date(event.date);
158
+ eventDate.setHours(0, 0, 0);
159
+ return eventDate.getTime() === slotDate.getTime();
160
+ })
161
+ return (
162
+ <PlannerCell date={date} events={cellEvents}/>
163
+ );
164
+ })}
165
+ </div>
166
+ )
167
+ }
168
+
169
+ /**
170
+ * Planner Cell
171
+ */
172
+ const PlannerCell = ({ lane, events, date, disabled = false, onAdd, onDelete, onSelect, onDrop, editable = false }) => {
173
+
174
+ const [dragOver, setDragOver] = useState(false);
175
+
176
+ function onDragOver(event) {
177
+ if (!dragOver) setDragOver(true);
178
+ event.stopPropagation();
179
+ event.preventDefault();
180
+ }
181
+
182
+ function onDragLeave(event) {
183
+ setDragOver(false);
184
+ event.stopPropagation();
185
+ event.preventDefault();
186
+ }
187
+
188
+ function drop(event) {
189
+ event.stopPropagation();
190
+ event.preventDefault();
191
+ const id = event.dataTransfer.getData("text");
192
+ if (onDrop)
193
+ onDrop({
194
+ id,
195
+ lane: lane.id,
196
+ date: date.moment.format("YYYY-MM-DD")
197
+ });
198
+ }
199
+
200
+ const isWekend = [0, 6].includes(date.moment.day());
201
+ const weekend = isWekend ? "weekend" : "";
202
+
203
+ return (
204
+ <div className={`cell ${weekend}`} onDragOver={onDragOver} onDragLeave={onDragLeave} onDrop={drop}>
205
+ c
206
+ </div>
207
+ );
208
+ };
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { Planner } from './Planner'
3
+
4
+ const PlannerTest = (prop) => {
5
+
6
+ const lanes = [
7
+ { id: "lane1", label: "Lane 1" },
8
+ { id: "lane2", label: "Lane 2" },
9
+ { id: "lane3", label: "Lane 3" },
10
+ { id: "lane3", label: "Lane 3" },
11
+ { id: "lane3", label: "Lane 3" },
12
+ { id: "lane3", label: "Lane 3" },
13
+ { id: "lane3", label: "Lane 3" },
14
+ ]
15
+
16
+ const events = []
17
+
18
+ return (
19
+
20
+ <Planner title="Planner 1" lanes={lanes} events={events} navigation={true} >
21
+
22
+ </Planner>
23
+
24
+ )
25
+ }