All checks were successful
Deploy Docs to Synology / deploy (push) Successful in 3s
75 lines
2.3 KiB
JavaScript
75 lines
2.3 KiB
JavaScript
import { $, h, when, watch } from "sigpro";
|
|
import { val, ui, getIcon } from "../utils.js";
|
|
import { Input } from "./Input.js";
|
|
import { Calendar } from "./Calendar.js";
|
|
|
|
export const Datepicker = (props) => {
|
|
const { class: className, value, range, label, placeholder, hour = false, ...rest } = props;
|
|
|
|
const isOpen = $(false);
|
|
const isRangeMode = () => val(range) === true;
|
|
|
|
// Formatear el valor para mostrarlo en el input
|
|
const displayValue = $("");
|
|
|
|
watch(() => {
|
|
const v = val(value);
|
|
if (!v) {
|
|
displayValue("");
|
|
return;
|
|
}
|
|
let text = "";
|
|
if (typeof v === "string") {
|
|
text = (hour && v.includes("T")) ? v.replace("T", " ") : v;
|
|
} else if (v.start && v.end) {
|
|
const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start;
|
|
const endStr = hour && v.endHour !== undefined ? `${v.end} ${String(v.endHour).padStart(2, "0")}:00` : v.end;
|
|
text = `${startStr} - ${endStr}`;
|
|
} else if (v.start) {
|
|
const startStr = hour && v.startHour !== undefined ? `${v.start} ${String(v.startHour).padStart(2, "0")}:00` : v.start;
|
|
text = `${startStr}...`;
|
|
}
|
|
displayValue(text);
|
|
});
|
|
|
|
const handleCalendarChange = (newValue) => {
|
|
if (typeof value === "function") {
|
|
value(newValue);
|
|
}
|
|
// Cerrar el popover si es modo simple o si el rango está completo (end existe)
|
|
if (!isRangeMode() || (newValue?.end !== undefined && newValue?.end !== null)) {
|
|
isOpen(false);
|
|
}
|
|
};
|
|
|
|
return h("div", { class: ui('relative w-full', className) }, [
|
|
Input({
|
|
label,
|
|
placeholder: placeholder || (isRangeMode() ? "Seleccionar rango..." : "Seleccionar fecha..."),
|
|
value: displayValue,
|
|
readonly: true,
|
|
icon: getIcon("icon-[lucide--calendar]"),
|
|
onclick: (e) => {
|
|
e.stopPropagation();
|
|
isOpen(!isOpen());
|
|
},
|
|
...rest,
|
|
}),
|
|
|
|
when(isOpen, () =>
|
|
h("div", {
|
|
class: "absolute left-0 mt-2 z-[100]",
|
|
onclick: (e) => e.stopPropagation(),
|
|
}, [
|
|
Calendar({
|
|
value,
|
|
range: isRangeMode(),
|
|
hour,
|
|
onChange: handleCalendarChange,
|
|
}),
|
|
])
|
|
),
|
|
|
|
when(isOpen, () => h("div", { class: "fixed inset-0 z-[90]", onclick: () => isOpen(false) })),
|
|
]);
|
|
}; |