@panneau/list-calendar 2.0.34

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 @@
1
+ .panneau-list-calendar-container{color:#6c6c6c}.panneau-list-calendar-container button{margin:0 auto}.panneau-list-calendar-container .panneau-list-calendar-inner{margin:.25rem auto 1rem;max-width:25rem;width:100%}.panneau-list-calendar-container .panneau-list-calendar-calendarHeader{-ms-flex-align:center;align-items:center;display:-ms-flexbox;display:flex;font-weight:700;padding:.5rem .75rem 1.25rem;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.panneau-list-calendar-container .panneau-list-calendar-activePeriod{-ms-flex-positive:1;flex-grow:1;line-height:2rem;text-transform:uppercase}.panneau-list-calendar-container .panneau-list-calendar-activePeriodWithDates{color:orange}.panneau-list-calendar-container .panneau-list-calendar-arrow{-ms-flex-align:center;-ms-flex-pack:center;align-items:center;display:-ms-flexbox;display:flex;justify-content:center;padding:.25rem;width:2rem}.panneau-list-calendar-container .panneau-list-calendar-calendarGrid{display:grid;grid-template:"a a a a a a a" "a a a a a a a" "a a a a a a a" "a a a a a a a" "a a a a a a a"}.panneau-list-calendar-container .panneau-list-calendar-calendarBox{-ms-flex-pack:center;display:-ms-flexbox;display:flex;justify-content:center;padding:1px}.panneau-list-calendar-container .panneau-list-calendar-calendarBox.panneau-list-calendar-headerBox{font-size:.75em;padding-bottom:.5rem}.panneau-list-calendar-container .panneau-list-calendar-day{-ms-flex-align:center;-ms-flex-pack:center;align-items:center;border-radius:50%;color:hsla(0,0%,80%,.75);display:-ms-flexbox;display:flex;font-weight:700;height:2.25rem;justify-content:center;line-height:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:2.25rem}.panneau-list-calendar-container .panneau-list-calendar-day.panneau-list-calendar-isToday{color:blue}.panneau-list-calendar-container .panneau-list-calendar-day.panneau-list-calendar-isPast{color:orange}.panneau-list-calendar-container .panneau-list-calendar-dayButton{background-color:hsla(0,0%,100%,.05);color:red}.panneau-list-calendar-container .panneau-list-calendar-dayButton.panneau-list-calendar-isPast{color:#555}@media (hover:hover){.panneau-list-calendar-container .panneau-list-calendar-dayButton:hover{color:#fff}}.panneau-list-calendar-container .panneau-list-calendar-dayButton.panneau-list-calendar-active{background-color:#ff0;color:#777}.panneau-list-calendar-container .panneau-list-calendar-dayButton:active{background-color:#9acd32;color:#777}
package/es/index.js ADDED
@@ -0,0 +1,282 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import classNames from 'classnames';
5
+ import { parseISO, toDate, startOfWeek, addWeeks, addMonths, endOfWeek, addDays, compareAsc, compareDesc, format } from 'date-fns';
6
+ import PropTypes from 'prop-types';
7
+ import React, { useState, useMemo, useCallback, useEffect } from 'react';
8
+ import { useIntl, FormattedDate } from 'react-intl';
9
+ import { PropTypes as PropTypes$1 } from '@panneau/core';
10
+ import Button from '@panneau/element-button';
11
+ import Icon from '@panneau/element-icon';
12
+
13
+ var styles = {"container":"panneau-list-calendar-container","inner":"panneau-list-calendar-inner","calendarHeader":"panneau-list-calendar-calendarHeader","activePeriod":"panneau-list-calendar-activePeriod","activePeriodWithDates":"panneau-list-calendar-activePeriodWithDates","arrow":"panneau-list-calendar-arrow","calendarGrid":"panneau-list-calendar-calendarGrid","calendarBox":"panneau-list-calendar-calendarBox","headerBox":"panneau-list-calendar-headerBox","day":"panneau-list-calendar-day","isToday":"panneau-list-calendar-isToday","isPast":"panneau-list-calendar-isPast","dayButton":"panneau-list-calendar-dayButton","active":"panneau-list-calendar-active"};
14
+
15
+ var propTypes = {
16
+ mode: PropTypes.string,
17
+ resource: PropTypes$1.resource.isRequired,
18
+ component: PropTypes.func,
19
+ items: PropTypes$1.items,
20
+ itemDateField: PropTypes.string,
21
+ loading: PropTypes.bool,
22
+ // onQueryChange: PropTypes.func,
23
+ filter: PropTypes.shape({
24
+ dates: PropTypes.arrayOf(PropTypes.string)
25
+ }),
26
+ // eslint-disable-next-line react/forbid-prop-types
27
+ value: PropTypes.any,
28
+ multiple: PropTypes.bool,
29
+ onDateChange: PropTypes.func,
30
+ onPeriodChange: PropTypes.func,
31
+ initialDate: PropTypes.string,
32
+ className: PropTypes.string
33
+ };
34
+ var defaultProps = {
35
+ mode: 'monthly',
36
+ component: null,
37
+ items: [],
38
+ itemDateField: 'date',
39
+ filter: null,
40
+ value: null,
41
+ multiple: false,
42
+ onDateChange: null,
43
+ onPeriodChange: null,
44
+ initialDate: null,
45
+ loading: false,
46
+ className: null
47
+ };
48
+ var CalendarList = function CalendarList(_ref) {
49
+ var mode = _ref.mode;
50
+ _ref.resource;
51
+ _ref.component;
52
+ var items = _ref.items,
53
+ itemDateField = _ref.itemDateField;
54
+ _ref.loading;
55
+ var value = _ref.value,
56
+ multiple = _ref.multiple,
57
+ onDateChange = _ref.onDateChange,
58
+ onPeriodChange = _ref.onPeriodChange,
59
+ initialDate = _ref.initialDate,
60
+ className = _ref.className;
61
+ var intl = useIntl();
62
+ var _useState = useState(0),
63
+ _useState2 = _slicedToArray(_useState, 2),
64
+ monthIdx = _useState2[0],
65
+ setMonthIdx = _useState2[1];
66
+ var _useState3 = useState(0),
67
+ _useState4 = _slicedToArray(_useState3, 2),
68
+ weekIdx = _useState4[0],
69
+ setWeekIdx = _useState4[1];
70
+ var currentDate = new Date();
71
+ var currentYear = currentDate.getUTCFullYear();
72
+ var currentMonth = currentDate.getUTCMonth();
73
+ var currentDayOfTheMonth = currentDate.getDate();
74
+ var dates = (items || []).map(function (it) {
75
+ return it !== null && it[itemDateField] ? it[itemDateField] : null;
76
+ }).filter(function (d) {
77
+ return d !== null;
78
+ });
79
+ var parsedInitialDate = initialDate !== null ? parseISO(initialDate) : null;
80
+ var partialInitialDate = parsedInitialDate !== null ? toDate(parsedInitialDate) : new Date();
81
+ var finalInitialDate = mode === 'weekly' ? startOfWeek(partialInitialDate) : partialInitialDate;
82
+ var activeDate = mode === 'weekly' ? addWeeks(finalInitialDate, weekIdx) : addMonths(finalInitialDate, monthIdx);
83
+ var activeYear = activeDate.getFullYear();
84
+ var activeMonth = activeDate.getUTCMonth();
85
+ var activeWeekStart = startOfWeek(activeDate);
86
+ var activeWeekEnd = endOfWeek(activeDate);
87
+ var days = useMemo(function () {
88
+ return [intl.formatMessage({
89
+ "id": "fSfLk8",
90
+ "defaultMessage": [{
91
+ "type": 0,
92
+ "value": "S"
93
+ }]
94
+ }), intl.formatMessage({
95
+ "id": "jbT/g6",
96
+ "defaultMessage": [{
97
+ "type": 0,
98
+ "value": "M"
99
+ }]
100
+ }), intl.formatMessage({
101
+ "id": "Of2stw",
102
+ "defaultMessage": [{
103
+ "type": 0,
104
+ "value": "T"
105
+ }]
106
+ }), intl.formatMessage({
107
+ "id": "BAKfhq",
108
+ "defaultMessage": [{
109
+ "type": 0,
110
+ "value": "W"
111
+ }]
112
+ }), intl.formatMessage({
113
+ "id": "DBU3cu",
114
+ "defaultMessage": [{
115
+ "type": 0,
116
+ "value": "T"
117
+ }]
118
+ }), intl.formatMessage({
119
+ "id": "J6Mhku",
120
+ "defaultMessage": [{
121
+ "type": 0,
122
+ "value": "F"
123
+ }]
124
+ }), intl.formatMessage({
125
+ "id": "0F5X3C",
126
+ "defaultMessage": [{
127
+ "type": 0,
128
+ "value": "S"
129
+ }]
130
+ })];
131
+ }, []);
132
+ var datesArray = [];
133
+ if (mode === 'weekly') {
134
+ // eslint-disable-next-line no-plusplus
135
+ for (var i = 0; i < 7; i++) {
136
+ var dte = addDays(activeWeekStart, i);
137
+ datesArray.push(dte);
138
+ }
139
+ } else {
140
+ var firstDayOfActualMonth = new Date(activeYear, activeMonth, 1).getDay();
141
+ var dayBeforeDiff = firstDayOfActualMonth === 0 ? 6 : firstDayOfActualMonth;
142
+ var gridMax = 35;
143
+ // eslint-disable-next-line no-plusplus
144
+ for (var _i = 1 - dayBeforeDiff; _i <= gridMax; _i++) {
145
+ datesArray.push(new Date(activeYear, activeMonth, _i));
146
+ }
147
+ }
148
+ var onClickPeriodChange = useCallback(function (e, previous) {
149
+ e.preventDefault();
150
+ if (mode === 'weekly') {
151
+ if (previous) {
152
+ setWeekIdx(weekIdx - 1);
153
+ } else {
154
+ setWeekIdx(weekIdx + 1);
155
+ }
156
+ } else if (previous) {
157
+ setMonthIdx(monthIdx - 1);
158
+ } else {
159
+ setMonthIdx(monthIdx + 1);
160
+ }
161
+ }, [mode, monthIdx, setMonthIdx, weekIdx, setWeekIdx]);
162
+ useEffect(function () {
163
+ if (onPeriodChange !== null) {
164
+ onPeriodChange(activeDate);
165
+ }
166
+ }, [activeDate, onPeriodChange]);
167
+ var onSelectDate = useCallback(function (e, newDate) {
168
+ e.preventDefault();
169
+ if (!multiple) {
170
+ onDateChange(newDate ? null : newDate);
171
+ return;
172
+ }
173
+ var valuesUpdate = _toConsumableArray(dates);
174
+ if (!valuesUpdate.includes(newDate)) {
175
+ onDateChange([newDate]);
176
+ } else {
177
+ var filteredOptions = valuesUpdate.filter(function (oldDate) {
178
+ return oldDate !== newDate;
179
+ });
180
+ onDateChange(filteredOptions);
181
+ }
182
+ }, [dates, onDateChange, multiple, value]);
183
+ var weekHasDates = dates.reduce(function (acc, dte) {
184
+ var parseDte = dte !== null ? parseISO(dte) : null;
185
+ if (parseDte !== null && compareAsc(parseDte, activeWeekStart) >= 0 && compareDesc(parseDte, activeWeekEnd) >= 0) {
186
+ return true;
187
+ }
188
+ return acc;
189
+ }, false);
190
+ var monthHasDates = dates.reduce(function (acc, dte) {
191
+ var splitDate = dte.split(/\s*-\s*/g);
192
+ var _ref2 = splitDate || [],
193
+ _ref3 = _slicedToArray(_ref2, 2),
194
+ _ref3$ = _ref3[0],
195
+ year = _ref3$ === void 0 ? null : _ref3$,
196
+ _ref3$2 = _ref3[1],
197
+ month = _ref3$2 === void 0 ? null : _ref3$2;
198
+ if (parseInt(year, 10) === parseInt(activeYear, 10) && parseInt(month, 10) === parseInt(activeMonth, 10) + 1 // yes this is incredibly stupid
199
+ ) {
200
+ return true;
201
+ }
202
+ return acc;
203
+ }, false);
204
+ return /*#__PURE__*/React.createElement("div", {
205
+ className: classNames([styles.container, _defineProperty({}, className, className !== null)])
206
+ }, /*#__PURE__*/React.createElement("div", {
207
+ className: styles.inner
208
+ }, /*#__PURE__*/React.createElement("div", {
209
+ className: styles.calendarHeader
210
+ }, /*#__PURE__*/React.createElement(Button, {
211
+ className: styles.arrow,
212
+ onClick: function onClick(e) {
213
+ return onClickPeriodChange(e, true);
214
+ }
215
+ }, /*#__PURE__*/React.createElement(Icon, {
216
+ name: "arrow-left"
217
+ })), mode === 'weekly' ? /*#__PURE__*/React.createElement("div", {
218
+ className: styles.activePeriod
219
+ }, weekHasDates ? /*#__PURE__*/React.createElement("span", {
220
+ className: styles.activePeriodWithDates
221
+ }, /*#__PURE__*/React.createElement(FormattedDate, {
222
+ value: activeDate,
223
+ day: "numeric",
224
+ month: "long",
225
+ year: "numeric"
226
+ })) : /*#__PURE__*/React.createElement(FormattedDate, {
227
+ value: activeDate,
228
+ day: "numeric",
229
+ month: "long",
230
+ year: "numeric"
231
+ })) : /*#__PURE__*/React.createElement("div", {
232
+ className: styles.activePeriod
233
+ }, monthHasDates ? /*#__PURE__*/React.createElement("span", {
234
+ className: styles.activePeriodWithDates
235
+ }, /*#__PURE__*/React.createElement(FormattedDate, {
236
+ value: activeDate,
237
+ month: "long",
238
+ year: "numeric"
239
+ })) : /*#__PURE__*/React.createElement(FormattedDate, {
240
+ value: activeDate,
241
+ month: "long",
242
+ year: "numeric"
243
+ })), /*#__PURE__*/React.createElement(Button, {
244
+ className: classNames([styles.arrow, styles.right]),
245
+ onClick: onClickPeriodChange
246
+ }, /*#__PURE__*/React.createElement(Icon, {
247
+ name: "arrow-right"
248
+ }))), /*#__PURE__*/React.createElement("div", {
249
+ className: styles.calendarGrid
250
+ }, days.map(function (d, i) {
251
+ return /*#__PURE__*/React.createElement("div", {
252
+ key: "day-".concat(d.getTime, "-").concat(i + 1),
253
+ className: classNames([styles.calendarBox, styles.headerBox])
254
+ }, d);
255
+ }), datesArray.map(function (d, i) {
256
+ var _classNames;
257
+ var dTime = format(d, 'yyyy-MM-dd');
258
+ var isCurrentYear = d.getUTCFullYear() === currentYear;
259
+ var isCurrentMonth = d.getUTCMonth() === currentMonth;
260
+ var isToday = isCurrentYear && isCurrentMonth && d.getDate() === currentDayOfTheMonth;
261
+ var eventTime = d.getTime();
262
+ var todayTime = currentDate.getTime();
263
+ var isPast = eventTime < todayTime && !isToday;
264
+ var hasItem = dates.includes(dTime);
265
+ var inner = hasItem ? /*#__PURE__*/React.createElement(Button, {
266
+ onClick: function onClick(e) {
267
+ return onSelectDate(e, dTime);
268
+ },
269
+ className: classNames(styles.day, styles.dayButton, (_classNames = {}, _defineProperty(_classNames, styles.isToday, isToday), _defineProperty(_classNames, styles.isPast, isPast), _defineProperty(_classNames, styles.active, dates.includes(dTime)), _classNames))
270
+ }, format(d, 'd')) : /*#__PURE__*/React.createElement("div", {
271
+ className: classNames(styles.day, _defineProperty({}, styles.isToday, isToday))
272
+ }, format(d, 'd'));
273
+ return /*#__PURE__*/React.createElement("div", {
274
+ key: "date-".concat(d.getTime, "-").concat(i + 1),
275
+ className: styles.calendarBox
276
+ }, d.getUTCMonth() !== activeMonth && mode === 'monthly' ? '' : inner);
277
+ }))));
278
+ };
279
+ CalendarList.propTypes = propTypes;
280
+ CalendarList.defaultProps = defaultProps;
281
+
282
+ export { CalendarList as default };
package/lib/index.js ADDED
@@ -0,0 +1,297 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
6
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
7
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
8
+ var classNames = require('classnames');
9
+ var dateFns = require('date-fns');
10
+ var PropTypes = require('prop-types');
11
+ var React = require('react');
12
+ var reactIntl = require('react-intl');
13
+ var core = require('@panneau/core');
14
+ var Button = require('@panneau/element-button');
15
+ var Icon = require('@panneau/element-icon');
16
+
17
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
18
+
19
+ var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
20
+ var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
21
+ var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
22
+ var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
23
+ var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
24
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
25
+ var Button__default = /*#__PURE__*/_interopDefaultLegacy(Button);
26
+ var Icon__default = /*#__PURE__*/_interopDefaultLegacy(Icon);
27
+
28
+ var styles = {"container":"panneau-list-calendar-container","inner":"panneau-list-calendar-inner","calendarHeader":"panneau-list-calendar-calendarHeader","activePeriod":"panneau-list-calendar-activePeriod","activePeriodWithDates":"panneau-list-calendar-activePeriodWithDates","arrow":"panneau-list-calendar-arrow","calendarGrid":"panneau-list-calendar-calendarGrid","calendarBox":"panneau-list-calendar-calendarBox","headerBox":"panneau-list-calendar-headerBox","day":"panneau-list-calendar-day","isToday":"panneau-list-calendar-isToday","isPast":"panneau-list-calendar-isPast","dayButton":"panneau-list-calendar-dayButton","active":"panneau-list-calendar-active"};
29
+
30
+ var propTypes = {
31
+ mode: PropTypes__default["default"].string,
32
+ resource: core.PropTypes.resource.isRequired,
33
+ component: PropTypes__default["default"].func,
34
+ items: core.PropTypes.items,
35
+ itemDateField: PropTypes__default["default"].string,
36
+ loading: PropTypes__default["default"].bool,
37
+ // onQueryChange: PropTypes.func,
38
+ filter: PropTypes__default["default"].shape({
39
+ dates: PropTypes__default["default"].arrayOf(PropTypes__default["default"].string)
40
+ }),
41
+ // eslint-disable-next-line react/forbid-prop-types
42
+ value: PropTypes__default["default"].any,
43
+ multiple: PropTypes__default["default"].bool,
44
+ onDateChange: PropTypes__default["default"].func,
45
+ onPeriodChange: PropTypes__default["default"].func,
46
+ initialDate: PropTypes__default["default"].string,
47
+ className: PropTypes__default["default"].string
48
+ };
49
+ var defaultProps = {
50
+ mode: 'monthly',
51
+ component: null,
52
+ items: [],
53
+ itemDateField: 'date',
54
+ filter: null,
55
+ value: null,
56
+ multiple: false,
57
+ onDateChange: null,
58
+ onPeriodChange: null,
59
+ initialDate: null,
60
+ loading: false,
61
+ className: null
62
+ };
63
+ var CalendarList = function CalendarList(_ref) {
64
+ var mode = _ref.mode;
65
+ _ref.resource;
66
+ _ref.component;
67
+ var items = _ref.items,
68
+ itemDateField = _ref.itemDateField;
69
+ _ref.loading;
70
+ var value = _ref.value,
71
+ multiple = _ref.multiple,
72
+ onDateChange = _ref.onDateChange,
73
+ onPeriodChange = _ref.onPeriodChange,
74
+ initialDate = _ref.initialDate,
75
+ className = _ref.className;
76
+ var intl = reactIntl.useIntl();
77
+ var _useState = React.useState(0),
78
+ _useState2 = _slicedToArray__default["default"](_useState, 2),
79
+ monthIdx = _useState2[0],
80
+ setMonthIdx = _useState2[1];
81
+ var _useState3 = React.useState(0),
82
+ _useState4 = _slicedToArray__default["default"](_useState3, 2),
83
+ weekIdx = _useState4[0],
84
+ setWeekIdx = _useState4[1];
85
+ var currentDate = new Date();
86
+ var currentYear = currentDate.getUTCFullYear();
87
+ var currentMonth = currentDate.getUTCMonth();
88
+ var currentDayOfTheMonth = currentDate.getDate();
89
+ var dates = (items || []).map(function (it) {
90
+ return it !== null && it[itemDateField] ? it[itemDateField] : null;
91
+ }).filter(function (d) {
92
+ return d !== null;
93
+ });
94
+ var parsedInitialDate = initialDate !== null ? dateFns.parseISO(initialDate) : null;
95
+ var partialInitialDate = parsedInitialDate !== null ? dateFns.toDate(parsedInitialDate) : new Date();
96
+ var finalInitialDate = mode === 'weekly' ? dateFns.startOfWeek(partialInitialDate) : partialInitialDate;
97
+ var activeDate = mode === 'weekly' ? dateFns.addWeeks(finalInitialDate, weekIdx) : dateFns.addMonths(finalInitialDate, monthIdx);
98
+ var activeYear = activeDate.getFullYear();
99
+ var activeMonth = activeDate.getUTCMonth();
100
+ var activeWeekStart = dateFns.startOfWeek(activeDate);
101
+ var activeWeekEnd = dateFns.endOfWeek(activeDate);
102
+ var days = React.useMemo(function () {
103
+ return [intl.formatMessage({
104
+ "id": "fSfLk8",
105
+ "defaultMessage": [{
106
+ "type": 0,
107
+ "value": "S"
108
+ }]
109
+ }), intl.formatMessage({
110
+ "id": "jbT/g6",
111
+ "defaultMessage": [{
112
+ "type": 0,
113
+ "value": "M"
114
+ }]
115
+ }), intl.formatMessage({
116
+ "id": "Of2stw",
117
+ "defaultMessage": [{
118
+ "type": 0,
119
+ "value": "T"
120
+ }]
121
+ }), intl.formatMessage({
122
+ "id": "BAKfhq",
123
+ "defaultMessage": [{
124
+ "type": 0,
125
+ "value": "W"
126
+ }]
127
+ }), intl.formatMessage({
128
+ "id": "DBU3cu",
129
+ "defaultMessage": [{
130
+ "type": 0,
131
+ "value": "T"
132
+ }]
133
+ }), intl.formatMessage({
134
+ "id": "J6Mhku",
135
+ "defaultMessage": [{
136
+ "type": 0,
137
+ "value": "F"
138
+ }]
139
+ }), intl.formatMessage({
140
+ "id": "0F5X3C",
141
+ "defaultMessage": [{
142
+ "type": 0,
143
+ "value": "S"
144
+ }]
145
+ })];
146
+ }, []);
147
+ var datesArray = [];
148
+ if (mode === 'weekly') {
149
+ // eslint-disable-next-line no-plusplus
150
+ for (var i = 0; i < 7; i++) {
151
+ var dte = dateFns.addDays(activeWeekStart, i);
152
+ datesArray.push(dte);
153
+ }
154
+ } else {
155
+ var firstDayOfActualMonth = new Date(activeYear, activeMonth, 1).getDay();
156
+ var dayBeforeDiff = firstDayOfActualMonth === 0 ? 6 : firstDayOfActualMonth;
157
+ var gridMax = 35;
158
+ // eslint-disable-next-line no-plusplus
159
+ for (var _i = 1 - dayBeforeDiff; _i <= gridMax; _i++) {
160
+ datesArray.push(new Date(activeYear, activeMonth, _i));
161
+ }
162
+ }
163
+ var onClickPeriodChange = React.useCallback(function (e, previous) {
164
+ e.preventDefault();
165
+ if (mode === 'weekly') {
166
+ if (previous) {
167
+ setWeekIdx(weekIdx - 1);
168
+ } else {
169
+ setWeekIdx(weekIdx + 1);
170
+ }
171
+ } else if (previous) {
172
+ setMonthIdx(monthIdx - 1);
173
+ } else {
174
+ setMonthIdx(monthIdx + 1);
175
+ }
176
+ }, [mode, monthIdx, setMonthIdx, weekIdx, setWeekIdx]);
177
+ React.useEffect(function () {
178
+ if (onPeriodChange !== null) {
179
+ onPeriodChange(activeDate);
180
+ }
181
+ }, [activeDate, onPeriodChange]);
182
+ var onSelectDate = React.useCallback(function (e, newDate) {
183
+ e.preventDefault();
184
+ if (!multiple) {
185
+ onDateChange(newDate ? null : newDate);
186
+ return;
187
+ }
188
+ var valuesUpdate = _toConsumableArray__default["default"](dates);
189
+ if (!valuesUpdate.includes(newDate)) {
190
+ onDateChange([newDate]);
191
+ } else {
192
+ var filteredOptions = valuesUpdate.filter(function (oldDate) {
193
+ return oldDate !== newDate;
194
+ });
195
+ onDateChange(filteredOptions);
196
+ }
197
+ }, [dates, onDateChange, multiple, value]);
198
+ var weekHasDates = dates.reduce(function (acc, dte) {
199
+ var parseDte = dte !== null ? dateFns.parseISO(dte) : null;
200
+ if (parseDte !== null && dateFns.compareAsc(parseDte, activeWeekStart) >= 0 && dateFns.compareDesc(parseDte, activeWeekEnd) >= 0) {
201
+ return true;
202
+ }
203
+ return acc;
204
+ }, false);
205
+ var monthHasDates = dates.reduce(function (acc, dte) {
206
+ var splitDate = dte.split(/\s*-\s*/g);
207
+ var _ref2 = splitDate || [],
208
+ _ref3 = _slicedToArray__default["default"](_ref2, 2),
209
+ _ref3$ = _ref3[0],
210
+ year = _ref3$ === void 0 ? null : _ref3$,
211
+ _ref3$2 = _ref3[1],
212
+ month = _ref3$2 === void 0 ? null : _ref3$2;
213
+ if (parseInt(year, 10) === parseInt(activeYear, 10) && parseInt(month, 10) === parseInt(activeMonth, 10) + 1 // yes this is incredibly stupid
214
+ ) {
215
+ return true;
216
+ }
217
+ return acc;
218
+ }, false);
219
+ return /*#__PURE__*/React__default["default"].createElement("div", {
220
+ className: classNames__default["default"]([styles.container, _defineProperty__default["default"]({}, className, className !== null)])
221
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
222
+ className: styles.inner
223
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
224
+ className: styles.calendarHeader
225
+ }, /*#__PURE__*/React__default["default"].createElement(Button__default["default"], {
226
+ className: styles.arrow,
227
+ onClick: function onClick(e) {
228
+ return onClickPeriodChange(e, true);
229
+ }
230
+ }, /*#__PURE__*/React__default["default"].createElement(Icon__default["default"], {
231
+ name: "arrow-left"
232
+ })), mode === 'weekly' ? /*#__PURE__*/React__default["default"].createElement("div", {
233
+ className: styles.activePeriod
234
+ }, weekHasDates ? /*#__PURE__*/React__default["default"].createElement("span", {
235
+ className: styles.activePeriodWithDates
236
+ }, /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedDate, {
237
+ value: activeDate,
238
+ day: "numeric",
239
+ month: "long",
240
+ year: "numeric"
241
+ })) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedDate, {
242
+ value: activeDate,
243
+ day: "numeric",
244
+ month: "long",
245
+ year: "numeric"
246
+ })) : /*#__PURE__*/React__default["default"].createElement("div", {
247
+ className: styles.activePeriod
248
+ }, monthHasDates ? /*#__PURE__*/React__default["default"].createElement("span", {
249
+ className: styles.activePeriodWithDates
250
+ }, /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedDate, {
251
+ value: activeDate,
252
+ month: "long",
253
+ year: "numeric"
254
+ })) : /*#__PURE__*/React__default["default"].createElement(reactIntl.FormattedDate, {
255
+ value: activeDate,
256
+ month: "long",
257
+ year: "numeric"
258
+ })), /*#__PURE__*/React__default["default"].createElement(Button__default["default"], {
259
+ className: classNames__default["default"]([styles.arrow, styles.right]),
260
+ onClick: onClickPeriodChange
261
+ }, /*#__PURE__*/React__default["default"].createElement(Icon__default["default"], {
262
+ name: "arrow-right"
263
+ }))), /*#__PURE__*/React__default["default"].createElement("div", {
264
+ className: styles.calendarGrid
265
+ }, days.map(function (d, i) {
266
+ return /*#__PURE__*/React__default["default"].createElement("div", {
267
+ key: "day-".concat(d.getTime, "-").concat(i + 1),
268
+ className: classNames__default["default"]([styles.calendarBox, styles.headerBox])
269
+ }, d);
270
+ }), datesArray.map(function (d, i) {
271
+ var _classNames;
272
+ var dTime = dateFns.format(d, 'yyyy-MM-dd');
273
+ var isCurrentYear = d.getUTCFullYear() === currentYear;
274
+ var isCurrentMonth = d.getUTCMonth() === currentMonth;
275
+ var isToday = isCurrentYear && isCurrentMonth && d.getDate() === currentDayOfTheMonth;
276
+ var eventTime = d.getTime();
277
+ var todayTime = currentDate.getTime();
278
+ var isPast = eventTime < todayTime && !isToday;
279
+ var hasItem = dates.includes(dTime);
280
+ var inner = hasItem ? /*#__PURE__*/React__default["default"].createElement(Button__default["default"], {
281
+ onClick: function onClick(e) {
282
+ return onSelectDate(e, dTime);
283
+ },
284
+ className: classNames__default["default"](styles.day, styles.dayButton, (_classNames = {}, _defineProperty__default["default"](_classNames, styles.isToday, isToday), _defineProperty__default["default"](_classNames, styles.isPast, isPast), _defineProperty__default["default"](_classNames, styles.active, dates.includes(dTime)), _classNames))
285
+ }, dateFns.format(d, 'd')) : /*#__PURE__*/React__default["default"].createElement("div", {
286
+ className: classNames__default["default"](styles.day, _defineProperty__default["default"]({}, styles.isToday, isToday))
287
+ }, dateFns.format(d, 'd'));
288
+ return /*#__PURE__*/React__default["default"].createElement("div", {
289
+ key: "date-".concat(d.getTime, "-").concat(i + 1),
290
+ className: styles.calendarBox
291
+ }, d.getUTCMonth() !== activeMonth && mode === 'monthly' ? '' : inner);
292
+ }))));
293
+ };
294
+ CalendarList.propTypes = propTypes;
295
+ CalendarList.defaultProps = defaultProps;
296
+
297
+ exports["default"] = CalendarList;
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@panneau/list-calendar",
3
+ "version": "2.0.34",
4
+ "description": "Calendar list",
5
+ "keywords": [
6
+ "javascript"
7
+ ],
8
+ "homepage": "https://github.com/folkloreinc/panneau-js",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/folkloreinc/panneau-js.git"
12
+ },
13
+ "author": {
14
+ "name": "Folklore",
15
+ "email": "info@folklore.email"
16
+ },
17
+ "contributors": [
18
+ {
19
+ "name": "David Mongeau-Petitpas",
20
+ "email": "dmp@folklore.email"
21
+ },
22
+ {
23
+ "name": "Nicolas Roy-Bourdages",
24
+ "email": "nrb@folklore.email"
25
+ }
26
+ ],
27
+ "license": "ISC",
28
+ "main": "lib/index.js",
29
+ "module": "es/index.js",
30
+ "files": [
31
+ "lib",
32
+ "es",
33
+ "assets"
34
+ ],
35
+ "scripts": {
36
+ "prepare": "../../scripts/prepare-package.sh"
37
+ },
38
+ "devDependencies": {
39
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
40
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
41
+ },
42
+ "peerDependencies": {
43
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
44
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
45
+ },
46
+ "dependencies": {
47
+ "@babel/runtime": "^7.12.5",
48
+ "@panneau/core": "^2.0.34",
49
+ "@panneau/element-button": "^2.0.34",
50
+ "@panneau/element-card": "^2.0.34",
51
+ "@panneau/element-icon": "^2.0.34",
52
+ "@panneau/element-item-actions": "^2.0.34",
53
+ "@panneau/element-loading": "^2.0.34",
54
+ "@panneau/themes": "^2.0.34",
55
+ "classnames": "^2.2.6",
56
+ "date-fns": "^2.29.3",
57
+ "lodash": "^4.17.21",
58
+ "prop-types": "^15.7.2",
59
+ "query-string": "^8.1.0",
60
+ "react-intl": "^5.15.8||^6.0.0"
61
+ },
62
+ "publishConfig": {
63
+ "access": "public"
64
+ },
65
+ "gitHead": "dade083366e5c16d253387424ff5177d5c943e40"
66
+ }