Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

486 строки
18 KiB

  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
  6. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  7. var _systemImportTransformerGlobalIdentifier = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : typeof global !== 'undefined' ? global : {};
  8. var _react = require('react');
  9. var _react2 = _interopRequireDefault(_react);
  10. var _propTypes = require('prop-types');
  11. var _propTypes2 = _interopRequireDefault(_propTypes);
  12. var _classnames = require('classnames');
  13. var _classnames2 = _interopRequireDefault(_classnames);
  14. var _OutsideClickHandler = require('./OutsideClickHandler');
  15. var _OutsideClickHandler2 = _interopRequireDefault(_OutsideClickHandler);
  16. var _Button = require('./Common/Button');
  17. var _Button2 = _interopRequireDefault(_Button);
  18. var _time = require('../utils/time.js');
  19. var _time2 = _interopRequireDefault(_time);
  20. var _language = require('../utils/language');
  21. var _language2 = _interopRequireDefault(_language);
  22. var _icons = require('../utils/icons');
  23. var _icons2 = _interopRequireDefault(_icons);
  24. var _func = require('../utils/func');
  25. var _AsyncComponent = require('./Common/AsyncComponent');
  26. var _AsyncComponent2 = _interopRequireDefault(_AsyncComponent);
  27. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  28. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  29. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  30. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  31. var DialPlates = {
  32. material: (0, _AsyncComponent2.default)(function () {
  33. return (typeof _systemImportTransformerGlobalIdentifier.define === 'function' && _systemImportTransformerGlobalIdentifier.define.amd ? new Promise(function (resolve, reject) {
  34. _systemImportTransformerGlobalIdentifier.require(['./MaterialTheme'], resolve, reject);
  35. }) : typeof module !== 'undefined' && module.exports && typeof require !== 'undefined' || typeof module !== 'undefined' && module.component && _systemImportTransformerGlobalIdentifier.require && _systemImportTransformerGlobalIdentifier.require.loader === 'component' ? Promise.resolve(require(('./MaterialTheme'))) : Promise.resolve(_systemImportTransformerGlobalIdentifier['./MaterialTheme'])).then(function (component) {
  36. return component.default;
  37. });
  38. }),
  39. classic: (0, _AsyncComponent2.default)(function () {
  40. return (typeof _systemImportTransformerGlobalIdentifier.define === 'function' && _systemImportTransformerGlobalIdentifier.define.amd ? new Promise(function (resolve, reject) {
  41. _systemImportTransformerGlobalIdentifier.require(['./ClassicTheme'], resolve, reject);
  42. }) : typeof module !== 'undefined' && module.exports && typeof require !== 'undefined' || typeof module !== 'undefined' && module.component && _systemImportTransformerGlobalIdentifier.require && _systemImportTransformerGlobalIdentifier.require.loader === 'component' ? Promise.resolve(require(('./ClassicTheme'))) : Promise.resolve(_systemImportTransformerGlobalIdentifier['./ClassicTheme'])).then(function (component) {
  43. return component.default;
  44. });
  45. })
  46. };
  47. // aliases for defaultProps readability
  48. var TIME = _time2.default.time({ useTz: false });
  49. TIME.current = _time2.default.current();
  50. var propTypes = {
  51. autoMode: _propTypes2.default.bool,
  52. autoClose: _propTypes2.default.bool,
  53. colorPalette: _propTypes2.default.string,
  54. draggable: _propTypes2.default.bool,
  55. focused: _propTypes2.default.bool,
  56. language: _propTypes2.default.string,
  57. meridiem: _propTypes2.default.string,
  58. onFocusChange: _propTypes2.default.func,
  59. onTimeChange: _propTypes2.default.func,
  60. onTimezoneChange: _propTypes2.default.func,
  61. phrases: _propTypes2.default.object,
  62. placeholder: _propTypes2.default.string,
  63. showTimezone: _propTypes2.default.bool,
  64. theme: _propTypes2.default.string,
  65. time: _propTypes2.default.string,
  66. timeMode: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
  67. timezone: _propTypes2.default.string,
  68. timezoneIsEditable: _propTypes2.default.bool,
  69. trigger: _propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.object, _propTypes2.default.element, _propTypes2.default.array, _propTypes2.default.node, _propTypes2.default.instanceOf(_react2.default.Component), _propTypes2.default.instanceOf(_react2.default.PureComponent)]),
  70. withoutIcon: _propTypes2.default.bool,
  71. minuteStep: _propTypes2.default.number,
  72. limitDrag: _propTypes2.default.bool,
  73. timeFormat: _propTypes2.default.string,
  74. timeFormatter: _propTypes2.default.func,
  75. useTz: _propTypes2.default.bool,
  76. closeOnOutsideClick: _propTypes2.default.bool,
  77. timeConfig: _propTypes2.default.object,
  78. disabled: _propTypes2.default.bool,
  79. focusDropdownOnTime: _propTypes2.default.bool
  80. };
  81. var defaultProps = {
  82. autoMode: true,
  83. autoClose: true,
  84. colorPalette: 'light',
  85. draggable: true,
  86. focused: false,
  87. language: 'en',
  88. meridiem: TIME.meridiem,
  89. onFocusChange: Function.prototype,
  90. onTimeChange: Function.prototype,
  91. onTimezoneChange: Function.prototype,
  92. placeholder: '',
  93. showTimezone: false,
  94. theme: 'material',
  95. time: '',
  96. timeMode: TIME.mode,
  97. trigger: null,
  98. withoutIcon: false,
  99. minuteStep: 5,
  100. limitDrag: false,
  101. timeFormat: '',
  102. timeFormatter: null,
  103. useTz: true,
  104. closeOnOutsideClick: true,
  105. timeConfig: {
  106. step: 30,
  107. unit: 'minutes'
  108. },
  109. disabled: false,
  110. focusDropdownOnTime: true
  111. };
  112. var TimePicker = function (_React$PureComponent) {
  113. _inherits(TimePicker, _React$PureComponent);
  114. function TimePicker(props) {
  115. _classCallCheck(this, TimePicker);
  116. var _this = _possibleConstructorReturn(this, (TimePicker.__proto__ || Object.getPrototypeOf(TimePicker)).call(this, props));
  117. var focused = props.focused,
  118. timezone = props.timezone,
  119. onTimezoneChange = props.onTimezoneChange;
  120. var timeData = _this.timeData(false);
  121. var timezoneData = _time2.default.tzForName(timeData.timezone);
  122. _this.state = {
  123. focused: focused,
  124. timezoneData: timezoneData,
  125. timeChanged: false
  126. };
  127. _this.onBlur = _this.onBlur.bind(_this);
  128. _this.onFocus = _this.onFocus.bind(_this);
  129. _this.timeData = _this.timeData.bind(_this);
  130. _this.handleTimeChange = _this.handleTimeChange.bind(_this);
  131. _this.handleHourChange = _this.handleHourChange.bind(_this);
  132. _this.handleMinuteChange = _this.handleMinuteChange.bind(_this);
  133. _this.handleMeridiemChange = _this.handleMeridiemChange.bind(_this);
  134. _this.handleHourAndMinuteChange = _this.handleHourAndMinuteChange.bind(_this);
  135. // if a timezone value was not passed in,
  136. // call the callback with the default value used for timezone
  137. if (!timezone) {
  138. onTimezoneChange(timezoneData);
  139. }
  140. return _this;
  141. }
  142. _createClass(TimePicker, [{
  143. key: 'componentWillReceiveProps',
  144. value: function componentWillReceiveProps(nextProps) {
  145. var focused = nextProps.focused;
  146. if (focused !== this.props.focused) {
  147. this.setState({ focused: focused });
  148. }
  149. }
  150. }, {
  151. key: 'onFocus',
  152. value: function onFocus() {
  153. var focused = this.state.focused;
  154. if (!focused) {
  155. this.onFocusChange(!focused);
  156. }
  157. }
  158. }, {
  159. key: 'onBlur',
  160. value: function onBlur() {
  161. var focused = this.state.focused;
  162. if (focused) {
  163. this.onFocusChange(!focused);
  164. }
  165. }
  166. }, {
  167. key: 'onFocusChange',
  168. value: function onFocusChange(focused) {
  169. var disabled = this.props.disabled;
  170. if (disabled) return;
  171. this.setState({ focused: focused });
  172. var onFocusChange = this.props.onFocusChange;
  173. onFocusChange && onFocusChange(focused);
  174. }
  175. }, {
  176. key: 'timeData',
  177. value: function timeData(timeChanged) {
  178. var _props = this.props,
  179. time = _props.time,
  180. useTz = _props.useTz,
  181. timeMode = _props.timeMode,
  182. timezone = _props.timezone,
  183. meridiem = _props.meridiem;
  184. var timeData = _time2.default.time({
  185. time: time,
  186. meridiem: meridiem,
  187. timeMode: timeMode,
  188. tz: timezone,
  189. useTz: !time && !timeChanged && useTz
  190. });
  191. return timeData;
  192. }
  193. }, {
  194. key: 'onTimeChanged',
  195. value: function onTimeChanged(timeChanged) {
  196. this.setState({ timeChanged: timeChanged });
  197. }
  198. }, {
  199. key: 'handleHourChange',
  200. value: function handleHourChange(hour) {
  201. var validateHour = _time2.default.validate(hour);
  202. var minute = this.hourAndMinute[1];
  203. this.handleTimeChange({
  204. hour: validateHour,
  205. minute: minute,
  206. meridiem: this.meridiem
  207. });
  208. }
  209. }, {
  210. key: 'handleMinuteChange',
  211. value: function handleMinuteChange(minute) {
  212. var validateMinute = _time2.default.validate(minute);
  213. var hour = this.hourAndMinute[0];
  214. this.handleTimeChange({
  215. hour: hour,
  216. minute: validateMinute,
  217. meridiem: this.meridiem
  218. });
  219. }
  220. }, {
  221. key: 'handleMeridiemChange',
  222. value: function handleMeridiemChange(meridiem) {
  223. var _hourAndMinute = _slicedToArray(this.hourAndMinute, 2),
  224. hour = _hourAndMinute[0],
  225. minute = _hourAndMinute[1];
  226. this.handleTimeChange({
  227. hour: hour,
  228. minute: minute,
  229. meridiem: meridiem
  230. });
  231. }
  232. }, {
  233. key: 'handleTimeChange',
  234. value: function handleTimeChange(options) {
  235. var onTimeChange = this.props.onTimeChange;
  236. onTimeChange && onTimeChange(options);
  237. this.onTimeChanged(true);
  238. }
  239. }, {
  240. key: 'handleHourAndMinuteChange',
  241. value: function handleHourAndMinuteChange(time) {
  242. this.onTimeChanged(true);
  243. var _props2 = this.props,
  244. onTimeChange = _props2.onTimeChange,
  245. autoClose = _props2.autoClose;
  246. if (autoClose) this.onBlur();
  247. return onTimeChange && onTimeChange(time);
  248. }
  249. }, {
  250. key: 'renderDialPlate',
  251. value: function renderDialPlate() {
  252. var _props3 = this.props,
  253. theme = _props3.theme,
  254. disabled = _props3.disabled,
  255. timeMode = _props3.timeMode,
  256. autoMode = _props3.autoMode,
  257. autoClose = _props3.autoClose,
  258. draggable = _props3.draggable,
  259. language = _props3.language,
  260. limitDrag = _props3.limitDrag,
  261. minuteStep = _props3.minuteStep,
  262. timeConfig = _props3.timeConfig,
  263. colorPalette = _props3.colorPalette,
  264. showTimezone = _props3.showTimezone,
  265. onTimezoneChange = _props3.onTimezoneChange,
  266. timezoneIsEditable = _props3.timezoneIsEditable,
  267. focusDropdownOnTime = _props3.focusDropdownOnTime;
  268. if (disabled) return null;
  269. var dialTheme = theme === 'material' ? theme : 'classic';
  270. var DialPlate = DialPlates[dialTheme];
  271. var timezoneData = this.state.timezoneData;
  272. var _hourAndMinute2 = _slicedToArray(this.hourAndMinute, 2),
  273. hour = _hourAndMinute2[0],
  274. minute = _hourAndMinute2[1];
  275. return _react2.default.createElement(DialPlate, {
  276. hour: hour,
  277. minute: minute,
  278. autoMode: autoMode,
  279. autoClose: autoClose,
  280. language: language,
  281. draggable: draggable,
  282. limitDrag: limitDrag,
  283. timezone: timezoneData,
  284. meridiem: this.meridiem,
  285. timeConfig: timeConfig,
  286. showTimezone: showTimezone,
  287. phrases: this.languageData,
  288. colorPalette: colorPalette,
  289. clearFocus: this.onBlur,
  290. timeMode: parseInt(timeMode, 10),
  291. onTimezoneChange: onTimezoneChange,
  292. minuteStep: parseInt(minuteStep, 10),
  293. timezoneIsEditable: timezoneIsEditable,
  294. handleHourChange: this.handleHourChange,
  295. handleTimeChange: this.handleTimeChange,
  296. handleMinuteChange: this.handleMinuteChange,
  297. handleMeridiemChange: this.handleMeridiemChange,
  298. focusDropdownOnTime: focusDropdownOnTime
  299. });
  300. }
  301. }, {
  302. key: 'render',
  303. value: function render() {
  304. var _props4 = this.props,
  305. trigger = _props4.trigger,
  306. disabled = _props4.disabled,
  307. placeholder = _props4.placeholder,
  308. withoutIcon = _props4.withoutIcon,
  309. colorPalette = _props4.colorPalette,
  310. closeOnOutsideClick = _props4.closeOnOutsideClick;
  311. var focused = this.state.focused;
  312. var times = this.formattedTime;
  313. var pickerPreviewClass = (0, _classnames2.default)('time_picker_preview', focused && 'active', disabled && 'disabled');
  314. var containerClass = (0, _classnames2.default)('time_picker_container', colorPalette === 'dark' && 'dark');
  315. var previewContainerClass = (0, _classnames2.default)('preview_container', withoutIcon && 'without_icon');
  316. return _react2.default.createElement(
  317. 'div',
  318. { className: containerClass },
  319. trigger || _react2.default.createElement(
  320. _Button2.default,
  321. {
  322. onClick: this.onFocus,
  323. className: pickerPreviewClass
  324. },
  325. _react2.default.createElement(
  326. 'div',
  327. { className: previewContainerClass },
  328. withoutIcon ? '' : _icons2.default.time,
  329. placeholder || times
  330. )
  331. ),
  332. _react2.default.createElement(
  333. _OutsideClickHandler2.default,
  334. {
  335. focused: focused,
  336. onOutsideClick: this.onBlur,
  337. closeOnOutsideClick: disabled ? false : closeOnOutsideClick
  338. },
  339. this.renderDialPlate()
  340. )
  341. );
  342. }
  343. }, {
  344. key: 'languageData',
  345. get: function get() {
  346. var _props5 = this.props,
  347. language = _props5.language,
  348. _props5$phrases = _props5.phrases,
  349. phrases = _props5$phrases === undefined ? {} : _props5$phrases;
  350. return Object.assign({}, _language2.default.get(language), phrases);
  351. }
  352. }, {
  353. key: 'hourAndMinute',
  354. get: function get() {
  355. var timeMode = this.props.timeMode;
  356. var timeData = this.timeData(this.state.timeChanged);
  357. // Since someone might pass a time in 24h format, etc., we need to get it from
  358. // timeData to 'translate' it into the local format, including its accurate meridiem
  359. var hour = parseInt(timeMode, 10) === 12 ? parseInt(timeData.hour12, 10) === 12 ? '00' : timeData.hour12 : parseInt(timeData.hour24, 10) === 24 ? '00' : timeData.hour24;
  360. var minute = timeData.minute;
  361. return [hour, minute];
  362. }
  363. }, {
  364. key: 'formattedTime',
  365. get: function get() {
  366. var _props6 = this.props,
  367. timeMode = _props6.timeMode,
  368. timeFormat = _props6.timeFormat,
  369. timeFormatter = _props6.timeFormatter;
  370. var _hourAndMinute3 = _slicedToArray(this.hourAndMinute, 2),
  371. hour = _hourAndMinute3[0],
  372. minute = _hourAndMinute3[1];
  373. var validTimeMode = _time2.default.validateTimeMode(timeMode);
  374. var times = '';
  375. if (timeFormatter && _func.is.func(timeFormatter)) {
  376. times = timeFormatter({
  377. hour: hour,
  378. minute: minute,
  379. meridiem: this.meridiem
  380. });
  381. } else if (timeFormat && _func.is.string(timeFormat)) {
  382. times = timeFormat;
  383. if (/HH?/.test(times) || /MM?/.test(times)) {
  384. if (validTimeMode === 12) {
  385. console.warn('It seems you are using 12 hours mode with 24 hours time format. Please check your timeMode and timeFormat props');
  386. }
  387. } else if (/hh?/.test(times) || /mm?/.test(times)) {
  388. if (validTimeMode === 24) {
  389. console.warn('It seems you are using 24 hours mode with 12 hours time format. Please check your timeMode and timeFormat props');
  390. }
  391. }
  392. times = times.replace(/(HH|hh)/g, hour);
  393. times = times.replace(/(MM|mm)/g, minute);
  394. times = times.replace(/(H|h)/g, Number(hour));
  395. times = times.replace(/(M|m)/g, Number(minute));
  396. } else {
  397. times = validTimeMode === 12 ? hour + ' : ' + minute + ' ' + this.meridiem : hour + ' : ' + minute;
  398. }
  399. return times;
  400. }
  401. }, {
  402. key: 'meridiem',
  403. get: function get() {
  404. var meridiem = this.props.meridiem;
  405. var timeData = this.timeData(this.state.timeChanged);
  406. var localMessages = this.languageData;
  407. // eslint-disable-next-line no-unneeded-ternary
  408. var m = meridiem ? meridiem : timeData.meridiem;
  409. // eslint-disable-next-line no-extra-boolean-cast
  410. return m && !!m.match(/^am|pm/i) ? localMessages[m.toLowerCase()] : m;
  411. }
  412. }]);
  413. return TimePicker;
  414. }(_react2.default.PureComponent);
  415. TimePicker.propTypes = propTypes;
  416. TimePicker.defaultProps = defaultProps;
  417. exports.default = TimePicker;