ywana-core8 0.0.910 → 0.0.912
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.
- package/dist/index.cjs +208 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +129 -6
- package/dist/index.css.map +1 -1
- package/dist/index.modern.js +208 -15
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +208 -14
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/CollectionAPI.js +11 -1
- package/src/domain/CollectionPage.js +4 -4
- package/src/widgets/calendar/Calendar.css +129 -6
- package/src/widgets/calendar/Calendar.js +176 -7
package/package.json
CHANGED
@@ -4,7 +4,7 @@ import { isEmpty} from '../commons'
|
|
4
4
|
/**
|
5
5
|
* Collection API
|
6
6
|
*/
|
7
|
-
export const CollectionAPI = (url, host) => {
|
7
|
+
export const CollectionAPI = (url, host, params) => {
|
8
8
|
|
9
9
|
const http = HTTPClient(host || window.API || process.env.REACT_APP_API, Session);
|
10
10
|
|
@@ -45,10 +45,20 @@ import { isEmpty} from '../commons'
|
|
45
45
|
return {
|
46
46
|
|
47
47
|
all(filters, likes = [], page) {
|
48
|
+
|
49
|
+
// build query params
|
48
50
|
let queryParams = page ? `?page=${page}&` : "?"
|
51
|
+
|
52
|
+
// concat optional params to queryparams
|
53
|
+
queryParams = `${queryParams}${params}`
|
54
|
+
|
55
|
+
// concat filters to queryparams
|
49
56
|
const filterQuery = objectToQueryParamString(filters, likes)
|
50
57
|
queryParams = `${queryParams}${filterQuery}`
|
58
|
+
|
59
|
+
// remove last &
|
51
60
|
queryParams = queryParams.substring(0, queryParams.length - 1)
|
61
|
+
|
52
62
|
return http.GET(`${url}${queryParams}`)
|
53
63
|
},
|
54
64
|
|
@@ -18,7 +18,7 @@ export const CollectionPage = (props) => {
|
|
18
18
|
const {
|
19
19
|
id = "collection",
|
20
20
|
icon, title, name = "Collection 1", className,
|
21
|
-
schema, url, field, host, page, fetching = false,
|
21
|
+
schema, url, field, host, page, fetching = false, params,
|
22
22
|
actions = [], onSelect, onChange,
|
23
23
|
canFilter = false, canAdd = false, canDelete = false, searchBy, addValidator,
|
24
24
|
autosave = false, delay = 1000, patch = false, versioning = false,
|
@@ -30,7 +30,7 @@ export const CollectionPage = (props) => {
|
|
30
30
|
children
|
31
31
|
} = props
|
32
32
|
|
33
|
-
const context = CollectionContext(url, field, host, page, fetching, versioning)
|
33
|
+
const context = CollectionContext(url, field, host, page, fetching, versioning, params)
|
34
34
|
const [pageContext, setPageContext] = useContext(PageContext)
|
35
35
|
const { all } = pageContext
|
36
36
|
|
@@ -460,9 +460,9 @@ const CollectionEditor = (props) => {
|
|
460
460
|
/**
|
461
461
|
* Collection Context
|
462
462
|
*/
|
463
|
-
export const CollectionContext = (url, field, host, page, fetching, versioning = false) => {
|
463
|
+
export const CollectionContext = (url, field, host, page, fetching, versioning = false, params) => {
|
464
464
|
|
465
|
-
const API = CollectionAPI(url, host)
|
465
|
+
const API = CollectionAPI(url, host, params)
|
466
466
|
|
467
467
|
return {
|
468
468
|
|
@@ -1,5 +1,128 @@
|
|
1
|
+
.calendar {
|
2
|
+
display: flex;
|
3
|
+
flex-direction: column;
|
4
|
+
flex: 1;
|
5
|
+
overflow: hidden;
|
6
|
+
}
|
7
|
+
|
8
|
+
.calendar-range-control {
|
9
|
+
margin: .3rem;
|
10
|
+
border: solid 1px var(--divider-color);
|
11
|
+
background-color: var(--background-color);
|
12
|
+
border-radius: 3px;
|
13
|
+
padding: .2rem;
|
14
|
+
display: flex;
|
15
|
+
justify-content: space-between;
|
16
|
+
align-items: center;
|
17
|
+
|
18
|
+
&>.btn {
|
19
|
+
flex: 1;
|
20
|
+
margin-left: 1rem;
|
21
|
+
border-radius: 2px;
|
22
|
+
background-color: var(--background-color);
|
23
|
+
&.outlined {
|
24
|
+
border: solid 1px var(--divider-color);
|
25
|
+
background-color: var(--paper-color);
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
.year-calendar {
|
31
|
+
margin: 1rem;
|
32
|
+
overflow: hidden;
|
33
|
+
display: flex;
|
34
|
+
flex-direction: column;
|
35
|
+
padding: 0rem;
|
36
|
+
}
|
37
|
+
|
38
|
+
.year-calendar>nav {
|
39
|
+
display: flex;
|
40
|
+
padding: .5rem;
|
41
|
+
display: flex;
|
42
|
+
align-items: center;
|
43
|
+
}
|
44
|
+
|
45
|
+
.year-calendar>nav>label {
|
46
|
+
flex: 1;
|
47
|
+
font-size: 1.3rem;
|
48
|
+
font-weight: 500;
|
49
|
+
}
|
50
|
+
|
51
|
+
.year-calendar>nav>button {
|
52
|
+
margin-left: 1px;
|
53
|
+
border-radius: 3px;
|
54
|
+
}
|
55
|
+
|
56
|
+
.year-calendar>main {
|
57
|
+
flex: 1;
|
58
|
+
border: solid 1px var(--divider-color);
|
59
|
+
border-width: 1px 1px 0 0;
|
60
|
+
display: grid;
|
61
|
+
grid-template-columns: repeat(3, 1fr);
|
62
|
+
grid-gap: 1rem;
|
63
|
+
grid-auto-rows: minmax(12rem, auto);
|
64
|
+
overflow: hidden;
|
65
|
+
font-size: .8rem;
|
66
|
+
}
|
67
|
+
|
68
|
+
.year-calendar .month-cell {
|
69
|
+
border-width: 0 0 1px 1px;
|
70
|
+
overflow: hidden;
|
71
|
+
padding: .5rem;
|
72
|
+
text-align: right;
|
73
|
+
font-weight: 400;
|
74
|
+
|
75
|
+
&>nav {
|
76
|
+
display: flex;
|
77
|
+
padding: .5rem;
|
78
|
+
display: flex;
|
79
|
+
align-items: center;
|
80
|
+
}
|
81
|
+
|
82
|
+
&>header {
|
83
|
+
display:flex;
|
84
|
+
|
85
|
+
&>.week-day-cell {
|
86
|
+
flex: 1;
|
87
|
+
border: solid 0px var(--divider-color);
|
88
|
+
padding: 2px;
|
89
|
+
text-align: right;
|
90
|
+
min-width: 2rem !important;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
&>main {
|
95
|
+
flex: 1;
|
96
|
+
border: solid 0px var(--divider-color);
|
97
|
+
display: grid;
|
98
|
+
grid-template-columns: repeat(7, 1fr);
|
99
|
+
grid-gap: 0px;
|
100
|
+
grid-auto-rows: minmax(2rem, auto);
|
101
|
+
overflow: hidden;
|
102
|
+
font-size: .8rem;
|
103
|
+
|
104
|
+
&>.day-cell {
|
105
|
+
border: solid 0px;
|
106
|
+
padding: .5rem;
|
107
|
+
text-align: right;
|
108
|
+
min-height: 1rem;
|
109
|
+
width: 1rem;
|
110
|
+
min-width: 1rem !important;
|
111
|
+
font-weight: 400;
|
112
|
+
color: var(--text-color);
|
113
|
+
}
|
114
|
+
|
115
|
+
|
116
|
+
&>.day-cell.other-month {
|
117
|
+
color: var(--text-color-lighter);
|
118
|
+
}
|
119
|
+
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
|
1
124
|
|
2
|
-
.calendar {
|
125
|
+
.month-calendar {
|
3
126
|
margin: 1rem;
|
4
127
|
overflow: hidden;
|
5
128
|
display: flex;
|
@@ -8,31 +131,31 @@
|
|
8
131
|
|
9
132
|
}
|
10
133
|
|
11
|
-
.calendar>nav {
|
134
|
+
.month-calendar>nav {
|
12
135
|
display: flex;
|
13
136
|
padding: .5rem;
|
14
137
|
display: flex;
|
15
138
|
align-items: center;
|
16
139
|
}
|
17
140
|
|
18
|
-
.calendar>nav>label {
|
141
|
+
.month-calendar>nav>label {
|
19
142
|
flex: 1;
|
20
143
|
font-size: 1.3rem;
|
21
144
|
font-weight: 500;
|
22
145
|
}
|
23
146
|
|
24
|
-
.calendar>nav>button {
|
147
|
+
.month-calendar>nav>button {
|
25
148
|
margin-left: 1px;
|
26
149
|
border-radius: 3px;
|
27
150
|
}
|
28
151
|
|
29
|
-
.calendar>header {
|
152
|
+
.month-calendar>header {
|
30
153
|
display: grid;
|
31
154
|
grid-template-columns: repeat(7, 1fr);
|
32
155
|
font-size: .8rem;
|
33
156
|
}
|
34
157
|
|
35
|
-
.calendar>main {
|
158
|
+
.month-calendar>main {
|
36
159
|
flex: 1;
|
37
160
|
border: solid 1px var(--divider-color);
|
38
161
|
border-width: 1px 1px 0 0;
|
@@ -8,8 +8,45 @@ import './Calendar.css'
|
|
8
8
|
Moment.locale('es')
|
9
9
|
const moment = extendMoment(Moment)
|
10
10
|
|
11
|
+
/**
|
12
|
+
* Calendar
|
13
|
+
*/
|
11
14
|
export const Calendar = (props) => {
|
12
15
|
|
16
|
+
const { events = [], children, onChange } = props
|
17
|
+
const [range, setRange] = useState(props.range || "year")
|
18
|
+
|
19
|
+
function onChangeRange(range) {
|
20
|
+
setRange(range)
|
21
|
+
}
|
22
|
+
|
23
|
+
return (
|
24
|
+
<div className="calendar">
|
25
|
+
<CalendarRangeControl range={range} onChange={onChangeRange} />
|
26
|
+
{range === "year" && <YearCalendar events={events} onChange={onChange}>{children}</YearCalendar>}
|
27
|
+
{range === "month" && <MonthCalendar events={events} onChange={onChange} onRange={onChangeRange}>{children}</MonthCalendar>}
|
28
|
+
</div>
|
29
|
+
)
|
30
|
+
}
|
31
|
+
|
32
|
+
/**
|
33
|
+
* CalendarRangeControl
|
34
|
+
*/
|
35
|
+
const CalendarRangeControl = (props) => {
|
36
|
+
const { range, onChange } = props
|
37
|
+
return (
|
38
|
+
<div className="calendar-range-control">
|
39
|
+
<Button label="Year" outlined={range == "year"} action={() => onChange("year")} />
|
40
|
+
<Button label="Month" outlined={range == "month"} action={() => onChange("month")} />
|
41
|
+
</div>
|
42
|
+
)
|
43
|
+
}
|
44
|
+
|
45
|
+
/**
|
46
|
+
* MonthCalendar
|
47
|
+
*/
|
48
|
+
export const MonthCalendar = (props) => {
|
49
|
+
|
13
50
|
const { events = [], children, onChange } = props
|
14
51
|
const [position, setPosition] = useState()
|
15
52
|
|
@@ -58,19 +95,21 @@ export const Calendar = (props) => {
|
|
58
95
|
const cells = days.map(day => {
|
59
96
|
|
60
97
|
const eventsOfDay = events.filter(event => {
|
61
|
-
console.log(event.date, day.format("YYYY-MM-DD"))
|
62
98
|
const eventDay = moment(event.date)
|
63
99
|
return eventDay.isSame(day, 'day')
|
64
100
|
})
|
65
101
|
|
102
|
+
const sameMonthStyle = day.isSame(moment(position), 'month') ? '' : 'other-month'
|
103
|
+
|
66
104
|
return {
|
67
105
|
day,
|
68
|
-
events: eventsOfDay
|
106
|
+
events: eventsOfDay,
|
107
|
+
sameMonthStyle
|
69
108
|
}
|
70
109
|
})
|
71
110
|
|
72
111
|
return (
|
73
|
-
<div className="calendar">
|
112
|
+
<div className="month-calendar">
|
74
113
|
<nav>
|
75
114
|
<label> <Text>{monthName}</Text> {year}</label>
|
76
115
|
<Button icon="chevron_left" action={prev} />
|
@@ -95,10 +134,9 @@ export const Calendar = (props) => {
|
|
95
134
|
|
96
135
|
const DayCell = (props) => {
|
97
136
|
const { cell = [], children } = props
|
98
|
-
const { day, events } = cell
|
137
|
+
const { day, events, sameMonthStyle } = cell
|
99
138
|
const todayStyle = day.isSame(moment(), 'day') ? 'today' : ''
|
100
|
-
|
101
|
-
|
139
|
+
|
102
140
|
return (
|
103
141
|
<div className={`day-cell ${todayStyle} ${sameMonthStyle}`}>
|
104
142
|
<header>
|
@@ -111,6 +149,9 @@ const DayCell = (props) => {
|
|
111
149
|
)
|
112
150
|
}
|
113
151
|
|
152
|
+
/**
|
153
|
+
* Event
|
154
|
+
*/
|
114
155
|
const Event = (props) => {
|
115
156
|
const { event, children } = props
|
116
157
|
if (children) {
|
@@ -125,4 +166,132 @@ const Event = (props) => {
|
|
125
166
|
</div>
|
126
167
|
)
|
127
168
|
}
|
128
|
-
}
|
169
|
+
}
|
170
|
+
|
171
|
+
/**
|
172
|
+
* YearCalendar
|
173
|
+
*/
|
174
|
+
const YearCalendar = (props) => {
|
175
|
+
|
176
|
+
const { events = [], children, onChange } = props
|
177
|
+
const [position, setPosition] = useState()
|
178
|
+
|
179
|
+
useEffect(() => {
|
180
|
+
const today = moment()
|
181
|
+
setPosition(today)
|
182
|
+
}, [])
|
183
|
+
|
184
|
+
useEffect(() => {
|
185
|
+
if (position && onChange) {
|
186
|
+
const firstDayOfYear = position.clone().startOf('year');
|
187
|
+
const firstDayOfRange = firstDayOfYear.clone().startOf('isoweek');
|
188
|
+
const lastDayOfYear = position.clone().endOf('year');
|
189
|
+
const lastDayOfRange = lastDayOfYear.clone().endOf('isoweek');
|
190
|
+
const range = moment.range(firstDayOfRange, lastDayOfRange)
|
191
|
+
onChange(position, range)
|
192
|
+
}
|
193
|
+
}, [position])
|
194
|
+
|
195
|
+
function next() {
|
196
|
+
const next = position.clone().add(1, 'year')
|
197
|
+
setPosition(next)
|
198
|
+
}
|
199
|
+
|
200
|
+
function prev() {
|
201
|
+
const prev = position.clone().subtract(1, 'year')
|
202
|
+
setPosition(prev)
|
203
|
+
}
|
204
|
+
|
205
|
+
function today() {
|
206
|
+
const today = moment()
|
207
|
+
setPosition(today)
|
208
|
+
}
|
209
|
+
|
210
|
+
if (!position) return "..."
|
211
|
+
|
212
|
+
const year = position.format("YYYY");
|
213
|
+
const firstDayOfYear = moment(position).startOf('year');
|
214
|
+
const lastDayOfYear = moment(position).endOf('year');
|
215
|
+
const months = [];
|
216
|
+
|
217
|
+
for (let currentMonth = moment(firstDayOfYear); currentMonth.isBefore(lastDayOfYear); currentMonth.add(1, 'month')) {
|
218
|
+
months.push(moment(currentMonth));
|
219
|
+
}
|
220
|
+
|
221
|
+
const cells = months.map(month => {
|
222
|
+
|
223
|
+
const firstDayOfMonth = month.clone().startOf('month');
|
224
|
+
const firstDayOfRange = firstDayOfMonth.clone().startOf('isoweek');
|
225
|
+
const lastDayOfMonth = month.clone().endOf('month');
|
226
|
+
const lastDayOfRange = lastDayOfMonth.clone().endOf('isoweek');
|
227
|
+
const range = moment.range(firstDayOfRange, lastDayOfRange)
|
228
|
+
const days = Array.from(range.by('days'))
|
229
|
+
|
230
|
+
const cells = days.map(day => {
|
231
|
+
|
232
|
+
const eventsOfDay = events.filter(event => {
|
233
|
+
const eventDay = moment(event.date)
|
234
|
+
return eventDay.isSame(day, 'day')
|
235
|
+
})
|
236
|
+
|
237
|
+
const sameMonthStyle = day.isSame(moment(month), 'month') ? '' : 'other-month'
|
238
|
+
|
239
|
+
return {
|
240
|
+
day,
|
241
|
+
events: eventsOfDay,
|
242
|
+
sameMonthStyle
|
243
|
+
}
|
244
|
+
})
|
245
|
+
|
246
|
+
return {
|
247
|
+
month,
|
248
|
+
cells
|
249
|
+
}
|
250
|
+
})
|
251
|
+
|
252
|
+
|
253
|
+
return (
|
254
|
+
<div className="year-calendar">
|
255
|
+
<nav>
|
256
|
+
<label> <Text>{year}</Text></label>
|
257
|
+
<Button icon="chevron_left" action={prev} />
|
258
|
+
<Button label="Today" outlined action={today} />
|
259
|
+
<Button icon="chevron_right" action={next} />
|
260
|
+
</nav>
|
261
|
+
<main>
|
262
|
+
{cells.map(cell => <MonthCell key={cell.month} cell={cell} >{children}</MonthCell>)}
|
263
|
+
</main>
|
264
|
+
</div>
|
265
|
+
)
|
266
|
+
}
|
267
|
+
|
268
|
+
/**
|
269
|
+
* MonthCell
|
270
|
+
*/
|
271
|
+
const MonthCell = (props) => {
|
272
|
+
const { cell = [], children } = props
|
273
|
+
const { month, cells } = cell
|
274
|
+
const monthName = month.format("MMMM")
|
275
|
+
|
276
|
+
return (
|
277
|
+
<div className={`month-cell`}>
|
278
|
+
<nav>
|
279
|
+
{monthName}
|
280
|
+
</nav>
|
281
|
+
<header>
|
282
|
+
<div className='week-day-cell'><Text>Mon</Text></div>
|
283
|
+
<div className='week-day-cell'><Text>Tue</Text></div>
|
284
|
+
<div className='week-day-cell'><Text>Wed</Text></div>
|
285
|
+
<div className='week-day-cell'><Text>Thu</Text></div>
|
286
|
+
<div className='week-day-cell'><Text>Fri</Text></div>
|
287
|
+
<div className='week-day-cell'><Text>Sat</Text></div>
|
288
|
+
<div className='week-day-cell'><Text>Sun</Text></div>
|
289
|
+
</header>
|
290
|
+
<main>
|
291
|
+
{cells.map(cell => <DayCell key={cell.day} cell={cell} >{children}</DayCell>)}
|
292
|
+
</main>
|
293
|
+
</div>
|
294
|
+
)
|
295
|
+
}
|
296
|
+
|
297
|
+
|