@ceed/ads 1.29.0 → 1.30.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
@@ -2236,6 +2236,15 @@ function calculateColumnGroups(columnGroupingModel, columns, visibleFields) {
2236
2236
  const correctedMaxLevel = filteredGroupsByLevel.length > 0 ? filteredGroupsByLevel.length - 1 : -1;
2237
2237
  return { groups: filteredGroupsByLevel, maxLevel: correctedMaxLevel, fieldsInGroupingModel };
2238
2238
  }
2239
+ function parsePxValue(value) {
2240
+ if (!value) return null;
2241
+ const trimmed = value.trim();
2242
+ if (trimmed.endsWith("px")) {
2243
+ const num = parseFloat(trimmed);
2244
+ return isNaN(num) ? null : num;
2245
+ }
2246
+ return null;
2247
+ }
2239
2248
  function getTextAlign(props) {
2240
2249
  return !props.editMode && ["number", "date", "currency"].includes(props.type || "") ? "end" : "start";
2241
2250
  }
@@ -2548,10 +2557,47 @@ var CalendarSheet = (0, import_joy28.styled)(Sheet_default, {
2548
2557
  slot: "sheet",
2549
2558
  overridesResolver: (props, styles) => styles.root
2550
2559
  })(({ theme }) => ({
2551
- width: "264px",
2552
2560
  boxShadow: theme.shadow.md,
2553
2561
  borderRadius: theme.radius.md
2554
2562
  }));
2563
+ var CalendarSheetContent = (0, import_joy28.styled)("div", {
2564
+ name: "DatePicker",
2565
+ slot: "sheetContent"
2566
+ })({
2567
+ display: "flex",
2568
+ flexDirection: "row"
2569
+ });
2570
+ var CalendarSection = (0, import_joy28.styled)("div", {
2571
+ name: "DatePicker",
2572
+ slot: "calendarSection"
2573
+ })({
2574
+ width: "264px"
2575
+ });
2576
+ var PresetPanel = (0, import_joy28.styled)("div", {
2577
+ name: "DatePicker",
2578
+ slot: "presetPanel"
2579
+ })(({ theme }) => ({
2580
+ display: "flex",
2581
+ flexDirection: "column",
2582
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
2583
+ padding: theme.spacing(1),
2584
+ minWidth: "120px",
2585
+ overflowY: "auto"
2586
+ }));
2587
+ var PresetItem = (0, import_joy28.styled)(Button_default, {
2588
+ name: "DatePicker",
2589
+ slot: "presetItem",
2590
+ shouldForwardProp: (prop) => prop !== "active"
2591
+ })(({ active }) => [
2592
+ {
2593
+ width: "100%",
2594
+ justifyContent: "flex-start",
2595
+ whiteSpace: "nowrap"
2596
+ },
2597
+ active && {
2598
+ fontWeight: "bold"
2599
+ }
2600
+ ]);
2555
2601
  var DatePickerRoot = (0, import_joy28.styled)("div", {
2556
2602
  name: "DatePicker",
2557
2603
  slot: "root",
@@ -2669,6 +2715,7 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2669
2715
  hideClearButton,
2670
2716
  readOnly,
2671
2717
  shouldDisableDate,
2718
+ presets,
2672
2719
  ...innerProps
2673
2720
  } = props;
2674
2721
  const innerRef = (0, import_react20.useRef)(null);
@@ -2750,6 +2797,35 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2750
2797
  },
2751
2798
  [inputReadOnly, buttonRef]
2752
2799
  );
2800
+ const handlePresetClick = (0, import_react20.useCallback)(
2801
+ (presetValue) => {
2802
+ handleChange({
2803
+ target: {
2804
+ name: props.name,
2805
+ value: presetValue
2806
+ }
2807
+ });
2808
+ setAnchorEl(null);
2809
+ },
2810
+ [handleChange, props.name]
2811
+ );
2812
+ const isPresetDisabled = (0, import_react20.useCallback)(
2813
+ (presetValue) => {
2814
+ try {
2815
+ const date = parseDate(presetValue, format);
2816
+ if (Number.isNaN(date.getTime())) return true;
2817
+ if (minDate && date < new Date(minDate)) return true;
2818
+ if (maxDate && date > new Date(maxDate)) return true;
2819
+ if (disableFuture && date > new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2820
+ if (disablePast && date < new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2821
+ if (shouldDisableDate?.(presetValue)) return true;
2822
+ return false;
2823
+ } catch {
2824
+ return true;
2825
+ }
2826
+ },
2827
+ [format, minDate, maxDate, disableFuture, disablePast, shouldDisableDate]
2828
+ );
2753
2829
  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(
2754
2830
  Input_default,
2755
2831
  {
@@ -2815,7 +2891,7 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2815
2891
  "aria-label": "Calendar Tooltip",
2816
2892
  "aria-expanded": open
2817
2893
  },
2818
- /* @__PURE__ */ import_react20.default.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react20.default.createElement(
2894
+ /* @__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(
2819
2895
  Calendar_default,
2820
2896
  {
2821
2897
  value: value && !Number.isNaN(parseDate(value, format).getTime()) ? [parseDate(value, format), void 0] : void 0,
@@ -2859,7 +2935,22 @@ var DatePicker = (0, import_react20.forwardRef)((inProps, ref) => {
2859
2935
  },
2860
2936
  "Clear"
2861
2937
  )
2862
- ))
2938
+ )), presets && presets.length > 0 && /* @__PURE__ */ import_react20.default.createElement(PresetPanel, null, presets.map((preset) => {
2939
+ const disabled2 = isPresetDisabled(preset.value);
2940
+ return /* @__PURE__ */ import_react20.default.createElement(
2941
+ PresetItem,
2942
+ {
2943
+ key: preset.label,
2944
+ size: "sm",
2945
+ variant: value === preset.value ? "soft" : "plain",
2946
+ color: value === preset.value ? "primary" : "neutral",
2947
+ active: value === preset.value,
2948
+ disabled: disabled2,
2949
+ onClick: () => handlePresetClick(preset.value)
2950
+ },
2951
+ preset.label
2952
+ );
2953
+ }))))
2863
2954
  )))));
2864
2955
  });
2865
2956
 
@@ -3535,7 +3626,8 @@ function useDataTableRenderer({
3535
3626
  isRowSelectable,
3536
3627
  columnGroupingModel,
3537
3628
  columnVisibilityModel,
3538
- onColumnVisibilityModelChange
3629
+ onColumnVisibilityModelChange,
3630
+ checkboxSelection
3539
3631
  }) {
3540
3632
  if (pinnedColumns && columnGroupingModel) {
3541
3633
  throw new Error(
@@ -3568,6 +3660,14 @@ function useDataTableRenderer({
3568
3660
  [reorderedColumns, visibilityModel]
3569
3661
  );
3570
3662
  const visibleFieldSet = (0, import_react25.useMemo)(() => new Set(visibleColumns.map((c) => c.field)), [visibleColumns]);
3663
+ const tableMinWidth = (0, import_react25.useMemo)(() => {
3664
+ const DEFAULT_MIN = 50;
3665
+ let total = checkboxSelection ? 40 : 0;
3666
+ for (const col of visibleColumns) {
3667
+ total += parsePxValue(col.minWidth) ?? parsePxValue(col.width) ?? DEFAULT_MIN;
3668
+ }
3669
+ return total;
3670
+ }, [visibleColumns, checkboxSelection]);
3571
3671
  const allColumnsByField = (0, import_react25.useMemo)(
3572
3672
  () => reorderedColumns.reduce(
3573
3673
  (acc, curr) => ({
@@ -3868,6 +3968,7 @@ function useDataTableRenderer({
3868
3968
  ]
3869
3969
  ),
3870
3970
  columns,
3971
+ tableMinWidth,
3871
3972
  processedColumnGroups,
3872
3973
  onTotalSelect: (0, import_react25.useCallback)(() => {
3873
3974
  const selectableRows = rows.filter((row, i) => {
@@ -4257,6 +4358,7 @@ function Component(props, apiRef) {
4257
4358
  onTotalSelect,
4258
4359
  HeadCell: HeadCell2,
4259
4360
  BodyRow: BodyRow2,
4361
+ tableMinWidth,
4260
4362
  // For keyboard selection
4261
4363
  selectionAnchor,
4262
4364
  setSelectionAnchor
@@ -4446,7 +4548,7 @@ function Component(props, apiRef) {
4446
4548
  ref: parentRef,
4447
4549
  ...backgroundProps
4448
4550
  },
4449
- /* @__PURE__ */ import_react28.default.createElement(Table, { ...innerProps }, /* @__PURE__ */ import_react28.default.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ import_react28.default.createElement(
4551
+ /* @__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(
4450
4552
  "col",
4451
4553
  {
4452
4554
  style: {
@@ -4459,7 +4561,8 @@ function Component(props, apiRef) {
4459
4561
  ref: c.tableColRef,
4460
4562
  key: `${c.field.toString()}_${c.width}`,
4461
4563
  style: {
4462
- width: c.width
4564
+ width: c.width,
4565
+ minWidth: c.minWidth ?? "50px"
4463
4566
  }
4464
4567
  }
4465
4568
  ))), /* @__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(
@@ -4678,10 +4781,47 @@ var CalendarSheet2 = (0, import_joy36.styled)(Sheet_default, {
4678
4781
  overridesResolver: (props, styles) => styles.root
4679
4782
  })(({ theme }) => ({
4680
4783
  zIndex: theme.zIndex.tooltip,
4681
- width: "264px",
4682
4784
  boxShadow: theme.shadow.md,
4683
4785
  borderRadius: theme.radius.md
4684
4786
  }));
4787
+ var CalendarSheetContent2 = (0, import_joy36.styled)("div", {
4788
+ name: "DateRangePicker",
4789
+ slot: "sheetContent"
4790
+ })({
4791
+ display: "flex",
4792
+ flexDirection: "row"
4793
+ });
4794
+ var CalendarSection2 = (0, import_joy36.styled)("div", {
4795
+ name: "DateRangePicker",
4796
+ slot: "calendarSection"
4797
+ })({
4798
+ width: "264px"
4799
+ });
4800
+ var PresetPanel2 = (0, import_joy36.styled)("div", {
4801
+ name: "DateRangePicker",
4802
+ slot: "presetPanel"
4803
+ })(({ theme }) => ({
4804
+ display: "flex",
4805
+ flexDirection: "column",
4806
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
4807
+ padding: theme.spacing(1),
4808
+ minWidth: "120px",
4809
+ overflowY: "auto"
4810
+ }));
4811
+ var PresetItem2 = (0, import_joy36.styled)(Button_default, {
4812
+ name: "DateRangePicker",
4813
+ slot: "presetItem",
4814
+ shouldForwardProp: (prop) => prop !== "active"
4815
+ })(({ active }) => [
4816
+ {
4817
+ width: "100%",
4818
+ justifyContent: "flex-start",
4819
+ whiteSpace: "nowrap"
4820
+ },
4821
+ active && {
4822
+ fontWeight: "bold"
4823
+ }
4824
+ ]);
4685
4825
  var DateRangePickerRoot = (0, import_joy36.styled)("div", {
4686
4826
  name: "DateRangePicker",
4687
4827
  slot: "root",
@@ -4810,6 +4950,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4810
4950
  inputReadOnly,
4811
4951
  hideClearButton,
4812
4952
  readOnly,
4953
+ presets,
4813
4954
  ...innerProps
4814
4955
  } = props;
4815
4956
  const innerRef = (0, import_react29.useRef)(null);
@@ -4909,6 +5050,38 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4909
5050
  },
4910
5051
  [inputReadOnly, buttonRef]
4911
5052
  );
5053
+ const handlePresetClick = (0, import_react29.useCallback)(
5054
+ (presetValue) => {
5055
+ if (props.value !== void 0) {
5056
+ onChange?.({ target: { name: props.name, value: presetValue } });
5057
+ } else {
5058
+ const dates = parseDates(presetValue, format);
5059
+ setDisplayValue(formatValueString2(dates, displayFormat));
5060
+ setValue(presetValue);
5061
+ }
5062
+ setAnchorEl(null);
5063
+ },
5064
+ [props.value, props.name, onChange, setValue, setAnchorEl, format, displayFormat]
5065
+ );
5066
+ const isPresetDisabled = (0, import_react29.useCallback)(
5067
+ (presetValue) => {
5068
+ try {
5069
+ const dates = parseDates(presetValue, format);
5070
+ if (dates.some((d) => Number.isNaN(d.getTime()))) return true;
5071
+ const today = new Date((/* @__PURE__ */ new Date()).toDateString());
5072
+ for (const date of dates) {
5073
+ if (minDate && date < new Date(minDate)) return true;
5074
+ if (maxDate && date > new Date(maxDate)) return true;
5075
+ if (disableFuture && date > today) return true;
5076
+ if (disablePast && date < today) return true;
5077
+ }
5078
+ return false;
5079
+ } catch {
5080
+ return true;
5081
+ }
5082
+ },
5083
+ [format, minDate, maxDate, disableFuture, disablePast]
5084
+ );
4912
5085
  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(
4913
5086
  Input_default,
4914
5087
  {
@@ -4974,7 +5147,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4974
5147
  "aria-label": "Calendar Tooltip",
4975
5148
  "aria-expanded": open
4976
5149
  },
4977
- /* @__PURE__ */ import_react29.default.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ import_react29.default.createElement(
5150
+ /* @__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(
4978
5151
  Calendar_default,
4979
5152
  {
4980
5153
  rangeSelection: true,
@@ -5006,7 +5179,22 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
5006
5179
  },
5007
5180
  "Clear"
5008
5181
  )
5009
- ))
5182
+ )), presets && presets.length > 0 && /* @__PURE__ */ import_react29.default.createElement(PresetPanel2, null, presets.map((preset) => {
5183
+ const disabled2 = isPresetDisabled(preset.value);
5184
+ return /* @__PURE__ */ import_react29.default.createElement(
5185
+ PresetItem2,
5186
+ {
5187
+ key: preset.label,
5188
+ size: "sm",
5189
+ variant: value === preset.value ? "soft" : "plain",
5190
+ color: value === preset.value ? "primary" : "neutral",
5191
+ active: value === preset.value,
5192
+ disabled: disabled2,
5193
+ onClick: () => handlePresetClick(preset.value)
5194
+ },
5195
+ preset.label
5196
+ );
5197
+ }))))
5010
5198
  )))));
5011
5199
  });
5012
5200
  DateRangePicker.displayName = "DateRangePicker";
package/dist/index.js CHANGED
@@ -2102,6 +2102,15 @@ function calculateColumnGroups(columnGroupingModel, columns, visibleFields) {
2102
2102
  const correctedMaxLevel = filteredGroupsByLevel.length > 0 ? filteredGroupsByLevel.length - 1 : -1;
2103
2103
  return { groups: filteredGroupsByLevel, maxLevel: correctedMaxLevel, fieldsInGroupingModel };
2104
2104
  }
2105
+ function parsePxValue(value) {
2106
+ if (!value) return null;
2107
+ const trimmed = value.trim();
2108
+ if (trimmed.endsWith("px")) {
2109
+ const num = parseFloat(trimmed);
2110
+ return isNaN(num) ? null : num;
2111
+ }
2112
+ return null;
2113
+ }
2105
2114
  function getTextAlign(props) {
2106
2115
  return !props.editMode && ["number", "date", "currency"].includes(props.type || "") ? "end" : "start";
2107
2116
  }
@@ -2423,10 +2432,47 @@ var CalendarSheet = styled10(Sheet_default, {
2423
2432
  slot: "sheet",
2424
2433
  overridesResolver: (props, styles) => styles.root
2425
2434
  })(({ theme }) => ({
2426
- width: "264px",
2427
2435
  boxShadow: theme.shadow.md,
2428
2436
  borderRadius: theme.radius.md
2429
2437
  }));
2438
+ var CalendarSheetContent = styled10("div", {
2439
+ name: "DatePicker",
2440
+ slot: "sheetContent"
2441
+ })({
2442
+ display: "flex",
2443
+ flexDirection: "row"
2444
+ });
2445
+ var CalendarSection = styled10("div", {
2446
+ name: "DatePicker",
2447
+ slot: "calendarSection"
2448
+ })({
2449
+ width: "264px"
2450
+ });
2451
+ var PresetPanel = styled10("div", {
2452
+ name: "DatePicker",
2453
+ slot: "presetPanel"
2454
+ })(({ theme }) => ({
2455
+ display: "flex",
2456
+ flexDirection: "column",
2457
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
2458
+ padding: theme.spacing(1),
2459
+ minWidth: "120px",
2460
+ overflowY: "auto"
2461
+ }));
2462
+ var PresetItem = styled10(Button_default, {
2463
+ name: "DatePicker",
2464
+ slot: "presetItem",
2465
+ shouldForwardProp: (prop) => prop !== "active"
2466
+ })(({ active }) => [
2467
+ {
2468
+ width: "100%",
2469
+ justifyContent: "flex-start",
2470
+ whiteSpace: "nowrap"
2471
+ },
2472
+ active && {
2473
+ fontWeight: "bold"
2474
+ }
2475
+ ]);
2430
2476
  var DatePickerRoot = styled10("div", {
2431
2477
  name: "DatePicker",
2432
2478
  slot: "root",
@@ -2544,6 +2590,7 @@ var DatePicker = forwardRef6((inProps, ref) => {
2544
2590
  hideClearButton,
2545
2591
  readOnly,
2546
2592
  shouldDisableDate,
2593
+ presets,
2547
2594
  ...innerProps
2548
2595
  } = props;
2549
2596
  const innerRef = useRef4(null);
@@ -2625,6 +2672,35 @@ var DatePicker = forwardRef6((inProps, ref) => {
2625
2672
  },
2626
2673
  [inputReadOnly, buttonRef]
2627
2674
  );
2675
+ const handlePresetClick = useCallback8(
2676
+ (presetValue) => {
2677
+ handleChange({
2678
+ target: {
2679
+ name: props.name,
2680
+ value: presetValue
2681
+ }
2682
+ });
2683
+ setAnchorEl(null);
2684
+ },
2685
+ [handleChange, props.name]
2686
+ );
2687
+ const isPresetDisabled = useCallback8(
2688
+ (presetValue) => {
2689
+ try {
2690
+ const date = parseDate(presetValue, format);
2691
+ if (Number.isNaN(date.getTime())) return true;
2692
+ if (minDate && date < new Date(minDate)) return true;
2693
+ if (maxDate && date > new Date(maxDate)) return true;
2694
+ if (disableFuture && date > new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2695
+ if (disablePast && date < new Date((/* @__PURE__ */ new Date()).toDateString())) return true;
2696
+ if (shouldDisableDate?.(presetValue)) return true;
2697
+ return false;
2698
+ } catch {
2699
+ return true;
2700
+ }
2701
+ },
2702
+ [format, minDate, maxDate, disableFuture, disablePast, shouldDisableDate]
2703
+ );
2628
2704
  return /* @__PURE__ */ React18.createElement(DatePickerRoot, null, /* @__PURE__ */ React18.createElement(FocusTrap, { open: true }, /* @__PURE__ */ React18.createElement(React18.Fragment, null, /* @__PURE__ */ React18.createElement(
2629
2705
  Input_default,
2630
2706
  {
@@ -2690,7 +2766,7 @@ var DatePicker = forwardRef6((inProps, ref) => {
2690
2766
  "aria-label": "Calendar Tooltip",
2691
2767
  "aria-expanded": open
2692
2768
  },
2693
- /* @__PURE__ */ React18.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React18.createElement(
2769
+ /* @__PURE__ */ React18.createElement(CalendarSheet, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React18.createElement(CalendarSheetContent, null, /* @__PURE__ */ React18.createElement(CalendarSection, null, /* @__PURE__ */ React18.createElement(
2694
2770
  Calendar_default,
2695
2771
  {
2696
2772
  value: value && !Number.isNaN(parseDate(value, format).getTime()) ? [parseDate(value, format), void 0] : void 0,
@@ -2734,7 +2810,22 @@ var DatePicker = forwardRef6((inProps, ref) => {
2734
2810
  },
2735
2811
  "Clear"
2736
2812
  )
2737
- ))
2813
+ )), presets && presets.length > 0 && /* @__PURE__ */ React18.createElement(PresetPanel, null, presets.map((preset) => {
2814
+ const disabled2 = isPresetDisabled(preset.value);
2815
+ return /* @__PURE__ */ React18.createElement(
2816
+ PresetItem,
2817
+ {
2818
+ key: preset.label,
2819
+ size: "sm",
2820
+ variant: value === preset.value ? "soft" : "plain",
2821
+ color: value === preset.value ? "primary" : "neutral",
2822
+ active: value === preset.value,
2823
+ disabled: disabled2,
2824
+ onClick: () => handlePresetClick(preset.value)
2825
+ },
2826
+ preset.label
2827
+ );
2828
+ }))))
2738
2829
  )))));
2739
2830
  });
2740
2831
 
@@ -3410,7 +3501,8 @@ function useDataTableRenderer({
3410
3501
  isRowSelectable,
3411
3502
  columnGroupingModel,
3412
3503
  columnVisibilityModel,
3413
- onColumnVisibilityModelChange
3504
+ onColumnVisibilityModelChange,
3505
+ checkboxSelection
3414
3506
  }) {
3415
3507
  if (pinnedColumns && columnGroupingModel) {
3416
3508
  throw new Error(
@@ -3443,6 +3535,14 @@ function useDataTableRenderer({
3443
3535
  [reorderedColumns, visibilityModel]
3444
3536
  );
3445
3537
  const visibleFieldSet = useMemo9(() => new Set(visibleColumns.map((c) => c.field)), [visibleColumns]);
3538
+ const tableMinWidth = useMemo9(() => {
3539
+ const DEFAULT_MIN = 50;
3540
+ let total = checkboxSelection ? 40 : 0;
3541
+ for (const col of visibleColumns) {
3542
+ total += parsePxValue(col.minWidth) ?? parsePxValue(col.width) ?? DEFAULT_MIN;
3543
+ }
3544
+ return total;
3545
+ }, [visibleColumns, checkboxSelection]);
3446
3546
  const allColumnsByField = useMemo9(
3447
3547
  () => reorderedColumns.reduce(
3448
3548
  (acc, curr) => ({
@@ -3743,6 +3843,7 @@ function useDataTableRenderer({
3743
3843
  ]
3744
3844
  ),
3745
3845
  columns,
3846
+ tableMinWidth,
3746
3847
  processedColumnGroups,
3747
3848
  onTotalSelect: useCallback10(() => {
3748
3849
  const selectableRows = rows.filter((row, i) => {
@@ -4132,6 +4233,7 @@ function Component(props, apiRef) {
4132
4233
  onTotalSelect,
4133
4234
  HeadCell: HeadCell2,
4134
4235
  BodyRow: BodyRow2,
4236
+ tableMinWidth,
4135
4237
  // For keyboard selection
4136
4238
  selectionAnchor,
4137
4239
  setSelectionAnchor
@@ -4321,7 +4423,7 @@ function Component(props, apiRef) {
4321
4423
  ref: parentRef,
4322
4424
  ...backgroundProps
4323
4425
  },
4324
- /* @__PURE__ */ React25.createElement(Table, { ...innerProps }, /* @__PURE__ */ React25.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ React25.createElement(
4426
+ /* @__PURE__ */ React25.createElement(Table, { ...innerProps, sx: { ...innerProps.sx, minWidth: tableMinWidth } }, /* @__PURE__ */ React25.createElement("colgroup", null, checkboxSelection && /* @__PURE__ */ React25.createElement(
4325
4427
  "col",
4326
4428
  {
4327
4429
  style: {
@@ -4334,7 +4436,8 @@ function Component(props, apiRef) {
4334
4436
  ref: c.tableColRef,
4335
4437
  key: `${c.field.toString()}_${c.width}`,
4336
4438
  style: {
4337
- width: c.width
4439
+ width: c.width,
4440
+ minWidth: c.minWidth ?? "50px"
4338
4441
  }
4339
4442
  }
4340
4443
  ))), /* @__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(
@@ -4553,10 +4656,47 @@ var CalendarSheet2 = styled14(Sheet_default, {
4553
4656
  overridesResolver: (props, styles) => styles.root
4554
4657
  })(({ theme }) => ({
4555
4658
  zIndex: theme.zIndex.tooltip,
4556
- width: "264px",
4557
4659
  boxShadow: theme.shadow.md,
4558
4660
  borderRadius: theme.radius.md
4559
4661
  }));
4662
+ var CalendarSheetContent2 = styled14("div", {
4663
+ name: "DateRangePicker",
4664
+ slot: "sheetContent"
4665
+ })({
4666
+ display: "flex",
4667
+ flexDirection: "row"
4668
+ });
4669
+ var CalendarSection2 = styled14("div", {
4670
+ name: "DateRangePicker",
4671
+ slot: "calendarSection"
4672
+ })({
4673
+ width: "264px"
4674
+ });
4675
+ var PresetPanel2 = styled14("div", {
4676
+ name: "DateRangePicker",
4677
+ slot: "presetPanel"
4678
+ })(({ theme }) => ({
4679
+ display: "flex",
4680
+ flexDirection: "column",
4681
+ borderLeft: `1px solid ${theme.vars.palette.divider}`,
4682
+ padding: theme.spacing(1),
4683
+ minWidth: "120px",
4684
+ overflowY: "auto"
4685
+ }));
4686
+ var PresetItem2 = styled14(Button_default, {
4687
+ name: "DateRangePicker",
4688
+ slot: "presetItem",
4689
+ shouldForwardProp: (prop) => prop !== "active"
4690
+ })(({ active }) => [
4691
+ {
4692
+ width: "100%",
4693
+ justifyContent: "flex-start",
4694
+ whiteSpace: "nowrap"
4695
+ },
4696
+ active && {
4697
+ fontWeight: "bold"
4698
+ }
4699
+ ]);
4560
4700
  var DateRangePickerRoot = styled14("div", {
4561
4701
  name: "DateRangePicker",
4562
4702
  slot: "root",
@@ -4685,6 +4825,7 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4685
4825
  inputReadOnly,
4686
4826
  hideClearButton,
4687
4827
  readOnly,
4828
+ presets,
4688
4829
  ...innerProps
4689
4830
  } = props;
4690
4831
  const innerRef = useRef8(null);
@@ -4784,6 +4925,38 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4784
4925
  },
4785
4926
  [inputReadOnly, buttonRef]
4786
4927
  );
4928
+ const handlePresetClick = useCallback13(
4929
+ (presetValue) => {
4930
+ if (props.value !== void 0) {
4931
+ onChange?.({ target: { name: props.name, value: presetValue } });
4932
+ } else {
4933
+ const dates = parseDates(presetValue, format);
4934
+ setDisplayValue(formatValueString2(dates, displayFormat));
4935
+ setValue(presetValue);
4936
+ }
4937
+ setAnchorEl(null);
4938
+ },
4939
+ [props.value, props.name, onChange, setValue, setAnchorEl, format, displayFormat]
4940
+ );
4941
+ const isPresetDisabled = useCallback13(
4942
+ (presetValue) => {
4943
+ try {
4944
+ const dates = parseDates(presetValue, format);
4945
+ if (dates.some((d) => Number.isNaN(d.getTime()))) return true;
4946
+ const today = new Date((/* @__PURE__ */ new Date()).toDateString());
4947
+ for (const date of dates) {
4948
+ if (minDate && date < new Date(minDate)) return true;
4949
+ if (maxDate && date > new Date(maxDate)) return true;
4950
+ if (disableFuture && date > today) return true;
4951
+ if (disablePast && date < today) return true;
4952
+ }
4953
+ return false;
4954
+ } catch {
4955
+ return true;
4956
+ }
4957
+ },
4958
+ [format, minDate, maxDate, disableFuture, disablePast]
4959
+ );
4787
4960
  return /* @__PURE__ */ React26.createElement(DateRangePickerRoot, null, /* @__PURE__ */ React26.createElement(FocusTrap2, { open: true }, /* @__PURE__ */ React26.createElement(React26.Fragment, null, /* @__PURE__ */ React26.createElement(
4788
4961
  Input_default,
4789
4962
  {
@@ -4849,7 +5022,7 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4849
5022
  "aria-label": "Calendar Tooltip",
4850
5023
  "aria-expanded": open
4851
5024
  },
4852
- /* @__PURE__ */ React26.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React26.createElement(
5025
+ /* @__PURE__ */ React26.createElement(CalendarSheet2, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React26.createElement(CalendarSheetContent2, null, /* @__PURE__ */ React26.createElement(CalendarSection2, null, /* @__PURE__ */ React26.createElement(
4853
5026
  Calendar_default,
4854
5027
  {
4855
5028
  rangeSelection: true,
@@ -4881,7 +5054,22 @@ var DateRangePicker = forwardRef8((inProps, ref) => {
4881
5054
  },
4882
5055
  "Clear"
4883
5056
  )
4884
- ))
5057
+ )), presets && presets.length > 0 && /* @__PURE__ */ React26.createElement(PresetPanel2, null, presets.map((preset) => {
5058
+ const disabled2 = isPresetDisabled(preset.value);
5059
+ return /* @__PURE__ */ React26.createElement(
5060
+ PresetItem2,
5061
+ {
5062
+ key: preset.label,
5063
+ size: "sm",
5064
+ variant: value === preset.value ? "soft" : "plain",
5065
+ color: value === preset.value ? "primary" : "neutral",
5066
+ active: value === preset.value,
5067
+ disabled: disabled2,
5068
+ onClick: () => handlePresetClick(preset.value)
5069
+ },
5070
+ preset.label
5071
+ );
5072
+ }))))
4885
5073
  )))));
4886
5074
  });
4887
5075
  DateRangePicker.displayName = "DateRangePicker";