RangePicker.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _PickerTrigger = _interopRequireDefault(require("./PickerTrigger"));
  11. var _PickerPanel = _interopRequireDefault(require("./PickerPanel"));
  12. var _usePickerInput = _interopRequireDefault(require("./hooks/usePickerInput"));
  13. var _PresetPanel = _interopRequireDefault(require("./PresetPanel"));
  14. var _miscUtil = _interopRequireWildcard(require("./utils/miscUtil"));
  15. var _uiUtil = require("./utils/uiUtil");
  16. var _PanelContext = require("./PanelContext");
  17. var _dateUtil = require("./utils/dateUtil");
  18. var _useValueTexts = _interopRequireDefault(require("./hooks/useValueTexts"));
  19. var _useTextValueMapping = _interopRequireDefault(require("./hooks/useTextValueMapping"));
  20. var _usePresets = _interopRequireDefault(require("./hooks/usePresets"));
  21. var _RangeContext = require("./RangeContext");
  22. var _useRangeDisabled = _interopRequireDefault(require("./hooks/useRangeDisabled"));
  23. var _getExtraFooter = _interopRequireDefault(require("./utils/getExtraFooter"));
  24. var _getRanges = _interopRequireDefault(require("./utils/getRanges"));
  25. var _useRangeViewDates = _interopRequireDefault(require("./hooks/useRangeViewDates"));
  26. var _useHoverValue = _interopRequireDefault(require("./hooks/useHoverValue"));
  27. var _useMergedState = _interopRequireDefault(require("../_util/hooks/useMergedState"));
  28. var _warning = require("../vc-util/warning");
  29. var _useState = _interopRequireDefault(require("../_util/hooks/useState"));
  30. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  31. var _warnUtil = require("./utils/warnUtil");
  32. var _useElementSize = require("../_util/hooks/_vueuse/useElementSize");
  33. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
  34. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  35. function reorderValues(values, generateConfig) {
  36. if (values && values[0] && values[1] && generateConfig.isAfter(values[0], values[1])) {
  37. return [values[1], values[0]];
  38. }
  39. return values;
  40. }
  41. function canValueTrigger(value, index, disabled, allowEmpty) {
  42. if (value) {
  43. return true;
  44. }
  45. if (allowEmpty && allowEmpty[index]) {
  46. return true;
  47. }
  48. if (disabled[(index + 1) % 2]) {
  49. return true;
  50. }
  51. return false;
  52. }
  53. function RangerPicker() {
  54. return (0, _vue.defineComponent)({
  55. name: 'RangerPicker',
  56. inheritAttrs: false,
  57. props: ['prefixCls', 'id', 'popupStyle', 'dropdownClassName', 'transitionName', 'dropdownAlign', 'getPopupContainer', 'generateConfig', 'locale', 'placeholder', 'autofocus', 'disabled', 'format', 'picker', 'showTime', 'showNow', 'showHour', 'showMinute', 'showSecond', 'use12Hours', 'separator', 'value', 'defaultValue', 'defaultPickerValue', 'open', 'defaultOpen', 'disabledDate', 'disabledTime', 'dateRender', 'panelRender', 'ranges', 'allowEmpty', 'allowClear', 'suffixIcon', 'clearIcon', 'pickerRef', 'inputReadOnly', 'mode', 'renderExtraFooter', 'onChange', 'onOpenChange', 'onPanelChange', 'onCalendarChange', 'onFocus', 'onBlur', 'onMousedown', 'onMouseup', 'onMouseenter', 'onMouseleave', 'onClick', 'onOk', 'onKeydown', 'components', 'order', 'direction', 'activePickerIndex', 'autocomplete', 'minuteStep', 'hourStep', 'secondStep', 'hideDisabledOptions', 'disabledMinutes', 'presets', 'prevIcon', 'nextIcon', 'superPrevIcon', 'superNextIcon'],
  58. setup(props, _ref) {
  59. let {
  60. attrs,
  61. expose
  62. } = _ref;
  63. const needConfirmButton = (0, _vue.computed)(() => props.picker === 'date' && !!props.showTime || props.picker === 'time');
  64. const presets = (0, _vue.computed)(() => props.presets);
  65. const ranges = (0, _vue.computed)(() => props.ranges);
  66. const presetList = (0, _usePresets.default)(presets, ranges);
  67. // We record oqqpened status here in case repeat open with picker
  68. const openRecordsRef = (0, _vue.ref)({});
  69. const containerRef = (0, _vue.ref)(null);
  70. const panelDivRef = (0, _vue.ref)(null);
  71. const startInputDivRef = (0, _vue.ref)(null);
  72. const endInputDivRef = (0, _vue.ref)(null);
  73. const separatorRef = (0, _vue.ref)(null);
  74. const startInputRef = (0, _vue.ref)(null);
  75. const endInputRef = (0, _vue.ref)(null);
  76. const arrowRef = (0, _vue.ref)(null);
  77. // ============================ Warning ============================
  78. if (process.env.NODE_ENV !== 'production') {
  79. (0, _warnUtil.legacyPropsWarning)(props);
  80. }
  81. // ============================= Misc ==============================
  82. const formatList = (0, _vue.computed)(() => (0, _miscUtil.toArray)((0, _uiUtil.getDefaultFormat)(props.format, props.picker, props.showTime, props.use12Hours)));
  83. // Active picker
  84. const [mergedActivePickerIndex, setMergedActivePickerIndex] = (0, _useMergedState.default)(0, {
  85. value: (0, _vue.toRef)(props, 'activePickerIndex')
  86. });
  87. // Operation ref
  88. const operationRef = (0, _vue.ref)(null);
  89. const mergedDisabled = (0, _vue.computed)(() => {
  90. const {
  91. disabled
  92. } = props;
  93. if (Array.isArray(disabled)) {
  94. return disabled;
  95. }
  96. return [disabled || false, disabled || false];
  97. });
  98. // ============================= Value =============================
  99. const [mergedValue, setInnerValue] = (0, _useMergedState.default)(null, {
  100. value: (0, _vue.toRef)(props, 'value'),
  101. defaultValue: props.defaultValue,
  102. postState: values => props.picker === 'time' && !props.order ? values : reorderValues(values, props.generateConfig)
  103. });
  104. // =========================== View Date ===========================
  105. // Config view panel
  106. const [startViewDate, endViewDate, setViewDate] = (0, _useRangeViewDates.default)({
  107. values: mergedValue,
  108. picker: (0, _vue.toRef)(props, 'picker'),
  109. defaultDates: props.defaultPickerValue,
  110. generateConfig: (0, _vue.toRef)(props, 'generateConfig')
  111. });
  112. // ========================= Select Values =========================
  113. const [selectedValue, setSelectedValue] = (0, _useMergedState.default)(mergedValue.value, {
  114. postState: values => {
  115. let postValues = values;
  116. if (mergedDisabled.value[0] && mergedDisabled.value[1]) {
  117. return postValues;
  118. }
  119. // Fill disabled unit
  120. for (let i = 0; i < 2; i += 1) {
  121. if (mergedDisabled.value[i] && !(0, _miscUtil.getValue)(postValues, i) && !(0, _miscUtil.getValue)(props.allowEmpty, i)) {
  122. postValues = (0, _miscUtil.updateValues)(postValues, props.generateConfig.getNow(), i);
  123. }
  124. }
  125. return postValues;
  126. }
  127. });
  128. // ============================= Modes =============================
  129. const [mergedModes, setInnerModes] = (0, _useMergedState.default)([props.picker, props.picker], {
  130. value: (0, _vue.toRef)(props, 'mode')
  131. });
  132. (0, _vue.watch)(() => props.picker, () => {
  133. setInnerModes([props.picker, props.picker]);
  134. });
  135. const triggerModesChange = (modes, values) => {
  136. var _a;
  137. setInnerModes(modes);
  138. (_a = props.onPanelChange) === null || _a === void 0 ? void 0 : _a.call(props, values, modes);
  139. };
  140. // ========================= Disable Date ==========================
  141. const [disabledStartDate, disabledEndDate] = (0, _useRangeDisabled.default)({
  142. picker: (0, _vue.toRef)(props, 'picker'),
  143. selectedValue,
  144. locale: (0, _vue.toRef)(props, 'locale'),
  145. disabled: mergedDisabled,
  146. disabledDate: (0, _vue.toRef)(props, 'disabledDate'),
  147. generateConfig: (0, _vue.toRef)(props, 'generateConfig')
  148. }, openRecordsRef);
  149. // ============================= Open ==============================
  150. const [mergedOpen, triggerInnerOpen] = (0, _useMergedState.default)(false, {
  151. value: (0, _vue.toRef)(props, 'open'),
  152. defaultValue: props.defaultOpen,
  153. postState: postOpen => mergedDisabled.value[mergedActivePickerIndex.value] ? false : postOpen,
  154. onChange: newOpen => {
  155. var _a;
  156. (_a = props.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(props, newOpen);
  157. if (!newOpen && operationRef.value && operationRef.value.onClose) {
  158. operationRef.value.onClose();
  159. }
  160. }
  161. });
  162. const startOpen = (0, _vue.computed)(() => mergedOpen.value && mergedActivePickerIndex.value === 0);
  163. const endOpen = (0, _vue.computed)(() => mergedOpen.value && mergedActivePickerIndex.value === 1);
  164. const panelLeft = (0, _vue.ref)(0);
  165. const arrowLeft = (0, _vue.ref)(0);
  166. // ============================= Popup =============================
  167. // Popup min width
  168. const popupMinWidth = (0, _vue.ref)(0);
  169. const {
  170. width: containerWidth
  171. } = (0, _useElementSize.useElementSize)(containerRef);
  172. (0, _vue.watch)([mergedOpen, containerWidth], () => {
  173. if (!mergedOpen.value && containerRef.value) {
  174. popupMinWidth.value = containerWidth.value;
  175. }
  176. });
  177. const {
  178. width: panelDivWidth
  179. } = (0, _useElementSize.useElementSize)(panelDivRef);
  180. const {
  181. width: arrowWidth
  182. } = (0, _useElementSize.useElementSize)(arrowRef);
  183. const {
  184. width: startInputDivWidth
  185. } = (0, _useElementSize.useElementSize)(startInputDivRef);
  186. const {
  187. width: separatorWidth
  188. } = (0, _useElementSize.useElementSize)(separatorRef);
  189. (0, _vue.watch)([mergedActivePickerIndex, mergedOpen, panelDivWidth, arrowWidth, startInputDivWidth, separatorWidth, () => props.direction], () => {
  190. arrowLeft.value = 0;
  191. if (mergedActivePickerIndex.value) {
  192. if (startInputDivRef.value && separatorRef.value) {
  193. arrowLeft.value = startInputDivWidth.value + separatorWidth.value;
  194. if (panelDivWidth.value && arrowWidth.value && arrowLeft.value > panelDivWidth.value - arrowWidth.value - (props.direction === 'rtl' || arrowRef.value.offsetLeft > arrowLeft.value ? 0 : arrowRef.value.offsetLeft)) {
  195. panelLeft.value = arrowLeft.value;
  196. }
  197. }
  198. } else if (mergedActivePickerIndex.value === 0) {
  199. panelLeft.value = 0;
  200. }
  201. }, {
  202. immediate: true
  203. });
  204. // ============================ Trigger ============================
  205. const triggerRef = (0, _vue.ref)();
  206. function triggerOpen(newOpen, index) {
  207. if (newOpen) {
  208. clearTimeout(triggerRef.value);
  209. openRecordsRef.value[index] = true;
  210. setMergedActivePickerIndex(index);
  211. triggerInnerOpen(newOpen);
  212. // Open to reset view date
  213. if (!mergedOpen.value) {
  214. setViewDate(null, index);
  215. }
  216. } else if (mergedActivePickerIndex.value === index) {
  217. triggerInnerOpen(newOpen);
  218. // Clean up async
  219. // This makes ref not quick refresh in case user open another input with blur trigger
  220. const openRecords = openRecordsRef.value;
  221. triggerRef.value = setTimeout(() => {
  222. if (openRecords === openRecordsRef.value) {
  223. openRecordsRef.value = {};
  224. }
  225. });
  226. }
  227. }
  228. function triggerOpenAndFocus(index) {
  229. triggerOpen(true, index);
  230. // Use setTimeout to make sure panel DOM exists
  231. setTimeout(() => {
  232. const inputRef = [startInputRef, endInputRef][index];
  233. if (inputRef.value) {
  234. inputRef.value.focus();
  235. }
  236. }, 0);
  237. }
  238. function triggerChange(newValue, sourceIndex) {
  239. let values = newValue;
  240. let startValue = (0, _miscUtil.getValue)(values, 0);
  241. let endValue = (0, _miscUtil.getValue)(values, 1);
  242. const {
  243. generateConfig,
  244. locale,
  245. picker,
  246. order,
  247. onCalendarChange,
  248. allowEmpty,
  249. onChange,
  250. showTime
  251. } = props;
  252. // >>>>> Format start & end values
  253. if (startValue && endValue && generateConfig.isAfter(startValue, endValue)) {
  254. if (
  255. // WeekPicker only compare week
  256. picker === 'week' && !(0, _dateUtil.isSameWeek)(generateConfig, locale.locale, startValue, endValue) ||
  257. // QuotaPicker only compare week
  258. picker === 'quarter' && !(0, _dateUtil.isSameQuarter)(generateConfig, startValue, endValue) ||
  259. // Other non-TimePicker compare date
  260. picker !== 'week' && picker !== 'quarter' && picker !== 'time' && !(showTime ? (0, _dateUtil.isEqual)(generateConfig, startValue, endValue) : (0, _dateUtil.isSameDate)(generateConfig, startValue, endValue))) {
  261. // Clean up end date when start date is after end date
  262. if (sourceIndex === 0) {
  263. values = [startValue, null];
  264. endValue = null;
  265. } else {
  266. startValue = null;
  267. values = [null, endValue];
  268. }
  269. // Clean up cache since invalidate
  270. openRecordsRef.value = {
  271. [sourceIndex]: true
  272. };
  273. } else if (picker !== 'time' || order !== false) {
  274. // Reorder when in same date
  275. values = reorderValues(values, generateConfig);
  276. }
  277. }
  278. setSelectedValue(values);
  279. const startStr = values && values[0] ? (0, _dateUtil.formatValue)(values[0], {
  280. generateConfig,
  281. locale,
  282. format: formatList.value[0]
  283. }) : '';
  284. const endStr = values && values[1] ? (0, _dateUtil.formatValue)(values[1], {
  285. generateConfig,
  286. locale,
  287. format: formatList.value[0]
  288. }) : '';
  289. if (onCalendarChange) {
  290. const info = {
  291. range: sourceIndex === 0 ? 'start' : 'end'
  292. };
  293. onCalendarChange(values, [startStr, endStr], info);
  294. }
  295. // >>>>> Trigger `onChange` event
  296. const canStartValueTrigger = canValueTrigger(startValue, 0, mergedDisabled.value, allowEmpty);
  297. const canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled.value, allowEmpty);
  298. const canTrigger = values === null || canStartValueTrigger && canEndValueTrigger;
  299. if (canTrigger) {
  300. // Trigger onChange only when value is validate
  301. setInnerValue(values);
  302. if (onChange && (!(0, _dateUtil.isEqual)(generateConfig, (0, _miscUtil.getValue)(mergedValue.value, 0), startValue) || !(0, _dateUtil.isEqual)(generateConfig, (0, _miscUtil.getValue)(mergedValue.value, 1), endValue))) {
  303. onChange(values, [startStr, endStr]);
  304. }
  305. }
  306. // >>>>> Open picker when
  307. // Always open another picker if possible
  308. let nextOpenIndex = null;
  309. if (sourceIndex === 0 && !mergedDisabled.value[1]) {
  310. nextOpenIndex = 1;
  311. } else if (sourceIndex === 1 && !mergedDisabled.value[0]) {
  312. nextOpenIndex = 0;
  313. }
  314. if (nextOpenIndex !== null && nextOpenIndex !== mergedActivePickerIndex.value && (!openRecordsRef.value[nextOpenIndex] || !(0, _miscUtil.getValue)(values, nextOpenIndex)) && (0, _miscUtil.getValue)(values, sourceIndex)) {
  315. // Delay to focus to avoid input blur trigger expired selectedValues
  316. triggerOpenAndFocus(nextOpenIndex);
  317. } else {
  318. triggerOpen(false, sourceIndex);
  319. }
  320. }
  321. const forwardKeydown = e => {
  322. if (mergedOpen && operationRef.value && operationRef.value.onKeydown) {
  323. // Let popup panel handle keyboard
  324. return operationRef.value.onKeydown(e);
  325. }
  326. /* istanbul ignore next */
  327. /* eslint-disable no-lone-blocks */
  328. {
  329. (0, _warning.warning)(false, 'Picker not correct forward Keydown operation. Please help to fire issue about this.');
  330. return false;
  331. }
  332. };
  333. // ============================= Text ==============================
  334. const sharedTextHooksProps = {
  335. formatList,
  336. generateConfig: (0, _vue.toRef)(props, 'generateConfig'),
  337. locale: (0, _vue.toRef)(props, 'locale')
  338. };
  339. const [startValueTexts, firstStartValueText] = (0, _useValueTexts.default)((0, _vue.computed)(() => (0, _miscUtil.getValue)(selectedValue.value, 0)), sharedTextHooksProps);
  340. const [endValueTexts, firstEndValueText] = (0, _useValueTexts.default)((0, _vue.computed)(() => (0, _miscUtil.getValue)(selectedValue.value, 1)), sharedTextHooksProps);
  341. const onTextChange = (newText, index) => {
  342. const inputDate = (0, _dateUtil.parseValue)(newText, {
  343. locale: props.locale,
  344. formatList: formatList.value,
  345. generateConfig: props.generateConfig
  346. });
  347. const disabledFunc = index === 0 ? disabledStartDate : disabledEndDate;
  348. if (inputDate && !disabledFunc(inputDate)) {
  349. setSelectedValue((0, _miscUtil.updateValues)(selectedValue.value, inputDate, index));
  350. setViewDate(inputDate, index);
  351. }
  352. };
  353. const [startText, triggerStartTextChange, resetStartText] = (0, _useTextValueMapping.default)({
  354. valueTexts: startValueTexts,
  355. onTextChange: newText => onTextChange(newText, 0)
  356. });
  357. const [endText, triggerEndTextChange, resetEndText] = (0, _useTextValueMapping.default)({
  358. valueTexts: endValueTexts,
  359. onTextChange: newText => onTextChange(newText, 1)
  360. });
  361. const [rangeHoverValue, setRangeHoverValue] = (0, _useState.default)(null);
  362. // ========================== Hover Range ==========================
  363. const [hoverRangedValue, setHoverRangedValue] = (0, _useState.default)(null);
  364. const [startHoverValue, onStartEnter, onStartLeave] = (0, _useHoverValue.default)(startText, sharedTextHooksProps);
  365. const [endHoverValue, onEndEnter, onEndLeave] = (0, _useHoverValue.default)(endText, sharedTextHooksProps);
  366. const onDateMouseenter = date => {
  367. setHoverRangedValue((0, _miscUtil.updateValues)(selectedValue.value, date, mergedActivePickerIndex.value));
  368. if (mergedActivePickerIndex.value === 0) {
  369. onStartEnter(date);
  370. } else {
  371. onEndEnter(date);
  372. }
  373. };
  374. const onDateMouseleave = () => {
  375. setHoverRangedValue((0, _miscUtil.updateValues)(selectedValue.value, null, mergedActivePickerIndex.value));
  376. if (mergedActivePickerIndex.value === 0) {
  377. onStartLeave();
  378. } else {
  379. onEndLeave();
  380. }
  381. };
  382. // ============================= Input =============================
  383. const getSharedInputHookProps = (index, resetText) => ({
  384. forwardKeydown,
  385. onBlur: e => {
  386. var _a;
  387. (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
  388. },
  389. isClickOutside: target => !(0, _uiUtil.elementsContains)([panelDivRef.value, startInputDivRef.value, endInputDivRef.value, containerRef.value], target),
  390. onFocus: e => {
  391. var _a;
  392. setMergedActivePickerIndex(index);
  393. (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
  394. },
  395. triggerOpen: newOpen => {
  396. triggerOpen(newOpen, index);
  397. },
  398. onSubmit: () => {
  399. if (
  400. // When user typing disabledDate with keyboard and enter, this value will be empty
  401. !selectedValue.value ||
  402. // Normal disabled check
  403. props.disabledDate && props.disabledDate(selectedValue.value[index])) {
  404. return false;
  405. }
  406. triggerChange(selectedValue.value, index);
  407. resetText();
  408. },
  409. onCancel: () => {
  410. triggerOpen(false, index);
  411. setSelectedValue(mergedValue.value);
  412. resetText();
  413. }
  414. });
  415. const [startInputProps, {
  416. focused: startFocused,
  417. typing: startTyping
  418. }] = (0, _usePickerInput.default)((0, _extends2.default)((0, _extends2.default)({}, getSharedInputHookProps(0, resetStartText)), {
  419. blurToCancel: needConfirmButton,
  420. open: startOpen,
  421. value: startText,
  422. onKeydown: (e, preventDefault) => {
  423. var _a;
  424. (_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault);
  425. }
  426. }));
  427. const [endInputProps, {
  428. focused: endFocused,
  429. typing: endTyping
  430. }] = (0, _usePickerInput.default)((0, _extends2.default)((0, _extends2.default)({}, getSharedInputHookProps(1, resetEndText)), {
  431. blurToCancel: needConfirmButton,
  432. open: endOpen,
  433. value: endText,
  434. onKeydown: (e, preventDefault) => {
  435. var _a;
  436. (_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault);
  437. }
  438. }));
  439. // ========================== Click Picker ==========================
  440. const onPickerClick = e => {
  441. var _a;
  442. // When click inside the picker & outside the picker's input elements
  443. // the panel should still be opened
  444. (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, e);
  445. if (!mergedOpen.value && !startInputRef.value.contains(e.target) && !endInputRef.value.contains(e.target)) {
  446. if (!mergedDisabled.value[0]) {
  447. triggerOpenAndFocus(0);
  448. } else if (!mergedDisabled.value[1]) {
  449. triggerOpenAndFocus(1);
  450. }
  451. }
  452. };
  453. const onPickerMousedown = e => {
  454. var _a;
  455. // shouldn't affect input elements if picker is active
  456. (_a = props.onMousedown) === null || _a === void 0 ? void 0 : _a.call(props, e);
  457. if (mergedOpen.value && (startFocused.value || endFocused.value) && !startInputRef.value.contains(e.target) && !endInputRef.value.contains(e.target)) {
  458. e.preventDefault();
  459. }
  460. };
  461. // ============================= Sync ==============================
  462. // Close should sync back with text value
  463. const startStr = (0, _vue.computed)(() => {
  464. var _a;
  465. return ((_a = mergedValue.value) === null || _a === void 0 ? void 0 : _a[0]) ? (0, _dateUtil.formatValue)(mergedValue.value[0], {
  466. locale: props.locale,
  467. format: 'YYYYMMDDHHmmss',
  468. generateConfig: props.generateConfig
  469. }) : '';
  470. });
  471. const endStr = (0, _vue.computed)(() => {
  472. var _a;
  473. return ((_a = mergedValue.value) === null || _a === void 0 ? void 0 : _a[1]) ? (0, _dateUtil.formatValue)(mergedValue.value[1], {
  474. locale: props.locale,
  475. format: 'YYYYMMDDHHmmss',
  476. generateConfig: props.generateConfig
  477. }) : '';
  478. });
  479. (0, _vue.watch)([mergedOpen, startValueTexts, endValueTexts], () => {
  480. if (!mergedOpen.value) {
  481. setSelectedValue(mergedValue.value);
  482. if (!startValueTexts.value.length || startValueTexts.value[0] === '') {
  483. triggerStartTextChange('');
  484. } else if (firstStartValueText.value !== startText.value) {
  485. resetStartText();
  486. }
  487. if (!endValueTexts.value.length || endValueTexts.value[0] === '') {
  488. triggerEndTextChange('');
  489. } else if (firstEndValueText.value !== endText.value) {
  490. resetEndText();
  491. }
  492. }
  493. });
  494. // Sync innerValue with control mode
  495. (0, _vue.watch)([startStr, endStr], () => {
  496. setSelectedValue(mergedValue.value);
  497. });
  498. // ============================ Warning ============================
  499. if (process.env.NODE_ENV !== 'production') {
  500. (0, _vue.watchEffect)(() => {
  501. const {
  502. value,
  503. disabled
  504. } = props;
  505. if (value && Array.isArray(disabled) && ((0, _miscUtil.getValue)(disabled, 0) && !(0, _miscUtil.getValue)(value, 0) || (0, _miscUtil.getValue)(disabled, 1) && !(0, _miscUtil.getValue)(value, 1))) {
  506. (0, _warning.warning)(false, '`disabled` should not set with empty `value`. You should set `allowEmpty` or `value` instead.');
  507. }
  508. });
  509. }
  510. expose({
  511. focus: () => {
  512. if (startInputRef.value) {
  513. startInputRef.value.focus();
  514. }
  515. },
  516. blur: () => {
  517. if (startInputRef.value) {
  518. startInputRef.value.blur();
  519. }
  520. if (endInputRef.value) {
  521. endInputRef.value.blur();
  522. }
  523. }
  524. });
  525. // ============================= Panel =============================
  526. const panelHoverRangedValue = (0, _vue.computed)(() => {
  527. if (mergedOpen.value && hoverRangedValue.value && hoverRangedValue.value[0] && hoverRangedValue.value[1] && props.generateConfig.isAfter(hoverRangedValue.value[1], hoverRangedValue.value[0])) {
  528. return hoverRangedValue.value;
  529. } else {
  530. return null;
  531. }
  532. });
  533. function renderPanel() {
  534. let panelPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  535. let panelProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  536. const {
  537. generateConfig,
  538. showTime,
  539. dateRender,
  540. direction,
  541. disabledTime,
  542. prefixCls,
  543. locale
  544. } = props;
  545. let panelShowTime = showTime;
  546. if (showTime && typeof showTime === 'object' && showTime.defaultValue) {
  547. const timeDefaultValues = showTime.defaultValue;
  548. panelShowTime = (0, _extends2.default)((0, _extends2.default)({}, showTime), {
  549. defaultValue: (0, _miscUtil.getValue)(timeDefaultValues, mergedActivePickerIndex.value) || undefined
  550. });
  551. }
  552. let panelDateRender = null;
  553. if (dateRender) {
  554. panelDateRender = _ref2 => {
  555. let {
  556. current: date,
  557. today
  558. } = _ref2;
  559. return dateRender({
  560. current: date,
  561. today,
  562. info: {
  563. range: mergedActivePickerIndex.value ? 'end' : 'start'
  564. }
  565. });
  566. };
  567. }
  568. return (0, _vue.createVNode)(_RangeContext.RangeContextProvider, {
  569. "value": {
  570. inRange: true,
  571. panelPosition,
  572. rangedValue: rangeHoverValue.value || selectedValue.value,
  573. hoverRangedValue: panelHoverRangedValue.value
  574. }
  575. }, {
  576. default: () => [(0, _vue.createVNode)(_PickerPanel.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), panelProps), {}, {
  577. "dateRender": panelDateRender,
  578. "showTime": panelShowTime,
  579. "mode": mergedModes.value[mergedActivePickerIndex.value],
  580. "generateConfig": generateConfig,
  581. "style": undefined,
  582. "direction": direction,
  583. "disabledDate": mergedActivePickerIndex.value === 0 ? disabledStartDate : disabledEndDate,
  584. "disabledTime": date => {
  585. if (disabledTime) {
  586. return disabledTime(date, mergedActivePickerIndex.value === 0 ? 'start' : 'end');
  587. }
  588. return false;
  589. },
  590. "class": (0, _classNames.default)({
  591. [`${prefixCls}-panel-focused`]: mergedActivePickerIndex.value === 0 ? !startTyping.value : !endTyping.value
  592. }),
  593. "value": (0, _miscUtil.getValue)(selectedValue.value, mergedActivePickerIndex.value),
  594. "locale": locale,
  595. "tabIndex": -1,
  596. "onPanelChange": (date, newMode) => {
  597. // clear hover value when panel change
  598. if (mergedActivePickerIndex.value === 0) {
  599. onStartLeave(true);
  600. }
  601. if (mergedActivePickerIndex.value === 1) {
  602. onEndLeave(true);
  603. }
  604. triggerModesChange((0, _miscUtil.updateValues)(mergedModes.value, newMode, mergedActivePickerIndex.value), (0, _miscUtil.updateValues)(selectedValue.value, date, mergedActivePickerIndex.value));
  605. let viewDate = date;
  606. if (panelPosition === 'right' && mergedModes.value[mergedActivePickerIndex.value] === newMode) {
  607. viewDate = (0, _dateUtil.getClosingViewDate)(viewDate, newMode, generateConfig, -1);
  608. }
  609. setViewDate(viewDate, mergedActivePickerIndex.value);
  610. },
  611. "onOk": null,
  612. "onSelect": undefined,
  613. "onChange": undefined,
  614. "defaultValue": mergedActivePickerIndex.value === 0 ? (0, _miscUtil.getValue)(selectedValue.value, 1) : (0, _miscUtil.getValue)(selectedValue.value, 0)
  615. }), null)]
  616. });
  617. }
  618. const onContextSelect = (date, type) => {
  619. const values = (0, _miscUtil.updateValues)(selectedValue.value, date, mergedActivePickerIndex.value);
  620. if (type === 'submit' || type !== 'key' && !needConfirmButton.value) {
  621. // triggerChange will also update selected values
  622. triggerChange(values, mergedActivePickerIndex.value);
  623. // clear hover value style
  624. if (mergedActivePickerIndex.value === 0) {
  625. onStartLeave();
  626. } else {
  627. onEndLeave();
  628. }
  629. } else {
  630. setSelectedValue(values);
  631. }
  632. };
  633. (0, _PanelContext.useProvidePanel)({
  634. operationRef,
  635. hideHeader: (0, _vue.computed)(() => props.picker === 'time'),
  636. onDateMouseenter,
  637. onDateMouseleave,
  638. hideRanges: (0, _vue.computed)(() => true),
  639. onSelect: onContextSelect,
  640. open: mergedOpen
  641. });
  642. return () => {
  643. const {
  644. prefixCls = 'rc-picker',
  645. id,
  646. popupStyle,
  647. dropdownClassName,
  648. transitionName,
  649. dropdownAlign,
  650. getPopupContainer,
  651. generateConfig,
  652. locale,
  653. placeholder,
  654. autofocus,
  655. picker = 'date',
  656. showTime,
  657. separator = '~',
  658. disabledDate,
  659. panelRender,
  660. allowClear,
  661. suffixIcon,
  662. clearIcon,
  663. inputReadOnly,
  664. renderExtraFooter,
  665. onMouseenter,
  666. onMouseleave,
  667. onMouseup,
  668. onOk,
  669. components,
  670. direction,
  671. autocomplete = 'off'
  672. } = props;
  673. const arrowPositionStyle = direction === 'rtl' ? {
  674. right: `${arrowLeft.value}px`
  675. } : {
  676. left: `${arrowLeft.value}px`
  677. };
  678. function renderPanels() {
  679. let panels;
  680. const extraNode = (0, _getExtraFooter.default)(prefixCls, mergedModes.value[mergedActivePickerIndex.value], renderExtraFooter);
  681. const rangesNode = (0, _getRanges.default)({
  682. prefixCls,
  683. components,
  684. needConfirmButton: needConfirmButton.value,
  685. okDisabled: !(0, _miscUtil.getValue)(selectedValue.value, mergedActivePickerIndex.value) || disabledDate && disabledDate(selectedValue.value[mergedActivePickerIndex.value]),
  686. locale,
  687. onOk: () => {
  688. if ((0, _miscUtil.getValue)(selectedValue.value, mergedActivePickerIndex.value)) {
  689. // triggerChangeOld(selectedValue.value);
  690. triggerChange(selectedValue.value, mergedActivePickerIndex.value);
  691. if (onOk) {
  692. onOk(selectedValue.value);
  693. }
  694. }
  695. }
  696. });
  697. if (picker !== 'time' && !showTime) {
  698. const viewDate = mergedActivePickerIndex.value === 0 ? startViewDate.value : endViewDate.value;
  699. const nextViewDate = (0, _dateUtil.getClosingViewDate)(viewDate, picker, generateConfig);
  700. const currentMode = mergedModes.value[mergedActivePickerIndex.value];
  701. const showDoublePanel = currentMode === picker;
  702. const leftPanel = renderPanel(showDoublePanel ? 'left' : false, {
  703. pickerValue: viewDate,
  704. onPickerValueChange: newViewDate => {
  705. setViewDate(newViewDate, mergedActivePickerIndex.value);
  706. }
  707. });
  708. const rightPanel = renderPanel('right', {
  709. pickerValue: nextViewDate,
  710. onPickerValueChange: newViewDate => {
  711. setViewDate((0, _dateUtil.getClosingViewDate)(newViewDate, picker, generateConfig, -1), mergedActivePickerIndex.value);
  712. }
  713. });
  714. if (direction === 'rtl') {
  715. panels = (0, _vue.createVNode)(_vue.Fragment, null, [rightPanel, showDoublePanel && leftPanel]);
  716. } else {
  717. panels = (0, _vue.createVNode)(_vue.Fragment, null, [leftPanel, showDoublePanel && rightPanel]);
  718. }
  719. } else {
  720. panels = renderPanel();
  721. }
  722. let mergedNodes = (0, _vue.createVNode)("div", {
  723. "class": `${prefixCls}-panel-layout`
  724. }, [(0, _vue.createVNode)(_PresetPanel.default, {
  725. "prefixCls": prefixCls,
  726. "presets": presetList.value,
  727. "onClick": nextValue => {
  728. triggerChange(nextValue, null);
  729. triggerOpen(false, mergedActivePickerIndex.value);
  730. },
  731. "onHover": hoverValue => {
  732. setRangeHoverValue(hoverValue);
  733. }
  734. }, null), (0, _vue.createVNode)("div", null, [(0, _vue.createVNode)("div", {
  735. "class": `${prefixCls}-panels`
  736. }, [panels]), (extraNode || rangesNode) && (0, _vue.createVNode)("div", {
  737. "class": `${prefixCls}-footer`
  738. }, [extraNode, rangesNode])])]);
  739. if (panelRender) {
  740. mergedNodes = panelRender(mergedNodes);
  741. }
  742. return (0, _vue.createVNode)("div", {
  743. "class": `${prefixCls}-panel-container`,
  744. "style": {
  745. marginLeft: `${panelLeft.value}px`
  746. },
  747. "ref": panelDivRef,
  748. "onMousedown": e => {
  749. e.preventDefault();
  750. }
  751. }, [mergedNodes]);
  752. }
  753. const rangePanel = (0, _vue.createVNode)("div", {
  754. "class": (0, _classNames.default)(`${prefixCls}-range-wrapper`, `${prefixCls}-${picker}-range-wrapper`),
  755. "style": {
  756. minWidth: `${popupMinWidth.value}px`
  757. }
  758. }, [(0, _vue.createVNode)("div", {
  759. "ref": arrowRef,
  760. "class": `${prefixCls}-range-arrow`,
  761. "style": arrowPositionStyle
  762. }, null), renderPanels()]);
  763. // ============================= Icons =============================
  764. let suffixNode;
  765. if (suffixIcon) {
  766. suffixNode = (0, _vue.createVNode)("span", {
  767. "class": `${prefixCls}-suffix`
  768. }, [suffixIcon]);
  769. }
  770. let clearNode;
  771. if (allowClear && ((0, _miscUtil.getValue)(mergedValue.value, 0) && !mergedDisabled.value[0] || (0, _miscUtil.getValue)(mergedValue.value, 1) && !mergedDisabled.value[1])) {
  772. clearNode = (0, _vue.createVNode)("span", {
  773. "onMousedown": e => {
  774. e.preventDefault();
  775. e.stopPropagation();
  776. },
  777. "onMouseup": e => {
  778. e.preventDefault();
  779. e.stopPropagation();
  780. let values = mergedValue.value;
  781. if (!mergedDisabled.value[0]) {
  782. values = (0, _miscUtil.updateValues)(values, null, 0);
  783. }
  784. if (!mergedDisabled.value[1]) {
  785. values = (0, _miscUtil.updateValues)(values, null, 1);
  786. }
  787. triggerChange(values, null);
  788. triggerOpen(false, mergedActivePickerIndex.value);
  789. },
  790. "class": `${prefixCls}-clear`
  791. }, [clearIcon || (0, _vue.createVNode)("span", {
  792. "class": `${prefixCls}-clear-btn`
  793. }, null)]);
  794. }
  795. const inputSharedProps = {
  796. size: (0, _uiUtil.getInputSize)(picker, formatList.value[0], generateConfig)
  797. };
  798. let activeBarLeft = 0;
  799. let activeBarWidth = 0;
  800. if (startInputDivRef.value && endInputDivRef.value && separatorRef.value) {
  801. if (mergedActivePickerIndex.value === 0) {
  802. activeBarWidth = startInputDivRef.value.offsetWidth;
  803. } else {
  804. activeBarLeft = arrowLeft.value;
  805. activeBarWidth = endInputDivRef.value.offsetWidth;
  806. }
  807. }
  808. const activeBarPositionStyle = direction === 'rtl' ? {
  809. right: `${activeBarLeft}px`
  810. } : {
  811. left: `${activeBarLeft}px`
  812. };
  813. // ============================ Return =============================
  814. return (0, _vue.createVNode)("div", (0, _objectSpread2.default)({
  815. "ref": containerRef,
  816. "class": (0, _classNames.default)(prefixCls, `${prefixCls}-range`, attrs.class, {
  817. [`${prefixCls}-disabled`]: mergedDisabled.value[0] && mergedDisabled.value[1],
  818. [`${prefixCls}-focused`]: mergedActivePickerIndex.value === 0 ? startFocused.value : endFocused.value,
  819. [`${prefixCls}-rtl`]: direction === 'rtl'
  820. }),
  821. "style": attrs.style,
  822. "onClick": onPickerClick,
  823. "onMouseenter": onMouseenter,
  824. "onMouseleave": onMouseleave,
  825. "onMousedown": onPickerMousedown,
  826. "onMouseup": onMouseup
  827. }, (0, _miscUtil.default)(props)), [(0, _vue.createVNode)("div", {
  828. "class": (0, _classNames.default)(`${prefixCls}-input`, {
  829. [`${prefixCls}-input-active`]: mergedActivePickerIndex.value === 0,
  830. [`${prefixCls}-input-placeholder`]: !!startHoverValue.value
  831. }),
  832. "ref": startInputDivRef
  833. }, [(0, _vue.createVNode)("input", (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
  834. "id": id,
  835. "disabled": mergedDisabled.value[0],
  836. "readonly": inputReadOnly || typeof formatList.value[0] === 'function' || !startTyping.value,
  837. "value": startHoverValue.value || startText.value,
  838. "onInput": e => {
  839. triggerStartTextChange(e.target.value);
  840. },
  841. "autofocus": autofocus,
  842. "placeholder": (0, _miscUtil.getValue)(placeholder, 0) || '',
  843. "ref": startInputRef
  844. }, startInputProps.value), inputSharedProps), {}, {
  845. "autocomplete": autocomplete
  846. }), null)]), (0, _vue.createVNode)("div", {
  847. "class": `${prefixCls}-range-separator`,
  848. "ref": separatorRef
  849. }, [separator]), (0, _vue.createVNode)("div", {
  850. "class": (0, _classNames.default)(`${prefixCls}-input`, {
  851. [`${prefixCls}-input-active`]: mergedActivePickerIndex.value === 1,
  852. [`${prefixCls}-input-placeholder`]: !!endHoverValue.value
  853. }),
  854. "ref": endInputDivRef
  855. }, [(0, _vue.createVNode)("input", (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
  856. "disabled": mergedDisabled.value[1],
  857. "readonly": inputReadOnly || typeof formatList.value[0] === 'function' || !endTyping.value,
  858. "value": endHoverValue.value || endText.value,
  859. "onInput": e => {
  860. triggerEndTextChange(e.target.value);
  861. },
  862. "placeholder": (0, _miscUtil.getValue)(placeholder, 1) || '',
  863. "ref": endInputRef
  864. }, endInputProps.value), inputSharedProps), {}, {
  865. "autocomplete": autocomplete
  866. }), null)]), (0, _vue.createVNode)("div", {
  867. "class": `${prefixCls}-active-bar`,
  868. "style": (0, _extends2.default)((0, _extends2.default)({}, activeBarPositionStyle), {
  869. width: `${activeBarWidth}px`,
  870. position: 'absolute'
  871. })
  872. }, null), suffixNode, clearNode, (0, _vue.createVNode)(_PickerTrigger.default, {
  873. "visible": mergedOpen.value,
  874. "popupStyle": popupStyle,
  875. "prefixCls": prefixCls,
  876. "dropdownClassName": dropdownClassName,
  877. "dropdownAlign": dropdownAlign,
  878. "getPopupContainer": getPopupContainer,
  879. "transitionName": transitionName,
  880. "range": true,
  881. "direction": direction
  882. }, {
  883. default: () => [(0, _vue.createVNode)("div", {
  884. "style": {
  885. pointerEvents: 'none',
  886. position: 'absolute',
  887. top: 0,
  888. bottom: 0,
  889. left: 0,
  890. right: 0
  891. }
  892. }, null)],
  893. popupElement: () => rangePanel
  894. })]);
  895. };
  896. }
  897. });
  898. }
  899. const InterRangerPicker = RangerPicker();
  900. var _default = exports.default = InterRangerPicker;