@ceed/cds 1.28.0 → 1.29.0

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/index.cjs CHANGED
@@ -2238,6 +2238,15 @@ function calculateColumnGroups(columnGroupingModel, columns, visibleFields) {
2238
2238
  const correctedMaxLevel = filteredGroupsByLevel.length > 0 ? filteredGroupsByLevel.length - 1 : -1;
2239
2239
  return { groups: filteredGroupsByLevel, maxLevel: correctedMaxLevel, fieldsInGroupingModel };
2240
2240
  }
2241
+ function parsePxValue(value) {
2242
+ if (!value) return null;
2243
+ const trimmed = value.trim();
2244
+ if (trimmed.endsWith("px")) {
2245
+ const num = parseFloat(trimmed);
2246
+ return isNaN(num) ? null : num;
2247
+ }
2248
+ return null;
2249
+ }
2241
2250
  function getTextAlign(props) {
2242
2251
  return !props.editMode && ["number", "date", "currency"].includes(props.type || "") ? "end" : "start";
2243
2252
  }
@@ -2550,10 +2559,47 @@ var CalendarSheet = (0, import_joy28.styled)(Sheet_default, {
2550
2559
  slot: "sheet",
2551
2560
  overridesResolver: (props, styles) => styles.root
2552
2561
  })(({ theme }) => ({
2553
- width: "264px",
2554
2562
  boxShadow: theme.shadow.md,
2555
2563
  borderRadius: theme.radius.md
2556
2564
  }));
2565
+ var CalendarSheetContent = (0, import_joy28.styled)("div", {
2566
+ name: "DatePicker",
2567
+ slot: "sheetContent"
2568
+ })({
2569
+ display: "flex",
2570
+ flexDirection: "row"
2571
+ });
2572
+ var CalendarSection = (0, import_joy28.styled)("div", {
2573
+ name: "DatePicker",
2574
+ slot: "calendarSection"
2575
+ })({
2576
+ width: "264px"
2577
+ });
2578
+ var PresetPanel = (0, import_joy28.styled)("div", {
2579
+ name: "DatePicker",
2580
+ slot: "presetPanel"
2581
+ })(({ theme }) => ({
2582
+ display: "flex",
2583
+ flexDirection: "column",
2584
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
2585
+ padding: theme.spacing(1),
2586
+ minWidth: "120px",
2587
+ overflowY: "auto"
2588
+ }));
2589
+ var PresetItem = (0, import_joy28.styled)(Button_default, {
2590
+ name: "DatePicker",
2591
+ slot: "presetItem",
2592
+ shouldForwardProp: (prop) => prop !== "active"
2593
+ })(({ active }) => [
2594
+ {
2595
+ width: "100%",
2596
+ justifyContent: "flex-start",
2597
+ whiteSpace: "nowrap"
2598
+ },
2599
+ active && {
2600
+ fontWeight: "bold"
2601
+ }
2602
+ ]);
2557
2603
  var DatePickerRoot = (0, import_joy28.styled)("div", {
2558
2604
  name: "DatePicker",
2559
2605
  slot: "root",
@@ -2671,6 +2717,7 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2671
2717
  hideClearButton,
2672
2718
  readOnly,
2673
2719
  shouldDisableDate,
2720
+ presets,
2674
2721
  ...innerProps
2675
2722
  } = props;
2676
2723
  const innerRef = (0, import_react20.useRef)(null);
@@ -2752,6 +2799,35 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2752
2799
  },
2753
2800
  [inputReadOnly, buttonRef]
2754
2801
  );
2802
+ const handlePresetClick = (0, import_react20.useCallback)(
2803
+ (presetValue) => {
2804
+ handleChange({
2805
+ target: {
2806
+ name: props.name,
2807
+ value: presetValue
2808
+ }
2809
+ });
2810
+ setAnchorEl(null);
2811
+ },
2812
+ [handleChange, props.name]
2813
+ );
2814
+ const isPresetDisabled = (0, import_react20.useCallback)(
2815
+ (presetValue) => {
2816
+ try {
2817
+ const date = parseDate(presetValue, format);
2818
+ if (Number.isNaN(date.getTime())) return true;
2819
+ if (minDate && date < new Date(minDate)) return true;
2820
+ if (maxDate && date > new Date(maxDate)) return true;
2821
+ if (disableFuture && date > new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2822
+ if (disablePast && date < new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2823
+ if (shouldDisableDate?.(presetValue)) return true;
2824
+ return false;
2825
+ } catch {
2826
+ return true;
2827
+ }
2828
+ },
2829
+ [format, minDate, maxDate, disableFuture, disablePast, shouldDisableDate]
2830
+ );
2755
2831
  return /* @__PURE__ */ import_react20.default.createElement(DatePickerRoot, null, /* @__PURE__ */ import_react20.default.createElement(import_base3.FocusTrap, { open: true }, /* @__PURE__ */ import_react20.default.createElement(import_react20.default.Fragment, null, /* @__PURE__ */ import_react20.default.createElement(
2756
2832
  Input_default,
2757
2833
  {
@@ -2817,7 +2893,7 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2817
2893
  "aria-label": "Calendar Tooltip",
2818
2894
  "aria-expanded": open
2819
2895
  },
2820
- /* @__PURE__ */ import_react20.default.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react20.default.createElement(
2896
+ /* @__PURE__ */ import_react20.default.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react20.default.createElement(CalendarSheetContent, null, /* @__PURE__ */ import_react20.default.createElement(CalendarSection, null, /* @__PURE__ */ import_react20.default.createElement(
2821
2897
  Calendar_default,
2822
2898
  {
2823
2899
  value: value && !Number.isNaN(parseDate(value, format).getTime()) ? [parseDate(value, format), void 0] : void 0,
@@ -2861,7 +2937,22 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2861
2937
  },
2862
2938
  "Clear"
2863
2939
  )
2864
- ))
2940
+ )), presets && presets.length > 0 && /* @__PURE__ */ import_react20.default.createElement(PresetPanel, null, presets.map((preset) => {
2941
+ const disabled2 = isPresetDisabled(preset.value);
2942
+ return /* @__PURE__ */ import_react20.default.createElement(
2943
+ PresetItem,
2944
+ {
2945
+ key: preset.label,
2946
+ size: "sm",
2947
+ variant: value === preset.value ? "soft" : "plain",
2948
+ color: value === preset.value ? "primary" : "neutral",
2949
+ active: value === preset.value,
2950
+ disabled: disabled2,
2951
+ onClick: () => handlePresetClick(preset.value)
2952
+ },
2953
+ preset.label
2954
+ );
2955
+ }))))
2865
2956
  )))));
2866
2957
  });
2867
2958
 
@@ -3537,7 +3628,8 @@ function useDataTableRenderer({
3537
3628
  isRowSelectable,
3538
3629
  columnGroupingModel,
3539
3630
  columnVisibilityModel,
3540
- onColumnVisibilityModelChange
3631
+ onColumnVisibilityModelChange,
3632
+ checkboxSelection
3541
3633
  }) {
3542
3634
  if (pinnedColumns && columnGroupingModel) {
3543
3635
  throw new Error(
@@ -3570,6 +3662,14 @@ function useDataTableRenderer({
3570
3662
  [reorderedColumns, visibilityModel]
3571
3663
  );
3572
3664
  const visibleFieldSet = (0, import_react25.useMemo)(() => new Set(visibleColumns.map((c) => c.field)), [visibleColumns]);
3665
+ const tableMinWidth = (0, import_react25.useMemo)(() => {
3666
+ const DEFAULT_MIN = 50;
3667
+ let total = checkboxSelection ? 40 : 0;
3668
+ for (const col of visibleColumns) {
3669
+ total += parsePxValue(col.minWidth) ?? parsePxValue(col.width) ?? DEFAULT_MIN;
3670
+ }
3671
+ return total;
3672
+ }, [visibleColumns, checkboxSelection]);
3573
3673
  const allColumnsByField = (0, import_react25.useMemo)(
3574
3674
  () => reorderedColumns.reduce(
3575
3675
  (acc, curr) => ({
@@ -3870,6 +3970,7 @@ function useDataTableRenderer({
3870
3970
  ]
3871
3971
  ),
3872
3972
  columns,
3973
+ tableMinWidth,
3873
3974
  processedColumnGroups,
3874
3975
  onTotalSelect: (0, import_react25.useCallback)(() => {
3875
3976
  const selectableRows = rows.filter((row, i) => {
@@ -4259,6 +4360,7 @@ function Component(props, apiRef) {
4259
4360
  onTotalSelect,
4260
4361
  HeadCell: HeadCell2,
4261
4362
  BodyRow: BodyRow2,
4363
+ tableMinWidth,
4262
4364
  // For keyboard selection
4263
4365
  selectionAnchor,
4264
4366
  setSelectionAnchor
@@ -4448,7 +4550,7 @@ function Component(props, apiRef) {
4448
4550
  ref: parentRef,
4449
4551
  ...backgroundProps
4450
4552
  },
4451
- /* @__PURE__ */ import_react28.default.createElement(Table, { ...innerProps }, /* @__PURE__ */ import_react28.default.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ import_react28.default.createElement(
4553
+ /* @__PURE__ */ import_react28.default.createElement(Table, { ...innerProps, sx: { ...innerProps.sx, minWidth: tableMinWidth } }, /* @__PURE__ */ import_react28.default.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ import_react28.default.createElement(
4452
4554
  "col",
4453
4555
  {
4454
4556
  style: {
@@ -4461,7 +4563,8 @@ function Component(props, apiRef) {
4461
4563
  ref: c.tableColRef,
4462
4564
  key: `${c.field.toString()}_${c.width}`,
4463
4565
  style: {
4464
- width: c.width
4566
+ width: c.width,
4567
+ minWidth: c.minWidth ?? "50px"
4465
4568
  }
4466
4569
  }
4467
4570
  ))), /* @__PURE__ */ import_react28.default.createElement("thead", null, processedColumnGroups && processedColumnGroups.groups.length > 0 && processedColumnGroups.groups.map((levelGroups, level) => /* @__PURE__ */ import_react28.default.createElement("tr", { key: `group-level-${level}` }, checkboxSelection && level === 0 && /* @__PURE__ */ import_react28.default.createElement(
@@ -4680,10 +4783,47 @@ var CalendarSheet2 = (0, import_joy36.styled)(Sheet_default, {
4680
4783
  overridesResolver: (props, styles) => styles.root
4681
4784
  })(({ theme }) => ({
4682
4785
  zIndex: theme.zIndex.tooltip,
4683
- width: "264px",
4684
4786
  boxShadow: theme.shadow.md,
4685
4787
  borderRadius: theme.radius.md
4686
4788
  }));
4789
+ var CalendarSheetContent2 = (0, import_joy36.styled)("div", {
4790
+ name: "DateRangePicker",
4791
+ slot: "sheetContent"
4792
+ })({
4793
+ display: "flex",
4794
+ flexDirection: "row"
4795
+ });
4796
+ var CalendarSection2 = (0, import_joy36.styled)("div", {
4797
+ name: "DateRangePicker",
4798
+ slot: "calendarSection"
4799
+ })({
4800
+ width: "264px"
4801
+ });
4802
+ var PresetPanel2 = (0, import_joy36.styled)("div", {
4803
+ name: "DateRangePicker",
4804
+ slot: "presetPanel"
4805
+ })(({ theme }) => ({
4806
+ display: "flex",
4807
+ flexDirection: "column",
4808
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
4809
+ padding: theme.spacing(1),
4810
+ minWidth: "120px",
4811
+ overflowY: "auto"
4812
+ }));
4813
+ var PresetItem2 = (0, import_joy36.styled)(Button_default, {
4814
+ name: "DateRangePicker",
4815
+ slot: "presetItem",
4816
+ shouldForwardProp: (prop) => prop !== "active"
4817
+ })(({ active }) => [
4818
+ {
4819
+ width: "100%",
4820
+ justifyContent: "flex-start",
4821
+ whiteSpace: "nowrap"
4822
+ },
4823
+ active && {
4824
+ fontWeight: "bold"
4825
+ }
4826
+ ]);
4687
4827
  var DateRangePickerRoot = (0, import_joy36.styled)("div", {
4688
4828
  name: "DateRangePicker",
4689
4829
  slot: "root",
@@ -4812,6 +4952,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4812
4952
  inputReadOnly,
4813
4953
  hideClearButton,
4814
4954
  readOnly,
4955
+ presets,
4815
4956
  ...innerProps
4816
4957
  } = props;
4817
4958
  const innerRef = (0, import_react29.useRef)(null);
@@ -4911,6 +5052,38 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4911
5052
  },
4912
5053
  [inputReadOnly, buttonRef]
4913
5054
  );
5055
+ const handlePresetClick = (0, import_react29.useCallback)(
5056
+ (presetValue) => {
5057
+ if (props.value !== void 0) {
5058
+ onChange?.({ target: { name: props.name, value: presetValue } });
5059
+ } else {
5060
+ const dates = parseDates(presetValue, format);
5061
+ setDisplayValue(formatValueString2(dates, displayFormat));
5062
+ setValue(presetValue);
5063
+ }
5064
+ setAnchorEl(null);
5065
+ },
5066
+ [props.value, props.name, onChange, setValue, setAnchorEl, format, displayFormat]
5067
+ );
5068
+ const isPresetDisabled = (0, import_react29.useCallback)(
5069
+ (presetValue) => {
5070
+ try {
5071
+ const dates = parseDates(presetValue, format);
5072
+ if (dates.some((d) => Number.isNaN(d.getTime()))) return true;
5073
+ const today = new Date((/* @__PURE__ */ new Date()).toDateString());
5074
+ for (const date of dates) {
5075
+ if (minDate && date < new Date(minDate)) return true;
5076
+ if (maxDate && date > new Date(maxDate)) return true;
5077
+ if (disableFuture && date > today) return true;
5078
+ if (disablePast && date < today) return true;
5079
+ }
5080
+ return false;
5081
+ } catch {
5082
+ return true;
5083
+ }
5084
+ },
5085
+ [format, minDate, maxDate, disableFuture, disablePast]
5086
+ );
4914
5087
  return /* @__PURE__ */ import_react29.default.createElement(DateRangePickerRoot, null, /* @__PURE__ */ import_react29.default.createElement(import_base4.FocusTrap, { open: true }, /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, /* @__PURE__ */ import_react29.default.createElement(
4915
5088
  Input_default,
4916
5089
  {
@@ -4976,7 +5149,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4976
5149
  "aria-label": "Calendar Tooltip",
4977
5150
  "aria-expanded": open
4978
5151
  },
4979
- /* @__PURE__ */ import_react29.default.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react29.default.createElement(
5152
+ /* @__PURE__ */ import_react29.default.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react29.default.createElement(CalendarSheetContent2, null, /* @__PURE__ */ import_react29.default.createElement(CalendarSection2, null, /* @__PURE__ */ import_react29.default.createElement(
4980
5153
  Calendar_default,
4981
5154
  {
4982
5155
  rangeSelection: true,
@@ -5008,7 +5181,22 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
5008
5181
  },
5009
5182
  "Clear"
5010
5183
  )
5011
- ))
5184
+ )), presets && presets.length > 0 && /* @__PURE__ */ import_react29.default.createElement(PresetPanel2, null, presets.map((preset) => {
5185
+ const disabled2 = isPresetDisabled(preset.value);
5186
+ return /* @__PURE__ */ import_react29.default.createElement(
5187
+ PresetItem2,
5188
+ {
5189
+ key: preset.label,
5190
+ size: "sm",
5191
+ variant: value === preset.value ? "soft" : "plain",
5192
+ color: value === preset.value ? "primary" : "neutral",
5193
+ active: value === preset.value,
5194
+ disabled: disabled2,
5195
+ onClick: () => handlePresetClick(preset.value)
5196
+ },
5197
+ preset.label
5198
+ );
5199
+ }))))
5012
5200
  )))));
5013
5201
  });
5014
5202
  DateRangePicker.displayName = "DateRangePicker";
package/dist/index.js CHANGED
@@ -2112,6 +2112,15 @@ function calculateColumnGroups(columnGroupingModel, columns, visibleFields) {
2112
2112
  const correctedMaxLevel = filteredGroupsByLevel.length > 0 ? filteredGroupsByLevel.length - 1 : -1;
2113
2113
  return { groups: filteredGroupsByLevel, maxLevel: correctedMaxLevel, fieldsInGroupingModel };
2114
2114
  }
2115
+ function parsePxValue(value) {
2116
+ if (!value) return null;
2117
+ const trimmed = value.trim();
2118
+ if (trimmed.endsWith("px")) {
2119
+ const num = parseFloat(trimmed);
2120
+ return isNaN(num) ? null : num;
2121
+ }
2122
+ return null;
2123
+ }
2115
2124
  function getTextAlign(props) {
2116
2125
  return !props.editMode && ["number", "date", "currency"].includes(props.type || "") ? "end" : "start";
2117
2126
  }
@@ -2433,10 +2442,47 @@ var CalendarSheet = styled10(Sheet_default, {
2433
2442
  slot: "sheet",
2434
2443
  overridesResolver: (props, styles) => styles.root
2435
2444
  })(({ theme }) => ({
2436
- width: "264px",
2437
2445
  boxShadow: theme.shadow.md,
2438
2446
  borderRadius: theme.radius.md
2439
2447
  }));
2448
+ var CalendarSheetContent = styled10("div", {
2449
+ name: "DatePicker",
2450
+ slot: "sheetContent"
2451
+ })({
2452
+ display: "flex",
2453
+ flexDirection: "row"
2454
+ });
2455
+ var CalendarSection = styled10("div", {
2456
+ name: "DatePicker",
2457
+ slot: "calendarSection"
2458
+ })({
2459
+ width: "264px"
2460
+ });
2461
+ var PresetPanel = styled10("div", {
2462
+ name: "DatePicker",
2463
+ slot: "presetPanel"
2464
+ })(({ theme }) => ({
2465
+ display: "flex",
2466
+ flexDirection: "column",
2467
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
2468
+ padding: theme.spacing(1),
2469
+ minWidth: "120px",
2470
+ overflowY: "auto"
2471
+ }));
2472
+ var PresetItem = styled10(Button_default, {
2473
+ name: "DatePicker",
2474
+ slot: "presetItem",
2475
+ shouldForwardProp: (prop) => prop !== "active"
2476
+ })(({ active }) => [
2477
+ {
2478
+ width: "100%",
2479
+ justifyContent: "flex-start",
2480
+ whiteSpace: "nowrap"
2481
+ },
2482
+ active && {
2483
+ fontWeight: "bold"
2484
+ }
2485
+ ]);
2440
2486
  var DatePickerRoot = styled10("div", {
2441
2487
  name: "DatePicker",
2442
2488
  slot: "root",
@@ -2554,6 +2600,7 @@ var DatePicker = forwardRef6((inProps, ref) => {
2554
2600
  hideClearButton,
2555
2601
  readOnly,
2556
2602
  shouldDisableDate,
2603
+ presets,
2557
2604
  ...innerProps
2558
2605
  } = props;
2559
2606
  const innerRef = useRef4(null);
@@ -2635,6 +2682,35 @@ var DatePicker = forwardRef6((inProps, ref) => {
2635
2682
  },
2636
2683
  [inputReadOnly, buttonRef]
2637
2684
  );
2685
+ const handlePresetClick = useCallback8(
2686
+ (presetValue) => {
2687
+ handleChange({
2688
+ target: {
2689
+ name: props.name,
2690
+ value: presetValue
2691
+ }
2692
+ });
2693
+ setAnchorEl(null);
2694
+ },
2695
+ [handleChange, props.name]
2696
+ );
2697
+ const isPresetDisabled = useCallback8(
2698
+ (presetValue) => {
2699
+ try {
2700
+ const date = parseDate(presetValue, format);
2701
+ if (Number.isNaN(date.getTime())) return true;
2702
+ if (minDate && date < new Date(minDate)) return true;
2703
+ if (maxDate && date > new Date(maxDate)) return true;
2704
+ if (disableFuture && date > new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2705
+ if (disablePast && date < new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2706
+ if (shouldDisableDate?.(presetValue)) return true;
2707
+ return false;
2708
+ } catch {
2709
+ return true;
2710
+ }
2711
+ },
2712
+ [format, minDate, maxDate, disableFuture, disablePast, shouldDisableDate]
2713
+ );
2638
2714
  return /* @__PURE__ */ React18.createElement(DatePickerRoot, null, /* @__PURE__ */ React18.createElement(FocusTrap, { open: true }, /* @__PURE__ */ React18.createElement(React18.Fragment, null, /* @__PURE__ */ React18.createElement(
2639
2715
  Input_default,
2640
2716
  {
@@ -2700,7 +2776,7 @@ var DatePicker = forwardRef6((inProps, ref) => {
2700
2776
  "aria-label": "Calendar Tooltip",
2701
2777
  "aria-expanded": open
2702
2778
  },
2703
- /* @__PURE__ */ React18.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React18.createElement(
2779
+ /* @__PURE__ */ React18.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React18.createElement(CalendarSheetContent, null, /* @__PURE__ */ React18.createElement(CalendarSection, null, /* @__PURE__ */ React18.createElement(
2704
2780
  Calendar_default,
2705
2781
  {
2706
2782
  value: value && !Number.isNaN(parseDate(value, format).getTime()) ? [parseDate(value, format), void 0] : void 0,
@@ -2744,7 +2820,22 @@ var DatePicker = forwardRef6((inProps, ref) => {
2744
2820
  },
2745
2821
  "Clear"
2746
2822
  )
2747
- ))
2823
+ )), presets && presets.length > 0 && /* @__PURE__ */ React18.createElement(PresetPanel, null, presets.map((preset) => {
2824
+ const disabled2 = isPresetDisabled(preset.value);
2825
+ return /* @__PURE__ */ React18.createElement(
2826
+ PresetItem,
2827
+ {
2828
+ key: preset.label,
2829
+ size: "sm",
2830
+ variant: value === preset.value ? "soft" : "plain",
2831
+ color: value === preset.value ? "primary" : "neutral",
2832
+ active: value === preset.value,
2833
+ disabled: disabled2,
2834
+ onClick: () => handlePresetClick(preset.value)
2835
+ },
2836
+ preset.label
2837
+ );
2838
+ }))))
2748
2839
  )))));
2749
2840
  });
2750
2841
 
@@ -3420,7 +3511,8 @@ function useDataTableRenderer({
3420
3511
  isRowSelectable,
3421
3512
  columnGroupingModel,
3422
3513
  columnVisibilityModel,
3423
- onColumnVisibilityModelChange
3514
+ onColumnVisibilityModelChange,
3515
+ checkboxSelection
3424
3516
  }) {
3425
3517
  if (pinnedColumns && columnGroupingModel) {
3426
3518
  throw new Error(
@@ -3453,6 +3545,14 @@ function useDataTableRenderer({
3453
3545
  [reorderedColumns, visibilityModel]
3454
3546
  );
3455
3547
  const visibleFieldSet = useMemo9(() => new Set(visibleColumns.map((c) => c.field)), [visibleColumns]);
3548
+ const tableMinWidth = useMemo9(() => {
3549
+ const DEFAULT_MIN = 50;
3550
+ let total = checkboxSelection ? 40 : 0;
3551
+ for (const col of visibleColumns) {
3552
+ total += parsePxValue(col.minWidth) ?? parsePxValue(col.width) ?? DEFAULT_MIN;
3553
+ }
3554
+ return total;
3555
+ }, [visibleColumns, checkboxSelection]);
3456
3556
  const allColumnsByField = useMemo9(
3457
3557
  () => reorderedColumns.reduce(
3458
3558
  (acc, curr) => ({
@@ -3753,6 +3853,7 @@ function useDataTableRenderer({
3753
3853
  ]
3754
3854
  ),
3755
3855
  columns,
3856
+ tableMinWidth,
3756
3857
  processedColumnGroups,
3757
3858
  onTotalSelect: useCallback10(() => {
3758
3859
  const selectableRows = rows.filter((row, i) => {
@@ -4142,6 +4243,7 @@ function Component(props, apiRef) {
4142
4243
  onTotalSelect,
4143
4244
  HeadCell: HeadCell2,
4144
4245
  BodyRow: BodyRow2,
4246
+ tableMinWidth,
4145
4247
  // For keyboard selection
4146
4248
  selectionAnchor,
4147
4249
  setSelectionAnchor
@@ -4331,7 +4433,7 @@ function Component(props, apiRef) {
4331
4433
  ref: parentRef,
4332
4434
  ...backgroundProps
4333
4435
  },
4334
- /* @__PURE__ */ React25.createElement(Table, { ...innerProps }, /* @__PURE__ */ React25.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ React25.createElement(
4436
+ /* @__PURE__ */ React25.createElement(Table, { ...innerProps, sx: { ...innerProps.sx, minWidth: tableMinWidth } }, /* @__PURE__ */ React25.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ React25.createElement(
4335
4437
  "col",
4336
4438
  {
4337
4439
  style: {
@@ -4344,7 +4446,8 @@ function Component(props, apiRef) {
4344
4446
  ref: c.tableColRef,
4345
4447
  key: `${c.field.toString()}_${c.width}`,
4346
4448
  style: {
4347
- width: c.width
4449
+ width: c.width,
4450
+ minWidth: c.minWidth ?? "50px"
4348
4451
  }
4349
4452
  }
4350
4453
  ))), /* @__PURE__ */ React25.createElement("thead", null, processedColumnGroups && processedColumnGroups.groups.length > 0 && processedColumnGroups.groups.map((levelGroups, level) => /* @__PURE__ */ React25.createElement("tr", { key: `group-level-${level}` }, checkboxSelection && level === 0 && /* @__PURE__ */ React25.createElement(
@@ -4563,10 +4666,47 @@ var CalendarSheet2 = styled14(Sheet_default, {
4563
4666
  overridesResolver: (props, styles) => styles.root
4564
4667
  })(({ theme }) => ({
4565
4668
  zIndex: theme.zIndex.tooltip,
4566
- width: "264px",
4567
4669
  boxShadow: theme.shadow.md,
4568
4670
  borderRadius: theme.radius.md
4569
4671
  }));
4672
+ var CalendarSheetContent2 = styled14("div", {
4673
+ name: "DateRangePicker",
4674
+ slot: "sheetContent"
4675
+ })({
4676
+ display: "flex",
4677
+ flexDirection: "row"
4678
+ });
4679
+ var CalendarSection2 = styled14("div", {
4680
+ name: "DateRangePicker",
4681
+ slot: "calendarSection"
4682
+ })({
4683
+ width: "264px"
4684
+ });
4685
+ var PresetPanel2 = styled14("div", {
4686
+ name: "DateRangePicker",
4687
+ slot: "presetPanel"
4688
+ })(({ theme }) => ({
4689
+ display: "flex",
4690
+ flexDirection: "column",
4691
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
4692
+ padding: theme.spacing(1),
4693
+ minWidth: "120px",
4694
+ overflowY: "auto"
4695
+ }));
4696
+ var PresetItem2 = styled14(Button_default, {
4697
+ name: "DateRangePicker",
4698
+ slot: "presetItem",
4699
+ shouldForwardProp: (prop) => prop !== "active"
4700
+ })(({ active }) => [
4701
+ {
4702
+ width: "100%",
4703
+ justifyContent: "flex-start",
4704
+ whiteSpace: "nowrap"
4705
+ },
4706
+ active && {
4707
+ fontWeight: "bold"
4708
+ }
4709
+ ]);
4570
4710
  var DateRangePickerRoot = styled14("div", {
4571
4711
  name: "DateRangePicker",
4572
4712
  slot: "root",
@@ -4695,6 +4835,7 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4695
4835
  inputReadOnly,
4696
4836
  hideClearButton,
4697
4837
  readOnly,
4838
+ presets,
4698
4839
  ...innerProps
4699
4840
  } = props;
4700
4841
  const innerRef = useRef8(null);
@@ -4794,6 +4935,38 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4794
4935
  },
4795
4936
  [inputReadOnly, buttonRef]
4796
4937
  );
4938
+ const handlePresetClick = useCallback13(
4939
+ (presetValue) => {
4940
+ if (props.value !== void 0) {
4941
+ onChange?.({ target: { name: props.name, value: presetValue } });
4942
+ } else {
4943
+ const dates = parseDates(presetValue, format);
4944
+ setDisplayValue(formatValueString2(dates, displayFormat));
4945
+ setValue(presetValue);
4946
+ }
4947
+ setAnchorEl(null);
4948
+ },
4949
+ [props.value, props.name, onChange, setValue, setAnchorEl, format, displayFormat]
4950
+ );
4951
+ const isPresetDisabled = useCallback13(
4952
+ (presetValue) => {
4953
+ try {
4954
+ const dates = parseDates(presetValue, format);
4955
+ if (dates.some((d) => Number.isNaN(d.getTime()))) return true;
4956
+ const today = new Date((/* @__PURE__ */ new Date()).toDateString());
4957
+ for (const date of dates) {
4958
+ if (minDate && date < new Date(minDate)) return true;
4959
+ if (maxDate && date > new Date(maxDate)) return true;
4960
+ if (disableFuture && date > today) return true;
4961
+ if (disablePast && date < today) return true;
4962
+ }
4963
+ return false;
4964
+ } catch {
4965
+ return true;
4966
+ }
4967
+ },
4968
+ [format, minDate, maxDate, disableFuture, disablePast]
4969
+ );
4797
4970
  return /* @__PURE__ */ React26.createElement(DateRangePickerRoot, null, /* @__PURE__ */ React26.createElement(FocusTrap2, { open: true }, /* @__PURE__ */ React26.createElement(React26.Fragment, null, /* @__PURE__ */ React26.createElement(
4798
4971
  Input_default,
4799
4972
  {
@@ -4859,7 +5032,7 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4859
5032
  "aria-label": "Calendar Tooltip",
4860
5033
  "aria-expanded": open
4861
5034
  },
4862
- /* @__PURE__ */ React26.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React26.createElement(
5035
+ /* @__PURE__ */ React26.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React26.createElement(CalendarSheetContent2, null, /* @__PURE__ */ React26.createElement(CalendarSection2, null, /* @__PURE__ */ React26.createElement(
4863
5036
  Calendar_default,
4864
5037
  {
4865
5038
  rangeSelection: true,
@@ -4891,7 +5064,22 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4891
5064
  },
4892
5065
  "Clear"
4893
5066
  )
4894
- ))
5067
+ )), presets && presets.length > 0 && /* @__PURE__ */ React26.createElement(PresetPanel2, null, presets.map((preset) => {
5068
+ const disabled2 = isPresetDisabled(preset.value);
5069
+ return /* @__PURE__ */ React26.createElement(
5070
+ PresetItem2,
5071
+ {
5072
+ key: preset.label,
5073
+ size: "sm",
5074
+ variant: value === preset.value ? "soft" : "plain",
5075
+ color: value === preset.value ? "primary" : "neutral",
5076
+ active: value === preset.value,
5077
+ disabled: disabled2,
5078
+ onClick: () => handlePresetClick(preset.value)
5079
+ },
5080
+ preset.label
5081
+ );
5082
+ }))))
4895
5083
  )))));
4896
5084
  });
4897
5085
  DateRangePicker.displayName = "DateRangePicker";