@bizapps/ui 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.cjs CHANGED
@@ -4547,22 +4547,52 @@ function DatePicker({
4547
4547
  disabled = false,
4548
4548
  className,
4549
4549
  fromDate,
4550
- toDate
4550
+ toDate,
4551
+ numberOfMonths = 1
4551
4552
  }) {
4552
4553
  const [open, setOpen] = react.useState(false);
4554
+ const [awaitingRangeEnd, setAwaitingRangeEnd] = react.useState(false);
4553
4555
  const label = react.useMemo(() => {
4554
4556
  if (mode === "range") {
4555
4557
  const range = selected;
4556
- if (range?.from && range?.to)
4557
- return `${dateFns.format(range.from, "MMM d, yyyy")} \u2013 ${dateFns.format(range.to, "MMM d, yyyy")}`;
4558
- if (range?.from) return `${dateFns.format(range.from, "MMM d, yyyy")} \u2013 \u2026`;
4559
- return placeholder;
4558
+ if (!range?.from) return placeholder;
4559
+ if (!range.to) return `${dateFns.format(range.from, "MMM d, yyyy")} \u2013 \u2026`;
4560
+ return `${dateFns.format(range.from, "MMM d, yyyy")} \u2013 ${dateFns.format(range.to, "MMM d, yyyy")}`;
4560
4561
  }
4561
4562
  const date = selected;
4562
4563
  return date ? dateFns.format(date, "MMM d, yyyy") : placeholder;
4563
4564
  }, [mode, selected, placeholder]);
4565
+ const handleOpenChange = (nextOpen) => {
4566
+ setOpen(nextOpen);
4567
+ if (!nextOpen) setAwaitingRangeEnd(false);
4568
+ };
4569
+ const handleRangeSelect = (range, triggerDate) => {
4570
+ const emit = onSelect;
4571
+ if (!awaitingRangeEnd) {
4572
+ setAwaitingRangeEnd(true);
4573
+ emit?.({ from: triggerDate, to: void 0 });
4574
+ return;
4575
+ }
4576
+ emit?.(range);
4577
+ if (!range?.from || !range.to) {
4578
+ setAwaitingRangeEnd(!!range?.from);
4579
+ return;
4580
+ }
4581
+ setAwaitingRangeEnd(false);
4582
+ setOpen(false);
4583
+ };
4584
+ const dateConstraints = react.useMemo(() => {
4585
+ const disabledMatchers = [];
4586
+ if (fromDate) disabledMatchers.push({ before: fromDate });
4587
+ if (toDate) disabledMatchers.push({ after: toDate });
4588
+ return {
4589
+ ...disabledMatchers.length > 0 && { disabled: disabledMatchers },
4590
+ ...fromDate && { startMonth: fromDate },
4591
+ ...toDate && { endMonth: toDate }
4592
+ };
4593
+ }, [fromDate, toDate]);
4564
4594
  const hasValue = mode === "range" ? !!selected?.from : !!selected;
4565
- return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
4595
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
4566
4596
  /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
4567
4597
  Button,
4568
4598
  {
@@ -4586,14 +4616,10 @@ function DatePicker({
4586
4616
  ...{
4587
4617
  mode: "range",
4588
4618
  selected,
4589
- onSelect: (range) => {
4590
- onSelect?.(range);
4591
- if (range?.to) setOpen(false);
4592
- },
4593
- fromDate,
4594
- toDate,
4595
- numberOfMonths: 2,
4596
- initialFocus: true
4619
+ onSelect: handleRangeSelect,
4620
+ ...dateConstraints,
4621
+ numberOfMonths,
4622
+ autoFocus: true
4597
4623
  }
4598
4624
  }
4599
4625
  ) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -4606,9 +4632,9 @@ function DatePicker({
4606
4632
  onSelect?.(date);
4607
4633
  setOpen(false);
4608
4634
  },
4609
- fromDate,
4610
- toDate,
4611
- initialFocus: true
4635
+ ...dateConstraints,
4636
+ numberOfMonths,
4637
+ autoFocus: true
4612
4638
  }
4613
4639
  }
4614
4640
  ) })