@zag-js/date-picker
Version:
Core logic for the date-picker widget implemented as a state machine
205 lines (203 loc) • 7.18 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/date-picker.utils.ts
var date_picker_utils_exports = {};
__export(date_picker_utils_exports, {
adjustStartAndEndDate: () => adjustStartAndEndDate,
clampView: () => clampView,
defaultTranslations: () => defaultTranslations,
eachView: () => eachView,
getInputPlaceholder: () => getInputPlaceholder,
getNextView: () => getNextView,
getPreviousView: () => getPreviousView,
getRoleDescription: () => getRoleDescription,
getVisibleRangeText: () => getVisibleRangeText,
isAboveMinView: () => isAboveMinView,
isBelowMinView: () => isBelowMinView,
isDateWithinRange: () => isDateWithinRange,
isValidDate: () => isValidDate,
sortDates: () => sortDates
});
module.exports = __toCommonJS(date_picker_utils_exports);
var import_date = require("@internationalized/date");
var import_core = require("@zag-js/core");
var import_date_utils = require("@zag-js/date-utils");
var import_utils = require("@zag-js/utils");
function adjustStartAndEndDate(value) {
const [startDate, endDate] = value;
let result;
if (!startDate || !endDate) result = value;
else result = startDate.compare(endDate) <= 0 ? value : [endDate, startDate];
return result;
}
function isDateWithinRange(date, value) {
const [startDate, endDate] = value;
if (!startDate || !endDate) return false;
return startDate.compare(date) <= 0 && endDate.compare(date) >= 0;
}
function sortDates(values) {
return values.slice().filter((date) => date != null).sort((a, b) => a.compare(b));
}
function getRoleDescription(view) {
return (0, import_utils.match)(view, {
year: "calendar decade",
month: "calendar year",
day: "calendar month"
});
}
var PLACEHOLDERS = {
day: "dd",
month: "mm",
year: "yyyy"
};
function getInputPlaceholder(locale) {
return new import_date.DateFormatter(locale).formatToParts(/* @__PURE__ */ new Date()).map((item) => PLACEHOLDERS[item.type] ?? item.value).join("");
}
var isValidDate = (value) => {
return !Number.isNaN(value.day) && !Number.isNaN(value.month) && !Number.isNaN(value.year);
};
var defaultTranslations = {
dayCell(state) {
if (state.unavailable) return `Not available. ${state.valueText}`;
if (state.firstInRange) return `Starting range from ${state.valueText}`;
if (state.lastInRange) return `Range ending at ${state.valueText}`;
if (state.selected) return `Selected date. ${state.valueText}`;
return `Choose ${state.valueText}`;
},
trigger(open) {
return open ? "Close calendar" : "Open calendar";
},
viewTrigger(view) {
return (0, import_utils.match)(view, {
year: "Switch to month view",
month: "Switch to day view",
day: "Switch to year view"
});
},
presetTrigger(value) {
const [start = "", end = ""] = value;
return `select ${start} to ${end}`;
},
prevTrigger(view) {
return (0, import_utils.match)(view, {
year: "Switch to previous decade",
month: "Switch to previous year",
day: "Switch to previous month"
});
},
nextTrigger(view) {
return (0, import_utils.match)(view, {
year: "Switch to next decade",
month: "Switch to next year",
day: "Switch to next month"
});
},
// TODO: Revisit this
placeholder() {
return { day: "dd", month: "mm", year: "yyyy" };
},
content: "calendar",
monthSelect: "Select month",
yearSelect: "Select year",
clearTrigger: "Clear selected dates",
weekColumnHeader: "Wk",
weekNumberCell(weekNumber) {
return `Week ${weekNumber}`;
}
};
function viewToNumber(view, fallback) {
if (!view) return fallback || 0;
return view === "day" ? 0 : view === "month" ? 1 : 2;
}
function viewNumberToView(viewNumber) {
return viewNumber === 0 ? "day" : viewNumber === 1 ? "month" : "year";
}
function clampView(view, minView, maxView) {
return viewNumberToView(
(0, import_utils.clampValue)(viewToNumber(view, 0), viewToNumber(minView, 0), viewToNumber(maxView, 2))
);
}
function isAboveMinView(view, minView) {
return viewToNumber(view, 0) > viewToNumber(minView, 0);
}
function isBelowMinView(view, minView) {
return viewToNumber(view, 0) < viewToNumber(minView, 0);
}
function getNextView(view, minView, maxView) {
const nextViewNumber = viewToNumber(view, 0) + 1;
return clampView(viewNumberToView(nextViewNumber), minView, maxView);
}
function getPreviousView(view, minView, maxView) {
const prevViewNumber = viewToNumber(view, 0) - 1;
return clampView(viewNumberToView(prevViewNumber), minView, maxView);
}
var views = ["day", "month", "year"];
function eachView(cb) {
views.forEach((view) => cb(view));
}
var getVisibleRangeText = (0, import_core.memo)(
(opts) => [opts.view, opts.startValue.toString(), opts.endValue.toString(), opts.locale],
([view], opts) => {
const { startValue, endValue, locale, timeZone, selectionMode } = opts;
if (view === "year") {
const years = (0, import_date_utils.getDecadeRange)(startValue.year, { strict: true });
const start2 = years.at(0).toString();
const end2 = years.at(-1).toString();
return { start: start2, end: end2, formatted: `${start2} - ${end2}` };
}
if (view === "month") {
const formatter2 = new import_date.DateFormatter(locale, {
year: "numeric",
timeZone,
calendar: startValue.calendar.identifier
});
const start2 = formatter2.format(startValue.toDate(timeZone));
const end2 = formatter2.format(endValue.toDate(timeZone));
const formatted2 = selectionMode === "range" ? `${start2} - ${end2}` : start2;
return { start: start2, end: end2, formatted: formatted2 };
}
const formatter = new import_date.DateFormatter(locale, {
month: "long",
year: "numeric",
timeZone,
calendar: startValue.calendar.identifier
});
const start = formatter.format(startValue.toDate(timeZone));
const end = formatter.format(endValue.toDate(timeZone));
const formatted = selectionMode === "range" ? `${start} - ${end}` : start;
return { start, end, formatted };
}
);
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
adjustStartAndEndDate,
clampView,
defaultTranslations,
eachView,
getInputPlaceholder,
getNextView,
getPreviousView,
getRoleDescription,
getVisibleRangeText,
isAboveMinView,
isBelowMinView,
isDateWithinRange,
isValidDate,
sortDates
});