@semapps/date-components 0.5.3 → 0.6.0-alpha.1

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,235 @@
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 $3RhHq$reactjsxruntime = require("react/jsx-runtime");
2
+ var $3RhHq$muixdatepickersDatePicker = require("@mui/x-date-pickers/DatePicker");
3
+ var $3RhHq$muixdatepickersTimePicker = require("@mui/x-date-pickers/TimePicker");
4
+ var $3RhHq$muixdatepickersDateTimePicker = require("@mui/x-date-pickers/DateTimePicker");
5
+ var $3RhHq$react = require("react");
6
+ var $3RhHq$reactadmin = require("react-admin");
7
+ var $3RhHq$muixdatepickersLocalizationProvider = require("@mui/x-date-pickers/LocalizationProvider");
8
+ var $3RhHq$muixdatepickersAdapterDateFns = require("@mui/x-date-pickers/AdapterDateFns");
9
+ var $3RhHq$fullcalendarreact = require("@fullcalendar/react");
10
+ var $3RhHq$fullcalendardaygrid = require("@fullcalendar/daygrid");
11
+ var $3RhHq$muimaterial = require("@mui/material");
12
+ var $3RhHq$muistylesmakeStyles = require("@mui/styles/makeStyles");
13
+ var $3RhHq$reactrouterdom = require("react-router-dom");
14
+ var $3RhHq$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", () => $0ec82123656742c1$export$7edc06cf1783b30f);
24
+ $parcel$export(module.exports, "TimeInput", () => $0ec82123656742c1$export$a1af6f79df847fac);
25
+ $parcel$export(module.exports, "DateTimeInput", () => $0ec82123656742c1$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
+ /* eslint-disable react/react-in-jsx-scope */ /* eslint-disable react/jsx-props-no-spreading */
30
+
31
+
32
+
33
+ /* eslint-disable react/react-in-jsx-scope */ /* eslint-disable react/require-default-props */
34
+
35
+
36
+
37
+
38
+ const $c332daa71b957685$var$Picker = ({ PickerComponent: PickerComponent, label: label, source: source, helperText: helperText, fullWidth: fullWidth, onBlur: onBlur, onChange: onChange, format: format, parse: parse, validate: validate, defaultValue: defaultValue, locale: locale, translations: translations, stringFormat: stringFormat = "ISO", ...rest })=>{
39
+ const { field: field, isRequired: isRequired, fieldState: { error: error, isTouched: isTouched, invalid: invalid }, formState: { isSubmitted: isSubmitted } } = (0, $3RhHq$reactadmin.useInput)({
40
+ format: format,
41
+ onBlur: onBlur,
42
+ onChange: onChange,
43
+ parse: parse,
44
+ source: source,
45
+ validate: validate,
46
+ defaultValue: defaultValue
47
+ });
48
+ const handleChange = (0, $3RhHq$react.useCallback)((value)=>{
49
+ if (value instanceof Date) field.onChange(stringFormat === "ISO" ? value.toISOString() : value.toString());
50
+ else field.onChange(null);
51
+ }, [
52
+ field,
53
+ stringFormat
54
+ ]);
55
+ const translateLabel = (0, $3RhHq$reactadmin.useTranslateLabel)();
56
+ const translatedLabel = /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsxs)("span", {
57
+ children: [
58
+ translateLabel({
59
+ label: label,
60
+ source: source
61
+ }),
62
+ isRequired && /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)("span", {
63
+ "aria-hidden": "true",
64
+ children: " *"
65
+ })
66
+ ]
67
+ });
68
+ return /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, $3RhHq$muixdatepickersLocalizationProvider.LocalizationProvider), {
69
+ dateAdapter: (0, $3RhHq$muixdatepickersAdapterDateFns.AdapterDateFns),
70
+ adapterLocale: locale,
71
+ localeText: translations?.components.MuiLocalizationProvider.defaultProps.localeText,
72
+ children: /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)(PickerComponent, {
73
+ label: translatedLabel,
74
+ slotProps: {
75
+ textField: {
76
+ error: (isTouched || isSubmitted) && invalid,
77
+ size: "small",
78
+ fullWidth: fullWidth,
79
+ helperText: /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, $3RhHq$reactadmin.InputHelperText), {
80
+ touched: isTouched || isSubmitted,
81
+ error: error?.message,
82
+ helperText: helperText
83
+ })
84
+ }
85
+ },
86
+ value: field.value ? new Date(field.value) : null,
87
+ onChange: handleChange,
88
+ ...rest
89
+ })
90
+ });
91
+ };
92
+ var $c332daa71b957685$export$2e2bcd8739ae039 = $c332daa71b957685$var$Picker;
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+ const $c8dbd8ec3b8f34cc$var$useFullCalendarProps = ({ label: label, startDate: startDate, endDate: endDate, linkType: linkType })=>{
105
+ const { data: data, isLoading: isLoading, resource: resource } = (0, $3RhHq$reactadmin.useListContext)();
106
+ const [searchParams, setSearchParams] = (0, $3RhHq$reactrouterdom.useSearchParams)();
107
+ const navigate = (0, $3RhHq$reactrouterdom.useNavigate)();
108
+ const createPath = (0, $3RhHq$reactadmin.useCreatePath)();
109
+ const query = new URLSearchParams(location.search);
110
+ // Bypass the link in order to use React-Router
111
+ const eventClick = (0, $3RhHq$react.useCallback)(({ event: event, jsEvent: jsEvent })=>{
112
+ jsEvent.preventDefault();
113
+ navigate(event.url);
114
+ }, []);
115
+ // Change the query string when month change
116
+ const datesSet = (0, $3RhHq$react.useCallback)(({ view: view })=>{
117
+ setSearchParams((params)=>({
118
+ ...params,
119
+ month: view.currentStart.getMonth() + 1,
120
+ year: view.currentStart.getFullYear()
121
+ }));
122
+ }, [
123
+ setSearchParams
124
+ ]);
125
+ const events = (0, $3RhHq$react.useMemo)(()=>!isLoading && data.filter((record)=>record).map((record)=>({
126
+ id: record.id,
127
+ title: typeof label === "string" ? record[label] : label(record),
128
+ start: typeof startDate === "string" ? record[startDate] : startDate(record),
129
+ end: typeof endDate === "string" ? record[endDate] : endDate(record),
130
+ url: createPath({
131
+ resource: resource,
132
+ id: record.id,
133
+ type: linkType
134
+ })
135
+ })), [
136
+ isLoading,
137
+ data,
138
+ resource,
139
+ createPath
140
+ ]);
141
+ return {
142
+ initialDate: query.has("month") ? new Date(query.get("year"), query.get("month") - 1) : new Date(),
143
+ events: events,
144
+ datesSet: datesSet,
145
+ eventClick: eventClick
146
+ };
147
+ };
148
+ var $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039 = $c8dbd8ec3b8f34cc$var$useFullCalendarProps;
149
+
150
+
151
+ const $563c84827e91e322$var$useGlobalStyles = (0, ($parcel$interopDefault($3RhHq$muistylesmakeStyles)))((theme)=>({
152
+ "@global": {
153
+ ".fc-button": {
154
+ backgroundColor: `${theme.palette.primary.main} !important`,
155
+ border: "none !important",
156
+ opacity: "1 !important"
157
+ },
158
+ ".fc-day-today": {
159
+ backgroundColor: `${theme.palette.secondary.light} !important`
160
+ },
161
+ // Overwrite violet color of links
162
+ "a.fc-daygrid-dot-event": {
163
+ color: "black !important"
164
+ }
165
+ }
166
+ }));
167
+ const $563c84827e91e322$var$CalendarList = (props)=>{
168
+ const theme = (0, $3RhHq$muimaterial.useTheme)();
169
+ const fullCalendarProps = (0, $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039)(props);
170
+ $563c84827e91e322$var$useGlobalStyles();
171
+ return /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, ($parcel$interopDefault($3RhHq$fullcalendarreact))), {
172
+ plugins: [
173
+ (0, ($parcel$interopDefault($3RhHq$fullcalendardaygrid)))
174
+ ],
175
+ locale: props.locale,
176
+ initialView: "dayGridMonth",
177
+ eventBackgroundColor: theme.palette.primary.main,
178
+ ...fullCalendarProps
179
+ });
180
+ };
181
+ $563c84827e91e322$var$CalendarList.defaultProps = {
182
+ linkType: "edit"
183
+ };
184
+ var $563c84827e91e322$export$2e2bcd8739ae039 = $563c84827e91e322$var$CalendarList;
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+ const $5379d12b87e743a4$var$useGlobalStyles = (0, ($parcel$interopDefault($3RhHq$muistylesmakeStyles)))((theme)=>({
194
+ "@global": {
195
+ ".fc-button": {
196
+ backgroundColor: `${theme.palette.primary.main} !important`,
197
+ border: "none !important",
198
+ opacity: "1 !important"
199
+ }
200
+ }
201
+ }));
202
+ const $5379d12b87e743a4$var$DaysList = (props)=>{
203
+ const fullCalendarProps = (0, $c8dbd8ec3b8f34cc$export$2e2bcd8739ae039)(props);
204
+ $5379d12b87e743a4$var$useGlobalStyles();
205
+ return /*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, ($parcel$interopDefault($3RhHq$fullcalendarreact))), {
206
+ plugins: [
207
+ (0, ($parcel$interopDefault($3RhHq$fullcalendarlist)))
208
+ ],
209
+ locale: props.locale,
210
+ initialView: "listMonth",
211
+ ...fullCalendarProps
212
+ });
213
+ };
214
+ $5379d12b87e743a4$var$DaysList.defaultProps = {
215
+ linkType: "edit"
216
+ };
217
+ var $5379d12b87e743a4$export$2e2bcd8739ae039 = $5379d12b87e743a4$var$DaysList;
218
+
219
+
220
+
221
+ const $0ec82123656742c1$export$7edc06cf1783b30f = (props)=>/*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, $c332daa71b957685$export$2e2bcd8739ae039), {
222
+ PickerComponent: (0, $3RhHq$muixdatepickersDatePicker.DatePicker),
223
+ ...props
224
+ });
225
+ const $0ec82123656742c1$export$a1af6f79df847fac = (props)=>/*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, $c332daa71b957685$export$2e2bcd8739ae039), {
226
+ PickerComponent: (0, $3RhHq$muixdatepickersTimePicker.TimePicker),
227
+ ...props
228
+ });
229
+ const $0ec82123656742c1$export$183478aa40b5df1 = (props)=>/*#__PURE__*/ (0, $3RhHq$reactjsxruntime.jsx)((0, $c332daa71b957685$export$2e2bcd8739ae039), {
230
+ PickerComponent: (0, $3RhHq$muixdatepickersDateTimePicker.DateTimePicker),
231
+ ...props
232
+ });
233
+
234
+
2
235
  //# 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.tsx","packages/date-components/src/Picker.tsx","packages/date-components/src/CalendarList.js","packages/date-components/src/useFullCalendarProps.js","packages/date-components/src/DaysList.js"],"sourcesContent":["/* eslint-disable react/react-in-jsx-scope */\n/* eslint-disable react/jsx-props-no-spreading */\nimport { DatePicker, DatePickerProps } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker, TimePickerProps } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker, DateTimePickerProps } from '@mui/x-date-pickers/DateTimePicker';\nimport Picker, { Props as PickerProps } from './Picker';\n\nconst DateInput = <TDate,>(props: Omit<PickerProps<DatePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={DatePicker} {...props} />\n);\nconst TimeInput = <TDate,>(props: Omit<PickerProps<TimePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={TimePicker} {...props} />\n);\nconst DateTimeInput = <TDate,>(props: Omit<PickerProps<DateTimePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={DateTimePicker} {...props} />\n);\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","/* eslint-disable react/react-in-jsx-scope */\n/* eslint-disable react/require-default-props */\nimport { useCallback, ComponentType } from 'react';\nimport { useInput, InputHelperText, TextInputProps, useTranslateLabel } from 'react-admin';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { getPickersLocalization } from '@mui/x-date-pickers/locales/utils/getPickersLocalization';\nimport { Locale } from 'date-fns';\n\nexport type Props<PickerProps> = TextInputProps &\n Omit<PickerProps, 'format'> & {\n PickerComponent: ComponentType;\n locale?: Locale;\n translations?: ReturnType<typeof getPickersLocalization>;\n stringFormat?: string;\n };\n\nconst Picker = <PickerProps,>({\n PickerComponent,\n label,\n source,\n helperText,\n fullWidth,\n onBlur,\n onChange,\n format,\n parse,\n validate,\n defaultValue,\n locale,\n translations,\n stringFormat = 'ISO',\n ...rest\n}: Props<PickerProps>) => {\n const {\n field,\n isRequired,\n fieldState: { error, isTouched, invalid },\n formState: { isSubmitted }\n } = useInput({\n format,\n onBlur,\n onChange,\n parse,\n source,\n validate,\n defaultValue\n });\n\n const handleChange = useCallback(\n (value: Date) => {\n if (value instanceof Date) {\n field.onChange(stringFormat === 'ISO' ? value.toISOString() : value.toString());\n } else {\n field.onChange(null);\n }\n },\n [field, stringFormat]\n );\n\n const translateLabel = useTranslateLabel();\n const translatedLabel = (\n <span>\n {translateLabel({\n label,\n source\n })}\n {isRequired && <span aria-hidden=\"true\">&thinsp;*</span>}\n </span>\n );\n\n return (\n <LocalizationProvider\n dateAdapter={AdapterDateFns}\n adapterLocale={locale}\n localeText={translations?.components.MuiLocalizationProvider.defaultProps.localeText}\n >\n <PickerComponent\n label={translatedLabel}\n slotProps={{\n textField: {\n error: (isTouched || isSubmitted) && invalid,\n size: 'small',\n fullWidth,\n helperText: (\n <InputHelperText touched={isTouched || isSubmitted} error={error?.message} helperText={helperText} />\n )\n }\n }}\n value={field.value ? new Date(field.value) : null}\n onChange={handleChange}\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...rest}\n />\n </LocalizationProvider>\n );\n};\n\nexport default Picker;\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"}
@@ -0,0 +1,59 @@
1
+ import { ComponentType } from 'react';
2
+ import { TextInputProps } from 'react-admin';
3
+ import { getPickersLocalization } from '@mui/x-date-pickers/locales/utils/getPickersLocalization';
4
+ import { Locale } from 'date-fns';
5
+ import { DatePickerProps } from '@mui/x-date-pickers/DatePicker';
6
+ import { TimePickerProps } from '@mui/x-date-pickers/TimePicker';
7
+ import { DateTimePickerProps } from '@mui/x-date-pickers/DateTimePicker';
8
+ type Props<PickerProps> = TextInputProps &
9
+ Omit<PickerProps, 'format'> & {
10
+ PickerComponent: ComponentType;
11
+ locale?: Locale;
12
+ translations?: ReturnType<typeof getPickersLocalization>;
13
+ stringFormat?: string;
14
+ };
15
+ export function useFullCalendarProps({
16
+ label,
17
+ startDate,
18
+ endDate,
19
+ linkType
20
+ }: {
21
+ label: any;
22
+ startDate: any;
23
+ endDate: any;
24
+ linkType: any;
25
+ }): {
26
+ initialDate: Date;
27
+ events:
28
+ | false
29
+ | {
30
+ id: any;
31
+ title: any;
32
+ start: any;
33
+ end: any;
34
+ url: string;
35
+ }[];
36
+ datesSet: ({ view }: { view: any }) => void;
37
+ eventClick: ({ event, jsEvent }: { event: any; jsEvent: any }) => void;
38
+ };
39
+ declare namespace CalendarList {
40
+ namespace defaultProps {
41
+ let linkType: string;
42
+ }
43
+ }
44
+ declare namespace DaysList {
45
+ namespace defaultProps {
46
+ let linkType: string;
47
+ }
48
+ }
49
+ export const DateInput: <TDate>(
50
+ props: Omit<Props<DatePickerProps<TDate>>, 'PickerComponent'>
51
+ ) => import('react/jsx-runtime').JSX.Element;
52
+ export const TimeInput: <TDate>(
53
+ props: Omit<Props<TimePickerProps<TDate>>, 'PickerComponent'>
54
+ ) => import('react/jsx-runtime').JSX.Element;
55
+ export const DateTimeInput: <TDate>(
56
+ props: Omit<Props<DateTimePickerProps<TDate>>, 'PickerComponent'>
57
+ ) => import('react/jsx-runtime').JSX.Element;
58
+
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"mappings":";;;;;;;AASA,WAAkB,WAAW,IAAI,cAAc,GAC7C,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG;IAC5B,eAAe,EAAE,aAAa,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;ACXJ;;;;;;;;;;;;;;;;;;;;;EA+CC;;;;;;;;;;;AG5CD,OAAA,MAAM,4HAEL,CAAC;AACF,OAAA,MAAM,4HAEL,CAAC;AACF,OAAA,MAAM,oIAEL,CAAC","sources":["packages/date-components/src/src/Picker.tsx","packages/date-components/src/src/useFullCalendarProps.js","packages/date-components/src/src/CalendarList.js","packages/date-components/src/src/DaysList.js","packages/date-components/src/src/index.tsx","packages/date-components/src/index.tsx"],"sourcesContent":[null,null,null,null,null,"/* eslint-disable react/react-in-jsx-scope */\n/* eslint-disable react/jsx-props-no-spreading */\nimport { DatePicker, DatePickerProps } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker, TimePickerProps } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker, DateTimePickerProps } from '@mui/x-date-pickers/DateTimePicker';\nimport Picker, { Props as PickerProps } from './Picker';\n\nconst DateInput = <TDate,>(props: Omit<PickerProps<DatePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={DatePicker} {...props} />\n);\nconst TimeInput = <TDate,>(props: Omit<PickerProps<TimePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={TimePicker} {...props} />\n);\nconst DateTimeInput = <TDate,>(props: Omit<PickerProps<DateTimePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={DateTimePicker} {...props} />\n);\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":[],"version":3,"file":"index.d.ts.map"}
package/dist/index.es.js CHANGED
@@ -1,2 +1,223 @@
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 $5Ihaz$jsx, jsxs as $5Ihaz$jsxs} from "react/jsx-runtime";
2
+ import {DatePicker as $5Ihaz$DatePicker} from "@mui/x-date-pickers/DatePicker";
3
+ import {TimePicker as $5Ihaz$TimePicker} from "@mui/x-date-pickers/TimePicker";
4
+ import {DateTimePicker as $5Ihaz$DateTimePicker} from "@mui/x-date-pickers/DateTimePicker";
5
+ import {useCallback as $5Ihaz$useCallback, useMemo as $5Ihaz$useMemo} from "react";
6
+ import {useInput as $5Ihaz$useInput, useTranslateLabel as $5Ihaz$useTranslateLabel, InputHelperText as $5Ihaz$InputHelperText, useListContext as $5Ihaz$useListContext, useCreatePath as $5Ihaz$useCreatePath} from "react-admin";
7
+ import {LocalizationProvider as $5Ihaz$LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider";
8
+ import {AdapterDateFns as $5Ihaz$AdapterDateFns} from "@mui/x-date-pickers/AdapterDateFns";
9
+ import $5Ihaz$fullcalendarreact from "@fullcalendar/react";
10
+ import $5Ihaz$fullcalendardaygrid from "@fullcalendar/daygrid";
11
+ import {useTheme as $5Ihaz$useTheme} from "@mui/material";
12
+ import $5Ihaz$muistylesmakeStyles from "@mui/styles/makeStyles";
13
+ import {useSearchParams as $5Ihaz$useSearchParams, useNavigate as $5Ihaz$useNavigate} from "react-router-dom";
14
+ import $5Ihaz$fullcalendarlist from "@fullcalendar/list";
15
+
16
+ /* eslint-disable react/react-in-jsx-scope */ /* eslint-disable react/jsx-props-no-spreading */
17
+
18
+
19
+
20
+ /* eslint-disable react/react-in-jsx-scope */ /* eslint-disable react/require-default-props */
21
+
22
+
23
+
24
+
25
+ const $610808f89222f9cc$var$Picker = ({ PickerComponent: PickerComponent, label: label, source: source, helperText: helperText, fullWidth: fullWidth, onBlur: onBlur, onChange: onChange, format: format, parse: parse, validate: validate, defaultValue: defaultValue, locale: locale, translations: translations, stringFormat: stringFormat = "ISO", ...rest })=>{
26
+ const { field: field, isRequired: isRequired, fieldState: { error: error, isTouched: isTouched, invalid: invalid }, formState: { isSubmitted: isSubmitted } } = (0, $5Ihaz$useInput)({
27
+ format: format,
28
+ onBlur: onBlur,
29
+ onChange: onChange,
30
+ parse: parse,
31
+ source: source,
32
+ validate: validate,
33
+ defaultValue: defaultValue
34
+ });
35
+ const handleChange = (0, $5Ihaz$useCallback)((value)=>{
36
+ if (value instanceof Date) field.onChange(stringFormat === "ISO" ? value.toISOString() : value.toString());
37
+ else field.onChange(null);
38
+ }, [
39
+ field,
40
+ stringFormat
41
+ ]);
42
+ const translateLabel = (0, $5Ihaz$useTranslateLabel)();
43
+ const translatedLabel = /*#__PURE__*/ (0, $5Ihaz$jsxs)("span", {
44
+ children: [
45
+ translateLabel({
46
+ label: label,
47
+ source: source
48
+ }),
49
+ isRequired && /*#__PURE__*/ (0, $5Ihaz$jsx)("span", {
50
+ "aria-hidden": "true",
51
+ children: " *"
52
+ })
53
+ ]
54
+ });
55
+ return /*#__PURE__*/ (0, $5Ihaz$jsx)((0, $5Ihaz$LocalizationProvider), {
56
+ dateAdapter: (0, $5Ihaz$AdapterDateFns),
57
+ adapterLocale: locale,
58
+ localeText: translations?.components.MuiLocalizationProvider.defaultProps.localeText,
59
+ children: /*#__PURE__*/ (0, $5Ihaz$jsx)(PickerComponent, {
60
+ label: translatedLabel,
61
+ slotProps: {
62
+ textField: {
63
+ error: (isTouched || isSubmitted) && invalid,
64
+ size: "small",
65
+ fullWidth: fullWidth,
66
+ helperText: /*#__PURE__*/ (0, $5Ihaz$jsx)((0, $5Ihaz$InputHelperText), {
67
+ touched: isTouched || isSubmitted,
68
+ error: error?.message,
69
+ helperText: helperText
70
+ })
71
+ }
72
+ },
73
+ value: field.value ? new Date(field.value) : null,
74
+ onChange: handleChange,
75
+ ...rest
76
+ })
77
+ });
78
+ };
79
+ var $610808f89222f9cc$export$2e2bcd8739ae039 = $610808f89222f9cc$var$Picker;
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+ const $37245c02f9b1b006$var$useFullCalendarProps = ({ label: label, startDate: startDate, endDate: endDate, linkType: linkType })=>{
92
+ const { data: data, isLoading: isLoading, resource: resource } = (0, $5Ihaz$useListContext)();
93
+ const [searchParams, setSearchParams] = (0, $5Ihaz$useSearchParams)();
94
+ const navigate = (0, $5Ihaz$useNavigate)();
95
+ const createPath = (0, $5Ihaz$useCreatePath)();
96
+ const query = new URLSearchParams(location.search);
97
+ // Bypass the link in order to use React-Router
98
+ const eventClick = (0, $5Ihaz$useCallback)(({ event: event, jsEvent: jsEvent })=>{
99
+ jsEvent.preventDefault();
100
+ navigate(event.url);
101
+ }, []);
102
+ // Change the query string when month change
103
+ const datesSet = (0, $5Ihaz$useCallback)(({ view: view })=>{
104
+ setSearchParams((params)=>({
105
+ ...params,
106
+ month: view.currentStart.getMonth() + 1,
107
+ year: view.currentStart.getFullYear()
108
+ }));
109
+ }, [
110
+ setSearchParams
111
+ ]);
112
+ const events = (0, $5Ihaz$useMemo)(()=>!isLoading && data.filter((record)=>record).map((record)=>({
113
+ id: record.id,
114
+ title: typeof label === "string" ? record[label] : label(record),
115
+ start: typeof startDate === "string" ? record[startDate] : startDate(record),
116
+ end: typeof endDate === "string" ? record[endDate] : endDate(record),
117
+ url: createPath({
118
+ resource: resource,
119
+ id: record.id,
120
+ type: linkType
121
+ })
122
+ })), [
123
+ isLoading,
124
+ data,
125
+ resource,
126
+ createPath
127
+ ]);
128
+ return {
129
+ initialDate: query.has("month") ? new Date(query.get("year"), query.get("month") - 1) : new Date(),
130
+ events: events,
131
+ datesSet: datesSet,
132
+ eventClick: eventClick
133
+ };
134
+ };
135
+ var $37245c02f9b1b006$export$2e2bcd8739ae039 = $37245c02f9b1b006$var$useFullCalendarProps;
136
+
137
+
138
+ const $abbcc02f55461290$var$useGlobalStyles = (0, $5Ihaz$muistylesmakeStyles)((theme)=>({
139
+ "@global": {
140
+ ".fc-button": {
141
+ backgroundColor: `${theme.palette.primary.main} !important`,
142
+ border: "none !important",
143
+ opacity: "1 !important"
144
+ },
145
+ ".fc-day-today": {
146
+ backgroundColor: `${theme.palette.secondary.light} !important`
147
+ },
148
+ // Overwrite violet color of links
149
+ "a.fc-daygrid-dot-event": {
150
+ color: "black !important"
151
+ }
152
+ }
153
+ }));
154
+ const $abbcc02f55461290$var$CalendarList = (props)=>{
155
+ const theme = (0, $5Ihaz$useTheme)();
156
+ const fullCalendarProps = (0, $37245c02f9b1b006$export$2e2bcd8739ae039)(props);
157
+ $abbcc02f55461290$var$useGlobalStyles();
158
+ return /*#__PURE__*/ (0, $5Ihaz$jsx)((0, $5Ihaz$fullcalendarreact), {
159
+ plugins: [
160
+ (0, $5Ihaz$fullcalendardaygrid)
161
+ ],
162
+ locale: props.locale,
163
+ initialView: "dayGridMonth",
164
+ eventBackgroundColor: theme.palette.primary.main,
165
+ ...fullCalendarProps
166
+ });
167
+ };
168
+ $abbcc02f55461290$var$CalendarList.defaultProps = {
169
+ linkType: "edit"
170
+ };
171
+ var $abbcc02f55461290$export$2e2bcd8739ae039 = $abbcc02f55461290$var$CalendarList;
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+ const $69d9f850452774a2$var$useGlobalStyles = (0, $5Ihaz$muistylesmakeStyles)((theme)=>({
181
+ "@global": {
182
+ ".fc-button": {
183
+ backgroundColor: `${theme.palette.primary.main} !important`,
184
+ border: "none !important",
185
+ opacity: "1 !important"
186
+ }
187
+ }
188
+ }));
189
+ const $69d9f850452774a2$var$DaysList = (props)=>{
190
+ const fullCalendarProps = (0, $37245c02f9b1b006$export$2e2bcd8739ae039)(props);
191
+ $69d9f850452774a2$var$useGlobalStyles();
192
+ return /*#__PURE__*/ (0, $5Ihaz$jsx)((0, $5Ihaz$fullcalendarreact), {
193
+ plugins: [
194
+ (0, $5Ihaz$fullcalendarlist)
195
+ ],
196
+ locale: props.locale,
197
+ initialView: "listMonth",
198
+ ...fullCalendarProps
199
+ });
200
+ };
201
+ $69d9f850452774a2$var$DaysList.defaultProps = {
202
+ linkType: "edit"
203
+ };
204
+ var $69d9f850452774a2$export$2e2bcd8739ae039 = $69d9f850452774a2$var$DaysList;
205
+
206
+
207
+
208
+ const $582746363a8b71b9$export$7edc06cf1783b30f = (props)=>/*#__PURE__*/ (0, $5Ihaz$jsx)((0, $610808f89222f9cc$export$2e2bcd8739ae039), {
209
+ PickerComponent: (0, $5Ihaz$DatePicker),
210
+ ...props
211
+ });
212
+ const $582746363a8b71b9$export$a1af6f79df847fac = (props)=>/*#__PURE__*/ (0, $5Ihaz$jsx)((0, $610808f89222f9cc$export$2e2bcd8739ae039), {
213
+ PickerComponent: (0, $5Ihaz$TimePicker),
214
+ ...props
215
+ });
216
+ const $582746363a8b71b9$export$183478aa40b5df1 = (props)=>/*#__PURE__*/ (0, $5Ihaz$jsx)((0, $610808f89222f9cc$export$2e2bcd8739ae039), {
217
+ PickerComponent: (0, $5Ihaz$DateTimePicker),
218
+ ...props
219
+ });
220
+
221
+
222
+ export {$582746363a8b71b9$export$7edc06cf1783b30f as DateInput, $582746363a8b71b9$export$a1af6f79df847fac as TimeInput, $582746363a8b71b9$export$183478aa40b5df1 as DateTimeInput, $abbcc02f55461290$export$2e2bcd8739ae039 as CalendarList, $69d9f850452774a2$export$2e2bcd8739ae039 as DaysList, $37245c02f9b1b006$export$2e2bcd8739ae039 as useFullCalendarProps};
2
223
  //# 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.tsx","packages/date-components/src/Picker.tsx","packages/date-components/src/CalendarList.js","packages/date-components/src/useFullCalendarProps.js","packages/date-components/src/DaysList.js"],"sourcesContent":["/* eslint-disable react/react-in-jsx-scope */\n/* eslint-disable react/jsx-props-no-spreading */\nimport { DatePicker, DatePickerProps } from '@mui/x-date-pickers/DatePicker';\nimport { TimePicker, TimePickerProps } from '@mui/x-date-pickers/TimePicker';\nimport { DateTimePicker, DateTimePickerProps } from '@mui/x-date-pickers/DateTimePicker';\nimport Picker, { Props as PickerProps } from './Picker';\n\nconst DateInput = <TDate,>(props: Omit<PickerProps<DatePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={DatePicker} {...props} />\n);\nconst TimeInput = <TDate,>(props: Omit<PickerProps<TimePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={TimePicker} {...props} />\n);\nconst DateTimeInput = <TDate,>(props: Omit<PickerProps<DateTimePickerProps<TDate>>, 'PickerComponent'>) => (\n <Picker PickerComponent={DateTimePicker} {...props} />\n);\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","/* eslint-disable react/react-in-jsx-scope */\n/* eslint-disable react/require-default-props */\nimport { useCallback, ComponentType } from 'react';\nimport { useInput, InputHelperText, TextInputProps, useTranslateLabel } from 'react-admin';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';\nimport { getPickersLocalization } from '@mui/x-date-pickers/locales/utils/getPickersLocalization';\nimport { Locale } from 'date-fns';\n\nexport type Props<PickerProps> = TextInputProps &\n Omit<PickerProps, 'format'> & {\n PickerComponent: ComponentType;\n locale?: Locale;\n translations?: ReturnType<typeof getPickersLocalization>;\n stringFormat?: string;\n };\n\nconst Picker = <PickerProps,>({\n PickerComponent,\n label,\n source,\n helperText,\n fullWidth,\n onBlur,\n onChange,\n format,\n parse,\n validate,\n defaultValue,\n locale,\n translations,\n stringFormat = 'ISO',\n ...rest\n}: Props<PickerProps>) => {\n const {\n field,\n isRequired,\n fieldState: { error, isTouched, invalid },\n formState: { isSubmitted }\n } = useInput({\n format,\n onBlur,\n onChange,\n parse,\n source,\n validate,\n defaultValue\n });\n\n const handleChange = useCallback(\n (value: Date) => {\n if (value instanceof Date) {\n field.onChange(stringFormat === 'ISO' ? value.toISOString() : value.toString());\n } else {\n field.onChange(null);\n }\n },\n [field, stringFormat]\n );\n\n const translateLabel = useTranslateLabel();\n const translatedLabel = (\n <span>\n {translateLabel({\n label,\n source\n })}\n {isRequired && <span aria-hidden=\"true\">&thinsp;*</span>}\n </span>\n );\n\n return (\n <LocalizationProvider\n dateAdapter={AdapterDateFns}\n adapterLocale={locale}\n localeText={translations?.components.MuiLocalizationProvider.defaultProps.localeText}\n >\n <PickerComponent\n label={translatedLabel}\n slotProps={{\n textField: {\n error: (isTouched || isSubmitted) && invalid,\n size: 'small',\n fullWidth,\n helperText: (\n <InputHelperText touched={isTouched || isSubmitted} error={error?.message} helperText={helperText} />\n )\n }\n }}\n value={field.value ? new Date(field.value) : null}\n onChange={handleChange}\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...rest}\n />\n </LocalizationProvider>\n );\n};\n\nexport default Picker;\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,20 @@
1
1
  {
2
2
  "name": "@semapps/date-components",
3
- "version": "0.5.3",
3
+ "version": "0.6.0-alpha.1",
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.tsx",
7
8
  "main": "dist/index.cjs.js",
8
9
  "module": "dist/index.es.js",
10
+ "types": "dist/index.d.ts",
9
11
  "files": [
10
12
  "dist"
11
13
  ],
12
14
  "scripts": {
13
- "pre-publish": "rollup --sourcemap --config",
14
- "dev": "rollup --watch --sourcemap --config"
15
+ "build": "yarn typecheck && parcel build",
16
+ "watch": "parcel watch",
17
+ "typecheck": "tsc --noEmit"
15
18
  },
16
19
  "dependencies": {
17
20
  "@fullcalendar/core": "^5.7.2",
@@ -22,24 +25,24 @@
22
25
  "date-fns": "~2.8.1"
23
26
  },
24
27
  "peerDependencies": {
28
+ "@mui/material": "^5.13.1",
29
+ "@mui/styles": "^5.13.1",
25
30
  "react": "^18.2.0",
26
- "react-admin": "^4.11.0"
31
+ "react-admin": "^4.11.0",
32
+ "react-router-dom": "^6.1.0"
27
33
  },
28
34
  "publishConfig": {
29
35
  "access": "public"
30
36
  },
31
37
  "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"
38
+ "@mui/material": "^5.13.1",
39
+ "@mui/styles": "^5.13.1",
40
+ "@parcel/packager-ts": "^2.9.3",
41
+ "@parcel/transformer-typescript-types": "^2.9.3",
42
+ "parcel": "^2.9.3",
43
+ "react": "^18.2.0",
44
+ "react-admin": "^4.11.0",
45
+ "react-router-dom": "^6.1.0"
43
46
  },
44
- "gitHead": "4470a718dd5c2edb0ca1549e2b5d9a62bdd26d6d"
47
+ "gitHead": "45ece8e99093c4a43ee34be08a78c659cfe6f324"
45
48
  }