@ceed/cds 1.8.0-next.7 → 1.8.0-next.9

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
@@ -4112,7 +4112,9 @@ var CalendarButton2 = (0, import_joy34.styled)(IconButton_default, {
4112
4112
  "&:focus": {
4113
4113
  "--Icon-color": "currentColor",
4114
4114
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4115
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4115
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4116
+ "palette-focusVisible"
4117
+ )}`
4116
4118
  }
4117
4119
  }));
4118
4120
  var StyledPopper2 = (0, import_joy34.styled)(import_base3.Popper, {
@@ -4138,6 +4140,32 @@ var DateRangePickerRoot = (0, import_joy34.styled)("div", {
4138
4140
  })({
4139
4141
  width: "100%"
4140
4142
  });
4143
+ var validValueFormat2 = (value, format) => {
4144
+ try {
4145
+ const [date1Str, date2Str] = value.split(" - ");
4146
+ if (!date1Str || !date2Str) {
4147
+ return false;
4148
+ }
4149
+ const parsedDate1 = parseDate2(date1Str, format);
4150
+ const parsedDate2 = parseDate2(date2Str, format);
4151
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4152
+ return false;
4153
+ }
4154
+ const formattedValue = formatValueString2(
4155
+ [parsedDate1, parsedDate2],
4156
+ format
4157
+ );
4158
+ if (value !== formattedValue) {
4159
+ return false;
4160
+ }
4161
+ const regex = new RegExp(
4162
+ `^${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")}$`
4163
+ );
4164
+ return regex.test(value);
4165
+ } catch (e) {
4166
+ return false;
4167
+ }
4168
+ };
4141
4169
  var formatValueString2 = ([date1, date2], format) => {
4142
4170
  const getStr = (date) => {
4143
4171
  let day = `${date.getDate()}`;
@@ -4234,6 +4262,7 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4234
4262
  sx,
4235
4263
  className,
4236
4264
  format = "YYYY/MM/DD",
4265
+ displayFormat = "YYYY/MM/DD",
4237
4266
  size,
4238
4267
  inputReadOnly,
4239
4268
  hideClearButton,
@@ -4250,12 +4279,27 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4250
4279
  [props.name, onChange]
4251
4280
  )
4252
4281
  );
4282
+ const [displayValue, setDisplayValue] = (0, import_react26.useState)(
4283
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4284
+ );
4253
4285
  const [anchorEl, setAnchorEl] = (0, import_react26.useState)(null);
4254
4286
  const open = Boolean(anchorEl);
4255
4287
  const calendarValue = (0, import_react26.useMemo)(
4256
4288
  () => value ? parseDates(value, format) : void 0,
4257
4289
  [value, format]
4258
4290
  );
4291
+ (0, import_react26.useEffect)(() => {
4292
+ if (value) {
4293
+ try {
4294
+ const dates = parseDates(value, format);
4295
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4296
+ setDisplayValue(newDisplayValue);
4297
+ } catch (error2) {
4298
+ }
4299
+ } else {
4300
+ setDisplayValue("");
4301
+ }
4302
+ }, [displayFormat, value, format]);
4259
4303
  (0, import_react26.useEffect)(() => {
4260
4304
  if (!anchorEl) {
4261
4305
  innerRef.current?.blur();
@@ -4266,9 +4310,41 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4266
4310
  ]);
4267
4311
  const handleChange = (0, import_react26.useCallback)(
4268
4312
  (event) => {
4269
- setValue(event.target.value);
4313
+ const value2 = event.target.value;
4314
+ setDisplayValue(
4315
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4316
+ );
4317
+ setValue(value2);
4270
4318
  },
4271
- [setValue]
4319
+ [displayFormat, format, setValue]
4320
+ );
4321
+ const handleDisplayInputChange = (0, import_react26.useCallback)(
4322
+ (event) => {
4323
+ if (event.target.value === "") {
4324
+ handleChange({
4325
+ target: {
4326
+ name: props.name,
4327
+ value: ""
4328
+ }
4329
+ });
4330
+ return;
4331
+ }
4332
+ const isValidDisplayValue = validValueFormat2(
4333
+ event.target.value,
4334
+ displayFormat
4335
+ );
4336
+ if (isValidDisplayValue) {
4337
+ const dates = parseDates(event.target.value, displayFormat);
4338
+ const formattedValue = formatValueString2(dates, format);
4339
+ handleChange({
4340
+ target: {
4341
+ name: props.name,
4342
+ value: formattedValue
4343
+ }
4344
+ });
4345
+ }
4346
+ },
4347
+ [displayFormat, format, handleChange, props.name]
4272
4348
  );
4273
4349
  const handleCalendarToggle = (0, import_react26.useCallback)(
4274
4350
  (event) => {
@@ -4280,10 +4356,26 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4280
4356
  const handleCalendarChange = (0, import_react26.useCallback)(
4281
4357
  ([date1, date2]) => {
4282
4358
  if (!date1 || !date2) return;
4283
- setValue(formatValueString2([date1, date2], format));
4359
+ const formattedValue = formatValueString2([date1, date2], format);
4360
+ if (props.value !== void 0) {
4361
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4362
+ } else {
4363
+ setDisplayValue(
4364
+ formatValueString2([date1, date2], displayFormat)
4365
+ );
4366
+ setValue(formattedValue);
4367
+ }
4284
4368
  setAnchorEl(null);
4285
4369
  },
4286
- [setValue, setAnchorEl, format]
4370
+ [
4371
+ props.value,
4372
+ props.name,
4373
+ onChange,
4374
+ setValue,
4375
+ setAnchorEl,
4376
+ format,
4377
+ displayFormat
4378
+ ]
4287
4379
  );
4288
4380
  const handleInputMouseDown = (0, import_react26.useCallback)(
4289
4381
  (event) => {
@@ -4301,17 +4393,21 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4301
4393
  color: error ? "danger" : innerProps.color,
4302
4394
  ref,
4303
4395
  size,
4304
- value,
4305
- onChange: handleChange,
4396
+ value: displayValue,
4397
+ onChange: handleDisplayInputChange,
4306
4398
  disabled,
4307
4399
  required,
4308
- placeholder: `${format} - ${format}`,
4400
+ placeholder: `${displayFormat} - ${displayFormat}`,
4309
4401
  slotProps: {
4310
4402
  input: {
4311
4403
  component: TextMaskAdapter5,
4312
4404
  ref: innerRef,
4313
- format,
4314
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4405
+ format: displayFormat,
4406
+ sx: {
4407
+ "&:hover": {
4408
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4409
+ }
4410
+ },
4315
4411
  onMouseDown: handleInputMouseDown
4316
4412
  }
4317
4413
  },
@@ -4381,6 +4477,7 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4381
4477
  color: "neutral",
4382
4478
  onClick: () => {
4383
4479
  setValue("");
4480
+ setDisplayValue("");
4384
4481
  setAnchorEl(null);
4385
4482
  }
4386
4483
  },
package/dist/index.js CHANGED
@@ -4088,7 +4088,9 @@ var CalendarButton2 = styled13(IconButton_default, {
4088
4088
  "&:focus": {
4089
4089
  "--Icon-color": "currentColor",
4090
4090
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4091
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4091
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4092
+ "palette-focusVisible"
4093
+ )}`
4092
4094
  }
4093
4095
  }));
4094
4096
  var StyledPopper2 = styled13(Popper3, {
@@ -4114,6 +4116,32 @@ var DateRangePickerRoot = styled13("div", {
4114
4116
  })({
4115
4117
  width: "100%"
4116
4118
  });
4119
+ var validValueFormat2 = (value, format) => {
4120
+ try {
4121
+ const [date1Str, date2Str] = value.split(" - ");
4122
+ if (!date1Str || !date2Str) {
4123
+ return false;
4124
+ }
4125
+ const parsedDate1 = parseDate2(date1Str, format);
4126
+ const parsedDate2 = parseDate2(date2Str, format);
4127
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4128
+ return false;
4129
+ }
4130
+ const formattedValue = formatValueString2(
4131
+ [parsedDate1, parsedDate2],
4132
+ format
4133
+ );
4134
+ if (value !== formattedValue) {
4135
+ return false;
4136
+ }
4137
+ const regex = new RegExp(
4138
+ `^${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")}$`
4139
+ );
4140
+ return regex.test(value);
4141
+ } catch (e) {
4142
+ return false;
4143
+ }
4144
+ };
4117
4145
  var formatValueString2 = ([date1, date2], format) => {
4118
4146
  const getStr = (date) => {
4119
4147
  let day = `${date.getDate()}`;
@@ -4210,6 +4238,7 @@ var DateRangePicker = forwardRef8(
4210
4238
  sx,
4211
4239
  className,
4212
4240
  format = "YYYY/MM/DD",
4241
+ displayFormat = "YYYY/MM/DD",
4213
4242
  size,
4214
4243
  inputReadOnly,
4215
4244
  hideClearButton,
@@ -4226,12 +4255,27 @@ var DateRangePicker = forwardRef8(
4226
4255
  [props.name, onChange]
4227
4256
  )
4228
4257
  );
4258
+ const [displayValue, setDisplayValue] = useState7(
4259
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4260
+ );
4229
4261
  const [anchorEl, setAnchorEl] = useState7(null);
4230
4262
  const open = Boolean(anchorEl);
4231
4263
  const calendarValue = useMemo9(
4232
4264
  () => value ? parseDates(value, format) : void 0,
4233
4265
  [value, format]
4234
4266
  );
4267
+ useEffect6(() => {
4268
+ if (value) {
4269
+ try {
4270
+ const dates = parseDates(value, format);
4271
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4272
+ setDisplayValue(newDisplayValue);
4273
+ } catch (error2) {
4274
+ }
4275
+ } else {
4276
+ setDisplayValue("");
4277
+ }
4278
+ }, [displayFormat, value, format]);
4235
4279
  useEffect6(() => {
4236
4280
  if (!anchorEl) {
4237
4281
  innerRef.current?.blur();
@@ -4242,9 +4286,41 @@ var DateRangePicker = forwardRef8(
4242
4286
  ]);
4243
4287
  const handleChange = useCallback10(
4244
4288
  (event) => {
4245
- setValue(event.target.value);
4289
+ const value2 = event.target.value;
4290
+ setDisplayValue(
4291
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4292
+ );
4293
+ setValue(value2);
4246
4294
  },
4247
- [setValue]
4295
+ [displayFormat, format, setValue]
4296
+ );
4297
+ const handleDisplayInputChange = useCallback10(
4298
+ (event) => {
4299
+ if (event.target.value === "") {
4300
+ handleChange({
4301
+ target: {
4302
+ name: props.name,
4303
+ value: ""
4304
+ }
4305
+ });
4306
+ return;
4307
+ }
4308
+ const isValidDisplayValue = validValueFormat2(
4309
+ event.target.value,
4310
+ displayFormat
4311
+ );
4312
+ if (isValidDisplayValue) {
4313
+ const dates = parseDates(event.target.value, displayFormat);
4314
+ const formattedValue = formatValueString2(dates, format);
4315
+ handleChange({
4316
+ target: {
4317
+ name: props.name,
4318
+ value: formattedValue
4319
+ }
4320
+ });
4321
+ }
4322
+ },
4323
+ [displayFormat, format, handleChange, props.name]
4248
4324
  );
4249
4325
  const handleCalendarToggle = useCallback10(
4250
4326
  (event) => {
@@ -4256,10 +4332,26 @@ var DateRangePicker = forwardRef8(
4256
4332
  const handleCalendarChange = useCallback10(
4257
4333
  ([date1, date2]) => {
4258
4334
  if (!date1 || !date2) return;
4259
- setValue(formatValueString2([date1, date2], format));
4335
+ const formattedValue = formatValueString2([date1, date2], format);
4336
+ if (props.value !== void 0) {
4337
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4338
+ } else {
4339
+ setDisplayValue(
4340
+ formatValueString2([date1, date2], displayFormat)
4341
+ );
4342
+ setValue(formattedValue);
4343
+ }
4260
4344
  setAnchorEl(null);
4261
4345
  },
4262
- [setValue, setAnchorEl, format]
4346
+ [
4347
+ props.value,
4348
+ props.name,
4349
+ onChange,
4350
+ setValue,
4351
+ setAnchorEl,
4352
+ format,
4353
+ displayFormat
4354
+ ]
4263
4355
  );
4264
4356
  const handleInputMouseDown = useCallback10(
4265
4357
  (event) => {
@@ -4277,17 +4369,21 @@ var DateRangePicker = forwardRef8(
4277
4369
  color: error ? "danger" : innerProps.color,
4278
4370
  ref,
4279
4371
  size,
4280
- value,
4281
- onChange: handleChange,
4372
+ value: displayValue,
4373
+ onChange: handleDisplayInputChange,
4282
4374
  disabled,
4283
4375
  required,
4284
- placeholder: `${format} - ${format}`,
4376
+ placeholder: `${displayFormat} - ${displayFormat}`,
4285
4377
  slotProps: {
4286
4378
  input: {
4287
4379
  component: TextMaskAdapter5,
4288
4380
  ref: innerRef,
4289
- format,
4290
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4381
+ format: displayFormat,
4382
+ sx: {
4383
+ "&:hover": {
4384
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4385
+ }
4386
+ },
4291
4387
  onMouseDown: handleInputMouseDown
4292
4388
  }
4293
4389
  },
@@ -4357,6 +4453,7 @@ var DateRangePicker = forwardRef8(
4357
4453
  color: "neutral",
4358
4454
  onClick: () => {
4359
4455
  setValue("");
4456
+ setDisplayValue("");
4360
4457
  setAnchorEl(null);
4361
4458
  }
4362
4459
  },