@moving-walls/design-system 1.0.24 → 2.0.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.
@@ -20,6 +20,10 @@ interface DateRangePickerProps {
20
20
  range: DateRange;
21
21
  }>;
22
22
  align?: 'left' | 'right';
23
+ enableApplyButton?: boolean;
24
+ applyButtonText?: string;
25
+ enableCancelButton?: boolean;
26
+ cancelButtonText?: string;
23
27
  }
24
- export declare function DateRangePicker({ value, onChange, placeholder, disabled, required, clearable, minDate, maxDate, numberOfMonths, className, format, presets, align }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
25
- export default DateRangePicker;
28
+ export declare function DateRangePicker({ value, onChange, placeholder, disabled, required, clearable, minDate, maxDate, selectsRange, numberOfMonths, className, format, presets, align, enableApplyButton, applyButtonText, enableCancelButton, cancelButtonText }: DateRangePickerProps): import("react/jsx-runtime").JSX.Element;
29
+ export {};
package/dist/index.esm.js CHANGED
@@ -36476,8 +36476,9 @@ function DateRangePicker(_ref3) {
36476
36476
  var _ref3$clearable = _ref3.clearable,
36477
36477
  clearable = _ref3$clearable === void 0 ? true : _ref3$clearable,
36478
36478
  minDate = _ref3.minDate,
36479
- maxDate = _ref3.maxDate,
36480
- _ref3$numberOfMonths = _ref3.numberOfMonths,
36479
+ maxDate = _ref3.maxDate;
36480
+ _ref3.selectsRange;
36481
+ var _ref3$numberOfMonths = _ref3.numberOfMonths,
36481
36482
  numberOfMonths = _ref3$numberOfMonths === void 0 ? 1 : _ref3$numberOfMonths,
36482
36483
  className = _ref3.className,
36483
36484
  _ref3$format = _ref3.format,
@@ -36485,7 +36486,15 @@ function DateRangePicker(_ref3) {
36485
36486
  _ref3$presets = _ref3.presets,
36486
36487
  presets = _ref3$presets === void 0 ? defaultPresets$1 : _ref3$presets,
36487
36488
  _ref3$align = _ref3.align,
36488
- align = _ref3$align === void 0 ? 'left' : _ref3$align;
36489
+ align = _ref3$align === void 0 ? 'left' : _ref3$align,
36490
+ _ref3$enableApplyButt = _ref3.enableApplyButton,
36491
+ enableApplyButton = _ref3$enableApplyButt === void 0 ? false : _ref3$enableApplyButt,
36492
+ _ref3$applyButtonText = _ref3.applyButtonText,
36493
+ applyButtonText = _ref3$applyButtonText === void 0 ? 'Apply' : _ref3$applyButtonText,
36494
+ _ref3$enableCancelBut = _ref3.enableCancelButton,
36495
+ enableCancelButton = _ref3$enableCancelBut === void 0 ? true : _ref3$enableCancelBut,
36496
+ _ref3$cancelButtonTex = _ref3.cancelButtonText,
36497
+ cancelButtonText = _ref3$cancelButtonTex === void 0 ? 'Cancel' : _ref3$cancelButtonTex;
36489
36498
  var _useState = useState(false),
36490
36499
  _useState2 = _slicedToArray(_useState, 2),
36491
36500
  isOpen = _useState2[0],
@@ -36497,71 +36506,111 @@ function DateRangePicker(_ref3) {
36497
36506
  _useState4 = _slicedToArray(_useState3, 2),
36498
36507
  selectedRange = _useState4[0],
36499
36508
  setSelectedRange = _useState4[1];
36500
- var _useState5 = useState(new Date()),
36509
+ var _useState5 = useState(value || {
36510
+ from: null,
36511
+ to: null
36512
+ }),
36501
36513
  _useState6 = _slicedToArray(_useState5, 2),
36502
- currentMonth = _useState6[0],
36503
- setCurrentMonth = _useState6[1];
36504
- var _useState7 = useState(true),
36514
+ pendingRange = _useState6[0],
36515
+ setPendingRange = _useState6[1];
36516
+ var _useState7 = useState(new Date()),
36505
36517
  _useState8 = _slicedToArray(_useState7, 2),
36506
- selectingStart = _useState8[0],
36507
- setSelectingStart = _useState8[1];
36518
+ currentMonth = _useState8[0],
36519
+ setCurrentMonth = _useState8[1];
36520
+ var _useState9 = useState(true),
36521
+ _useState0 = _slicedToArray(_useState9, 2),
36522
+ selectingStart = _useState0[0],
36523
+ setSelectingStart = _useState0[1];
36508
36524
  var containerRef = useRef(null);
36509
36525
  useEffect(function () {
36510
36526
  if (value) {
36511
36527
  setSelectedRange(value);
36528
+ setPendingRange(value);
36512
36529
  }
36513
36530
  }, [value]);
36514
36531
  useEffect(function () {
36515
36532
  function handleClickOutside(event) {
36516
36533
  if (containerRef.current && !containerRef.current.contains(event.target)) {
36517
36534
  setIsOpen(false);
36535
+ // Reset pending to selected when closing without apply
36536
+ setPendingRange(selectedRange);
36518
36537
  }
36519
36538
  }
36520
36539
  document.addEventListener('mousedown', handleClickOutside);
36521
36540
  return function () {
36522
36541
  return document.removeEventListener('mousedown', handleClickOutside);
36523
36542
  };
36524
- }, []);
36543
+ }, [selectedRange]);
36525
36544
  var handleDateSelect = function handleDateSelect(date) {
36526
36545
  var newRange;
36527
- if (selectingStart || !selectedRange.from) {
36546
+ if (selectingStart || !pendingRange.from) {
36528
36547
  newRange = {
36529
36548
  from: date,
36530
36549
  to: null
36531
36550
  };
36532
36551
  setSelectingStart(false);
36533
36552
  } else {
36534
- if (date < selectedRange.from) {
36553
+ if (date < pendingRange.from) {
36535
36554
  newRange = {
36536
36555
  from: date,
36537
- to: selectedRange.from
36556
+ to: null
36538
36557
  };
36539
- } else {
36558
+ } else if (date > pendingRange.from) {
36540
36559
  newRange = {
36541
- from: selectedRange.from,
36560
+ from: pendingRange.from,
36542
36561
  to: date
36543
36562
  };
36563
+ setSelectingStart(true);
36564
+ } else {
36565
+ newRange = {
36566
+ from: date,
36567
+ to: null
36568
+ };
36544
36569
  }
36545
- setSelectingStart(true);
36546
36570
  }
36547
- setSelectedRange(newRange);
36548
- onChange === null || onChange === void 0 ? void 0 : onChange(newRange);
36549
- if (newRange.from && newRange.to) {
36571
+ // Update pending range, don't call onChange yet
36572
+ setPendingRange(newRange);
36573
+ // Without Apply button, fire onChange immediately when full range selected
36574
+ if (!enableApplyButton && newRange.from && newRange.to) {
36575
+ setSelectedRange(newRange);
36576
+ onChange === null || onChange === void 0 ? void 0 : onChange(newRange);
36550
36577
  setIsOpen(false);
36551
36578
  }
36552
36579
  };
36553
- var handlePresetSelect = function handlePresetSelect(preset) {
36554
- setSelectedRange(preset.range);
36555
- onChange === null || onChange === void 0 ? void 0 : onChange(preset.range);
36580
+ var handleApply = function handleApply() {
36581
+ // Apply pending range and call onChange
36582
+ setSelectedRange(pendingRange);
36583
+ onChange === null || onChange === void 0 ? void 0 : onChange(pendingRange);
36556
36584
  setIsOpen(false);
36557
36585
  };
36586
+ var handleCancel = function handleCancel() {
36587
+ // Cancel: restore original selection, don't call onChange
36588
+ setPendingRange(selectedRange);
36589
+ setIsOpen(false);
36590
+ };
36591
+ var handlePresetSelect = function handlePresetSelect(preset) {
36592
+ setPendingRange(preset.range);
36593
+ // Navigate calendar to show the start month of the preset range
36594
+ if (preset.range.from) {
36595
+ setCurrentMonth(new Date(preset.range.from.getFullYear(), preset.range.from.getMonth(), 1));
36596
+ }
36597
+ setSelectingStart(true);
36598
+ // If Apply button is enabled, keep calendar open so user can confirm
36599
+ if (!enableApplyButton) {
36600
+ setSelectedRange(preset.range);
36601
+ onChange === null || onChange === void 0 ? void 0 : onChange(preset.range);
36602
+ setIsOpen(false);
36603
+ }
36604
+ };
36558
36605
  var handleClear = function handleClear() {
36559
36606
  var clearedRange = {
36560
36607
  from: null,
36561
36608
  to: null
36562
36609
  };
36563
36610
  setSelectedRange(clearedRange);
36611
+ setPendingRange(clearedRange);
36564
36612
  onChange === null || onChange === void 0 ? void 0 : onChange(clearedRange);
36613
+ setIsOpen(false);
36565
36614
  };
36566
36615
  var formatDisplayValue = function formatDisplayValue() {
36567
36616
  if (!selectedRange.from && !selectedRange.to) return placeholder;
@@ -36577,19 +36626,31 @@ function DateRangePicker(_ref3) {
36577
36626
  return jsxs("div", {
36578
36627
  ref: containerRef,
36579
36628
  className: cn$p('relative', className),
36580
- children: [jsxs("button", {
36581
- type: "button",
36629
+ children: [jsxs("div", {
36630
+ role: "button",
36631
+ tabIndex: disabled ? -1 : 0,
36582
36632
  onClick: function onClick() {
36583
- return !disabled && setIsOpen(!isOpen);
36633
+ if (!disabled) {
36634
+ if (!isOpen) setPendingRange(selectedRange);
36635
+ setIsOpen(!isOpen);
36636
+ setSelectingStart(true);
36637
+ }
36584
36638
  },
36585
- disabled: disabled,
36586
- className: cn$p('w-full flex items-center justify-between px-3 py-2 text-left', 'border border-mw-neutral-200 dark:border-mw-neutral-600 rounded-md', 'bg-white dark:bg-mw-neutral-800', 'text-mw-neutral-800 dark:text-white', 'hover:border-mw-neutral-300 dark:hover:border-mw-neutral-500', 'focus:outline-none focus:ring-2 focus:ring-mw-primary-500 focus:border-transparent', disabled && 'opacity-50 cursor-not-allowed', !selectedRange.from && !selectedRange.to && 'text-mw-neutral-500 dark:text-mw-neutral-400'),
36639
+ onKeyDown: function onKeyDown(e) {
36640
+ if (!disabled && (e.key === 'Enter' || e.key === ' ')) {
36641
+ if (!isOpen) setPendingRange(selectedRange);
36642
+ setIsOpen(!isOpen);
36643
+ setSelectingStart(true);
36644
+ }
36645
+ },
36646
+ className: cn$p('w-full flex items-center justify-between px-3 py-2 text-left cursor-pointer', 'border border-mw-neutral-200 dark:border-mw-neutral-600 rounded-md', 'bg-white dark:bg-mw-neutral-800', 'text-mw-neutral-800 dark:text-white', 'hover:border-mw-neutral-300 dark:hover:border-mw-neutral-500', 'focus:outline-none focus:ring-2 focus:ring-mw-primary-500 focus:border-transparent', disabled && 'opacity-50 cursor-not-allowed pointer-events-none', !selectedRange.from && !selectedRange.to && 'text-mw-neutral-500 dark:text-mw-neutral-400'),
36587
36647
  children: [jsx("span", {
36588
36648
  className: "truncate",
36589
36649
  children: formatDisplayValue()
36590
36650
  }), jsxs("div", {
36591
36651
  className: "flex items-center gap-1 ml-2",
36592
36652
  children: [clearable && (selectedRange.from || selectedRange.to) && jsx("button", {
36653
+ type: "button",
36593
36654
  onClick: function onClick(e) {
36594
36655
  e.stopPropagation();
36595
36656
  handleClear();
@@ -36615,6 +36676,7 @@ function DateRangePicker(_ref3) {
36615
36676
  className: "space-y-0.5",
36616
36677
  children: presets.map(function (preset, index) {
36617
36678
  return jsx("button", {
36679
+ type: "button",
36618
36680
  onClick: function onClick() {
36619
36681
  return handlePresetSelect(preset);
36620
36682
  },
@@ -36627,7 +36689,7 @@ function DateRangePicker(_ref3) {
36627
36689
  className: "flex",
36628
36690
  children: [jsx(CalendarMonth, {
36629
36691
  currentMonth: currentMonth,
36630
- selectedRange: selectedRange,
36692
+ selectedRange: pendingRange,
36631
36693
  onDateSelect: handleDateSelect,
36632
36694
  onMonthChange: setCurrentMonth,
36633
36695
  minDate: minDate,
@@ -36635,7 +36697,7 @@ function DateRangePicker(_ref3) {
36635
36697
  selectingStart: selectingStart
36636
36698
  }), numberOfMonths === 2 && jsx(CalendarMonth, {
36637
36699
  currentMonth: new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1),
36638
- selectedRange: selectedRange,
36700
+ selectedRange: pendingRange,
36639
36701
  onDateSelect: handleDateSelect,
36640
36702
  onMonthChange: function onMonthChange(month) {
36641
36703
  var prevMonth = new Date(month);
@@ -36654,19 +36716,17 @@ function DateRangePicker(_ref3) {
36654
36716
  children: selectingStart ? 'Select start date' : 'Select end date'
36655
36717
  }), jsxs("div", {
36656
36718
  className: "flex gap-2 items-center",
36657
- children: [jsx("button", {
36658
- onClick: function onClick() {
36659
- return setIsOpen(false);
36660
- },
36661
- className: "px-2.5 py-1 text-xs text-mw-neutral-600 dark:text-mw-neutral-400 hover:text-mw-neutral-900 dark:hover:text-white",
36662
- children: "Cancel"
36663
- }), jsx("button", {
36664
- onClick: function onClick() {
36665
- return setIsOpen(false);
36666
- },
36667
- disabled: !selectedRange.from,
36668
- className: "px-3 py-1 text-xs bg-mw-primary-500 text-white rounded hover:bg-mw-primary-600 disabled:opacity-50 disabled:cursor-not-allowed",
36669
- children: "Apply"
36719
+ children: [enableCancelButton && jsx("button", {
36720
+ type: "button",
36721
+ onClick: handleCancel,
36722
+ className: "px-3 py-1.5 text-xs text-mw-neutral-600 dark:text-mw-neutral-400 hover:text-mw-neutral-900 dark:hover:text-white border border-mw-neutral-200 dark:border-mw-neutral-600 rounded",
36723
+ children: cancelButtonText
36724
+ }), enableApplyButton && jsx("button", {
36725
+ type: "button",
36726
+ onClick: handleApply,
36727
+ disabled: !pendingRange.from || !pendingRange.to,
36728
+ className: "px-3 py-1.5 text-xs bg-mw-primary-500 text-white rounded hover:bg-mw-primary-600 disabled:opacity-50 disabled:cursor-not-allowed",
36729
+ children: applyButtonText
36670
36730
  })]
36671
36731
  })]
36672
36732
  })]