@ceed/cds 1.8.0 → 1.8.2

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.
@@ -1,6 +1,9 @@
1
1
  import React from "react";
2
2
  import Input from "../Input";
3
3
  interface BaseDateRangePickerProps {
4
+ /**
5
+ * props.format 의 형식을 따라야 한다.
6
+ */
4
7
  value?: string;
5
8
  defaultValue?: string;
6
9
  onChange?: (event: {
@@ -19,7 +22,14 @@ interface BaseDateRangePickerProps {
19
22
  maxDate?: string;
20
23
  disableFuture?: boolean;
21
24
  disablePast?: boolean;
25
+ /**
26
+ * value, onChange의 값은 해당 포맷을 따른다.
27
+ */
22
28
  format?: string;
29
+ /**
30
+ * Input 에 표시되는 값의 포맷을 지정한다.
31
+ */
32
+ displayFormat?: string;
23
33
  inputReadOnly?: boolean;
24
34
  hideClearButton?: boolean;
25
35
  }
package/dist/index.cjs CHANGED
@@ -3530,6 +3530,8 @@ function useDataTableRenderer({
3530
3530
  isTotalSelected: _isTotalSelected,
3531
3531
  isRowSelectable
3532
3532
  }) {
3533
+ const onSelectionModelChangeRef = (0, import_react25.useRef)(onSelectionModelChange);
3534
+ onSelectionModelChangeRef.current = onSelectionModelChange;
3533
3535
  const [focusedRowId, setFocusedRowId] = (0, import_react25.useState)(null);
3534
3536
  const [sortModel, setSortModel] = useControlledState(
3535
3537
  controlledSortModel,
@@ -3719,7 +3721,7 @@ function useDataTableRenderer({
3719
3721
  }
3720
3722
  }, [page, rowCount, pageSize, handlePageChange]);
3721
3723
  (0, import_react25.useEffect)(() => {
3722
- onSelectionModelChange?.([]);
3724
+ onSelectionModelChangeRef.current?.([]);
3723
3725
  }, [page]);
3724
3726
  return {
3725
3727
  rowCount,
@@ -4112,7 +4114,9 @@ var CalendarButton2 = (0, import_joy34.styled)(IconButton_default, {
4112
4114
  "&:focus": {
4113
4115
  "--Icon-color": "currentColor",
4114
4116
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4115
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4117
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4118
+ "palette-focusVisible"
4119
+ )}`
4116
4120
  }
4117
4121
  }));
4118
4122
  var StyledPopper2 = (0, import_joy34.styled)(import_base3.Popper, {
@@ -4138,6 +4142,32 @@ var DateRangePickerRoot = (0, import_joy34.styled)("div", {
4138
4142
  })({
4139
4143
  width: "100%"
4140
4144
  });
4145
+ var validValueFormat2 = (value, format) => {
4146
+ try {
4147
+ const [date1Str, date2Str] = value.split(" - ");
4148
+ if (!date1Str || !date2Str) {
4149
+ return false;
4150
+ }
4151
+ const parsedDate1 = parseDate2(date1Str, format);
4152
+ const parsedDate2 = parseDate2(date2Str, format);
4153
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4154
+ return false;
4155
+ }
4156
+ const formattedValue = formatValueString2(
4157
+ [parsedDate1, parsedDate2],
4158
+ format
4159
+ );
4160
+ if (value !== formattedValue) {
4161
+ return false;
4162
+ }
4163
+ const regex = new RegExp(
4164
+ `^${format.replace(/Y/g, "\\d").replace(/M/g, "\\d").replace(/D/g, "\\d")} - ${format.replace(/Y/g, "\\d").replace(/M/g, "\\d").replace(/D/g, "\\d")}$`
4165
+ );
4166
+ return regex.test(value);
4167
+ } catch (e) {
4168
+ return false;
4169
+ }
4170
+ };
4141
4171
  var formatValueString2 = ([date1, date2], format) => {
4142
4172
  const getStr = (date) => {
4143
4173
  let day = `${date.getDate()}`;
@@ -4234,6 +4264,7 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4234
4264
  sx,
4235
4265
  className,
4236
4266
  format = "YYYY/MM/DD",
4267
+ displayFormat = "YYYY/MM/DD",
4237
4268
  size,
4238
4269
  inputReadOnly,
4239
4270
  hideClearButton,
@@ -4250,12 +4281,27 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4250
4281
  [props.name, onChange]
4251
4282
  )
4252
4283
  );
4284
+ const [displayValue, setDisplayValue] = (0, import_react26.useState)(
4285
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4286
+ );
4253
4287
  const [anchorEl, setAnchorEl] = (0, import_react26.useState)(null);
4254
4288
  const open = Boolean(anchorEl);
4255
4289
  const calendarValue = (0, import_react26.useMemo)(
4256
4290
  () => value ? parseDates(value, format) : void 0,
4257
4291
  [value, format]
4258
4292
  );
4293
+ (0, import_react26.useEffect)(() => {
4294
+ if (value) {
4295
+ try {
4296
+ const dates = parseDates(value, format);
4297
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4298
+ setDisplayValue(newDisplayValue);
4299
+ } catch (error2) {
4300
+ }
4301
+ } else {
4302
+ setDisplayValue("");
4303
+ }
4304
+ }, [displayFormat, value, format]);
4259
4305
  (0, import_react26.useEffect)(() => {
4260
4306
  if (!anchorEl) {
4261
4307
  innerRef.current?.blur();
@@ -4266,9 +4312,41 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4266
4312
  ]);
4267
4313
  const handleChange = (0, import_react26.useCallback)(
4268
4314
  (event) => {
4269
- setValue(event.target.value);
4315
+ const value2 = event.target.value;
4316
+ setDisplayValue(
4317
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4318
+ );
4319
+ setValue(value2);
4270
4320
  },
4271
- [setValue]
4321
+ [displayFormat, format, setValue]
4322
+ );
4323
+ const handleDisplayInputChange = (0, import_react26.useCallback)(
4324
+ (event) => {
4325
+ if (event.target.value === "") {
4326
+ handleChange({
4327
+ target: {
4328
+ name: props.name,
4329
+ value: ""
4330
+ }
4331
+ });
4332
+ return;
4333
+ }
4334
+ const isValidDisplayValue = validValueFormat2(
4335
+ event.target.value,
4336
+ displayFormat
4337
+ );
4338
+ if (isValidDisplayValue) {
4339
+ const dates = parseDates(event.target.value, displayFormat);
4340
+ const formattedValue = formatValueString2(dates, format);
4341
+ handleChange({
4342
+ target: {
4343
+ name: props.name,
4344
+ value: formattedValue
4345
+ }
4346
+ });
4347
+ }
4348
+ },
4349
+ [displayFormat, format, handleChange, props.name]
4272
4350
  );
4273
4351
  const handleCalendarToggle = (0, import_react26.useCallback)(
4274
4352
  (event) => {
@@ -4280,10 +4358,26 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4280
4358
  const handleCalendarChange = (0, import_react26.useCallback)(
4281
4359
  ([date1, date2]) => {
4282
4360
  if (!date1 || !date2) return;
4283
- setValue(formatValueString2([date1, date2], format));
4361
+ const formattedValue = formatValueString2([date1, date2], format);
4362
+ if (props.value !== void 0) {
4363
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4364
+ } else {
4365
+ setDisplayValue(
4366
+ formatValueString2([date1, date2], displayFormat)
4367
+ );
4368
+ setValue(formattedValue);
4369
+ }
4284
4370
  setAnchorEl(null);
4285
4371
  },
4286
- [setValue, setAnchorEl, format]
4372
+ [
4373
+ props.value,
4374
+ props.name,
4375
+ onChange,
4376
+ setValue,
4377
+ setAnchorEl,
4378
+ format,
4379
+ displayFormat
4380
+ ]
4287
4381
  );
4288
4382
  const handleInputMouseDown = (0, import_react26.useCallback)(
4289
4383
  (event) => {
@@ -4301,17 +4395,21 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4301
4395
  color: error ? "danger" : innerProps.color,
4302
4396
  ref,
4303
4397
  size,
4304
- value,
4305
- onChange: handleChange,
4398
+ value: displayValue,
4399
+ onChange: handleDisplayInputChange,
4306
4400
  disabled,
4307
4401
  required,
4308
- placeholder: `${format} - ${format}`,
4402
+ placeholder: `${displayFormat} - ${displayFormat}`,
4309
4403
  slotProps: {
4310
4404
  input: {
4311
4405
  component: TextMaskAdapter5,
4312
4406
  ref: innerRef,
4313
- format,
4314
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4407
+ format: displayFormat,
4408
+ sx: {
4409
+ "&:hover": {
4410
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4411
+ }
4412
+ },
4315
4413
  onMouseDown: handleInputMouseDown
4316
4414
  }
4317
4415
  },
@@ -4381,6 +4479,7 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4381
4479
  color: "neutral",
4382
4480
  onClick: () => {
4383
4481
  setValue("");
4482
+ setDisplayValue("");
4384
4483
  setAnchorEl(null);
4385
4484
  }
4386
4485
  },
package/dist/index.js CHANGED
@@ -3498,6 +3498,8 @@ function useDataTableRenderer({
3498
3498
  isTotalSelected: _isTotalSelected,
3499
3499
  isRowSelectable
3500
3500
  }) {
3501
+ const onSelectionModelChangeRef = useRef4(onSelectionModelChange);
3502
+ onSelectionModelChangeRef.current = onSelectionModelChange;
3501
3503
  const [focusedRowId, setFocusedRowId] = useState6(null);
3502
3504
  const [sortModel, setSortModel] = useControlledState(
3503
3505
  controlledSortModel,
@@ -3687,7 +3689,7 @@ function useDataTableRenderer({
3687
3689
  }
3688
3690
  }, [page, rowCount, pageSize, handlePageChange]);
3689
3691
  useEffect5(() => {
3690
- onSelectionModelChange?.([]);
3692
+ onSelectionModelChangeRef.current?.([]);
3691
3693
  }, [page]);
3692
3694
  return {
3693
3695
  rowCount,
@@ -4088,7 +4090,9 @@ var CalendarButton2 = styled13(IconButton_default, {
4088
4090
  "&:focus": {
4089
4091
  "--Icon-color": "currentColor",
4090
4092
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4091
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4093
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4094
+ "palette-focusVisible"
4095
+ )}`
4092
4096
  }
4093
4097
  }));
4094
4098
  var StyledPopper2 = styled13(Popper3, {
@@ -4114,6 +4118,32 @@ var DateRangePickerRoot = styled13("div", {
4114
4118
  })({
4115
4119
  width: "100%"
4116
4120
  });
4121
+ var validValueFormat2 = (value, format) => {
4122
+ try {
4123
+ const [date1Str, date2Str] = value.split(" - ");
4124
+ if (!date1Str || !date2Str) {
4125
+ return false;
4126
+ }
4127
+ const parsedDate1 = parseDate2(date1Str, format);
4128
+ const parsedDate2 = parseDate2(date2Str, format);
4129
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4130
+ return false;
4131
+ }
4132
+ const formattedValue = formatValueString2(
4133
+ [parsedDate1, parsedDate2],
4134
+ format
4135
+ );
4136
+ if (value !== formattedValue) {
4137
+ return false;
4138
+ }
4139
+ const regex = new RegExp(
4140
+ `^${format.replace(/Y/g, "\\d").replace(/M/g, "\\d").replace(/D/g, "\\d")} - ${format.replace(/Y/g, "\\d").replace(/M/g, "\\d").replace(/D/g, "\\d")}$`
4141
+ );
4142
+ return regex.test(value);
4143
+ } catch (e) {
4144
+ return false;
4145
+ }
4146
+ };
4117
4147
  var formatValueString2 = ([date1, date2], format) => {
4118
4148
  const getStr = (date) => {
4119
4149
  let day = `${date.getDate()}`;
@@ -4210,6 +4240,7 @@ var DateRangePicker = forwardRef8(
4210
4240
  sx,
4211
4241
  className,
4212
4242
  format = "YYYY/MM/DD",
4243
+ displayFormat = "YYYY/MM/DD",
4213
4244
  size,
4214
4245
  inputReadOnly,
4215
4246
  hideClearButton,
@@ -4226,12 +4257,27 @@ var DateRangePicker = forwardRef8(
4226
4257
  [props.name, onChange]
4227
4258
  )
4228
4259
  );
4260
+ const [displayValue, setDisplayValue] = useState7(
4261
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4262
+ );
4229
4263
  const [anchorEl, setAnchorEl] = useState7(null);
4230
4264
  const open = Boolean(anchorEl);
4231
4265
  const calendarValue = useMemo9(
4232
4266
  () => value ? parseDates(value, format) : void 0,
4233
4267
  [value, format]
4234
4268
  );
4269
+ useEffect6(() => {
4270
+ if (value) {
4271
+ try {
4272
+ const dates = parseDates(value, format);
4273
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4274
+ setDisplayValue(newDisplayValue);
4275
+ } catch (error2) {
4276
+ }
4277
+ } else {
4278
+ setDisplayValue("");
4279
+ }
4280
+ }, [displayFormat, value, format]);
4235
4281
  useEffect6(() => {
4236
4282
  if (!anchorEl) {
4237
4283
  innerRef.current?.blur();
@@ -4242,9 +4288,41 @@ var DateRangePicker = forwardRef8(
4242
4288
  ]);
4243
4289
  const handleChange = useCallback10(
4244
4290
  (event) => {
4245
- setValue(event.target.value);
4291
+ const value2 = event.target.value;
4292
+ setDisplayValue(
4293
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4294
+ );
4295
+ setValue(value2);
4246
4296
  },
4247
- [setValue]
4297
+ [displayFormat, format, setValue]
4298
+ );
4299
+ const handleDisplayInputChange = useCallback10(
4300
+ (event) => {
4301
+ if (event.target.value === "") {
4302
+ handleChange({
4303
+ target: {
4304
+ name: props.name,
4305
+ value: ""
4306
+ }
4307
+ });
4308
+ return;
4309
+ }
4310
+ const isValidDisplayValue = validValueFormat2(
4311
+ event.target.value,
4312
+ displayFormat
4313
+ );
4314
+ if (isValidDisplayValue) {
4315
+ const dates = parseDates(event.target.value, displayFormat);
4316
+ const formattedValue = formatValueString2(dates, format);
4317
+ handleChange({
4318
+ target: {
4319
+ name: props.name,
4320
+ value: formattedValue
4321
+ }
4322
+ });
4323
+ }
4324
+ },
4325
+ [displayFormat, format, handleChange, props.name]
4248
4326
  );
4249
4327
  const handleCalendarToggle = useCallback10(
4250
4328
  (event) => {
@@ -4256,10 +4334,26 @@ var DateRangePicker = forwardRef8(
4256
4334
  const handleCalendarChange = useCallback10(
4257
4335
  ([date1, date2]) => {
4258
4336
  if (!date1 || !date2) return;
4259
- setValue(formatValueString2([date1, date2], format));
4337
+ const formattedValue = formatValueString2([date1, date2], format);
4338
+ if (props.value !== void 0) {
4339
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4340
+ } else {
4341
+ setDisplayValue(
4342
+ formatValueString2([date1, date2], displayFormat)
4343
+ );
4344
+ setValue(formattedValue);
4345
+ }
4260
4346
  setAnchorEl(null);
4261
4347
  },
4262
- [setValue, setAnchorEl, format]
4348
+ [
4349
+ props.value,
4350
+ props.name,
4351
+ onChange,
4352
+ setValue,
4353
+ setAnchorEl,
4354
+ format,
4355
+ displayFormat
4356
+ ]
4263
4357
  );
4264
4358
  const handleInputMouseDown = useCallback10(
4265
4359
  (event) => {
@@ -4277,17 +4371,21 @@ var DateRangePicker = forwardRef8(
4277
4371
  color: error ? "danger" : innerProps.color,
4278
4372
  ref,
4279
4373
  size,
4280
- value,
4281
- onChange: handleChange,
4374
+ value: displayValue,
4375
+ onChange: handleDisplayInputChange,
4282
4376
  disabled,
4283
4377
  required,
4284
- placeholder: `${format} - ${format}`,
4378
+ placeholder: `${displayFormat} - ${displayFormat}`,
4285
4379
  slotProps: {
4286
4380
  input: {
4287
4381
  component: TextMaskAdapter5,
4288
4382
  ref: innerRef,
4289
- format,
4290
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4383
+ format: displayFormat,
4384
+ sx: {
4385
+ "&:hover": {
4386
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4387
+ }
4388
+ },
4291
4389
  onMouseDown: handleInputMouseDown
4292
4390
  }
4293
4391
  },
@@ -4357,6 +4455,7 @@ var DateRangePicker = forwardRef8(
4357
4455
  color: "neutral",
4358
4456
  onClick: () => {
4359
4457
  setValue("");
4458
+ setDisplayValue("");
4360
4459
  setAnchorEl(null);
4361
4460
  }
4362
4461
  },