vuetify
Version:
Vue Material Component Framework
97 lines (96 loc) • 3.12 kB
JavaScript
import { mergeProps as _mergeProps, createVNode as _createVNode, createElementVNode as _createElementVNode, normalizeStyle as _normalizeStyle } from "vue";
// Styles
import "./VDatePickerYears.css";
// Components
import { VBtn } from "../VBtn/index.js"; // Composables
import { useDate } from "../../composables/date/index.js";
import { useProxiedModel } from "../../composables/proxiedModel.js"; // Utilities
import { computed, nextTick, onMounted, watchEffect } from 'vue';
import { convertToUnit, createRange, genericComponent, propsFactory, templateRef, useRender } from "../../util/index.js"; // Types
// Types
export const makeVDatePickerYearsProps = propsFactory({
color: String,
height: [String, Number],
min: null,
max: null,
modelValue: Number
}, 'VDatePickerYears');
export const VDatePickerYears = genericComponent()({
name: 'VDatePickerYears',
props: makeVDatePickerYearsProps(),
emits: {
'update:modelValue': year => true
},
setup(props, _ref) {
let {
emit,
slots
} = _ref;
const adapter = useDate();
const model = useProxiedModel(props, 'modelValue');
const years = computed(() => {
const year = adapter.getYear(adapter.date());
let min = year - 100;
let max = year + 52;
if (props.min) {
min = adapter.getYear(adapter.date(props.min));
}
if (props.max) {
max = adapter.getYear(adapter.date(props.max));
}
let date = adapter.startOfYear(adapter.date());
date = adapter.setYear(date, min);
return createRange(max - min + 1, min).map(i => {
const text = adapter.format(date, 'year');
date = adapter.setYear(date, adapter.getYear(date) + 1);
return {
text,
value: i
};
});
});
watchEffect(() => {
model.value = model.value ?? adapter.getYear(adapter.date());
});
const yearRef = templateRef();
onMounted(async () => {
await nextTick();
yearRef.el?.scrollIntoView({
block: 'center'
});
});
useRender(() => _createElementVNode("div", {
"class": "v-date-picker-years",
"style": _normalizeStyle({
height: convertToUnit(props.height)
})
}, [_createElementVNode("div", {
"class": "v-date-picker-years__content"
}, [years.value.map((year, i) => {
const btnProps = {
ref: model.value === year.value ? yearRef : undefined,
active: model.value === year.value,
color: model.value === year.value ? props.color : undefined,
rounded: true,
text: year.text,
variant: model.value === year.value ? 'flat' : 'text',
onClick: () => {
if (model.value === year.value) {
emit('update:modelValue', model.value);
return;
}
model.value = year.value;
}
};
return slots.year?.({
year,
i,
props: btnProps
}) ?? _createVNode(VBtn, _mergeProps({
"key": "month"
}, btnProps), null);
})])]));
return {};
}
});
//# sourceMappingURL=VDatePickerYears.js.map