VDatePickerYears.mjs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { createVNode as _createVNode, mergeProps as _mergeProps } from "vue";
  2. // Styles
  3. import "./VDatePickerYears.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, nextTick, onMounted, watchEffect } from 'vue';
  9. import { convertToUnit, createRange, genericComponent, propsFactory, templateRef, useRender } from "../../util/index.mjs"; // Types
  10. // Types
  11. export const makeVDatePickerYearsProps = propsFactory({
  12. color: String,
  13. height: [String, Number],
  14. min: null,
  15. max: null,
  16. modelValue: Number
  17. }, 'VDatePickerYears');
  18. export const VDatePickerYears = genericComponent()({
  19. name: 'VDatePickerYears',
  20. props: makeVDatePickerYearsProps(),
  21. emits: {
  22. 'update:modelValue': year => 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 years = computed(() => {
  32. const year = adapter.getYear(adapter.date());
  33. let min = year - 100;
  34. let max = year + 52;
  35. if (props.min) {
  36. min = adapter.getYear(adapter.date(props.min));
  37. }
  38. if (props.max) {
  39. max = adapter.getYear(adapter.date(props.max));
  40. }
  41. let date = adapter.startOfYear(adapter.date());
  42. date = adapter.setYear(date, min);
  43. return createRange(max - min + 1, min).map(i => {
  44. const text = adapter.format(date, 'year');
  45. date = adapter.setYear(date, adapter.getYear(date) + 1);
  46. return {
  47. text,
  48. value: i
  49. };
  50. });
  51. });
  52. watchEffect(() => {
  53. model.value = model.value ?? adapter.getYear(adapter.date());
  54. });
  55. const yearRef = templateRef();
  56. onMounted(async () => {
  57. await nextTick();
  58. yearRef.el?.scrollIntoView({
  59. block: 'center'
  60. });
  61. });
  62. useRender(() => _createVNode("div", {
  63. "class": "v-date-picker-years",
  64. "style": {
  65. height: convertToUnit(props.height)
  66. }
  67. }, [_createVNode("div", {
  68. "class": "v-date-picker-years__content"
  69. }, [years.value.map((year, i) => {
  70. const btnProps = {
  71. ref: model.value === year.value ? yearRef : undefined,
  72. active: model.value === year.value,
  73. color: model.value === year.value ? props.color : undefined,
  74. rounded: true,
  75. text: year.text,
  76. variant: model.value === year.value ? 'flat' : 'text',
  77. onClick: () => {
  78. if (model.value === year.value) {
  79. emit('update:modelValue', model.value);
  80. return;
  81. }
  82. model.value = year.value;
  83. }
  84. };
  85. return slots.year?.({
  86. year,
  87. i,
  88. props: btnProps
  89. }) ?? _createVNode(VBtn, _mergeProps({
  90. "key": "month"
  91. }, btnProps), null);
  92. })])]));
  93. return {};
  94. }
  95. });
  96. //# sourceMappingURL=VDatePickerYears.mjs.map