panel-year-range.mjs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import { defineComponent, ref, inject, computed, useSlots, toRef, watch, openBlock, createElementBlock, normalizeClass, unref, createElementVNode, renderSlot, Fragment, renderList, toDisplayString, createCommentVNode, createVNode, withCtx } from 'vue';
  2. import dayjs from 'dayjs';
  3. import { DArrowLeft, DArrowRight } from '@element-plus/icons-vue';
  4. import { ElIcon } from '../../../icon/index.mjs';
  5. import { panelYearRangeProps, panelYearRangeEmits } from '../props/panel-year-range.mjs';
  6. import { useShortcut } from '../composables/use-shortcut.mjs';
  7. import { useYearRangeHeader } from '../composables/use-year-range-header.mjs';
  8. import { isValidRange, correctlyParseUserInput } from '../utils.mjs';
  9. import { ROOT_PICKER_INJECTION_KEY } from '../constants.mjs';
  10. import YearTable from './basic-year-table.mjs';
  11. import _export_sfc from '../../../../_virtual/plugin-vue_export-helper.mjs';
  12. import { useLocale } from '../../../../hooks/use-locale/index.mjs';
  13. import { useNamespace } from '../../../../hooks/use-namespace/index.mjs';
  14. import { isArray } from '@vue/shared';
  15. const unit = "year";
  16. const __default__ = defineComponent({
  17. name: "DatePickerYearRange"
  18. });
  19. const _sfc_main = /* @__PURE__ */ defineComponent({
  20. ...__default__,
  21. props: panelYearRangeProps,
  22. emits: panelYearRangeEmits,
  23. setup(__props, { emit }) {
  24. const props = __props;
  25. const { lang } = useLocale();
  26. const leftDate = ref(dayjs().locale(lang.value));
  27. const rightDate = ref(leftDate.value.add(10, "year"));
  28. const { pickerNs: ppNs } = inject(ROOT_PICKER_INJECTION_KEY);
  29. const drpNs = useNamespace("date-range-picker");
  30. const isDefaultFormat = inject("ElIsDefaultFormat");
  31. const hasShortcuts = computed(() => !!shortcuts.length);
  32. const panelKls = computed(() => [
  33. ppNs.b(),
  34. drpNs.b(),
  35. {
  36. "has-sidebar": Boolean(useSlots().sidebar) || hasShortcuts.value
  37. }
  38. ]);
  39. const leftPanelKls = computed(() => {
  40. return {
  41. content: [ppNs.e("content"), drpNs.e("content"), "is-left"],
  42. arrowLeftBtn: [ppNs.e("icon-btn"), "d-arrow-left"],
  43. arrowRightBtn: [
  44. ppNs.e("icon-btn"),
  45. { [ppNs.is("disabled")]: !enableYearArrow.value },
  46. "d-arrow-right"
  47. ]
  48. };
  49. });
  50. const rightPanelKls = computed(() => {
  51. return {
  52. content: [ppNs.e("content"), drpNs.e("content"), "is-right"],
  53. arrowLeftBtn: [
  54. ppNs.e("icon-btn"),
  55. { "is-disabled": !enableYearArrow.value },
  56. "d-arrow-left"
  57. ],
  58. arrowRightBtn: [ppNs.e("icon-btn"), "d-arrow-right"]
  59. };
  60. });
  61. const handleShortcutClick = useShortcut(lang);
  62. const {
  63. leftPrevYear,
  64. rightNextYear,
  65. leftNextYear,
  66. rightPrevYear,
  67. leftLabel,
  68. rightLabel,
  69. leftYear,
  70. rightYear
  71. } = useYearRangeHeader({
  72. unlinkPanels: toRef(props, "unlinkPanels"),
  73. leftDate,
  74. rightDate
  75. });
  76. const enableYearArrow = computed(() => {
  77. return props.unlinkPanels && rightYear.value > leftYear.value + 1;
  78. });
  79. const minDate = ref();
  80. const maxDate = ref();
  81. const rangeState = ref({
  82. endDate: null,
  83. selecting: false
  84. });
  85. const handleChangeRange = (val) => {
  86. rangeState.value = val;
  87. };
  88. const handleRangePick = (val, close = true) => {
  89. const minDate_ = val.minDate;
  90. const maxDate_ = val.maxDate;
  91. if (maxDate.value === maxDate_ && minDate.value === minDate_) {
  92. return;
  93. }
  94. emit("calendar-change", [minDate_.toDate(), maxDate_ && maxDate_.toDate()]);
  95. maxDate.value = maxDate_;
  96. minDate.value = minDate_;
  97. if (!close)
  98. return;
  99. handleConfirm();
  100. };
  101. const handleConfirm = (visible = false) => {
  102. if (isValidRange([minDate.value, maxDate.value])) {
  103. emit("pick", [minDate.value, maxDate.value], visible);
  104. }
  105. };
  106. const onSelect = (selecting) => {
  107. rangeState.value.selecting = selecting;
  108. if (!selecting) {
  109. rangeState.value.endDate = null;
  110. }
  111. };
  112. const pickerBase = inject("EP_PICKER_BASE");
  113. const { shortcuts, disabledDate } = pickerBase.props;
  114. const format = toRef(pickerBase.props, "format");
  115. const defaultValue = toRef(pickerBase.props, "defaultValue");
  116. const getDefaultValue = () => {
  117. let start;
  118. if (isArray(defaultValue.value)) {
  119. const left = dayjs(defaultValue.value[0]);
  120. let right = dayjs(defaultValue.value[1]);
  121. if (!props.unlinkPanels) {
  122. right = left.add(10, unit);
  123. }
  124. return [left, right];
  125. } else if (defaultValue.value) {
  126. start = dayjs(defaultValue.value);
  127. } else {
  128. start = dayjs();
  129. }
  130. start = start.locale(lang.value);
  131. return [start, start.add(10, unit)];
  132. };
  133. watch(() => defaultValue.value, (val) => {
  134. if (val) {
  135. const defaultArr = getDefaultValue();
  136. leftDate.value = defaultArr[0];
  137. rightDate.value = defaultArr[1];
  138. }
  139. }, { immediate: true });
  140. watch(() => props.parsedValue, (newVal) => {
  141. if (newVal && newVal.length === 2) {
  142. minDate.value = newVal[0];
  143. maxDate.value = newVal[1];
  144. leftDate.value = minDate.value;
  145. if (props.unlinkPanels && maxDate.value) {
  146. const minDateYear = minDate.value.year();
  147. const maxDateYear = maxDate.value.year();
  148. rightDate.value = minDateYear === maxDateYear ? maxDate.value.add(10, "year") : maxDate.value;
  149. } else {
  150. rightDate.value = leftDate.value.add(10, "year");
  151. }
  152. } else {
  153. const defaultArr = getDefaultValue();
  154. minDate.value = void 0;
  155. maxDate.value = void 0;
  156. leftDate.value = defaultArr[0];
  157. rightDate.value = defaultArr[1];
  158. }
  159. }, { immediate: true });
  160. const parseUserInput = (value) => {
  161. return correctlyParseUserInput(value, format.value, lang.value, isDefaultFormat);
  162. };
  163. const formatToString = (value) => {
  164. return isArray(value) ? value.map((day) => day.format(format.value)) : value.format(format.value);
  165. };
  166. const isValidValue = (date) => {
  167. return isValidRange(date) && (disabledDate ? !disabledDate(date[0].toDate()) && !disabledDate(date[1].toDate()) : true);
  168. };
  169. const handleClear = () => {
  170. const defaultArr = getDefaultValue();
  171. leftDate.value = defaultArr[0];
  172. rightDate.value = defaultArr[1];
  173. maxDate.value = void 0;
  174. minDate.value = void 0;
  175. emit("pick", null);
  176. };
  177. emit("set-picker-option", ["isValidValue", isValidValue]);
  178. emit("set-picker-option", ["parseUserInput", parseUserInput]);
  179. emit("set-picker-option", ["formatToString", formatToString]);
  180. emit("set-picker-option", ["handleClear", handleClear]);
  181. return (_ctx, _cache) => {
  182. return openBlock(), createElementBlock("div", {
  183. class: normalizeClass(unref(panelKls))
  184. }, [
  185. createElementVNode("div", {
  186. class: normalizeClass(unref(ppNs).e("body-wrapper"))
  187. }, [
  188. renderSlot(_ctx.$slots, "sidebar", {
  189. class: normalizeClass(unref(ppNs).e("sidebar"))
  190. }),
  191. unref(hasShortcuts) ? (openBlock(), createElementBlock("div", {
  192. key: 0,
  193. class: normalizeClass(unref(ppNs).e("sidebar"))
  194. }, [
  195. (openBlock(true), createElementBlock(Fragment, null, renderList(unref(shortcuts), (shortcut, key) => {
  196. return openBlock(), createElementBlock("button", {
  197. key,
  198. type: "button",
  199. class: normalizeClass(unref(ppNs).e("shortcut")),
  200. onClick: ($event) => unref(handleShortcutClick)(shortcut)
  201. }, toDisplayString(shortcut.text), 11, ["onClick"]);
  202. }), 128))
  203. ], 2)) : createCommentVNode("v-if", true),
  204. createElementVNode("div", {
  205. class: normalizeClass(unref(ppNs).e("body"))
  206. }, [
  207. createElementVNode("div", {
  208. class: normalizeClass(unref(leftPanelKls).content)
  209. }, [
  210. createElementVNode("div", {
  211. class: normalizeClass(unref(drpNs).e("header"))
  212. }, [
  213. createElementVNode("button", {
  214. type: "button",
  215. class: normalizeClass(unref(leftPanelKls).arrowLeftBtn),
  216. onClick: unref(leftPrevYear)
  217. }, [
  218. renderSlot(_ctx.$slots, "prev-year", {}, () => [
  219. createVNode(unref(ElIcon), null, {
  220. default: withCtx(() => [
  221. createVNode(unref(DArrowLeft))
  222. ]),
  223. _: 1
  224. })
  225. ])
  226. ], 10, ["onClick"]),
  227. _ctx.unlinkPanels ? (openBlock(), createElementBlock("button", {
  228. key: 0,
  229. type: "button",
  230. disabled: !unref(enableYearArrow),
  231. class: normalizeClass(unref(leftPanelKls).arrowRightBtn),
  232. onClick: unref(leftNextYear)
  233. }, [
  234. renderSlot(_ctx.$slots, "next-year", {}, () => [
  235. createVNode(unref(ElIcon), null, {
  236. default: withCtx(() => [
  237. createVNode(unref(DArrowRight))
  238. ]),
  239. _: 1
  240. })
  241. ])
  242. ], 10, ["disabled", "onClick"])) : createCommentVNode("v-if", true),
  243. createElementVNode("div", null, toDisplayString(unref(leftLabel)), 1)
  244. ], 2),
  245. createVNode(YearTable, {
  246. "selection-mode": "range",
  247. date: leftDate.value,
  248. "min-date": minDate.value,
  249. "max-date": maxDate.value,
  250. "range-state": rangeState.value,
  251. "disabled-date": unref(disabledDate),
  252. onChangerange: handleChangeRange,
  253. onPick: handleRangePick,
  254. onSelect
  255. }, null, 8, ["date", "min-date", "max-date", "range-state", "disabled-date"])
  256. ], 2),
  257. createElementVNode("div", {
  258. class: normalizeClass(unref(rightPanelKls).content)
  259. }, [
  260. createElementVNode("div", {
  261. class: normalizeClass(unref(drpNs).e("header"))
  262. }, [
  263. _ctx.unlinkPanels ? (openBlock(), createElementBlock("button", {
  264. key: 0,
  265. type: "button",
  266. disabled: !unref(enableYearArrow),
  267. class: normalizeClass(unref(rightPanelKls).arrowLeftBtn),
  268. onClick: unref(rightPrevYear)
  269. }, [
  270. renderSlot(_ctx.$slots, "prev-year", {}, () => [
  271. createVNode(unref(ElIcon), null, {
  272. default: withCtx(() => [
  273. createVNode(unref(DArrowLeft))
  274. ]),
  275. _: 1
  276. })
  277. ])
  278. ], 10, ["disabled", "onClick"])) : createCommentVNode("v-if", true),
  279. createElementVNode("button", {
  280. type: "button",
  281. class: normalizeClass(unref(rightPanelKls).arrowRightBtn),
  282. onClick: unref(rightNextYear)
  283. }, [
  284. renderSlot(_ctx.$slots, "next-year", {}, () => [
  285. createVNode(unref(ElIcon), null, {
  286. default: withCtx(() => [
  287. createVNode(unref(DArrowRight))
  288. ]),
  289. _: 1
  290. })
  291. ])
  292. ], 10, ["onClick"]),
  293. createElementVNode("div", null, toDisplayString(unref(rightLabel)), 1)
  294. ], 2),
  295. createVNode(YearTable, {
  296. "selection-mode": "range",
  297. date: rightDate.value,
  298. "min-date": minDate.value,
  299. "max-date": maxDate.value,
  300. "range-state": rangeState.value,
  301. "disabled-date": unref(disabledDate),
  302. onChangerange: handleChangeRange,
  303. onPick: handleRangePick,
  304. onSelect
  305. }, null, 8, ["date", "min-date", "max-date", "range-state", "disabled-date"])
  306. ], 2)
  307. ], 2)
  308. ], 2)
  309. ], 2);
  310. };
  311. }
  312. });
  313. var YearRangePickPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "panel-year-range.vue"]]);
  314. export { YearRangePickPanel as default };
  315. //# sourceMappingURL=panel-year-range.mjs.map