@ceed/cds 1.40.3-next.5 → 1.40.3-next.7

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
@@ -460,16 +460,25 @@ function useSlotRef(slotProp, ref) {
460
460
  const isFunctionForm = typeof slotProp === "function";
461
461
  const slotRef = isFunctionForm ? void 0 : slotProp?.ref;
462
462
  const mergedRef = useMergedRef(slotRef, ref);
463
+ const latestSlotRef = (0, import_react6.useRef)(null);
464
+ const stableMergedRef = (0, import_react6.useCallback)(
465
+ (value) => {
466
+ assignRef(latestSlotRef.current, value);
467
+ assignRef(ref, value);
468
+ },
469
+ [ref]
470
+ );
463
471
  return (0, import_react6.useMemo)(() => {
464
472
  if (isFunctionForm) {
465
473
  return ((ownerState) => {
466
474
  const resolved = slotProp(ownerState) ?? {};
467
- const merged = mergeRefs(resolved.ref, ref);
468
- return merged ? { ...resolved, ref: merged } : { ...resolved };
475
+ const resolvedRef = resolved.ref;
476
+ latestSlotRef.current = resolvedRef ?? null;
477
+ return resolvedRef || ref ? { ...resolved, ref: stableMergedRef } : { ...resolved };
469
478
  });
470
479
  }
471
480
  return mergedRef ? { ...slotProp, ref: mergedRef } : { ...slotProp };
472
- }, [isFunctionForm, slotProp, mergedRef, ref]);
481
+ }, [isFunctionForm, slotProp, mergedRef, ref, stableMergedRef]);
473
482
  }
474
483
 
475
484
  // src/components/Autocomplete/Autocomplete.tsx
@@ -2612,7 +2621,10 @@ function computeAutoFitWidth(params) {
2612
2621
  return finalWidth;
2613
2622
  }
2614
2623
  function getHeaderCellId(tableId, columnId) {
2615
- return `${tableId}_header_${columnId}`.trim();
2624
+ return `${tableId}_header_${columnId}`;
2625
+ }
2626
+ function sanitizeColumnId(field) {
2627
+ return String(field).trim().replace(/\s+/g, "_");
2616
2628
  }
2617
2629
 
2618
2630
  // src/components/DataTable/styled.tsx
@@ -3569,7 +3581,7 @@ var HeadCell = (props) => {
3569
3581
  }, [ref]);
3570
3582
  const [isHovered, setIsHovered] = (0, import_react26.useState)(false);
3571
3583
  const sortable = type === "actions" ? false : _sortable;
3572
- const headId = (0, import_react26.useMemo)(() => getHeaderCellId(tableId, columnId ?? field), [tableId, columnId, field]);
3584
+ const headId = (0, import_react26.useMemo)(() => getHeaderCellId(tableId, columnId), [tableId, columnId]);
3573
3585
  const isResizingRef = (0, import_react26.useRef)(false);
3574
3586
  const resizer = (0, import_react26.useMemo)(
3575
3587
  () => resizable ?? true ? Resizer(
@@ -3578,9 +3590,9 @@ var HeadCell = (props) => {
3578
3590
  (isResizing) => {
3579
3591
  isResizingRef.current = isResizing;
3580
3592
  },
3581
- onAutoFit ? () => onAutoFit(columnId ?? String(field)) : void 0
3593
+ onAutoFit ? () => onAutoFit(columnId) : void 0
3582
3594
  ) : null,
3583
- [resizable, ref, colRef, onAutoFit, columnId, field]
3595
+ [resizable, ref, colRef, onAutoFit, columnId]
3584
3596
  );
3585
3597
  const style = (0, import_react26.useMemo)(
3586
3598
  () => ({
@@ -3850,7 +3862,7 @@ var BodyCell = (props) => {
3850
3862
  {
3851
3863
  ref: cellRef,
3852
3864
  key: field,
3853
- headers: getHeaderCellId(tableId, props.columnId ?? field),
3865
+ headers: getHeaderCellId(tableId, props.columnId),
3854
3866
  sx: {
3855
3867
  textAlign: getTextAlign({ type }),
3856
3868
  verticalAlign: editMode ? "top" : "middle",
@@ -3950,8 +3962,8 @@ function useColumnWidths(columnsById) {
3950
3962
  });
3951
3963
  setWidths((prev) => {
3952
3964
  const keys = Object.keys(measured);
3953
- const same = keys.length === Object.keys(prev).length && keys.every((key) => prev[key] === measured[key]);
3954
- return same ? prev : measured;
3965
+ const same = keys.every((key) => prev[key] === measured[key]);
3966
+ return same ? prev : { ...prev, ...measured };
3955
3967
  });
3956
3968
  return () => roRef.current?.disconnect();
3957
3969
  }, [columnsById]);
@@ -4038,10 +4050,10 @@ function useDataTableRenderer({
4038
4050
  [reorderedColumns]
4039
4051
  );
4040
4052
  const allColumnIds = (0, import_react27.useMemo)(() => {
4041
- const taken = new Set(reorderedColumns.map((column) => String(column.field)));
4053
+ const taken = new Set(reorderedColumns.map((column) => sanitizeColumnId(column.field)));
4042
4054
  const assigned = /* @__PURE__ */ new Set();
4043
4055
  return reorderedColumns.map((column) => {
4044
- const field = String(column.field);
4056
+ const field = sanitizeColumnId(column.field);
4045
4057
  if (!assigned.has(field)) {
4046
4058
  assigned.add(field);
4047
4059
  return field;
@@ -4192,7 +4204,7 @@ function useDataTableRenderer({
4192
4204
  field: key
4193
4205
  }));
4194
4206
  return baseColumns.map((column, index) => {
4195
- const columnId = columnIds[index] ?? String(column.field);
4207
+ const columnId = columnIds[index] ?? sanitizeColumnId(column.field);
4196
4208
  const isLeftPinned = effectivePinnedLeft?.includes(column.field);
4197
4209
  const isRightPinned = effectivePinnedRight?.includes(column.field);
4198
4210
  const isPinned = isLeftPinned || isRightPinned;
@@ -5030,13 +5042,13 @@ function Component(props, apiRef) {
5030
5042
  }
5031
5043
  },
5032
5044
  headerCheckboxElement
5033
- ), columns.map((c, i) => (
5045
+ ), columns.map((c) => (
5034
5046
  // @ts-ignore
5035
5047
  /* @__PURE__ */ import_react30.default.createElement(
5036
5048
  HeadCell2,
5037
5049
  {
5038
5050
  tableId,
5039
- key: `${c.field.toString()}_${i}`,
5051
+ key: c.columnId,
5040
5052
  stickyHeader: props.stickyHeader,
5041
5053
  editMode: !!c.isCellEditable,
5042
5054
  onSortChange: handleSortChange,
@@ -5701,7 +5713,7 @@ var ModalOverflow = MotionModalOverflow;
5701
5713
  ModalOverflow.displayName = "ModalOverflow";
5702
5714
  var ModalFrame = import_react33.default.forwardRef((props, ref) => {
5703
5715
  const { title, children, titleStartDecorator, onClose, ...innerProps } = props;
5704
- return /* @__PURE__ */ import_react33.default.createElement(StyledModalDialog, { ref, ...innerProps }, /* @__PURE__ */ import_react33.default.createElement(ModalClose, { onClick: onClose }), /* @__PURE__ */ import_react33.default.createElement(DialogTitle_default, null, titleStartDecorator, title), /* @__PURE__ */ import_react33.default.createElement(DialogContent_default, null, children));
5716
+ return /* @__PURE__ */ import_react33.default.createElement(StyledModalDialog, { ...innerProps, ref }, /* @__PURE__ */ import_react33.default.createElement(ModalClose, { onClick: onClose }), /* @__PURE__ */ import_react33.default.createElement(DialogTitle_default, null, titleStartDecorator, title), /* @__PURE__ */ import_react33.default.createElement(DialogContent_default, null, children));
5705
5717
  });
5706
5718
  ModalFrame.displayName = "ModalFrame";
5707
5719
 
@@ -5979,7 +5991,7 @@ var import_joy46 = require("@mui/joy");
5979
5991
  // src/components/IconMenuButton/IconMenuButton.tsx
5980
5992
  var import_react37 = __toESM(require("react"));
5981
5993
  var import_joy47 = require("@mui/joy");
5982
- var MenuButtonRootSlot = import_react37.default.forwardRef(function MenuButtonRootSlot2({ as, ...rest }, ref) {
5994
+ var MenuButtonRootSlot = import_react37.default.forwardRef(function MenuButtonRootSlot2({ as, ownerState: _ownerState, ...rest }, ref) {
5983
5995
  return /* @__PURE__ */ import_react37.default.createElement(import_joy47.IconButton, { ...rest, component: as ?? "button", ref });
5984
5996
  });
5985
5997
  function IconMenuButtonInner(props, ref) {
@@ -6017,7 +6029,8 @@ function IconMenuButtonInner(props, ref) {
6017
6029
  slots: { root: MenuButtonRootSlot },
6018
6030
  slotProps: {
6019
6031
  root: {
6020
- component: props.buttonComponent ?? "button",
6032
+ // 기본값 'button'은 MenuButtonRootSlot 한 곳에만 둔다.
6033
+ component: props.buttonComponent,
6021
6034
  size,
6022
6035
  variant,
6023
6036
  color,