reka-ui
Version:
Vue port for Radix UI Primitives.
180 lines (178 loc) • 7.19 kB
JavaScript
const require_rolldown_runtime = require('../rolldown-runtime.cjs');
const require_date_comparators = require('../date/comparators.cjs');
const require_date_calendar = require('../date/calendar.cjs');
const require_shared_useDateFormatter = require('../shared/useDateFormatter.cjs');
const vue = require_rolldown_runtime.__toESM(require("vue"));
const __internationalized_date = require_rolldown_runtime.__toESM(require("@internationalized/date"));
//#region src/YearPicker/useYearPicker.ts
function useYearPickerState(props) {
function isYearSelected(dateObj) {
if (Array.isArray(props.date.value)) return props.date.value.some((d) => require_date_comparators.isSameYear(d, dateObj));
else if (!props.date.value) return false;
else return require_date_comparators.isSameYear(props.date.value, dateObj);
}
const isInvalid = (0, vue.computed)(() => {
if (Array.isArray(props.date.value)) {
if (!props.date.value.length) return false;
for (const dateObj of props.date.value) {
if (props.isYearDisabled?.(dateObj)) return true;
if (props.isYearUnavailable?.(dateObj)) return true;
}
} else {
if (!props.date.value) return false;
if (props.isYearDisabled?.(props.date.value)) return true;
if (props.isYearUnavailable?.(props.date.value)) return true;
}
return false;
});
return {
isYearSelected,
isInvalid
};
}
function useYearPicker(props) {
const formatter = require_shared_useDateFormatter.useDateFormatter(props.locale.value);
const resolveMatcher = (matcher) => typeof matcher === "function" ? matcher : matcher?.value;
const headingFormatOptions = (0, vue.computed)(() => {
const options = { calendar: props.placeholder.value.calendar.identifier };
if (props.placeholder.value.calendar.identifier === "gregory" && props.placeholder.value.era === "BC") options.era = "short";
return options;
});
const grid = (0, vue.ref)(require_date_calendar.createYearGrid({
dateObj: props.placeholder.value,
yearsPerPage: props.yearsPerPage.value
}));
function isYearDisabled(dateObj) {
if (resolveMatcher(props.isYearDisabled)?.(dateObj) || props.disabled.value) return true;
if (props.maxValue.value && require_date_comparators.isAfter((0, __internationalized_date.startOfYear)(dateObj), props.maxValue.value)) return true;
if (props.minValue.value && require_date_comparators.isBefore((0, __internationalized_date.endOfYear)(dateObj), props.minValue.value)) return true;
return false;
}
const isYearUnavailable = (date) => {
if (resolveMatcher(props.isYearUnavailable)?.(date)) return true;
return false;
};
const isNextButtonDisabled = (nextPageFunc) => {
if (!props.maxValue.value) return false;
if (props.disabled.value) return true;
const lastYearInView = grid.value.cells.at(-1);
if (nextPageFunc || props.nextPage.value) {
const nextDate = (nextPageFunc || props.nextPage.value)(lastYearInView);
return require_date_comparators.isAfter((0, __internationalized_date.startOfYear)(nextDate), props.maxValue.value);
}
const nextPageStart = (0, __internationalized_date.startOfYear)(lastYearInView.add({ years: 1 }));
return require_date_comparators.isAfter(nextPageStart, props.maxValue.value);
};
const isPrevButtonDisabled = (prevPageFunc) => {
if (!props.minValue.value) return false;
if (props.disabled.value) return true;
const firstYearInView = grid.value.value;
if (prevPageFunc || props.prevPage.value) {
const prevDate = (prevPageFunc || props.prevPage.value)(firstYearInView);
return require_date_comparators.isBefore((0, __internationalized_date.endOfYear)(prevDate), props.minValue.value);
}
const prevPageEnd = (0, __internationalized_date.endOfYear)(firstYearInView.subtract({ years: 1 }));
return require_date_comparators.isBefore(prevPageEnd, props.minValue.value);
};
const nextPage = (nextPageFunc) => {
const firstYearInGrid = grid.value.value;
if (nextPageFunc || props.nextPage.value) {
const newDate$1 = (nextPageFunc || props.nextPage.value)(firstYearInGrid);
grid.value = require_date_calendar.createYearGrid({
dateObj: newDate$1,
yearsPerPage: props.yearsPerPage.value,
decadeAligned: false
});
props.placeholder.value = newDate$1.set({
month: props.placeholder.value.month,
day: props.placeholder.value.day
});
return;
}
const newDate = firstYearInGrid.add({ years: props.yearsPerPage.value });
grid.value = require_date_calendar.createYearGrid({
dateObj: newDate,
yearsPerPage: props.yearsPerPage.value,
decadeAligned: false
});
props.placeholder.value = newDate.set({
month: props.placeholder.value.month,
day: props.placeholder.value.day
});
};
const prevPage = (prevPageFunc) => {
const firstYearInGrid = grid.value.value;
if (prevPageFunc || props.prevPage.value) {
const newDate$1 = (prevPageFunc || props.prevPage.value)(firstYearInGrid);
grid.value = require_date_calendar.createYearGrid({
dateObj: newDate$1,
yearsPerPage: props.yearsPerPage.value,
decadeAligned: false
});
props.placeholder.value = newDate$1.set({
month: props.placeholder.value.month,
day: props.placeholder.value.day
});
return;
}
const newDate = firstYearInGrid.subtract({ years: props.yearsPerPage.value });
grid.value = require_date_calendar.createYearGrid({
dateObj: newDate,
yearsPerPage: props.yearsPerPage.value,
decadeAligned: false
});
props.placeholder.value = newDate.set({
month: props.placeholder.value.month,
day: props.placeholder.value.day
});
};
(0, vue.watch)(props.placeholder, (value) => {
const firstYearInGrid = grid.value.value;
const lastYearInGrid = grid.value.cells.at(-1);
if (value.year >= firstYearInGrid.year && value.year <= lastYearInGrid.year) return;
grid.value = require_date_calendar.createYearGrid({
dateObj: value,
yearsPerPage: props.yearsPerPage.value
});
});
(0, vue.watch)([props.locale, props.yearsPerPage], () => {
formatter.setLocale(props.locale.value);
grid.value = require_date_calendar.createYearGrid({
dateObj: props.placeholder.value,
yearsPerPage: props.yearsPerPage.value
});
});
const headingValue = (0, vue.computed)(() => {
if (props.locale.value !== formatter.getLocale()) formatter.setLocale(props.locale.value);
const firstYear = grid.value.cells[0];
const lastYear = grid.value.cells.at(-1);
return `${formatter.fullYear(require_date_comparators.toDate(firstYear), headingFormatOptions.value)} - ${formatter.fullYear(require_date_comparators.toDate(lastYear), headingFormatOptions.value)}`;
});
const fullCalendarLabel = (0, vue.computed)(() => `${props.calendarLabel.value ?? "Year Picker"}, ${headingValue.value}`);
return {
isYearDisabled,
isYearUnavailable,
isNextButtonDisabled,
isPrevButtonDisabled,
grid,
formatter,
nextPage,
prevPage,
headingValue,
fullCalendarLabel
};
}
//#endregion
Object.defineProperty(exports, 'useYearPicker', {
enumerable: true,
get: function () {
return useYearPicker;
}
});
Object.defineProperty(exports, 'useYearPickerState', {
enumerable: true,
get: function () {
return useYearPickerState;
}
});
//# sourceMappingURL=useYearPicker.cjs.map