@semapps/date-components 0.5.2 → 0.6.0-alpha.0

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.js CHANGED
@@ -1,2 +1,261 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("react-admin"),r=require("@mui/x-date-pickers/LocalizationProvider"),n=require("@mui/x-date-pickers/AdapterDateFns"),a=require("@mui/x-date-pickers/DatePicker"),o=require("@mui/x-date-pickers/TimePicker"),i=require("@mui/x-date-pickers/DateTimePicker"),l=require("@fullcalendar/react"),u=require("@fullcalendar/daygrid"),c=require("@mui/material"),s=require("@mui/styles/makeStyles"),f=require("react-router-dom"),p=require("@fullcalendar/list");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=d(e),y=d(l),b=d(u),g=d(s),v=d(p);function h(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function O(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?h(Object(r),!0).forEach((function(t){P(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):h(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function P(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function k(){return(k=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function C(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,a,o=[],i=!0,l=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);i=!0);}catch(e){l=!0,a=e}finally{try{i||null==r.return||r.return()}finally{if(l)throw a}}return o}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return D(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return D(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function D(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var T=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2;return function(t){return("0".repeat(e)+t).slice(-e)}},x=T(4),j=T(2),S=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,q=function(e){if(!(e instanceof Date)||isNaN(e.getDate()))return"";var t=x(e.getFullYear()),r=j(e.getMonth()+1),n=j(e.getDate()),a=j(e.getHours()),o=j(e.getMinutes());return"".concat(t,"-").concat(r,"-").concat(n,"T").concat(a,":").concat(o)},E=function(e){return null==e||""===e?"":e instanceof Date?q(e):S.test(e)?e:q(new Date(e))},F=function(e){return e?new Date(e):""},I=["PickerComponent","format","label","source","helperText","onBlur","onChange","onFocus","parse","validate","defaultValue","locale","pickerVariant","stringFormat","allowClear"],V=["allowEmpty","alwaysOn","component","defaultValue","format","formClassName","initialValue","initializeForm","input","isRequired","label","limitChoicesToValue","locale","meta","options","optionText","optionValue","parse","source","textAlign","translate","translateChoice","labelTime"],A=function(a){var o=a.PickerComponent,i=a.format,l=void 0===i?E:i,u=a.label,c=a.source,s=a.helperText,f=a.onBlur,p=a.onChange,d=a.onFocus,y=a.parse,b=void 0===y?F:y,g=a.validate;a.defaultValue;var v=a.locale;a.pickerVariant;var h=a.stringFormat,P=void 0===h?"ISO":h;a.allowClear;var w=C(a,I),D=t.useInput(O({format:l,onBlur:f,onChange:p,onFocus:d,parse:b,source:c,validate:g},w)),T=D.field,x=D.isRequired,j=D.fieldState,S=j.error,q=j.isTouched,V=e.useCallback((function(e){Date.parse(e)?T.onChange("ISO"===P?e.toISOString():e.toString()):T.onChange(null)}),[]);return m.default.createElement(r.LocalizationProvider,{dateAdapter:n.AdapterDateFns,adapterLocale:v},m.default.createElement(o,k({label:m.default.createElement(t.FieldTitle,{label:u,source:c,isRequired:x}),error:!(!q||!S),slotProps:{textField:{helperText:m.default.createElement(t.InputHelperText,{touched:q,error:S,helperText:s})}}},L(w),{value:T.value?new Date(T.value):null,onChange:V,onBlur:function(){return T.onBlur(T.value?"ISO"===P?new Date(T.value).toISOString():new Date(T.value).toString():null)}})))};A.defaultProps={isRequired:!1,meta:{isTouched:!1,error:!1},locale:void 0,parse:function(e){return""===e?null:e}};var L=function(e){return e.allowEmpty,e.alwaysOn,e.component,e.defaultValue,e.format,e.formClassName,e.initialValue,e.initializeForm,e.input,e.isRequired,e.label,e.limitChoicesToValue,e.locale,e.meta,e.options,e.optionText,e.optionValue,e.parse,e.source,e.textAlign,e.translate,e.translateChoice,e.labelTime,C(e,V)},M=function(r){var n=r.label,a=r.startDate,o=r.endDate,i=r.linkType,l=t.useListContext(),u=l.data,c=l.isLoading,s=l.resource,p=w(f.useSearchParams(),2);p[0];var d=p[1],m=f.useNavigate(),y=t.useCreatePath(),b=new URLSearchParams(location.search),g=e.useCallback((function(e){var t=e.event;e.jsEvent.preventDefault(),m(t.url)}),[]),v=e.useCallback((function(e){var t=e.view;d((function(e){return O(O({},e),{},{month:t.currentStart.getMonth()+1,year:t.currentStart.getFullYear()})}))}),[d]),h=e.useMemo((function(){return!c&&u.filter((function(e){return e})).map((function(e){return{id:e.id,title:"string"==typeof n?e[n]:n(e),start:"string"==typeof a?e[a]:a(e),end:"string"==typeof o?e[o]:o(e),url:y({resource:s,id:e.id,type:i})}}))}),[c,u,s,y]);return{initialDate:b.has("month")?new Date(b.get("year"),b.get("month")-1):new Date,events:h,datesSet:v,eventClick:g}},B=g.default((function(e){return{"@global":{".fc-button":{backgroundColor:e.palette.primary.main+" !important",border:"none !important",opacity:"1 !important"},".fc-day-today":{backgroundColor:e.palette.secondary.light+" !important"},"a.fc-daygrid-dot-event":{color:"black !important"}}}})),R=function(e){var t=c.useTheme(),r=M(e);return B(),m.default.createElement(y.default,k({plugins:[b.default],locale:e.locale,initialView:"dayGridMonth",eventBackgroundColor:t.palette.primary.main},r))};R.defaultProps={linkType:"edit"};var N=g.default((function(e){return{"@global":{".fc-button":{backgroundColor:e.palette.primary.main+" !important",border:"none !important",opacity:"1 !important"}}}})),z=function(e){var t=M(e);return N(),m.default.createElement(y.default,k({plugins:[v.default],locale:e.locale,initialView:"listMonth"},t))};z.defaultProps={linkType:"edit"};exports.CalendarList=R,exports.DateInput=function(e){return m.default.createElement(A,k({PickerComponent:a.DatePicker},e))},exports.DateTimeInput=function(e){return m.default.createElement(A,k({PickerComponent:i.DateTimePicker},e))},exports.DaysList=z,exports.TimeInput=function(e){return m.default.createElement(A,k({PickerComponent:o.TimePicker},e))},exports.useFullCalendarProps=M;
1
+ var $g9yvC$reactjsxruntime = require("react/jsx-runtime");
2
+ var $g9yvC$react = require("react");
3
+ var $g9yvC$muixdatepickersDatePicker = require("@mui/x-date-pickers/DatePicker");
4
+ var $g9yvC$muixdatepickersTimePicker = require("@mui/x-date-pickers/TimePicker");
5
+ var $g9yvC$muixdatepickersDateTimePicker = require("@mui/x-date-pickers/DateTimePicker");
6
+ var $g9yvC$reactadmin = require("react-admin");
7
+ var $g9yvC$muixdatepickersLocalizationProvider = require("@mui/x-date-pickers/LocalizationProvider");
8
+ var $g9yvC$muixdatepickersAdapterDateFns = require("@mui/x-date-pickers/AdapterDateFns");
9
+ var $g9yvC$fullcalendarreact = require("@fullcalendar/react");
10
+ var $g9yvC$fullcalendardaygrid = require("@fullcalendar/daygrid");
11
+ var $g9yvC$muimaterial = require("@mui/material");
12
+ var $g9yvC$muistylesmakeStyles = require("@mui/styles/makeStyles");
13
+ var $g9yvC$reactrouterdom = require("react-router-dom");
14
+ var $g9yvC$fullcalendarlist = require("@fullcalendar/list");
15
+
16
+ function $parcel$export(e, n, v, s) {
17
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
18
+ }
19
+ function $parcel$interopDefault(a) {
20
+ return a && a.__esModule ? a.default : a;
21
+ }
22
+
23
+ $parcel$export(module.exports, "DateInput", () => $2d95977354f78fa4$export$7edc06cf1783b30f);
24
+ $parcel$export(module.exports, "TimeInput", () => $2d95977354f78fa4$export$a1af6f79df847fac);
25
+ $parcel$export(module.exports, "DateTimeInput", () => $2d95977354f78fa4$export$183478aa40b5df1);
26
+ $parcel$export(module.exports, "CalendarList", () => $563c84827e91e322$export$2e2bcd8739ae039);
27
+ $parcel$export(module.exports, "DaysList", () => $5379d12b87e743a4$export$2e2bcd8739ae039);
28
+ $parcel$export(module.exports, "useFullCalendarProps", () => $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039);
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+ const $0dc8df9925f5313b$var$leftPad = (nb = 2)=>(value)=>("0".repeat(nb) + value).slice(-nb);
40
+ const $0dc8df9925f5313b$var$leftPad4 = $0dc8df9925f5313b$var$leftPad(4);
41
+ const $0dc8df9925f5313b$var$leftPad2 = $0dc8df9925f5313b$var$leftPad(2);
42
+ // yyyy-MM-ddThh:mm
43
+ const $0dc8df9925f5313b$var$dateTimeRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/;
44
+ /**
45
+ * @param {Date} value value to convert
46
+ * @returns {string} A standardized datetime (yyyy-MM-ddThh:mm), to be passed to an <input type="datetime-local" />
47
+ */ const $0dc8df9925f5313b$var$convertDateToString = (value)=>{
48
+ if (!(value instanceof Date) || isNaN(value.getDate())) return "";
49
+ const yy = $0dc8df9925f5313b$var$leftPad4(value.getFullYear());
50
+ const MM = $0dc8df9925f5313b$var$leftPad2(value.getMonth() + 1);
51
+ const dd = $0dc8df9925f5313b$var$leftPad2(value.getDate());
52
+ const hh = $0dc8df9925f5313b$var$leftPad2(value.getHours());
53
+ const mm = $0dc8df9925f5313b$var$leftPad2(value.getMinutes());
54
+ return `${yy}-${MM}-${dd}T${hh}:${mm}`;
55
+ };
56
+ const $0dc8df9925f5313b$export$59113f23fb667b84 = (value)=>{
57
+ // null, undefined and empty string values should not go through convertDateToString
58
+ // otherwise, it returns undefined and will make the input an uncontrolled one.
59
+ if (value == null || value === "") return "";
60
+ if (value instanceof Date) return $0dc8df9925f5313b$var$convertDateToString(value);
61
+ // valid dates should not be converted
62
+ if ($0dc8df9925f5313b$var$dateTimeRegex.test(value)) return value;
63
+ return $0dc8df9925f5313b$var$convertDateToString(new Date(value));
64
+ };
65
+ const $0dc8df9925f5313b$export$9a692607b62bf94e = (value)=>value ? new Date(value) : "";
66
+
67
+
68
+ const $68a2d690bd37b19a$var$Picker = ({ PickerComponent: PickerComponent, format: format = (0, $0dc8df9925f5313b$export$59113f23fb667b84), label: label, source: source, helperText: helperText, onBlur: onBlur, onChange: onChange, onFocus: onFocus, parse: parse = (0, $0dc8df9925f5313b$export$9a692607b62bf94e), validate: validate, defaultValue: defaultValue, locale: locale, pickerVariant: pickerVariant = "dialog", stringFormat: stringFormat = "ISO", allowClear: allowClear, ...rest })=>{
69
+ const { field: field, isRequired: isRequired, fieldState: { error: error, isTouched: isTouched } } = (0, $g9yvC$reactadmin.useInput)({
70
+ format: format,
71
+ onBlur: onBlur,
72
+ onChange: onChange,
73
+ onFocus: onFocus,
74
+ parse: parse,
75
+ source: source,
76
+ validate: validate,
77
+ ...rest
78
+ });
79
+ const handleChange = (0, $g9yvC$react.useCallback)((value)=>{
80
+ Date.parse(value) ? field.onChange(stringFormat === "ISO" ? value.toISOString() : value.toString()) : field.onChange(null);
81
+ }, []);
82
+ return /*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, $g9yvC$muixdatepickersLocalizationProvider.LocalizationProvider), {
83
+ dateAdapter: (0, $g9yvC$muixdatepickersAdapterDateFns.AdapterDateFns),
84
+ adapterLocale: locale,
85
+ children: /*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)(PickerComponent, {
86
+ label: /*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, $g9yvC$reactadmin.FieldTitle), {
87
+ label: label,
88
+ source: source,
89
+ isRequired: isRequired
90
+ }),
91
+ error: !!(isTouched && error),
92
+ slotProps: {
93
+ textField: {
94
+ helperText: /*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, $g9yvC$reactadmin.InputHelperText), {
95
+ touched: isTouched,
96
+ error: error,
97
+ helperText: helperText
98
+ })
99
+ }
100
+ },
101
+ ...$68a2d690bd37b19a$var$sanitizeRestProps(rest),
102
+ value: field.value ? new Date(field.value) : null,
103
+ onChange: handleChange,
104
+ onBlur: ()=>field.onBlur(field.value ? stringFormat === "ISO" ? new Date(field.value).toISOString() : new Date(field.value).toString() : null)
105
+ })
106
+ });
107
+ };
108
+ $68a2d690bd37b19a$var$Picker.defaultProps = {
109
+ isRequired: false,
110
+ meta: {
111
+ isTouched: false,
112
+ error: false
113
+ },
114
+ locale: undefined,
115
+ parse: (value)=>value === "" ? null : value // Avoid saving an empty string in the dataset
116
+ };
117
+ const $68a2d690bd37b19a$var$sanitizeRestProps = ({ allowEmpty: allowEmpty, alwaysOn: alwaysOn, component: component, defaultValue: defaultValue, format: format, formClassName: formClassName, initialValue: initialValue, initializeForm: initializeForm, input: input, isRequired: isRequired, label: label, limitChoicesToValue: limitChoicesToValue, locale: locale, meta: meta, options: options, optionText: optionText, optionValue: optionValue, parse: parse, source: source, textAlign: textAlign, translate: translate, translateChoice: translateChoice, labelTime: labelTime, ...rest })=>rest;
118
+ var $68a2d690bd37b19a$export$2e2bcd8739ae039 = $68a2d690bd37b19a$var$Picker;
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+ const $c8dbd8ec3b8f34cc$var$useFullCalendarProps = ({ label: label, startDate: startDate, endDate: endDate, linkType: linkType })=>{
131
+ const { data: data, isLoading: isLoading, resource: resource } = (0, $g9yvC$reactadmin.useListContext)();
132
+ const [searchParams, setSearchParams] = (0, $g9yvC$reactrouterdom.useSearchParams)();
133
+ const navigate = (0, $g9yvC$reactrouterdom.useNavigate)();
134
+ const createPath = (0, $g9yvC$reactadmin.useCreatePath)();
135
+ const query = new URLSearchParams(location.search);
136
+ // Bypass the link in order to use React-Router
137
+ const eventClick = (0, $g9yvC$react.useCallback)(({ event: event, jsEvent: jsEvent })=>{
138
+ jsEvent.preventDefault();
139
+ navigate(event.url);
140
+ }, []);
141
+ // Change the query string when month change
142
+ const datesSet = (0, $g9yvC$react.useCallback)(({ view: view })=>{
143
+ setSearchParams((params)=>({
144
+ ...params,
145
+ month: view.currentStart.getMonth() + 1,
146
+ year: view.currentStart.getFullYear()
147
+ }));
148
+ }, [
149
+ setSearchParams
150
+ ]);
151
+ const events = (0, $g9yvC$react.useMemo)(()=>!isLoading && data.filter((record)=>record).map((record)=>({
152
+ id: record.id,
153
+ title: typeof label === "string" ? record[label] : label(record),
154
+ start: typeof startDate === "string" ? record[startDate] : startDate(record),
155
+ end: typeof endDate === "string" ? record[endDate] : endDate(record),
156
+ url: createPath({
157
+ resource: resource,
158
+ id: record.id,
159
+ type: linkType
160
+ })
161
+ })), [
162
+ isLoading,
163
+ data,
164
+ resource,
165
+ createPath
166
+ ]);
167
+ return {
168
+ initialDate: query.has("month") ? new Date(query.get("year"), query.get("month") - 1) : new Date(),
169
+ events: events,
170
+ datesSet: datesSet,
171
+ eventClick: eventClick
172
+ };
173
+ };
174
+ var $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039 = $c8dbd8ec3b8f34cc$var$useFullCalendarProps;
175
+
176
+
177
+ const $563c84827e91e322$var$useGlobalStyles = (0, ($parcel$interopDefault($g9yvC$muistylesmakeStyles)))((theme)=>({
178
+ "@global": {
179
+ ".fc-button": {
180
+ backgroundColor: `${theme.palette.primary.main} !important`,
181
+ border: "none !important",
182
+ opacity: "1 !important"
183
+ },
184
+ ".fc-day-today": {
185
+ backgroundColor: `${theme.palette.secondary.light} !important`
186
+ },
187
+ // Overwrite violet color of links
188
+ "a.fc-daygrid-dot-event": {
189
+ color: "black !important"
190
+ }
191
+ }
192
+ }));
193
+ const $563c84827e91e322$var$CalendarList = (props)=>{
194
+ const theme = (0, $g9yvC$muimaterial.useTheme)();
195
+ const fullCalendarProps = (0, $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039)(props);
196
+ $563c84827e91e322$var$useGlobalStyles();
197
+ return /*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, ($parcel$interopDefault($g9yvC$fullcalendarreact))), {
198
+ plugins: [
199
+ (0, ($parcel$interopDefault($g9yvC$fullcalendardaygrid)))
200
+ ],
201
+ locale: props.locale,
202
+ initialView: "dayGridMonth",
203
+ eventBackgroundColor: theme.palette.primary.main,
204
+ ...fullCalendarProps
205
+ });
206
+ };
207
+ $563c84827e91e322$var$CalendarList.defaultProps = {
208
+ linkType: "edit"
209
+ };
210
+ var $563c84827e91e322$export$2e2bcd8739ae039 = $563c84827e91e322$var$CalendarList;
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+ const $5379d12b87e743a4$var$useGlobalStyles = (0, ($parcel$interopDefault($g9yvC$muistylesmakeStyles)))((theme)=>({
220
+ "@global": {
221
+ ".fc-button": {
222
+ backgroundColor: `${theme.palette.primary.main} !important`,
223
+ border: "none !important",
224
+ opacity: "1 !important"
225
+ }
226
+ }
227
+ }));
228
+ const $5379d12b87e743a4$var$DaysList = (props)=>{
229
+ const fullCalendarProps = (0, $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039)(props);
230
+ $5379d12b87e743a4$var$useGlobalStyles();
231
+ return /*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, ($parcel$interopDefault($g9yvC$fullcalendarreact))), {
232
+ plugins: [
233
+ (0, ($parcel$interopDefault($g9yvC$fullcalendarlist)))
234
+ ],
235
+ locale: props.locale,
236
+ initialView: "listMonth",
237
+ ...fullCalendarProps
238
+ });
239
+ };
240
+ $5379d12b87e743a4$var$DaysList.defaultProps = {
241
+ linkType: "edit"
242
+ };
243
+ var $5379d12b87e743a4$export$2e2bcd8739ae039 = $5379d12b87e743a4$var$DaysList;
244
+
245
+
246
+
247
+ const $2d95977354f78fa4$export$7edc06cf1783b30f = (props)=>/*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, $68a2d690bd37b19a$export$2e2bcd8739ae039), {
248
+ PickerComponent: (0, $g9yvC$muixdatepickersDatePicker.DatePicker),
249
+ ...props
250
+ });
251
+ const $2d95977354f78fa4$export$a1af6f79df847fac = (props)=>/*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, $68a2d690bd37b19a$export$2e2bcd8739ae039), {
252
+ PickerComponent: (0, $g9yvC$muixdatepickersTimePicker.TimePicker),
253
+ ...props
254
+ });
255
+ const $2d95977354f78fa4$export$183478aa40b5df1 = (props)=>/*#__PURE__*/ (0, $g9yvC$reactjsxruntime.jsx)((0, $68a2d690bd37b19a$export$2e2bcd8739ae039), {
256
+ PickerComponent: (0, $g9yvC$muixdatepickersDateTimePicker.DateTimePicker),
257
+ ...props
258
+ });
259
+
260
+
2
261
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/utils.js","../src/Picker.js","../src/useFullCalendarProps.js","../src/CalendarList.js","../src/DaysList.js","../src/index.js"],"sourcesContent":["const leftPad = (nb = 2) => value => ('0'.repeat(nb) + value).slice(-nb);\nconst leftPad4 = leftPad(4);\nconst leftPad2 = leftPad(2);\n\n// yyyy-MM-ddThh:mm\nconst dateTimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n\n/**\n * @param {Date} value value to convert\n * @returns {String} A standardized datetime (yyyy-MM-ddThh:mm), to be passed to an <input type=\"datetime-local\" />\n */\nconst convertDateToString = value => {\n if (!(value instanceof Date) || isNaN(value.getDate())) {\n return '';\n }\n\n const yy = leftPad4(value.getFullYear());\n const MM = leftPad2(value.getMonth() + 1);\n const dd = leftPad2(value.getDate());\n const hh = leftPad2(value.getHours());\n const mm = leftPad2(value.getMinutes());\n return `${yy}-${MM}-${dd}T${hh}:${mm}`;\n};\n\n/**\n * Converts a date from the Redux store, with timezone, to a date string\n * without timezone for use in an <input type=\"datetime-local\" />.\n *\n * @param {Date | String} value date string or object\n */\nexport const dateTimeFormatter = value => {\n // null, undefined and empty string values should not go through convertDateToString\n // otherwise, it returns undefined and will make the input an uncontrolled one.\n if (value == null || value === '') {\n return '';\n }\n\n if (value instanceof Date) {\n return convertDateToString(value);\n }\n\n // valid dates should not be converted\n if (dateTimeRegex.test(value)) {\n return value;\n }\n\n return convertDateToString(new Date(value));\n};\n\n/**\n * Converts a datetime string without timezone to a date object\n * with timezone, using the browser timezone.\n *\n * @param {String} value Date string, formatted as yyyy-MM-ddThh:mm\n * @return {Date}\n */\nexport const dateTimeParser = value => (value ? new Date(value) : '');\n","import React, { useCallback } from 'react';\nimport { useInput, FieldTitle, InputHelperText } from 'react-admin';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { dateTimeFormatter, dateTimeParser } from './utils';\n\nconst Picker = ({\n PickerComponent,\n format = dateTimeFormatter,\n label,\n source,\n helperText,\n onBlur,\n onChange,\n onFocus,\n parse = dateTimeParser,\n validate,\n defaultValue,\n locale,\n pickerVariant = 'dialog',\n stringFormat = 'ISO',\n allowClear,\n ...rest\n}) => {\n const {\n field,\n isRequired,\n fieldState: { error, isTouched }\n } = useInput({\n format,\n onBlur,\n onChange,\n onFocus,\n parse,\n source,\n validate,\n ...rest\n });\n\n const handleChange = useCallback(value => {\n Date.parse(value)\n ? field.onChange(stringFormat === 'ISO' ? value.toISOString() : value.toString())\n : field.onChange(null);\n }, []);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={locale}>\n <PickerComponent\n label={<FieldTitle label={label} source={source} isRequired={isRequired} />}\n error={!!(isTouched && error)}\n slotProps={{\n textField: {\n helperText: <InputHelperText touched={isTouched} error={error} helperText={helperText} />\n },\n }}\n {...sanitizeRestProps(rest)}\n value={field.value ? new Date(field.value) : null}\n onChange={handleChange}\n onBlur={() =>\n field.onBlur(\n field.value\n ? stringFormat === 'ISO'\n ? new Date(field.value).toISOString()\n : new Date(field.value).toString()\n : null\n )\n }\n />\n </LocalizationProvider>\n );\n};\n\nPicker.defaultProps = {\n isRequired: false,\n meta: { isTouched: false, error: false },\n locale: undefined, // Default to english\n parse: value => (value === '' ? null : value) // Avoid saving an empty string in the dataset\n};\n\nconst sanitizeRestProps = ({\n allowEmpty,\n alwaysOn,\n component,\n defaultValue,\n format,\n formClassName,\n initialValue,\n initializeForm,\n input,\n isRequired,\n label,\n limitChoicesToValue,\n locale,\n meta,\n options,\n optionText,\n optionValue,\n parse,\n source,\n textAlign,\n translate,\n translateChoice,\n labelTime,\n ...rest\n}) => rest;\n\n\nexport default Picker;\n","import React, { useMemo, useCallback } from 'react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport { useListContext, useCreatePath } from 'react-admin';\n\nconst useFullCalendarProps = ({ label, startDate, endDate, linkType }) => {\n const { data, isLoading, resource } = useListContext();\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const createPath = useCreatePath();\n\n let query = new URLSearchParams(location.search);\n\n // Bypass the link in order to use React-Router\n const eventClick = useCallback(({ event, jsEvent }) => {\n jsEvent.preventDefault();\n navigate(event.url);\n }, []);\n\n // Change the query string when month change\n const datesSet = useCallback(\n ({ view }) => {\n setSearchParams(params => ({ ...params, month: view.currentStart.getMonth() + 1, year: view.currentStart.getFullYear() }));\n },\n [setSearchParams]\n );\n\n const events = useMemo(\n () =>\n !isLoading &&\n data\n .filter(record => record)\n .map(record => ({\n id: record.id,\n title: typeof label === 'string' ? record[label] : label(record),\n start: typeof startDate === 'string' ? record[startDate] : startDate(record),\n end: typeof endDate === 'string' ? record[endDate] : endDate(record),\n url: createPath({ resource, id: record.id, type: linkType })\n })),\n [isLoading, data, resource, createPath]\n );\n\n return {\n initialDate: query.has('month') ? new Date(query.get('year'), query.get('month') - 1) : new Date(),\n events,\n datesSet,\n eventClick\n };\n};\n\nexport default useFullCalendarProps;\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport { useTheme } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: theme.palette.primary.main + ' !important',\n border: 'none !important',\n opacity: '1 !important'\n },\n '.fc-day-today': {\n backgroundColor: theme.palette.secondary.light + ' !important'\n },\n // Overwrite violet color of links\n 'a.fc-daygrid-dot-event': {\n color: 'black !important'\n }\n }\n}));\n\nconst CalendarList = props => {\n const theme = useTheme();\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return (\n <FullCalendar\n plugins={[dayGridPlugin]}\n locale={props.locale}\n initialView=\"dayGridMonth\"\n eventBackgroundColor={theme.palette.primary.main}\n {...fullCalendarProps}\n />\n );\n};\n\nCalendarList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default CalendarList;\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport listPlugin from '@fullcalendar/list';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: theme.palette.primary.main + ' !important',\n border: 'none !important',\n opacity: '1 !important'\n }\n }\n}));\n\nconst DaysList = props => {\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return <FullCalendar plugins={[listPlugin]} locale={props.locale} initialView=\"listMonth\" {...fullCalendarProps} />;\n};\n\nDaysList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default DaysList;\n","import React from 'react';\nimport Picker from './Picker';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\n\nconst DateInput = props => <Picker PickerComponent={DatePicker} {...props} />;\nconst TimeInput = props => <Picker PickerComponent={TimePicker} {...props} />;\nconst DateTimeInput = props => <Picker PickerComponent={DateTimePicker} {...props} />;\n\nexport { DateInput, TimeInput, DateTimeInput };\n\nexport { default as CalendarList } from './CalendarList';\nexport { default as DaysList } from './DaysList';\nexport { default as useFullCalendarProps } from './useFullCalendarProps';\n"],"names":["leftPad","nb","value","repeat","slice","leftPad4","leftPad2","dateTimeRegex","convertDateToString","Date","isNaN","getDate","yy","getFullYear","MM","getMonth","dd","hh","getHours","mm","getMinutes","concat","dateTimeFormatter","test","dateTimeParser","Picker","_ref","PickerComponent","_ref$format","format","label","source","helperText","onBlur","onChange","onFocus","_ref$parse","parse","validate","defaultValue","locale","pickerVariant","_ref$stringFormat","stringFormat","allowClear","rest","_objectWithoutProperties","_excluded","_useInput","useInput","_objectSpread","field","isRequired","_useInput$fieldState","fieldState","error","isTouched","handleChange","useCallback","toISOString","toString","React","LocalizationProvider","dateAdapter","AdapterDateFns","adapterLocale","_extends","FieldTitle","slotProps","textField","InputHelperText","touched","sanitizeRestProps","defaultProps","meta","undefined","_ref2","allowEmpty","alwaysOn","component","formClassName","initialValue","initializeForm","input","limitChoicesToValue","options","optionText","optionValue","textAlign","translate","translateChoice","labelTime","_excluded2","useFullCalendarProps","startDate","endDate","linkType","_useListContext","useListContext","data","isLoading","resource","_useSearchParams2","_slicedToArray","useSearchParams","setSearchParams","navigate","useNavigate","createPath","useCreatePath","query","URLSearchParams","location","search","eventClick","event","jsEvent","preventDefault","url","datesSet","_ref3","view","params","month","currentStart","year","events","useMemo","filter","record","map","id","title","start","end","type","initialDate","has","get","useGlobalStyles","makeStyles","theme","@global",".fc-button","backgroundColor","palette","primary","main","border","opacity",".fc-day-today","secondary","light","a.fc-daygrid-dot-event","color","CalendarList","props","useTheme","fullCalendarProps","FullCalendar","plugins","dayGridPlugin","initialView","eventBackgroundColor","DaysList","listPlugin","DatePicker","DateTimePicker","TimePicker"],"mappings":"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"}
1
+ {"mappings":"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","sources":["packages/date-components/src/index.js","packages/date-components/src/Picker.js","packages/date-components/src/utils.js","packages/date-components/src/CalendarList.js","packages/date-components/src/useFullCalendarProps.js","packages/date-components/src/DaysList.js"],"sourcesContent":["import React from 'react';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\nimport Picker from './Picker';\n\nconst DateInput = props => <Picker PickerComponent={DatePicker} {...props} />;\nconst TimeInput = props => <Picker PickerComponent={TimePicker} {...props} />;\nconst DateTimeInput = props => <Picker PickerComponent={DateTimePicker} {...props} />;\n\nexport { DateInput, TimeInput, DateTimeInput };\n\nexport { default as CalendarList } from './CalendarList';\nexport { default as DaysList } from './DaysList';\nexport { default as useFullCalendarProps } from './useFullCalendarProps';\n","import React, { useCallback } from 'react';\nimport { useInput, FieldTitle, InputHelperText } from 'react-admin';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { dateTimeFormatter, dateTimeParser } from './utils';\n\nconst Picker = ({\n PickerComponent,\n format = dateTimeFormatter,\n label,\n source,\n helperText,\n onBlur,\n onChange,\n onFocus,\n parse = dateTimeParser,\n validate,\n defaultValue,\n locale,\n pickerVariant = 'dialog',\n stringFormat = 'ISO',\n allowClear,\n ...rest\n}) => {\n const {\n field,\n isRequired,\n fieldState: { error, isTouched }\n } = useInput({\n format,\n onBlur,\n onChange,\n onFocus,\n parse,\n source,\n validate,\n ...rest\n });\n\n const handleChange = useCallback(value => {\n Date.parse(value)\n ? field.onChange(stringFormat === 'ISO' ? value.toISOString() : value.toString())\n : field.onChange(null);\n }, []);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={locale}>\n <PickerComponent\n label={<FieldTitle label={label} source={source} isRequired={isRequired} />}\n error={!!(isTouched && error)}\n slotProps={{\n textField: {\n helperText: <InputHelperText touched={isTouched} error={error} helperText={helperText} />\n }\n }}\n {...sanitizeRestProps(rest)}\n value={field.value ? new Date(field.value) : null}\n onChange={handleChange}\n onBlur={() =>\n field.onBlur(\n field.value\n ? stringFormat === 'ISO'\n ? new Date(field.value).toISOString()\n : new Date(field.value).toString()\n : null\n )\n }\n />\n </LocalizationProvider>\n );\n};\n\nPicker.defaultProps = {\n isRequired: false,\n meta: { isTouched: false, error: false },\n locale: undefined, // Default to english\n parse: value => (value === '' ? null : value) // Avoid saving an empty string in the dataset\n};\n\nconst sanitizeRestProps = ({\n allowEmpty,\n alwaysOn,\n component,\n defaultValue,\n format,\n formClassName,\n initialValue,\n initializeForm,\n input,\n isRequired,\n label,\n limitChoicesToValue,\n locale,\n meta,\n options,\n optionText,\n optionValue,\n parse,\n source,\n textAlign,\n translate,\n translateChoice,\n labelTime,\n ...rest\n}) => rest;\n\nexport default Picker;\n","const leftPad =\n (nb = 2) =>\n value =>\n ('0'.repeat(nb) + value).slice(-nb);\nconst leftPad4 = leftPad(4);\nconst leftPad2 = leftPad(2);\n\n// yyyy-MM-ddThh:mm\nconst dateTimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n\n/**\n * @param {Date} value value to convert\n * @returns {string} A standardized datetime (yyyy-MM-ddThh:mm), to be passed to an <input type=\"datetime-local\" />\n */\nconst convertDateToString = value => {\n if (!(value instanceof Date) || isNaN(value.getDate())) {\n return '';\n }\n\n const yy = leftPad4(value.getFullYear());\n const MM = leftPad2(value.getMonth() + 1);\n const dd = leftPad2(value.getDate());\n const hh = leftPad2(value.getHours());\n const mm = leftPad2(value.getMinutes());\n return `${yy}-${MM}-${dd}T${hh}:${mm}`;\n};\n\n/**\n * Converts a date from the Redux store, with timezone, to a date string\n * without timezone for use in an <input type=\"datetime-local\" />.\n * @param {Date | string} value date string or object\n */\nexport const dateTimeFormatter = value => {\n // null, undefined and empty string values should not go through convertDateToString\n // otherwise, it returns undefined and will make the input an uncontrolled one.\n if (value == null || value === '') {\n return '';\n }\n\n if (value instanceof Date) {\n return convertDateToString(value);\n }\n\n // valid dates should not be converted\n if (dateTimeRegex.test(value)) {\n return value;\n }\n\n return convertDateToString(new Date(value));\n};\n\n/**\n * Converts a datetime string without timezone to a date object\n * with timezone, using the browser timezone.\n * @param {string} value Date string, formatted as yyyy-MM-ddThh:mm\n * @returns {Date}\n */\nexport const dateTimeParser = value => (value ? new Date(value) : '');\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport { useTheme } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: `${theme.palette.primary.main} !important`,\n border: 'none !important',\n opacity: '1 !important'\n },\n '.fc-day-today': {\n backgroundColor: `${theme.palette.secondary.light} !important`\n },\n // Overwrite violet color of links\n 'a.fc-daygrid-dot-event': {\n color: 'black !important'\n }\n }\n}));\n\nconst CalendarList = props => {\n const theme = useTheme();\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return (\n <FullCalendar\n plugins={[dayGridPlugin]}\n locale={props.locale}\n initialView=\"dayGridMonth\"\n eventBackgroundColor={theme.palette.primary.main}\n {...fullCalendarProps}\n />\n );\n};\n\nCalendarList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default CalendarList;\n","import React, { useMemo, useCallback } from 'react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport { useListContext, useCreatePath } from 'react-admin';\n\nconst useFullCalendarProps = ({ label, startDate, endDate, linkType }) => {\n const { data, isLoading, resource } = useListContext();\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const createPath = useCreatePath();\n\n const query = new URLSearchParams(location.search);\n\n // Bypass the link in order to use React-Router\n const eventClick = useCallback(({ event, jsEvent }) => {\n jsEvent.preventDefault();\n navigate(event.url);\n }, []);\n\n // Change the query string when month change\n const datesSet = useCallback(\n ({ view }) => {\n setSearchParams(params => ({\n ...params,\n month: view.currentStart.getMonth() + 1,\n year: view.currentStart.getFullYear()\n }));\n },\n [setSearchParams]\n );\n\n const events = useMemo(\n () =>\n !isLoading &&\n data\n .filter(record => record)\n .map(record => ({\n id: record.id,\n title: typeof label === 'string' ? record[label] : label(record),\n start: typeof startDate === 'string' ? record[startDate] : startDate(record),\n end: typeof endDate === 'string' ? record[endDate] : endDate(record),\n url: createPath({ resource, id: record.id, type: linkType })\n })),\n [isLoading, data, resource, createPath]\n );\n\n return {\n initialDate: query.has('month') ? new Date(query.get('year'), query.get('month') - 1) : new Date(),\n events,\n datesSet,\n eventClick\n };\n};\n\nexport default useFullCalendarProps;\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport listPlugin from '@fullcalendar/list';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: `${theme.palette.primary.main} !important`,\n border: 'none !important',\n opacity: '1 !important'\n }\n }\n}));\n\nconst DaysList = props => {\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return <FullCalendar plugins={[listPlugin]} locale={props.locale} initialView=\"listMonth\" {...fullCalendarProps} />;\n};\n\nDaysList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default DaysList;\n"],"names":[],"version":3,"file":"index.cjs.js.map"}
package/dist/index.es.js CHANGED
@@ -1,2 +1,249 @@
1
- import e,{useCallback as t,useMemo as r}from"react";import{useInput as n,FieldTitle as o,InputHelperText as a,useListContext as i,useCreatePath as l}from"react-admin";import{LocalizationProvider as u}from"@mui/x-date-pickers/LocalizationProvider";import{AdapterDateFns as c}from"@mui/x-date-pickers/AdapterDateFns";import{DatePicker as p}from"@mui/x-date-pickers/DatePicker";import{TimePicker as f}from"@mui/x-date-pickers/TimePicker";import{DateTimePicker as m}from"@mui/x-date-pickers/DateTimePicker";import s from"@fullcalendar/react";import d from"@fullcalendar/daygrid";import{useTheme as y}from"@mui/material";import g from"@mui/styles/makeStyles";import{useSearchParams as b,useNavigate as v}from"react-router-dom";import h from"@fullcalendar/list";function O(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function w(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?O(Object(r),!0).forEach((function(t){k(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):O(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function k(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P(){return(P=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e}).apply(this,arguments)}function C(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function S(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null==r)return;var n,o,a=[],i=!0,l=!1;try{for(r=r.call(e);!(i=(n=r.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(e){l=!0,o=e}finally{try{i||null==r.return||r.return()}finally{if(l)throw o}}return a}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return j(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return j(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function j(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var D=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2;return function(t){return("0".repeat(e)+t).slice(-e)}},T=D(4),x=D(2),E=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/,V=function(e){if(!(e instanceof Date)||isNaN(e.getDate()))return"";var t=T(e.getFullYear()),r=x(e.getMonth()+1),n=x(e.getDate()),o=x(e.getHours()),a=x(e.getMinutes());return"".concat(t,"-").concat(r,"-").concat(n,"T").concat(o,":").concat(a)},F=function(e){return null==e||""===e?"":e instanceof Date?V(e):E.test(e)?e:V(new Date(e))},A=function(e){return e?new Date(e):""},I=["PickerComponent","format","label","source","helperText","onBlur","onChange","onFocus","parse","validate","defaultValue","locale","pickerVariant","stringFormat","allowClear"],B=["allowEmpty","alwaysOn","component","defaultValue","format","formClassName","initialValue","initializeForm","input","isRequired","label","limitChoicesToValue","locale","meta","options","optionText","optionValue","parse","source","textAlign","translate","translateChoice","labelTime"],M=function(r){var i=r.PickerComponent,l=r.format,p=void 0===l?F:l,f=r.label,m=r.source,s=r.helperText,d=r.onBlur,y=r.onChange,g=r.onFocus,b=r.parse,v=void 0===b?A:b,h=r.validate;r.defaultValue;var O=r.locale;r.pickerVariant;var k=r.stringFormat,S=void 0===k?"ISO":k;r.allowClear;var j=C(r,I),D=n(w({format:p,onBlur:d,onChange:y,onFocus:g,parse:v,source:m,validate:h},j)),T=D.field,x=D.isRequired,E=D.fieldState,V=E.error,B=E.isTouched,M=t((function(e){Date.parse(e)?T.onChange("ISO"===S?e.toISOString():e.toString()):T.onChange(null)}),[]);return e.createElement(u,{dateAdapter:c,adapterLocale:O},e.createElement(i,P({label:e.createElement(o,{label:f,source:m,isRequired:x}),error:!(!B||!V),slotProps:{textField:{helperText:e.createElement(a,{touched:B,error:V,helperText:s})}}},R(j),{value:T.value?new Date(T.value):null,onChange:M,onBlur:function(){return T.onBlur(T.value?"ISO"===S?new Date(T.value).toISOString():new Date(T.value).toString():null)}})))};M.defaultProps={isRequired:!1,meta:{isTouched:!1,error:!1},locale:void 0,parse:function(e){return""===e?null:e}};var R=function(e){return e.allowEmpty,e.alwaysOn,e.component,e.defaultValue,e.format,e.formClassName,e.initialValue,e.initializeForm,e.input,e.isRequired,e.label,e.limitChoicesToValue,e.locale,e.meta,e.options,e.optionText,e.optionValue,e.parse,e.source,e.textAlign,e.translate,e.translateChoice,e.labelTime,C(e,B)},q=function(e){var n=e.label,o=e.startDate,a=e.endDate,u=e.linkType,c=i(),p=c.data,f=c.isLoading,m=c.resource,s=S(b(),2);s[0];var d=s[1],y=v(),g=l(),h=new URLSearchParams(location.search),O=t((function(e){var t=e.event;e.jsEvent.preventDefault(),y(t.url)}),[]),k=t((function(e){var t=e.view;d((function(e){return w(w({},e),{},{month:t.currentStart.getMonth()+1,year:t.currentStart.getFullYear()})}))}),[d]),P=r((function(){return!f&&p.filter((function(e){return e})).map((function(e){return{id:e.id,title:"string"==typeof n?e[n]:n(e),start:"string"==typeof o?e[o]:o(e),end:"string"==typeof a?e[a]:a(e),url:g({resource:m,id:e.id,type:u})}}))}),[f,p,m,g]);return{initialDate:h.has("month")?new Date(h.get("year"),h.get("month")-1):new Date,events:P,datesSet:k,eventClick:O}},L=g((function(e){return{"@global":{".fc-button":{backgroundColor:e.palette.primary.main+" !important",border:"none !important",opacity:"1 !important"},".fc-day-today":{backgroundColor:e.palette.secondary.light+" !important"},"a.fc-daygrid-dot-event":{color:"black !important"}}}})),N=function(t){var r=y(),n=q(t);return L(),e.createElement(s,P({plugins:[d],locale:t.locale,initialView:"dayGridMonth",eventBackgroundColor:r.palette.primary.main},n))};N.defaultProps={linkType:"edit"};var z=g((function(e){return{"@global":{".fc-button":{backgroundColor:e.palette.primary.main+" !important",border:"none !important",opacity:"1 !important"}}}})),U=function(t){var r=q(t);return z(),e.createElement(s,P({plugins:[h],locale:t.locale,initialView:"listMonth"},r))};U.defaultProps={linkType:"edit"};var Y=function(t){return e.createElement(M,P({PickerComponent:p},t))},$=function(t){return e.createElement(M,P({PickerComponent:f},t))},G=function(t){return e.createElement(M,P({PickerComponent:m},t))};export{N as CalendarList,Y as DateInput,G as DateTimeInput,U as DaysList,$ as TimeInput,q as useFullCalendarProps};
1
+ import {jsx as $1h8NM$jsx} from "react/jsx-runtime";
2
+ import {useCallback as $1h8NM$useCallback, useMemo as $1h8NM$useMemo} from "react";
3
+ import {DatePicker as $1h8NM$DatePicker} from "@mui/x-date-pickers/DatePicker";
4
+ import {TimePicker as $1h8NM$TimePicker} from "@mui/x-date-pickers/TimePicker";
5
+ import {DateTimePicker as $1h8NM$DateTimePicker} from "@mui/x-date-pickers/DateTimePicker";
6
+ import {useInput as $1h8NM$useInput, FieldTitle as $1h8NM$FieldTitle, InputHelperText as $1h8NM$InputHelperText, useListContext as $1h8NM$useListContext, useCreatePath as $1h8NM$useCreatePath} from "react-admin";
7
+ import {LocalizationProvider as $1h8NM$LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider";
8
+ import {AdapterDateFns as $1h8NM$AdapterDateFns} from "@mui/x-date-pickers/AdapterDateFns";
9
+ import $1h8NM$fullcalendarreact from "@fullcalendar/react";
10
+ import $1h8NM$fullcalendardaygrid from "@fullcalendar/daygrid";
11
+ import {useTheme as $1h8NM$useTheme} from "@mui/material";
12
+ import $1h8NM$muistylesmakeStyles from "@mui/styles/makeStyles";
13
+ import {useSearchParams as $1h8NM$useSearchParams, useNavigate as $1h8NM$useNavigate} from "react-router-dom";
14
+ import $1h8NM$fullcalendarlist from "@fullcalendar/list";
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+ const $85cccff3a4734cfe$var$leftPad = (nb = 2)=>(value)=>("0".repeat(nb) + value).slice(-nb);
27
+ const $85cccff3a4734cfe$var$leftPad4 = $85cccff3a4734cfe$var$leftPad(4);
28
+ const $85cccff3a4734cfe$var$leftPad2 = $85cccff3a4734cfe$var$leftPad(2);
29
+ // yyyy-MM-ddThh:mm
30
+ const $85cccff3a4734cfe$var$dateTimeRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/;
31
+ /**
32
+ * @param {Date} value value to convert
33
+ * @returns {string} A standardized datetime (yyyy-MM-ddThh:mm), to be passed to an <input type="datetime-local" />
34
+ */ const $85cccff3a4734cfe$var$convertDateToString = (value)=>{
35
+ if (!(value instanceof Date) || isNaN(value.getDate())) return "";
36
+ const yy = $85cccff3a4734cfe$var$leftPad4(value.getFullYear());
37
+ const MM = $85cccff3a4734cfe$var$leftPad2(value.getMonth() + 1);
38
+ const dd = $85cccff3a4734cfe$var$leftPad2(value.getDate());
39
+ const hh = $85cccff3a4734cfe$var$leftPad2(value.getHours());
40
+ const mm = $85cccff3a4734cfe$var$leftPad2(value.getMinutes());
41
+ return `${yy}-${MM}-${dd}T${hh}:${mm}`;
42
+ };
43
+ const $85cccff3a4734cfe$export$59113f23fb667b84 = (value)=>{
44
+ // null, undefined and empty string values should not go through convertDateToString
45
+ // otherwise, it returns undefined and will make the input an uncontrolled one.
46
+ if (value == null || value === "") return "";
47
+ if (value instanceof Date) return $85cccff3a4734cfe$var$convertDateToString(value);
48
+ // valid dates should not be converted
49
+ if ($85cccff3a4734cfe$var$dateTimeRegex.test(value)) return value;
50
+ return $85cccff3a4734cfe$var$convertDateToString(new Date(value));
51
+ };
52
+ const $85cccff3a4734cfe$export$9a692607b62bf94e = (value)=>value ? new Date(value) : "";
53
+
54
+
55
+ const $23b8ae46df88f164$var$Picker = ({ PickerComponent: PickerComponent, format: format = (0, $85cccff3a4734cfe$export$59113f23fb667b84), label: label, source: source, helperText: helperText, onBlur: onBlur, onChange: onChange, onFocus: onFocus, parse: parse = (0, $85cccff3a4734cfe$export$9a692607b62bf94e), validate: validate, defaultValue: defaultValue, locale: locale, pickerVariant: pickerVariant = "dialog", stringFormat: stringFormat = "ISO", allowClear: allowClear, ...rest })=>{
56
+ const { field: field, isRequired: isRequired, fieldState: { error: error, isTouched: isTouched } } = (0, $1h8NM$useInput)({
57
+ format: format,
58
+ onBlur: onBlur,
59
+ onChange: onChange,
60
+ onFocus: onFocus,
61
+ parse: parse,
62
+ source: source,
63
+ validate: validate,
64
+ ...rest
65
+ });
66
+ const handleChange = (0, $1h8NM$useCallback)((value)=>{
67
+ Date.parse(value) ? field.onChange(stringFormat === "ISO" ? value.toISOString() : value.toString()) : field.onChange(null);
68
+ }, []);
69
+ return /*#__PURE__*/ (0, $1h8NM$jsx)((0, $1h8NM$LocalizationProvider), {
70
+ dateAdapter: (0, $1h8NM$AdapterDateFns),
71
+ adapterLocale: locale,
72
+ children: /*#__PURE__*/ (0, $1h8NM$jsx)(PickerComponent, {
73
+ label: /*#__PURE__*/ (0, $1h8NM$jsx)((0, $1h8NM$FieldTitle), {
74
+ label: label,
75
+ source: source,
76
+ isRequired: isRequired
77
+ }),
78
+ error: !!(isTouched && error),
79
+ slotProps: {
80
+ textField: {
81
+ helperText: /*#__PURE__*/ (0, $1h8NM$jsx)((0, $1h8NM$InputHelperText), {
82
+ touched: isTouched,
83
+ error: error,
84
+ helperText: helperText
85
+ })
86
+ }
87
+ },
88
+ ...$23b8ae46df88f164$var$sanitizeRestProps(rest),
89
+ value: field.value ? new Date(field.value) : null,
90
+ onChange: handleChange,
91
+ onBlur: ()=>field.onBlur(field.value ? stringFormat === "ISO" ? new Date(field.value).toISOString() : new Date(field.value).toString() : null)
92
+ })
93
+ });
94
+ };
95
+ $23b8ae46df88f164$var$Picker.defaultProps = {
96
+ isRequired: false,
97
+ meta: {
98
+ isTouched: false,
99
+ error: false
100
+ },
101
+ locale: undefined,
102
+ parse: (value)=>value === "" ? null : value // Avoid saving an empty string in the dataset
103
+ };
104
+ const $23b8ae46df88f164$var$sanitizeRestProps = ({ allowEmpty: allowEmpty, alwaysOn: alwaysOn, component: component, defaultValue: defaultValue, format: format, formClassName: formClassName, initialValue: initialValue, initializeForm: initializeForm, input: input, isRequired: isRequired, label: label, limitChoicesToValue: limitChoicesToValue, locale: locale, meta: meta, options: options, optionText: optionText, optionValue: optionValue, parse: parse, source: source, textAlign: textAlign, translate: translate, translateChoice: translateChoice, labelTime: labelTime, ...rest })=>rest;
105
+ var $23b8ae46df88f164$export$2e2bcd8739ae039 = $23b8ae46df88f164$var$Picker;
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+ const $37245c02f9b1b006$var$useFullCalendarProps = ({ label: label, startDate: startDate, endDate: endDate, linkType: linkType })=>{
118
+ const { data: data, isLoading: isLoading, resource: resource } = (0, $1h8NM$useListContext)();
119
+ const [searchParams, setSearchParams] = (0, $1h8NM$useSearchParams)();
120
+ const navigate = (0, $1h8NM$useNavigate)();
121
+ const createPath = (0, $1h8NM$useCreatePath)();
122
+ const query = new URLSearchParams(location.search);
123
+ // Bypass the link in order to use React-Router
124
+ const eventClick = (0, $1h8NM$useCallback)(({ event: event, jsEvent: jsEvent })=>{
125
+ jsEvent.preventDefault();
126
+ navigate(event.url);
127
+ }, []);
128
+ // Change the query string when month change
129
+ const datesSet = (0, $1h8NM$useCallback)(({ view: view })=>{
130
+ setSearchParams((params)=>({
131
+ ...params,
132
+ month: view.currentStart.getMonth() + 1,
133
+ year: view.currentStart.getFullYear()
134
+ }));
135
+ }, [
136
+ setSearchParams
137
+ ]);
138
+ const events = (0, $1h8NM$useMemo)(()=>!isLoading && data.filter((record)=>record).map((record)=>({
139
+ id: record.id,
140
+ title: typeof label === "string" ? record[label] : label(record),
141
+ start: typeof startDate === "string" ? record[startDate] : startDate(record),
142
+ end: typeof endDate === "string" ? record[endDate] : endDate(record),
143
+ url: createPath({
144
+ resource: resource,
145
+ id: record.id,
146
+ type: linkType
147
+ })
148
+ })), [
149
+ isLoading,
150
+ data,
151
+ resource,
152
+ createPath
153
+ ]);
154
+ return {
155
+ initialDate: query.has("month") ? new Date(query.get("year"), query.get("month") - 1) : new Date(),
156
+ events: events,
157
+ datesSet: datesSet,
158
+ eventClick: eventClick
159
+ };
160
+ };
161
+ var $37245c02f9b1b006$export$2e2bcd8739ae039 = $37245c02f9b1b006$var$useFullCalendarProps;
162
+
163
+
164
+ const $abbcc02f55461290$var$useGlobalStyles = (0, $1h8NM$muistylesmakeStyles)((theme)=>({
165
+ "@global": {
166
+ ".fc-button": {
167
+ backgroundColor: `${theme.palette.primary.main} !important`,
168
+ border: "none !important",
169
+ opacity: "1 !important"
170
+ },
171
+ ".fc-day-today": {
172
+ backgroundColor: `${theme.palette.secondary.light} !important`
173
+ },
174
+ // Overwrite violet color of links
175
+ "a.fc-daygrid-dot-event": {
176
+ color: "black !important"
177
+ }
178
+ }
179
+ }));
180
+ const $abbcc02f55461290$var$CalendarList = (props)=>{
181
+ const theme = (0, $1h8NM$useTheme)();
182
+ const fullCalendarProps = (0, $37245c02f9b1b006$export$2e2bcd8739ae039)(props);
183
+ $abbcc02f55461290$var$useGlobalStyles();
184
+ return /*#__PURE__*/ (0, $1h8NM$jsx)((0, $1h8NM$fullcalendarreact), {
185
+ plugins: [
186
+ (0, $1h8NM$fullcalendardaygrid)
187
+ ],
188
+ locale: props.locale,
189
+ initialView: "dayGridMonth",
190
+ eventBackgroundColor: theme.palette.primary.main,
191
+ ...fullCalendarProps
192
+ });
193
+ };
194
+ $abbcc02f55461290$var$CalendarList.defaultProps = {
195
+ linkType: "edit"
196
+ };
197
+ var $abbcc02f55461290$export$2e2bcd8739ae039 = $abbcc02f55461290$var$CalendarList;
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+ const $69d9f850452774a2$var$useGlobalStyles = (0, $1h8NM$muistylesmakeStyles)((theme)=>({
207
+ "@global": {
208
+ ".fc-button": {
209
+ backgroundColor: `${theme.palette.primary.main} !important`,
210
+ border: "none !important",
211
+ opacity: "1 !important"
212
+ }
213
+ }
214
+ }));
215
+ const $69d9f850452774a2$var$DaysList = (props)=>{
216
+ const fullCalendarProps = (0, $37245c02f9b1b006$export$2e2bcd8739ae039)(props);
217
+ $69d9f850452774a2$var$useGlobalStyles();
218
+ return /*#__PURE__*/ (0, $1h8NM$jsx)((0, $1h8NM$fullcalendarreact), {
219
+ plugins: [
220
+ (0, $1h8NM$fullcalendarlist)
221
+ ],
222
+ locale: props.locale,
223
+ initialView: "listMonth",
224
+ ...fullCalendarProps
225
+ });
226
+ };
227
+ $69d9f850452774a2$var$DaysList.defaultProps = {
228
+ linkType: "edit"
229
+ };
230
+ var $69d9f850452774a2$export$2e2bcd8739ae039 = $69d9f850452774a2$var$DaysList;
231
+
232
+
233
+
234
+ const $92007338c717b459$export$7edc06cf1783b30f = (props)=>/*#__PURE__*/ (0, $1h8NM$jsx)((0, $23b8ae46df88f164$export$2e2bcd8739ae039), {
235
+ PickerComponent: (0, $1h8NM$DatePicker),
236
+ ...props
237
+ });
238
+ const $92007338c717b459$export$a1af6f79df847fac = (props)=>/*#__PURE__*/ (0, $1h8NM$jsx)((0, $23b8ae46df88f164$export$2e2bcd8739ae039), {
239
+ PickerComponent: (0, $1h8NM$TimePicker),
240
+ ...props
241
+ });
242
+ const $92007338c717b459$export$183478aa40b5df1 = (props)=>/*#__PURE__*/ (0, $1h8NM$jsx)((0, $23b8ae46df88f164$export$2e2bcd8739ae039), {
243
+ PickerComponent: (0, $1h8NM$DateTimePicker),
244
+ ...props
245
+ });
246
+
247
+
248
+ export {$92007338c717b459$export$7edc06cf1783b30f as DateInput, $92007338c717b459$export$a1af6f79df847fac as TimeInput, $92007338c717b459$export$183478aa40b5df1 as DateTimeInput, $abbcc02f55461290$export$2e2bcd8739ae039 as CalendarList, $69d9f850452774a2$export$2e2bcd8739ae039 as DaysList, $37245c02f9b1b006$export$2e2bcd8739ae039 as useFullCalendarProps};
2
249
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/utils.js","../src/Picker.js","../src/useFullCalendarProps.js","../src/CalendarList.js","../src/DaysList.js","../src/index.js"],"sourcesContent":["const leftPad = (nb = 2) => value => ('0'.repeat(nb) + value).slice(-nb);\nconst leftPad4 = leftPad(4);\nconst leftPad2 = leftPad(2);\n\n// yyyy-MM-ddThh:mm\nconst dateTimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n\n/**\n * @param {Date} value value to convert\n * @returns {String} A standardized datetime (yyyy-MM-ddThh:mm), to be passed to an <input type=\"datetime-local\" />\n */\nconst convertDateToString = value => {\n if (!(value instanceof Date) || isNaN(value.getDate())) {\n return '';\n }\n\n const yy = leftPad4(value.getFullYear());\n const MM = leftPad2(value.getMonth() + 1);\n const dd = leftPad2(value.getDate());\n const hh = leftPad2(value.getHours());\n const mm = leftPad2(value.getMinutes());\n return `${yy}-${MM}-${dd}T${hh}:${mm}`;\n};\n\n/**\n * Converts a date from the Redux store, with timezone, to a date string\n * without timezone for use in an <input type=\"datetime-local\" />.\n *\n * @param {Date | String} value date string or object\n */\nexport const dateTimeFormatter = value => {\n // null, undefined and empty string values should not go through convertDateToString\n // otherwise, it returns undefined and will make the input an uncontrolled one.\n if (value == null || value === '') {\n return '';\n }\n\n if (value instanceof Date) {\n return convertDateToString(value);\n }\n\n // valid dates should not be converted\n if (dateTimeRegex.test(value)) {\n return value;\n }\n\n return convertDateToString(new Date(value));\n};\n\n/**\n * Converts a datetime string without timezone to a date object\n * with timezone, using the browser timezone.\n *\n * @param {String} value Date string, formatted as yyyy-MM-ddThh:mm\n * @return {Date}\n */\nexport const dateTimeParser = value => (value ? new Date(value) : '');\n","import React, { useCallback } from 'react';\nimport { useInput, FieldTitle, InputHelperText } from 'react-admin';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { dateTimeFormatter, dateTimeParser } from './utils';\n\nconst Picker = ({\n PickerComponent,\n format = dateTimeFormatter,\n label,\n source,\n helperText,\n onBlur,\n onChange,\n onFocus,\n parse = dateTimeParser,\n validate,\n defaultValue,\n locale,\n pickerVariant = 'dialog',\n stringFormat = 'ISO',\n allowClear,\n ...rest\n}) => {\n const {\n field,\n isRequired,\n fieldState: { error, isTouched }\n } = useInput({\n format,\n onBlur,\n onChange,\n onFocus,\n parse,\n source,\n validate,\n ...rest\n });\n\n const handleChange = useCallback(value => {\n Date.parse(value)\n ? field.onChange(stringFormat === 'ISO' ? value.toISOString() : value.toString())\n : field.onChange(null);\n }, []);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={locale}>\n <PickerComponent\n label={<FieldTitle label={label} source={source} isRequired={isRequired} />}\n error={!!(isTouched && error)}\n slotProps={{\n textField: {\n helperText: <InputHelperText touched={isTouched} error={error} helperText={helperText} />\n },\n }}\n {...sanitizeRestProps(rest)}\n value={field.value ? new Date(field.value) : null}\n onChange={handleChange}\n onBlur={() =>\n field.onBlur(\n field.value\n ? stringFormat === 'ISO'\n ? new Date(field.value).toISOString()\n : new Date(field.value).toString()\n : null\n )\n }\n />\n </LocalizationProvider>\n );\n};\n\nPicker.defaultProps = {\n isRequired: false,\n meta: { isTouched: false, error: false },\n locale: undefined, // Default to english\n parse: value => (value === '' ? null : value) // Avoid saving an empty string in the dataset\n};\n\nconst sanitizeRestProps = ({\n allowEmpty,\n alwaysOn,\n component,\n defaultValue,\n format,\n formClassName,\n initialValue,\n initializeForm,\n input,\n isRequired,\n label,\n limitChoicesToValue,\n locale,\n meta,\n options,\n optionText,\n optionValue,\n parse,\n source,\n textAlign,\n translate,\n translateChoice,\n labelTime,\n ...rest\n}) => rest;\n\n\nexport default Picker;\n","import React, { useMemo, useCallback } from 'react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport { useListContext, useCreatePath } from 'react-admin';\n\nconst useFullCalendarProps = ({ label, startDate, endDate, linkType }) => {\n const { data, isLoading, resource } = useListContext();\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const createPath = useCreatePath();\n\n let query = new URLSearchParams(location.search);\n\n // Bypass the link in order to use React-Router\n const eventClick = useCallback(({ event, jsEvent }) => {\n jsEvent.preventDefault();\n navigate(event.url);\n }, []);\n\n // Change the query string when month change\n const datesSet = useCallback(\n ({ view }) => {\n setSearchParams(params => ({ ...params, month: view.currentStart.getMonth() + 1, year: view.currentStart.getFullYear() }));\n },\n [setSearchParams]\n );\n\n const events = useMemo(\n () =>\n !isLoading &&\n data\n .filter(record => record)\n .map(record => ({\n id: record.id,\n title: typeof label === 'string' ? record[label] : label(record),\n start: typeof startDate === 'string' ? record[startDate] : startDate(record),\n end: typeof endDate === 'string' ? record[endDate] : endDate(record),\n url: createPath({ resource, id: record.id, type: linkType })\n })),\n [isLoading, data, resource, createPath]\n );\n\n return {\n initialDate: query.has('month') ? new Date(query.get('year'), query.get('month') - 1) : new Date(),\n events,\n datesSet,\n eventClick\n };\n};\n\nexport default useFullCalendarProps;\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport { useTheme } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: theme.palette.primary.main + ' !important',\n border: 'none !important',\n opacity: '1 !important'\n },\n '.fc-day-today': {\n backgroundColor: theme.palette.secondary.light + ' !important'\n },\n // Overwrite violet color of links\n 'a.fc-daygrid-dot-event': {\n color: 'black !important'\n }\n }\n}));\n\nconst CalendarList = props => {\n const theme = useTheme();\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return (\n <FullCalendar\n plugins={[dayGridPlugin]}\n locale={props.locale}\n initialView=\"dayGridMonth\"\n eventBackgroundColor={theme.palette.primary.main}\n {...fullCalendarProps}\n />\n );\n};\n\nCalendarList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default CalendarList;\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport listPlugin from '@fullcalendar/list';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: theme.palette.primary.main + ' !important',\n border: 'none !important',\n opacity: '1 !important'\n }\n }\n}));\n\nconst DaysList = props => {\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return <FullCalendar plugins={[listPlugin]} locale={props.locale} initialView=\"listMonth\" {...fullCalendarProps} />;\n};\n\nDaysList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default DaysList;\n","import React from 'react';\nimport Picker from './Picker';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\n\nconst DateInput = props => <Picker PickerComponent={DatePicker} {...props} />;\nconst TimeInput = props => <Picker PickerComponent={TimePicker} {...props} />;\nconst DateTimeInput = props => <Picker PickerComponent={DateTimePicker} {...props} />;\n\nexport { DateInput, TimeInput, DateTimeInput };\n\nexport { default as CalendarList } from './CalendarList';\nexport { default as DaysList } from './DaysList';\nexport { default as useFullCalendarProps } from './useFullCalendarProps';\n"],"names":["leftPad","nb","value","repeat","slice","leftPad4","leftPad2","dateTimeRegex","convertDateToString","Date","isNaN","getDate","yy","getFullYear","MM","getMonth","dd","hh","getHours","mm","getMinutes","concat","dateTimeFormatter","test","dateTimeParser","Picker","_ref","PickerComponent","_ref$format","format","label","source","helperText","onBlur","onChange","onFocus","_ref$parse","parse","validate","defaultValue","locale","pickerVariant","_ref$stringFormat","stringFormat","allowClear","rest","_objectWithoutProperties","_excluded","_useInput","useInput","_objectSpread","field","isRequired","_useInput$fieldState","fieldState","error","isTouched","handleChange","useCallback","toISOString","toString","React","LocalizationProvider","dateAdapter","AdapterDateFns","adapterLocale","_extends","FieldTitle","slotProps","textField","InputHelperText","touched","sanitizeRestProps","defaultProps","meta","undefined","_ref2","allowEmpty","alwaysOn","component","formClassName","initialValue","initializeForm","input","limitChoicesToValue","options","optionText","optionValue","textAlign","translate","translateChoice","labelTime","_excluded2","useFullCalendarProps","startDate","endDate","linkType","_useListContext","useListContext","data","isLoading","resource","_useSearchParams2","_slicedToArray","useSearchParams","setSearchParams","navigate","useNavigate","createPath","useCreatePath","query","URLSearchParams","location","search","eventClick","event","jsEvent","preventDefault","url","datesSet","_ref3","view","params","month","currentStart","year","events","useMemo","filter","record","map","id","title","start","end","type","initialDate","has","get","useGlobalStyles","makeStyles","theme","@global",".fc-button","backgroundColor","palette","primary","main","border","opacity",".fc-day-today","secondary","light","a.fc-daygrid-dot-event","color","CalendarList","props","useTheme","fullCalendarProps","FullCalendar","plugins","dayGridPlugin","initialView","eventBackgroundColor","DaysList","listPlugin","DateInput","DatePicker","TimeInput","TimePicker","DateTimeInput","DateTimePicker"],"mappings":"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"}
1
+ {"mappings":"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","sources":["packages/date-components/src/index.js","packages/date-components/src/Picker.js","packages/date-components/src/utils.js","packages/date-components/src/CalendarList.js","packages/date-components/src/useFullCalendarProps.js","packages/date-components/src/DaysList.js"],"sourcesContent":["import React from 'react';\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\nimport Picker from './Picker';\n\nconst DateInput = props => <Picker PickerComponent={DatePicker} {...props} />;\nconst TimeInput = props => <Picker PickerComponent={TimePicker} {...props} />;\nconst DateTimeInput = props => <Picker PickerComponent={DateTimePicker} {...props} />;\n\nexport { DateInput, TimeInput, DateTimeInput };\n\nexport { default as CalendarList } from './CalendarList';\nexport { default as DaysList } from './DaysList';\nexport { default as useFullCalendarProps } from './useFullCalendarProps';\n","import React, { useCallback } from 'react';\nimport { useInput, FieldTitle, InputHelperText } from 'react-admin';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { dateTimeFormatter, dateTimeParser } from './utils';\n\nconst Picker = ({\n PickerComponent,\n format = dateTimeFormatter,\n label,\n source,\n helperText,\n onBlur,\n onChange,\n onFocus,\n parse = dateTimeParser,\n validate,\n defaultValue,\n locale,\n pickerVariant = 'dialog',\n stringFormat = 'ISO',\n allowClear,\n ...rest\n}) => {\n const {\n field,\n isRequired,\n fieldState: { error, isTouched }\n } = useInput({\n format,\n onBlur,\n onChange,\n onFocus,\n parse,\n source,\n validate,\n ...rest\n });\n\n const handleChange = useCallback(value => {\n Date.parse(value)\n ? field.onChange(stringFormat === 'ISO' ? value.toISOString() : value.toString())\n : field.onChange(null);\n }, []);\n\n return (\n <LocalizationProvider dateAdapter={AdapterDateFns} adapterLocale={locale}>\n <PickerComponent\n label={<FieldTitle label={label} source={source} isRequired={isRequired} />}\n error={!!(isTouched && error)}\n slotProps={{\n textField: {\n helperText: <InputHelperText touched={isTouched} error={error} helperText={helperText} />\n }\n }}\n {...sanitizeRestProps(rest)}\n value={field.value ? new Date(field.value) : null}\n onChange={handleChange}\n onBlur={() =>\n field.onBlur(\n field.value\n ? stringFormat === 'ISO'\n ? new Date(field.value).toISOString()\n : new Date(field.value).toString()\n : null\n )\n }\n />\n </LocalizationProvider>\n );\n};\n\nPicker.defaultProps = {\n isRequired: false,\n meta: { isTouched: false, error: false },\n locale: undefined, // Default to english\n parse: value => (value === '' ? null : value) // Avoid saving an empty string in the dataset\n};\n\nconst sanitizeRestProps = ({\n allowEmpty,\n alwaysOn,\n component,\n defaultValue,\n format,\n formClassName,\n initialValue,\n initializeForm,\n input,\n isRequired,\n label,\n limitChoicesToValue,\n locale,\n meta,\n options,\n optionText,\n optionValue,\n parse,\n source,\n textAlign,\n translate,\n translateChoice,\n labelTime,\n ...rest\n}) => rest;\n\nexport default Picker;\n","const leftPad =\n (nb = 2) =>\n value =>\n ('0'.repeat(nb) + value).slice(-nb);\nconst leftPad4 = leftPad(4);\nconst leftPad2 = leftPad(2);\n\n// yyyy-MM-ddThh:mm\nconst dateTimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n\n/**\n * @param {Date} value value to convert\n * @returns {string} A standardized datetime (yyyy-MM-ddThh:mm), to be passed to an <input type=\"datetime-local\" />\n */\nconst convertDateToString = value => {\n if (!(value instanceof Date) || isNaN(value.getDate())) {\n return '';\n }\n\n const yy = leftPad4(value.getFullYear());\n const MM = leftPad2(value.getMonth() + 1);\n const dd = leftPad2(value.getDate());\n const hh = leftPad2(value.getHours());\n const mm = leftPad2(value.getMinutes());\n return `${yy}-${MM}-${dd}T${hh}:${mm}`;\n};\n\n/**\n * Converts a date from the Redux store, with timezone, to a date string\n * without timezone for use in an <input type=\"datetime-local\" />.\n * @param {Date | string} value date string or object\n */\nexport const dateTimeFormatter = value => {\n // null, undefined and empty string values should not go through convertDateToString\n // otherwise, it returns undefined and will make the input an uncontrolled one.\n if (value == null || value === '') {\n return '';\n }\n\n if (value instanceof Date) {\n return convertDateToString(value);\n }\n\n // valid dates should not be converted\n if (dateTimeRegex.test(value)) {\n return value;\n }\n\n return convertDateToString(new Date(value));\n};\n\n/**\n * Converts a datetime string without timezone to a date object\n * with timezone, using the browser timezone.\n * @param {string} value Date string, formatted as yyyy-MM-ddThh:mm\n * @returns {Date}\n */\nexport const dateTimeParser = value => (value ? new Date(value) : '');\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport dayGridPlugin from '@fullcalendar/daygrid';\nimport { useTheme } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: `${theme.palette.primary.main} !important`,\n border: 'none !important',\n opacity: '1 !important'\n },\n '.fc-day-today': {\n backgroundColor: `${theme.palette.secondary.light} !important`\n },\n // Overwrite violet color of links\n 'a.fc-daygrid-dot-event': {\n color: 'black !important'\n }\n }\n}));\n\nconst CalendarList = props => {\n const theme = useTheme();\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return (\n <FullCalendar\n plugins={[dayGridPlugin]}\n locale={props.locale}\n initialView=\"dayGridMonth\"\n eventBackgroundColor={theme.palette.primary.main}\n {...fullCalendarProps}\n />\n );\n};\n\nCalendarList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default CalendarList;\n","import React, { useMemo, useCallback } from 'react';\nimport { useSearchParams, useNavigate } from 'react-router-dom';\nimport { useListContext, useCreatePath } from 'react-admin';\n\nconst useFullCalendarProps = ({ label, startDate, endDate, linkType }) => {\n const { data, isLoading, resource } = useListContext();\n const [searchParams, setSearchParams] = useSearchParams();\n const navigate = useNavigate();\n const createPath = useCreatePath();\n\n const query = new URLSearchParams(location.search);\n\n // Bypass the link in order to use React-Router\n const eventClick = useCallback(({ event, jsEvent }) => {\n jsEvent.preventDefault();\n navigate(event.url);\n }, []);\n\n // Change the query string when month change\n const datesSet = useCallback(\n ({ view }) => {\n setSearchParams(params => ({\n ...params,\n month: view.currentStart.getMonth() + 1,\n year: view.currentStart.getFullYear()\n }));\n },\n [setSearchParams]\n );\n\n const events = useMemo(\n () =>\n !isLoading &&\n data\n .filter(record => record)\n .map(record => ({\n id: record.id,\n title: typeof label === 'string' ? record[label] : label(record),\n start: typeof startDate === 'string' ? record[startDate] : startDate(record),\n end: typeof endDate === 'string' ? record[endDate] : endDate(record),\n url: createPath({ resource, id: record.id, type: linkType })\n })),\n [isLoading, data, resource, createPath]\n );\n\n return {\n initialDate: query.has('month') ? new Date(query.get('year'), query.get('month') - 1) : new Date(),\n events,\n datesSet,\n eventClick\n };\n};\n\nexport default useFullCalendarProps;\n","import React from 'react';\nimport FullCalendar from '@fullcalendar/react';\nimport listPlugin from '@fullcalendar/list';\nimport makeStyles from '@mui/styles/makeStyles';\nimport useFullCalendarProps from './useFullCalendarProps';\n\nconst useGlobalStyles = makeStyles(theme => ({\n '@global': {\n '.fc-button': {\n backgroundColor: `${theme.palette.primary.main} !important`,\n border: 'none !important',\n opacity: '1 !important'\n }\n }\n}));\n\nconst DaysList = props => {\n const fullCalendarProps = useFullCalendarProps(props);\n useGlobalStyles();\n\n return <FullCalendar plugins={[listPlugin]} locale={props.locale} initialView=\"listMonth\" {...fullCalendarProps} />;\n};\n\nDaysList.defaultProps = {\n linkType: 'edit'\n};\n\nexport default DaysList;\n"],"names":[],"version":3,"file":"index.es.js.map"}
package/package.json CHANGED
@@ -1,17 +1,18 @@
1
1
  {
2
2
  "name": "@semapps/date-components",
3
- "version": "0.5.2",
3
+ "version": "0.6.0-alpha.0",
4
4
  "description": "React-Admin components for date display and input",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Virtual Assembly",
7
+ "source": "src/index.js",
7
8
  "main": "dist/index.cjs.js",
8
9
  "module": "dist/index.es.js",
9
10
  "files": [
10
11
  "dist"
11
12
  ],
12
13
  "scripts": {
13
- "pre-publish": "rollup --sourcemap --config",
14
- "dev": "rollup --watch --sourcemap --config"
14
+ "build": "parcel build",
15
+ "watch": "parcel watch"
15
16
  },
16
17
  "dependencies": {
17
18
  "@fullcalendar/core": "^5.7.2",
@@ -22,24 +23,17 @@
22
23
  "date-fns": "~2.8.1"
23
24
  },
24
25
  "peerDependencies": {
26
+ "@mui/material": "^5.13.1",
27
+ "@mui/styles": "^5.13.1",
25
28
  "react": "^18.2.0",
26
- "react-admin": "^4.11.0"
29
+ "react-admin": "^4.11.0",
30
+ "react-router-dom": "^6.1.0"
27
31
  },
28
32
  "publishConfig": {
29
33
  "access": "public"
30
34
  },
31
35
  "devDependencies": {
32
- "@babel/core": "^7.9.6",
33
- "@babel/preset-env": "^7.9.6",
34
- "@babel/preset-react": "^7.9.4",
35
- "rollup": "^2.7.6",
36
- "rollup-plugin-babel": "^4.4.0",
37
- "rollup-plugin-commonjs": "^10.1.0",
38
- "rollup-plugin-json": "^4.0.0",
39
- "rollup-plugin-node-resolve": "^5.2.0",
40
- "rollup-plugin-replace": "^2.2.0",
41
- "rollup-plugin-terser": "^5.3.0",
42
- "rollup-pluginutils": "^2.8.2"
36
+ "parcel": "^2.9.3"
43
37
  },
44
- "gitHead": "6a862e0f78bf73680a38daa07a73d3e987b038a0"
38
+ "gitHead": "237f139526a181db8b95bf1801e46168277094f3"
45
39
  }