You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							263 lines
						
					
					
						
							9.1 KiB
						
					
					
				
			
		
		
	
	
							263 lines
						
					
					
						
							9.1 KiB
						
					
					
				| "use strict";
 | |
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | |
|     if (k2 === undefined) k2 = k;
 | |
|     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
 | |
| }) : (function(o, m, k, k2) {
 | |
|     if (k2 === undefined) k2 = k;
 | |
|     o[k2] = m[k];
 | |
| }));
 | |
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | |
|     Object.defineProperty(o, "default", { enumerable: true, value: v });
 | |
| }) : function(o, v) {
 | |
|     o["default"] = v;
 | |
| });
 | |
| var __importStar = (this && this.__importStar) || function (mod) {
 | |
|     if (mod && mod.__esModule) return mod;
 | |
|     var result = {};
 | |
|     if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | |
|     __setModuleDefault(result, mod);
 | |
|     return result;
 | |
| };
 | |
| var __rest = (this && this.__rest) || function (s, e) {
 | |
|     var t = {};
 | |
|     for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
 | |
|         t[p] = s[p];
 | |
|     if (s != null && typeof Object.getOwnPropertySymbols === "function")
 | |
|         for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
 | |
|             if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
 | |
|                 t[p[i]] = s[p[i]];
 | |
|         }
 | |
|     return t;
 | |
| };
 | |
| var __importDefault = (this && this.__importDefault) || function (mod) {
 | |
|     return (mod && mod.__esModule) ? mod : { "default": mod };
 | |
| };
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.DatePicker = void 0;
 | |
| const react_1 = __importStar(require("react"));
 | |
| const react_datepicker_1 = __importDefault(require("react-datepicker"));
 | |
| const styled_components_1 = __importDefault(require("styled-components"));
 | |
| const react_text_mask_1 = __importDefault(require("react-text-mask"));
 | |
| const createAutoCorrectedDatePipe_1 = __importDefault(require("text-mask-addons/dist/createAutoCorrectedDatePipe"));
 | |
| const datepicker_styles_1 = __importDefault(require("../../utils/datepicker.styles"));
 | |
| const icon_1 = require("../../atoms/icon");
 | |
| const box_1 = require("../../atoms/box/box");
 | |
| const css_class_1 = require("../../utils/css-class");
 | |
| const DatePickerIcon = styled_components_1.default(icon_1.Icon) `
 | |
|   position: absolute;
 | |
|   background: ${({ theme }) => theme.colors.primary100};
 | |
|   color: ${({ theme }) => theme.colors.white};
 | |
|   right: 0;
 | |
|   top: 0;
 | |
|   display: flex;
 | |
|   justify-content: center;
 | |
|   align-items: center;
 | |
|   overflow: hidden;
 | |
|   height: 100%;
 | |
|   min-width: 34px;
 | |
|   width: auto;
 | |
| `;
 | |
| const StyledDatePicker = styled_components_1.default(box_1.Box) `
 | |
|   ${datepicker_styles_1.default};
 | |
|   position: relative;
 | |
| 
 | |
|   & .react-datepicker-wrapper {
 | |
|     width: 100%;
 | |
|     box-sizing: border-box;
 | |
|     border: ${({ theme }) => `1px solid ${theme.colors.grey40}`};
 | |
|     padding: 4px 8px;
 | |
|     font-size: 14px;
 | |
|     line-height: 24px;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker-wrapper input {
 | |
|     border: none;
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
|     background: transparent;
 | |
|     color: ${({ theme }) => theme.colors.grey80};
 | |
| 
 | |
|     &:focus-visible {
 | |
|       outline: none;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker {
 | |
|     border-radius: 0;
 | |
|     padding: ${({ theme }) => theme.space.default};
 | |
|     font-family: ${({ theme }) => theme.font};
 | |
|     z-index: 101;
 | |
| 
 | |
|     &:focus-visible {
 | |
|       outline: none;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__navigation--next {
 | |
|     border-left-color: ${({ theme }) => theme.colors.primary60};
 | |
|     top: 16px;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__navigation--next:hover {
 | |
|     border-left-color: ${({ theme }) => theme.colors.primary100};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__navigation--previous {
 | |
|     border-right-color: ${({ theme }) => theme.colors.primary60};
 | |
|     top: 16px;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__navigation--previous:hover {
 | |
|     border-right-color: ${({ theme }) => theme.colors.primary100};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__navigation {
 | |
|     outline: none;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__year-read-view--down-arrow {
 | |
|     top: 5px;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__header {
 | |
|     background: ${({ theme }) => theme.colors.white};
 | |
|     font-size: ${({ theme }) => theme.fontSizes.default};
 | |
|     border: none;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__current-month {
 | |
|     font-weight: normal;
 | |
|     padding-bottom: ${({ theme }) => theme.space.lg};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__month {
 | |
|     margin-top: 0;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day-name {
 | |
|     color: ${({ theme }) => theme.colors.primary60};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day--outside-month {
 | |
|     color: ${({ theme }) => theme.colors.grey40};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day--today.react-datepicker__day--keyboard-selected {
 | |
|     color: ${({ theme }) => theme.colors.white};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day--selected {
 | |
|     color: ${({ theme }) => theme.colors.white};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day--keyboard-selected:not(.react-datepicker__day--today) {
 | |
|     background: none;
 | |
|     color: ${({ theme }) => theme.colors.grey100};
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day:hover,
 | |
|   & .react-datepicker__day {
 | |
|     border-radius: 15px;
 | |
|   }
 | |
| 
 | |
|   & .react-datepicker__day--selected {
 | |
|     background: ${({ theme }) => theme.colors.primary100};
 | |
|     border-radius: 15px;
 | |
|     color: ${({ theme }) => theme.colors.white};
 | |
|   }
 | |
| `;
 | |
| const parseDateSafely = (newDate) => {
 | |
|     const timestamp = Date.parse(newDate);
 | |
|     if (!Number.isNaN(timestamp)) {
 | |
|         return new Date(timestamp);
 | |
|     }
 | |
|     return null;
 | |
| };
 | |
| // https://github.com/text-mask/text-mask/issues/951
 | |
| const convertDateFnsFormatToDatePipeFormat = (format) => {
 | |
|     const tokens = format.split('');
 | |
|     return tokens.map((char) => {
 | |
|         if (char === 'M')
 | |
|             return 'm';
 | |
|         if (char === 'm')
 | |
|             return 'M';
 | |
|         return char;
 | |
|     }).join('');
 | |
| };
 | |
| const defaultDateProps = {
 | |
|     date: {
 | |
|         format: 'yyyy/MM/dd',
 | |
|         placeholder: 'YYYY/MM/DD',
 | |
|         inputMask: [/\d/, /\d/, /\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/],
 | |
|     },
 | |
|     datetime: {
 | |
|         format: 'yyyy/MM/dd HH:mm',
 | |
|         placeholder: 'YYYY/MM/DD HH:mm',
 | |
|         inputMask: [/\d/, /\d/, /\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, ' ', /\d/, /\d/, ':', /\d/, /\d/],
 | |
|     },
 | |
| };
 | |
| const parseCustomMask = (mask) => mask.map((el) => {
 | |
|     if (typeof el === 'string')
 | |
|         return el;
 | |
|     if (el.raw)
 | |
|         return el.raw;
 | |
|     if (!el.regex)
 | |
|         throw new Error('Invalid input mask');
 | |
|     return new RegExp(el.regex);
 | |
| });
 | |
| const getDateInputProps = (propertyType = 'datetime', props) => {
 | |
|     const { dateFormat, placeholderText, inputMask } = props;
 | |
|     const defaultProps = defaultDateProps[propertyType];
 | |
|     const format = dateFormat !== null && dateFormat !== void 0 ? dateFormat : defaultProps.format;
 | |
|     const placeholder = placeholderText !== null && placeholderText !== void 0 ? placeholderText : defaultProps.placeholder;
 | |
|     const mask = (inputMask === null || inputMask === void 0 ? void 0 : inputMask.mask) ? parseCustomMask(inputMask.mask)
 | |
|         : defaultProps.inputMask;
 | |
|     const dateFormatPipe = createAutoCorrectedDatePipe_1.default(convertDateFnsFormatToDatePipeFormat(format));
 | |
|     return { format, dateFormatPipe, placeholder, parsedMask: mask };
 | |
| };
 | |
| /**
 | |
|  * @classdesc
 | |
|  *
 | |
|  * <img src="components/date-picker.png" />
 | |
|  *
 | |
|  *
 | |
|  * Component responsible for showing dates. It is a wrapper to
 | |
|  * [react datepicker]{@link https://reactdatepicker.com/}.
 | |
|  *
 | |
|  * ### Usage
 | |
|  *
 | |
|  * ```javascript
 | |
|  * import { DatePicker, DatePickerProps } from '@adminjs/design-system'
 | |
|  * ```
 | |
|  *
 | |
|  * @component
 | |
|  * @subcategory Molecules
 | |
|  * @see https://reactdatepicker.com/
 | |
|  * @see {@link https://storybook.adminjs.co/?path=/story/designsystem-molecules-datepicker--default Storybook}
 | |
|  * @see DatePickerProps
 | |
|  * @hideconstructor
 | |
|  *
 | |
|  * @example
 | |
|  * return (
 | |
|  * <Box width={1/2} height="300px">
 | |
|  *   <DatePicker onChange={(date) => console.log(date)}/>
 | |
|  * </Box>
 | |
|  * )
 | |
|  * @section design-system
 | |
|  */
 | |
| const DatePicker = (props) => {
 | |
|     const { value, onChange, disabled, propertyType, inputMask = {}, placeholderText, dateFormat } = props, other = __rest(props, ["value", "onChange", "disabled", "propertyType", "inputMask", "placeholderText", "dateFormat"]);
 | |
|     const _a = inputMask, { mask: _mask } = _a, otherInputMaskProps = __rest(_a, ["mask"]);
 | |
|     const handleChange = (newDate) => {
 | |
|         var _a, _b;
 | |
|         onChange(((_b = (_a = parseDateSafely(newDate)) === null || _a === void 0 ? void 0 : _a.toISOString) === null || _b === void 0 ? void 0 : _b.call(_a)) || '');
 | |
|     };
 | |
|     const dateValue = react_1.useMemo(() => parseDateSafely(value), [value]);
 | |
|     const { dateFormatPipe, format, parsedMask, placeholder } = getDateInputProps(propertyType, { dateFormat, inputMask, placeholderText });
 | |
|     return (react_1.default.createElement(StyledDatePicker, { className: css_class_1.cssClass('DatePicker') },
 | |
|         react_1.default.createElement(react_datepicker_1.default, Object.assign({ customInput: (react_1.default.createElement(react_text_mask_1.default, Object.assign({ pipe: dateFormatPipe, mask: parsedMask, keepCharPositions: true, guide: true, placeholder: placeholder, disabled: disabled }, otherInputMaskProps))), selected: dateValue, onChange: handleChange, showTimeInput: propertyType === 'datetime', dateFormat: format, disabled: disabled }, other)),
 | |
|         react_1.default.createElement(DatePickerIcon, { icon: "Calendar", color: "white" })));
 | |
| };
 | |
| exports.DatePicker = DatePicker;
 | |
| exports.default = DatePicker;
 |