UNPKG

smart-react-components

Version:

React UI library, wide variety of editable ready to use Styled and React components.

1,133 lines (1,071 loc) 43.7 kB
'use strict'; function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var index = require('./index-6d498b59.js'); var DOMHelper = require('./DOMHelper-c0bd5a29.js'); var React = require('react'); var React__default = _interopDefault(React); var styled = require('styled-components'); var styled__default = _interopDefault(styled); var Div = require('./element/Div.js'); var Svg = require('./element/Svg.js'); var Span = require('./element/Span.js'); var CSSTransition = require('./CSSTransition-5a3ab124.js'); var Button = require('./Button-0d381a87.js'); var TransitionSwitch = require('./TransitionSwitch-c80def34.js'); const DMY = 1; const MDY = 2; var DT = /*#__PURE__*/Object.freeze({ __proto__: null, DMY: DMY, MDY: MDY }); const $12 = 1; const $24 = 2; var HT = /*#__PURE__*/Object.freeze({ __proto__: null, $12: $12, $24: $24 }); const DATE = 1; const HOUR = 2; const DATE_HOUR = 4; var PT = /*#__PURE__*/Object.freeze({ __proto__: null, DATE: DATE, HOUR: HOUR, DATE_HOUR: DATE_HOUR }); const SUNDAY = 0; const MONDAY = 1; const TUESDAY = 2; const WEDNESDAY = 3; const THURSDAY = 4; const FRIDAY = 5; const SATURDAY = 6; var W = /*#__PURE__*/Object.freeze({ __proto__: null, SUNDAY: SUNDAY, MONDAY: MONDAY, TUESDAY: TUESDAY, WEDNESDAY: WEDNESDAY, THURSDAY: THURSDAY, FRIDAY: FRIDAY, SATURDAY: SATURDAY }); var size = { small: { width: "210px", iconContainerSize: "25px", bodyHeight: "225px", dateHeaderPaddingY: "5px", dateWeekItemSize: "20px", dateWeekItemSpace: "2.5px", dateListItemSize: "43.75px", dateListItemSpace: "0", hourItemSize: "45px", hourIconSize: "35px", hourItemFontSize: "13px", buttonsPadding: "0 20px 10px 10px", buttonMarginLeft: "5px" }, default: { width: "310px", spanMarginLeft: "9px", iconContainerSize: "40px", bodyHeight: "340px", dateHeaderPaddingY: "10px", dateWeekItemSize: "30px", dateWeekItemSpace: "5px", dateListItemSize: "60px", dateListItemSpace: "5px", hourItemSize: "60px", hourIconSize: "40px", hourItemFontSize: "20px", buttonsPadding: "0 25px 15px 15px", buttonMarginLeft: "10px" }, large: { width: "380px", iconContainerSize: "50px", bodyHeight: "340px", dateHeaderPaddingY: "10px", dateWeekItemSize: "30px", dateWeekItemSpace: "5px 10px", dateListItemSize: "60px", dateListItemSpace: "13.75px", hourItemSize: "60px", hourIconSize: "40px", hourItemFontSize: "20px", buttonsPadding: "0 30px 15px 15px", buttonMarginLeft: "10px" }, paddingX: "15px", paddingY: "10px", radius: "4px", fontSize: "14px", headerIconSize: "16px", dateHeaderIconSize: "20px", hourSpace: "10px" }; var DEFAULT_LANGUAGE = { days: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], am: "AM", pm: "PM", cancel: "CANCEL", save: "OK" }; const MIN_YEAR = 100; const MAX_YEAR = 9999; class DatePickerHelper { /** * Gets day count of the given month. * * @param month * @param year */ static getDayCount(month, year) { switch (month) { case 0: case 2: case 4: case 6: case 7: case 9: case 11: return 31; case 3: case 5: case 8: case 10: return 30; case 1: return this.isLeapYear(year) ? 29 : 28; } } /** * Checks if the given year is a leap year or not. * * @param year */ static isLeapYear(year) { return year % 4 == 0; } /** * Gets decade by the given year. * * @param year */ static getDecade(year) { let start = year; while (start % 10 != 0) start -= 1; return [start, start + 10]; } /** * Gets week days as an array. * * @param startDay */ static getWeekDays(startDay) { const arr = [0, 1, 2, 3, 4, 5, 6]; return [...arr.slice(startDay, 7), ...arr.slice(0, startDay)]; } /** * Gets value as object. * * @param value * @param pickerType * @param hourType */ static getValueObject(value, pickerType, hourType) { let result = {}; if (typeof value === "string" || value.constructor == Date) { let date; if (typeof value === "string" && pickerType == HOUR) date = new Date(`1/1/2020 ${value}`); else date = typeof value === "string" ? new Date(value) : value; if (!isNaN(date.getTime())) { if (pickerType != HOUR) result.date = { day: date.getDate(), weekDay: date.getDay(), month: date.getMonth(), year: date.getFullYear(), decade: DatePickerHelper.getDecade(date.getFullYear()) }; if (pickerType != DATE) { result.hour = { hour: date.getHours(), minute: date.getMinutes() }; if (hourType == $12) { if (result.hour.hour < 12) { result.hour.am = true; if (result.hour.hour == 0) result.hour.hour = 12; } else { result.hour.am = false; if (result.hour.hour > 12) result.hour.hour -= 12; } } } } else result = null; } else { result = value; try { if (pickerType & (DATE | DATE_HOUR)) { if (pickerType == DATE) delete result.hour; result.date.year = Math.max(MIN_YEAR, result.date.year); result.date.year = Math.min(MAX_YEAR, result.date.year); result.date.decade = DatePickerHelper.getDecade(result.date.year); result.date.month = Math.max(0, result.date.month); result.date.month = Math.min(11, result.date.month); result.date.day = Math.max(1, result.date.day); result.date.day = Math.min(DatePickerHelper.getDayCount(result.date.month, result.date.year), result.date.day); result.date.weekDay = new Date(result.date.year, result.date.month, result.date.day).getDay(); } if (pickerType & (HOUR | DATE_HOUR)) { if (pickerType == HOUR) delete result.date; result.hour.minute = Math.max(0, result.hour.minute); result.hour.minute = Math.min(59, result.hour.minute); if (hourType == $12) { result.hour.am = result.hour.am ? true : false; result.hour.hour = Math.max(1, result.hour.hour); result.hour.hour = Math.min(12, result.hour.hour); } else { result.hour.hour = Math.max(0, result.hour.hour); result.hour.hour = Math.min(23, result.hour.hour); } } } catch (ignored) { result = null; } } return result; } } const WEEK = 1; const YEAR = 2; const DECADE = 4; const customKeys = { size: v => ` width: ${size[v].width}; .src-date-picker-span-element { margin-left: ${size[v].spanMarginLeft}; } .src-date-picker-icon-container { width: ${size[v].iconContainerSize}; } .src-date-picker-body { height: ${size[v].bodyHeight}; } .src-date-picker-date-header { padding: ${size[v].dateHeaderPaddingY} 0; } .src-date-picker-week-item { width: ${size[v].dateWeekItemSize}; height: ${size[v].dateWeekItemSize}; margin: ${size[v].dateWeekItemSpace}; } .src-date-picker-date-item { width: ${size[v].dateListItemSize}; height: ${size[v].dateListItemSize}; margin: ${size[v].dateListItemSpace}; } .src-date-picker-hour-element { width: ${size[v].hourItemSize}; height: ${size[v].hourItemSize}; } .src-date-picker-hour-arrow-container svg { width: ${size[v].hourIconSize}; height: ${size[v].hourIconSize}; } .src-date-picker-hour-input { font-size: ${size[v].hourItemFontSize}; } .src-date-picker-buttons { padding: ${size[v].buttonsPadding}; > div { margin-left: ${size[v].buttonMarginLeft}; } } ` }; var DatePickerElement = styled__default(Div).attrs({ customKeys })(({ theme, type }) => ` overflow: hidden; flex: 0 0 auto; border-radius: ${size.radius}; background: ${theme.src.datePicker.background}; color: ${theme.src.datePicker.font}; font-family: "Open Sans", sans-serif; font-size: ${size.fontSize}; .src-date-picker-body { box-sizing: border-box; user-select: none; } .src-date-picker-item { &.src-date-picker-item-inactive { color: ${theme.src.datePicker.inactive}; font-weight: 400; } &.src-date-picker-item-active { background: ${theme.src.type[type].main}; color: ${theme.src.type[type].font}; } } .src-date-picker-hour-input { background: ${theme.src.type[type].main}; color: ${theme.src.type[type].font}; &:focus { background: ${theme.src.type[type].active}; } } `); var IconContainer = styled__default.div.attrs({ className: "src-date-picker-icon-container" }) ` display: flex; justify-content: center; align-items: center; `; var HourIcon = styled__default(Svg).attrs({ children: React__default.createElement("path", { d: "M1024 544v448q0 14-9 23t-23 9h-320q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h224v-352q0-14 9-23t23-9h64q14 0 23 9t9 23zm416 352q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z" }), viewBox: "0 0 1792 1792" }) ``; var DateIcon = styled__default(Svg).attrs({ children: React__default.createElement("path", { d: "M192 1664h1408v-1024h-1408v1024zm384-1216v-288q0-14-9-23t-23-9h-64q-14 0-23 9t-9 23v288q0 14 9 23t23 9h64q14 0 23-9t9-23zm768 0v-288q0-14-9-23t-23-9h-64q-14 0-23 9t-9 23v288q0 14 9 23t23 9h64q14 0 23-9t9-23zm384-64v1280q0 52-38 90t-90 38h-1408q-52 0-90-38t-38-90v-1280q0-52 38-90t90-38h128v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h384v-96q0-66 47-113t113-47h64q66 0 113 47t47 113v96h128q52 0 90 38t38 90z" }), viewBox: "0 0 1792 1792" }) ``; var CloseIcon = styled__default(Svg).attrs({ children: React__default.createElement("path", { d: "M1490 1322q0 40-28 68l-136 136q-28 28-68 28t-68-28l-294-294-294 294q-28 28-68 28t-68-28l-136-136q-28-28-28-68t28-68l294-294-294-294q-28-28-28-68t28-68l136-136q28-28 68-28t68 28l294 294 294-294q28-28 68-28t68 28l136 136q28 28 28 68t-28 68l-294 294 294 294q28 28 28 68z" }), viewBox: "0 0 1792 1792" }) ``; const HeaderElement = styled__default.header(({ theme, type }) => ` display: flex; justify-content: space-between; align-items: center; padding: ${size.paddingY} ${size.paddingX}; background: ${theme.src.type[type].main}; ${IconContainer} { position: relative; div { position: absolute; display: inline-flex; } svg { width: ${size.headerIconSize}; height: ${size.headerIconSize}; fill: ${theme.src.type[type].darker}; transition: fill 150ms 0s ease-in-out; &:hover { fill: ${theme.src.type[type].darkest}; } } } `); const Header = ({ valueObject, today, selectedPicker, setSelectedPicker, type, pickerType, showCloseIcon, lang, onClose }) => { const getValue = () => { let date = (valueObject && valueObject.date) ? valueObject.date : today; return `${lang.days[date.weekDay]}, ${date.day} ${lang.months[date.month].substr(0, 3)} ${date.year}`; }; const [value, setValue] = React__default.useState(() => getValue()); /** * Calls onClose method. */ const close = () => { if (onClose) onClose(); }; React__default.useEffect(() => setValue(getValue()), [valueObject]); return (React__default.createElement(HeaderElement, { type: type }, React__default.createElement(Span, { color: `${type}.font`, className: "src-date-picker-span-element" }, value), React__default.createElement(Div, { display: "flex", alignItems: "center" }, React__default.createElement(IconContainer, null, pickerType == DATE_HOUR && (React__default.createElement(React__default.Fragment, null, React__default.createElement(CSSTransition.CSSTransition, { status: selectedPicker == DATE, className: "src-fade", duration: 150 }, React__default.createElement("div", null, React__default.createElement(HourIcon, { onClick: () => setSelectedPicker(HOUR) }))), React__default.createElement(CSSTransition.CSSTransition, { status: selectedPicker == HOUR, className: "src-fade", duration: 150 }, React__default.createElement("div", null, React__default.createElement(DateIcon, { onClick: () => setSelectedPicker(DATE) })))))), showCloseIcon && (React__default.createElement(IconContainer, null, React__default.createElement(CloseIcon, { onClick: close })))))); }; var ArrowUp = styled__default(Svg).attrs({ children: React__default.createElement("path", { d: "M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z" }), viewBox: "0 0 1792 1792" }) ``; var ArrowDown = styled__default(Svg).attrs({ children: React__default.createElement("path", { d: "M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z" }), viewBox: "0 0 1792 1792" }) ``; const HeaderElement$1 = styled__default.header.attrs({ className: "src-date-picker-date-header" }) ` display: flex; justify-content: space-between; > span { cursor: default; font-weight: 600; } svg { width: ${size.dateHeaderIconSize}; } `; const DateHeader = ({ date, setDate, selectedDatePicker, setSelectedDatePicker, orientation, lang }) => { const getValue = () => { if (selectedDatePicker == WEEK) return `${lang.months[date.month]} ${date.year}`; else if (selectedDatePicker == YEAR) return `${date.year}`; else return `${date.decade[0]} - ${date.decade[1]}`; }; const [value, setValue] = React__default.useState(() => getValue()); React__default.useEffect(() => setValue(getValue()), [date, selectedDatePicker]); /** * Sets "selected date picker" */ const setSelectedDatePicker$ = () => { if (selectedDatePicker == WEEK) setSelectedDatePicker(YEAR); else if (selectedDatePicker == YEAR) setSelectedDatePicker(DECADE); }; /** * Sets date * * @param up */ const setDate$ = (up) => { const inc = orientation ? up : !up; const val = Object.assign({}, date); if (inc) { if (selectedDatePicker == WEEK) { if (val.month < 11) val.month++; else if (val.year < MAX_YEAR) { val.month = 0; val.year++; } } else if (selectedDatePicker == YEAR) { if (val.year < MAX_YEAR) val.year++; } else if (selectedDatePicker == DECADE) { if (val.decade[1] < MAX_YEAR) val.decade = [val.decade[1], val.decade[1] + 10]; } } else { if (selectedDatePicker == WEEK) { if (val.month > 0) val.month--; else if (val.year > MIN_YEAR) { val.month = 11; val.year--; } } else if (selectedDatePicker == YEAR) { if (val.year > MIN_YEAR) val.year--; } else if (selectedDatePicker == DECADE) { if (val.decade[0] > MIN_YEAR) val.decade = [val.decade[0] - 10, val.decade[0]]; } } setDate(val); }; return (React__default.createElement(HeaderElement$1, null, React__default.createElement("span", { className: "src-date-picker-span-element", onClick: setSelectedDatePicker$ }, value), React__default.createElement(Div, { display: "flex", alignItems: "center" }, React__default.createElement(IconContainer, null, React__default.createElement(ArrowUp, { onClick: () => setDate$(true) })), React__default.createElement(IconContainer, null, React__default.createElement(ArrowDown, { onClick: () => setDate$(false) }))))); }; var DateList = styled__default.ul ` display: flex; justify-content: space-between; padding: 0; margin: 0; `; var DateItem = styled__default.li.attrs(({ className, active, inactive }) => ({ className: `${className} src-date-picker-item ${active ? "src-date-picker-item-active" : ""} ${inactive ? "src-date-picker-item-inactive" : ""}` })) ` display: flex; justify-content: center; align-items: center; border-radius: 100%; line-height: 100%; font-weight: 600; `; const DateWeek = ({ valueObject, date, setValue, weekStartDay, lang }) => { const getHeader = () => { const weekDays = DatePickerHelper.getWeekDays(weekStartDay); const result = []; weekDays.forEach(item => result.push(React__default.createElement(DateItem, { className: "src-date-picker-week-item", key: item, inactive: true }, lang.days[item].substring(0, 2)))); return result; }; const getList = () => { const result = Array(6).fill(null).map((item, index) => React__default.createElement(DateList, { key: index, children: [] })); const prevMonth = date.month == 0 ? 11 : date.month - 1; const prevYear = prevMonth == 11 ? date.year - 1 : date.year; const nextMonth = date.month < 11 ? date.month + 1 : 1; const nextYear = nextMonth == 0 ? date.year + 1 : date.year; const weekDays = DatePickerHelper.getWeekDays(weekStartDay); const firstMonthDay = new Date(date.year, date.month, 1).getDay(); const weekStartIndex = weekDays.indexOf(firstMonthDay); const weekDayCount = DatePickerHelper.getDayCount(date.month, date.year); const prevDayLimit = firstMonthDay - weekStartIndex; const prevMountCount = DatePickerHelper.getDayCount(prevMonth, prevYear); let prevDay = prevMountCount - prevDayLimit; let weekDay = 1; let nextWeekDay = 1; let index = 0; for (let i = 0; i < 42; i++) { let dateItem; let isInactive; if (prevDay <= prevMountCount) { dateItem = { day: prevDay, month: prevMonth, year: prevYear }; prevDay++; isInactive = true; } else if (weekDay <= weekDayCount) { dateItem = { day: weekDay, month: date.month, year: date.year }; weekDay++; } else { dateItem = { day: nextWeekDay, month: nextMonth, year: nextYear }; nextWeekDay++; isInactive = true; } let isActive; if (valueObject && dateItem.day == valueObject.date.day && dateItem.month == valueObject.date.month && dateItem.year == valueObject.date.year) isActive = true; else isActive = false; result[index].props.children.push(React__default.createElement(DateItem, { className: "src-date-picker-week-item", key: i, active: isActive, inactive: isInactive, onClick: () => setValue$(dateItem.day, dateItem.month, dateItem.year) }, dateItem.day)); if (i % 7 == 6) index++; } return result; }; const [header, setHeader] = React__default.useState(() => getHeader()); const headerInit = React__default.useRef(false); const [list, setList] = React__default.useState(() => getList()); const listInit = React__default.useRef(false); React__default.useEffect(() => { if (!headerInit.current) headerInit.current = true; else setHeader(getHeader()); }, [lang, weekStartDay]); React__default.useEffect(() => { if (!listInit.current) listInit.current = true; else setList(getList()); }, [valueObject, date]); /** * Sets value. * * @param day * @param month * @param year */ const setValue$ = (day, month, year) => { if (year >= MIN_YEAR && year <= MAX_YEAR) setValue({ day, month, year }, null); }; return (React__default.createElement("div", null, React__default.createElement(DateList, null, header), list)); }; const DateYear = ({ date, setDate, setSelectedDatePicker, lang }) => { const getList = () => { const result = Array(4).fill(null).map((item, index) => React__default.createElement(DateList, { key: index, children: [] })); let index = 0; for (let i = 0; i < 16; i++) { const month = i < 12 ? i : i - 12; const year = i < 12 ? date.year : date.year + 1; const isInactive = year != date.year; const isActive = date.selectedMonth.month == month && date.selectedMonth.year == year; result[index].props.children.push(React__default.createElement(DateItem, { className: "src-date-picker-date-item", key: i, inactive: isInactive, active: isActive, onClick: () => setValue(month, year) }, lang.months[month].substr(0, 3))); if (i % 4 == 3) index++; } return result; }; const [list, setList] = React__default.useState(() => getList()); const listInit = React__default.useRef(false); React__default.useEffect(() => { if (!listInit.current) listInit.current = true; else setList(getList()); }, [date, lang]); /** * Sets date. * * @param month * @param year */ const setValue = (month, year) => { if (year >= MIN_YEAR && year <= MAX_YEAR) { setSelectedDatePicker(WEEK); setDate(Object.assign(Object.assign({}, date), { month, year, selectedMonth: { month, year } })); } }; return (React__default.createElement("div", null, list)); }; const DateDecade = ({ date, setDate, setSelectedDatePicker }) => { const getList = () => { const result = Array(4).fill(null).map((item, index) => React__default.createElement(DateList, { key: index, children: [] })); let index = 0; for (let i = 0; i < 16; i++) { const year = date.decade[0] + i; const isInactive = year >= date.decade[1]; const isActive = year == date.year; result[index].props.children.push(React__default.createElement(DateItem, { className: "src-date-picker-date-item", key: i, inactive: isInactive, active: isActive, onClick: () => setValue(year) }, year)); if (i % 4 == 3) index++; } return result; }; const [list, setList] = React__default.useState(() => getList()); const listInit = React__default.useRef(false); React__default.useEffect(() => { if (!listInit.current) listInit.current = true; else setList(getList()); }, [date]); /** * Sets date. * * @param year */ const setValue = (year) => { if (year >= MIN_YEAR && year <= MAX_YEAR) { setSelectedDatePicker(YEAR); setDate(Object.assign(Object.assign({}, date), { year })); } }; return React__default.createElement("div", null, list); }; const PickerElement = styled__default.div ` height: 100%; padding: 0 ${size.paddingX}; `; const DatePickerItem = ({ valueObject, date, setDate, selectedDatePicker, setSelectedDatePicker, setValue, orientation, weekStartDay, lang }) => { const previousSelectedDatePicker = React__default.useRef(null); React__default.useEffect(() => { previousSelectedDatePicker.current = selectedDatePicker; }, [selectedDatePicker]); return (React__default.createElement(PickerElement, null, React__default.createElement(DateHeader, { date: date, setDate: setDate, selectedDatePicker: selectedDatePicker, setSelectedDatePicker: setSelectedDatePicker, orientation: orientation, lang: lang }), React__default.createElement("div", null, React__default.createElement(TransitionSwitch.TransitionSwitch, { active: selectedDatePicker }, React__default.createElement(CSSTransition.CSSTransition, { value: WEEK, className: "src-dp-fade-in", duration: 150 }, React__default.createElement(DateWeek, { valueObject: valueObject, date: date, setValue: setValue, weekStartDay: weekStartDay, lang: lang })), React__default.createElement(CSSTransition.CSSTransition, { value: YEAR, className: `${(previousSelectedDatePicker.current == WEEK || selectedDatePicker == WEEK) ? "src-dp-fade-out" : "src-dp-fade-in"}`, duration: 150 }, React__default.createElement(DateYear, { date: date, setDate: setDate, setSelectedDatePicker: setSelectedDatePicker, lang: lang })), React__default.createElement(CSSTransition.CSSTransition, { value: DECADE, className: "src-dp-fade-out", duration: 150 }, React__default.createElement(DateDecade, { date: date, setDate: setDate, setSelectedDatePicker: setSelectedDatePicker })))))); }; const HOUR$1 = 1; const MINUTE = 2; const AM = 4; class StringHelper { /** * Renders a number with given digits as string. * * @param value * @param digit * @param placeholder */ static renderNumber(value, digit, placeholder) { let str = value.toString(); while (str.length < digit) str = placeholder + str; return str; } } const Container = styled__default.div ` display: flex; justify-content: center; align-items: center; `; const ArrowContainer = styled__default.div.attrs({ className: "src-date-picker-hour-arrow-container src-date-picker-hour-element" })(({ theme }) => ` display: flex; justify-content: center; align-items: center; margin: ${size.hourSpace}; svg { fill: ${theme.src.datePicker.font}; &:active { fill: ${theme.src.datePicker.arrowActive}; } } `); const Input = styled__default.input.attrs({ className: "src-date-picker-hour-input src-date-picker-hour-element", spellCheck: false }) ` box-sizing: border-box; padding: ${size.hourSpace}; margin: ${size.hourSpace}; border: 0; border-radius: ${size.radius}; text-align: center; &:focus, &:active { outline: 0; } `; const HourPickerItem = ({ valueObject, setValue, hourType, orientation, lang }) => { const focusInputType = React__default.useRef(null); const valueObjectRef = React__default.useRef(null); // holds value for wheel input event const hourInput = React__default.useRef(null); const minuteInput = React__default.useRef(null); const amInput = React__default.useRef(null); /** * Gets default hour. */ const getDefaultHour = (valueObj) => { if (valueObj) return Object.assign({}, valueObj.hour); else { const hour = { hour: 12, minute: 0 }; if (hourType == $12) hour.am = false; return hour; } }; /** * Sets focus input type. * * @param type */ const focusInput = (type) => { focusInputType.current = type; DOMHelper.DOMHelper.addEventListener(document, DOMHelper.DOMHelper.MOUSE_WHEEL, wheelInput, { passive: false }); }; /** * Sets input value by focus input type. */ const leaveInput = () => { const hour = getDefaultHour(valueObject); if (focusInputType.current == HOUR$1) { let value = parseInt(hourInput.current.value); if (isNaN(value)) hourInput.current.value = valueObject ? StringHelper.renderNumber(valueObject.hour.hour, 2, "0") : ""; else { if (hourType == $12) { value = Math.max(1, value); value = Math.min(12, value); } else { value = Math.max(0, value); value = Math.min(23, value); } hour.hour = value; } } else if (focusInputType.current == MINUTE) { let value = parseInt(minuteInput.current.value); if (isNaN(value)) minuteInput.current.value = valueObject ? StringHelper.renderNumber(valueObject.hour.minute, 2, "0") : ""; else { value = Math.max(0, value); value = Math.min(59, value); hour.minute = value; } } else if (focusInputType.current == AM) { let value = amInput.current.value; if (value != lang.am && value != lang.pm) amInput.current.value = valueObject ? lang[valueObject.hour.am ? "am" : "pm"] : ""; else hour.am = value == lang.am; } focusInputType.current = null; DOMHelper.DOMHelper.removeEventListener(document, DOMHelper.DOMHelper.MOUSE_WHEEL, wheelInput, {}); setValue(null, hour); }; /** * Gets wheel orientation and sets value by focus input type. * * @param e */ const wheelInput = React__default.useCallback((e) => { const delta = ((e.deltaY || -e.wheelDelta || e.detail) >> 10) || 1; const up = delta < 0; if (focusInputType.current == HOUR$1) changeHour(up); else if (focusInputType.current == MINUTE) changeMinute(up); else if (focusInputType.current == AM) changeAM(); e.preventDefault(); e.stopPropagation(); }, []); /** * Sets hour value. * * @param up */ const changeHour = (up, hour) => { const inc = orientation ? up : !up; hour = hour || getDefaultHour(valueObjectRef.current); if (inc) { if (hourType == $12) { if (hour.hour == 11) { hour.am = !hour.am; hour.hour = 12; } else if (hour.hour == 12) hour.hour = 1; else hour.hour++; } else if (hourType == $24) { if (hour.hour == 23) hour.hour = 0; else hour.hour++; } } else { if (hourType == $12) { if (hour.hour == 12) { hour.am = !hour.am; hour.hour = 11; } else if (hour.hour == 1) hour.hour = 12; else hour.hour--; } else if (hourType == $24) { if (hour.hour == 0) hour.hour = 23; else hour.hour--; } } setValue(null, hour); }; /** * Sets minute value and changes hour value by minute. * * @param up */ const changeMinute = (up) => { const inc = orientation ? up : !up; const hour = getDefaultHour(valueObjectRef.current); if (inc) { if (hour.minute < 59) hour.minute++; else { hour.minute = 0; changeHour(up, hour); return; } } else { if (hour.minute > 0) hour.minute--; else { hour.minute = 59; changeHour(up, hour); return; } } setValue(null, hour); }; /** * Toggles am/pm value. */ const changeAM = () => { const hour = getDefaultHour(valueObjectRef.current); hour.am = !hour.am; setValue(null, hour); }; React__default.useEffect(() => { valueObjectRef.current = valueObject; if (valueObject) { hourInput.current.value = StringHelper.renderNumber(valueObject.hour.hour, 2, "0"); minuteInput.current.value = StringHelper.renderNumber(valueObject.hour.minute, 2, "0"); if (amInput.current) amInput.current.value = lang[valueObject.hour.am ? "am" : "pm"]; } }, [valueObject]); return (React__default.createElement(Div, { height: "100%", display: "flex", flexDirection: "column", justifyContent: "space-around", alignItems: "center" }, React__default.createElement(Container, null, React__default.createElement(ArrowContainer, null, React__default.createElement(ArrowUp, { onClick: () => changeHour(true) })), React__default.createElement(ArrowContainer, null, React__default.createElement(ArrowUp, { onClick: () => changeMinute(true) })), hourType == $12 && (React__default.createElement(ArrowContainer, null, React__default.createElement(ArrowUp, { onClick: changeAM })))), React__default.createElement(Container, null, React__default.createElement(Input, { defaultValue: valueObject ? StringHelper.renderNumber(valueObject.hour.hour, 2, "0") : "", ref: hourInput, onFocus: () => focusInput(HOUR$1), onBlur: leaveInput }), React__default.createElement(Input, { defaultValue: valueObject ? StringHelper.renderNumber(valueObject.hour.minute, 2, "0") : "", ref: minuteInput, onFocus: () => focusInput(MINUTE), onBlur: leaveInput }), hourType == $12 && React__default.createElement(Input, { defaultValue: valueObject ? lang[valueObject.hour.am ? "am" : "pm"] : "", ref: amInput, onFocus: () => focusInput(AM), onBlur: leaveInput })), React__default.createElement(Container, null, React__default.createElement(ArrowContainer, null, React__default.createElement(ArrowDown, { onClick: () => changeHour(false) })), React__default.createElement(ArrowContainer, null, React__default.createElement(ArrowDown, { onClick: () => changeMinute(false) })), hourType == $12 && (React__default.createElement(ArrowContainer, null, React__default.createElement(ArrowDown, { onClick: changeAM })))))); }; const Buttons = ({ value, setValue, initialValue, setInitialValue, onSave, onCancel, type, lang }) => { /** * Sets initial value as value. */ const cancel = () => { setValue(initialValue); if (onCancel) onCancel(); }; /** * Sets value as initial value. */ const save = () => { setInitialValue(value); if (onSave) onSave(); }; return (React__default.createElement(Div, { className: "src-date-picker-buttons", display: "flex", justifyContent: "flex-end", alignItems: "center" }, React__default.createElement(Button.Button, { type: type, link: true, waveEffect: "dark", elementProps: { onClick: cancel } }, lang.cancel), React__default.createElement(Button.Button, { type: type, link: true, waveEffect: "dark", elementProps: { onClick: save } }, lang.save))); }; const Body = styled__default.div.attrs({ className: "src-date-picker-body" }) ` box-sizing: border-box; padding: ${size.paddingY} 0; `; const DatePicker = ({ size = "default", sizeSm, sizeMd, sizeLg, sizeXl, elementProps = index.DV.JSX_ELEMENT_PROPS, value, setValue, type = "primary", pickerType = DATE_HOUR, hourType = $12, showCloseIcon, showButtons, weekStartDay = MONDAY, orientation, lang = DEFAULT_LANGUAGE, onClose, onSave, onCancel }) => { const [valueObject, setValueObject] = React__default.useState(() => DatePickerHelper.getValueObject(value, pickerType, hourType)); const [initialValue, setInitialValue] = React__default.useState(() => value); const [today] = React__default.useState(() => { const date = new Date(); return { day: date.getDate(), weekDay: date.getDay(), month: date.getMonth(), year: date.getFullYear(), decade: DatePickerHelper.getDecade(date.getFullYear()) }; }); const [date, setDate] = React__default.useState(() => { const dateObject = valueObject && valueObject.date ? valueObject.date : today; return { month: dateObject.month, year: dateObject.year, decade: dateObject.decade, selectedMonth: { month: dateObject.month, year: dateObject.year } }; }); const [selectedPicker, setSelectedPicker] = React__default.useState(() => (pickerType & (DATE | DATE_HOUR)) ? DATE : HOUR); const [selectedDatePicker, setSelectedDatePicker] = React__default.useState(() => WEEK); const valueInit = React__default.useRef(false); React__default.useEffect(() => { if (!valueInit.current) valueInit.current = true; else setValueObject(DatePickerHelper.getValueObject(value, pickerType, hourType)); }, [value, pickerType, hourType]); /** * Sets value. * * @param date * @param hour */ const setValue$ = (date, hour) => { if (!date && !hour) setValue(null); else { date = date || (valueObject ? valueObject.date : today); hour = hour || (valueObject ? valueObject.hour : { hour: 1, minute: 0, am: false }); if (typeof value == "string" || value.constructor == Date) { let result = ""; if (pickerType != HOUR) result += `${date.month + 1}/${date.day}/${date.year}`; if (pickerType != DATE) { if (result != "") result += " "; result += `${hour.hour}:${hour.minute}`; if (hourType == $12) result += ` ${hour.am ? "AM" : "PM"}`; } setValue(typeof value == "string" ? result : new Date(result)); } else setValue({ date, hour }); } }; return (React__default.createElement(DatePickerElement, Object.assign({}, elementProps, { size: size, sizeSm: sizeSm, sizeMd: sizeMd, sizeLg: sizeLg, sizeXl: sizeXl, type: type }), React__default.createElement(Header, { valueObject: valueObject, today: today, selectedPicker: selectedPicker, setSelectedPicker: setSelectedPicker, type: type, pickerType: pickerType, showCloseIcon: showCloseIcon, lang: lang, onClose: onClose }), React__default.createElement(Body, null, React__default.createElement(TransitionSwitch.TransitionSwitch, { active: selectedPicker }, React__default.createElement(CSSTransition.CSSTransition, { value: DATE, className: "src-dp-fade-in", duration: 150 }, React__default.createElement(DatePickerItem, { valueObject: valueObject, date: date, setDate: setDate, selectedDatePicker: selectedDatePicker, setSelectedDatePicker: setSelectedDatePicker, setValue: setValue$, orientation: orientation, weekStartDay: weekStartDay, lang: lang })), React__default.createElement(CSSTransition.CSSTransition, { value: HOUR, className: "src-dp-fade-out", duration: 150 }, React__default.createElement(HourPickerItem, { valueObject: valueObject, setValue: setValue$, hourType: hourType, orientation: orientation, lang: lang })))), showButtons && React__default.createElement(Buttons, { value: value, setValue: setValue, initialValue: initialValue, setInitialValue: setInitialValue, onSave: onSave, onCancel: onCancel, type: type, lang: lang }))); }; exports.$12 = $12; exports.DATE_HOUR = DATE_HOUR; exports.DEFAULT_LANGUAGE = DEFAULT_LANGUAGE; exports.DMY = DMY; exports.DT = DT; exports.DatePicker = DatePicker; exports.DatePickerHelper = DatePickerHelper; exports.HT = HT; exports.MDY = MDY; exports.PT = PT; exports.StringHelper = StringHelper; exports.W = W;