VDatePickerMonths.mjs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
  2. // Styles
  3. import "./VDatePickerMonths.css";
  4. // Components
  5. import { VBtn } from "../VBtn/index.mjs"; // Composables
  6. import { useDate } from "../../composables/date/index.mjs";
  7. import { useProxiedModel } from "../../composables/proxiedModel.mjs"; // Utilities
  8. import { computed, watchEffect } from 'vue';
  9. import { convertToUnit, createRange, genericComponent, propsFactory, useRender } from "../../util/index.mjs"; // Types
  10. export const makeVDatePickerMonthsProps = propsFactory({
  11. color: String,
  12. height: [String, Number],
  13. min: null,
  14. max: null,
  15. modelValue: Number,
  16. year: Number
  17. }, 'VDatePickerMonths');
  18. export const VDatePickerMonths = genericComponent()({
  19. name: 'VDatePickerMonths',
  20. props: makeVDatePickerMonthsProps(),
  21. emits: {
  22. 'update:modelValue': date => true
  23. },
  24. setup(props, _ref) {
  25. let {
  26. emit,
  27. slots
  28. } = _ref;
  29. const adapter = useDate();
  30. const model = useProxiedModel(props, 'modelValue');
  31. const months = computed(() => {
  32. let date = adapter.startOfYear(adapter.date());
  33. if (props.year) {
  34. date = adapter.setYear(date, props.year);
  35. }
  36. return createRange(12).map(i => {
  37. const text = adapter.format(date, 'monthShort');
  38. const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
  39. date = adapter.getNextMonth(date);
  40. return {
  41. isDisabled,
  42. text,
  43. value: i
  44. };
  45. });
  46. });
  47. watchEffect(() => {
  48. model.value = model.value ?? adapter.getMonth(adapter.date());
  49. });
  50. useRender(() => _createVNode("div", {
  51. "class": "v-date-picker-months",
  52. "style": {
  53. height: convertToUnit(props.height)
  54. }
  55. }, [_createVNode("div", {
  56. "class": "v-date-picker-months__content"
  57. }, [months.value.map((month, i) => {
  58. const btnProps = {
  59. active: model.value === i,
  60. color: model.value === i ? props.color : undefined,
  61. disabled: month.isDisabled,
  62. rounded: true,
  63. text: month.text,
  64. variant: model.value === month.value ? 'flat' : 'text',
  65. onClick: () => onClick(i)
  66. };
  67. function onClick(i) {
  68. if (model.value === i) {
  69. emit('update:modelValue', model.value);
  70. return;
  71. }
  72. model.value = i;
  73. }
  74. return slots.month?.({
  75. month,
  76. i,
  77. props: btnProps
  78. }) ?? _createVNode(VBtn, _mergeProps({
  79. "key": "month"
  80. }, btnProps), null);
  81. })])]));
  82. return {};
  83. }
  84. });
  85. //# sourceMappingURL=VDatePickerMonths.mjs.map