@ceed/ads 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
  }
@@ -4,6 +4,7 @@ interface FilterMenuProps {
4
4
  filters?: FilterItem[];
5
5
  values?: Record<string, any>;
6
6
  defaultValues?: Record<string, any>;
7
+ resetValues?: Record<string, any>;
7
8
  onChange?: (values: Record<string, any>) => void;
8
9
  onClose?: () => void;
9
10
  /**
@@ -24,7 +24,7 @@ export interface FilterRadioGroupItem extends FilterBaseItem<string | number> {
24
24
  value: string | number;
25
25
  }[];
26
26
  }
27
- export interface FilterDateRangeItem extends FilterBaseItem<[DateTime, DateTime]>, Pick<DateRangePickerProps, "minDate" | "maxDate" | "disableFuture" | "disablePast" | "format" | "inputReadOnly" | "hideClearButton"> {
27
+ export interface FilterDateRangeItem extends FilterBaseItem<[DateTime, DateTime]>, Pick<DateRangePickerProps, "minDate" | "maxDate" | "disableFuture" | "disablePast" | "format" | "displayFormat" | "inputReadOnly" | "hideClearButton"> {
28
28
  type: "date-range";
29
29
  }
30
30
  export interface FilterCurrencyInputItem extends FilterBaseItem<number>, Pick<CurrencyInputProps, "max" | "placeholder" | "useMinorUnit" | "currency"> {
package/dist/index.cjs CHANGED
@@ -4157,7 +4157,9 @@ var CalendarButton2 = (0, import_joy34.styled)(IconButton_default, {
4157
4157
  "&:focus": {
4158
4158
  "--Icon-color": "currentColor",
4159
4159
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4160
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4160
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4161
+ "palette-focusVisible"
4162
+ )}`
4161
4163
  }
4162
4164
  }));
4163
4165
  var StyledPopper2 = (0, import_joy34.styled)(import_base3.Popper, {
@@ -4183,6 +4185,32 @@ var DateRangePickerRoot = (0, import_joy34.styled)("div", {
4183
4185
  })({
4184
4186
  width: "100%"
4185
4187
  });
4188
+ var validValueFormat2 = (value, format) => {
4189
+ try {
4190
+ const [date1Str, date2Str] = value.split(" - ");
4191
+ if (!date1Str || !date2Str) {
4192
+ return false;
4193
+ }
4194
+ const parsedDate1 = parseDate2(date1Str, format);
4195
+ const parsedDate2 = parseDate2(date2Str, format);
4196
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4197
+ return false;
4198
+ }
4199
+ const formattedValue = formatValueString2(
4200
+ [parsedDate1, parsedDate2],
4201
+ format
4202
+ );
4203
+ if (value !== formattedValue) {
4204
+ return false;
4205
+ }
4206
+ const regex = new RegExp(
4207
+ `^${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")}$`
4208
+ );
4209
+ return regex.test(value);
4210
+ } catch (e) {
4211
+ return false;
4212
+ }
4213
+ };
4186
4214
  var formatValueString2 = ([date1, date2], format) => {
4187
4215
  const getStr = (date) => {
4188
4216
  let day = `${date.getDate()}`;
@@ -4279,6 +4307,7 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4279
4307
  sx,
4280
4308
  className,
4281
4309
  format = "YYYY/MM/DD",
4310
+ displayFormat = "YYYY/MM/DD",
4282
4311
  size,
4283
4312
  inputReadOnly,
4284
4313
  hideClearButton,
@@ -4295,12 +4324,27 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4295
4324
  [props.name, onChange]
4296
4325
  )
4297
4326
  );
4327
+ const [displayValue, setDisplayValue] = (0, import_react26.useState)(
4328
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4329
+ );
4298
4330
  const [anchorEl, setAnchorEl] = (0, import_react26.useState)(null);
4299
4331
  const open = Boolean(anchorEl);
4300
4332
  const calendarValue = (0, import_react26.useMemo)(
4301
4333
  () => value ? parseDates(value, format) : void 0,
4302
4334
  [value, format]
4303
4335
  );
4336
+ (0, import_react26.useEffect)(() => {
4337
+ if (value) {
4338
+ try {
4339
+ const dates = parseDates(value, format);
4340
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4341
+ setDisplayValue(newDisplayValue);
4342
+ } catch (error2) {
4343
+ }
4344
+ } else {
4345
+ setDisplayValue("");
4346
+ }
4347
+ }, [displayFormat, value, format]);
4304
4348
  (0, import_react26.useEffect)(() => {
4305
4349
  if (!anchorEl) {
4306
4350
  innerRef.current?.blur();
@@ -4311,9 +4355,41 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4311
4355
  ]);
4312
4356
  const handleChange = (0, import_react26.useCallback)(
4313
4357
  (event) => {
4314
- setValue(event.target.value);
4358
+ const value2 = event.target.value;
4359
+ setDisplayValue(
4360
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4361
+ );
4362
+ setValue(value2);
4315
4363
  },
4316
- [setValue]
4364
+ [displayFormat, format, setValue]
4365
+ );
4366
+ const handleDisplayInputChange = (0, import_react26.useCallback)(
4367
+ (event) => {
4368
+ if (event.target.value === "") {
4369
+ handleChange({
4370
+ target: {
4371
+ name: props.name,
4372
+ value: ""
4373
+ }
4374
+ });
4375
+ return;
4376
+ }
4377
+ const isValidDisplayValue = validValueFormat2(
4378
+ event.target.value,
4379
+ displayFormat
4380
+ );
4381
+ if (isValidDisplayValue) {
4382
+ const dates = parseDates(event.target.value, displayFormat);
4383
+ const formattedValue = formatValueString2(dates, format);
4384
+ handleChange({
4385
+ target: {
4386
+ name: props.name,
4387
+ value: formattedValue
4388
+ }
4389
+ });
4390
+ }
4391
+ },
4392
+ [displayFormat, format, handleChange, props.name]
4317
4393
  );
4318
4394
  const handleCalendarToggle = (0, import_react26.useCallback)(
4319
4395
  (event) => {
@@ -4325,10 +4401,26 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4325
4401
  const handleCalendarChange = (0, import_react26.useCallback)(
4326
4402
  ([date1, date2]) => {
4327
4403
  if (!date1 || !date2) return;
4328
- setValue(formatValueString2([date1, date2], format));
4404
+ const formattedValue = formatValueString2([date1, date2], format);
4405
+ if (props.value !== void 0) {
4406
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4407
+ } else {
4408
+ setDisplayValue(
4409
+ formatValueString2([date1, date2], displayFormat)
4410
+ );
4411
+ setValue(formattedValue);
4412
+ }
4329
4413
  setAnchorEl(null);
4330
4414
  },
4331
- [setValue, setAnchorEl, format]
4415
+ [
4416
+ props.value,
4417
+ props.name,
4418
+ onChange,
4419
+ setValue,
4420
+ setAnchorEl,
4421
+ format,
4422
+ displayFormat
4423
+ ]
4332
4424
  );
4333
4425
  const handleInputMouseDown = (0, import_react26.useCallback)(
4334
4426
  (event) => {
@@ -4346,17 +4438,21 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4346
4438
  color: error ? "danger" : innerProps.color,
4347
4439
  ref,
4348
4440
  size,
4349
- value,
4350
- onChange: handleChange,
4441
+ value: displayValue,
4442
+ onChange: handleDisplayInputChange,
4351
4443
  disabled,
4352
4444
  required,
4353
- placeholder: `${format} - ${format}`,
4445
+ placeholder: `${displayFormat} - ${displayFormat}`,
4354
4446
  slotProps: {
4355
4447
  input: {
4356
4448
  component: TextMaskAdapter5,
4357
4449
  ref: innerRef,
4358
- format,
4359
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4450
+ format: displayFormat,
4451
+ sx: {
4452
+ "&:hover": {
4453
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4454
+ }
4455
+ },
4360
4456
  onMouseDown: handleInputMouseDown
4361
4457
  }
4362
4458
  },
@@ -4426,6 +4522,7 @@ var DateRangePicker = (0, import_react26.forwardRef)(
4426
4522
  color: "neutral",
4427
4523
  onClick: () => {
4428
4524
  setValue("");
4525
+ setDisplayValue("");
4429
4526
  setAnchorEl(null);
4430
4527
  }
4431
4528
  },
@@ -4582,7 +4679,7 @@ function CheckboxGroup(props) {
4582
4679
  {
4583
4680
  key: `${id}-${option.value}`,
4584
4681
  label: option.label,
4585
- checked: internalValue.includes(option.value),
4682
+ checked: internalValue?.includes(option.value),
4586
4683
  onChange: handleCheckboxChange(option.value)
4587
4684
  }
4588
4685
  )));
@@ -4666,6 +4763,7 @@ function DateRange(props) {
4666
4763
  disableFuture,
4667
4764
  disablePast,
4668
4765
  format = "YYYY/MM/DD",
4766
+ displayFormat,
4669
4767
  inputReadOnly,
4670
4768
  hideClearButton
4671
4769
  } = props;
@@ -4820,6 +4918,7 @@ function DateRange(props) {
4820
4918
  disableFuture,
4821
4919
  disablePast,
4822
4920
  format,
4921
+ displayFormat,
4823
4922
  inputReadOnly,
4824
4923
  hideClearButton
4825
4924
  }
@@ -5207,7 +5306,7 @@ function PercentageRange(props) {
5207
5306
  useMinorUnit,
5208
5307
  maxDecimalScale,
5209
5308
  min,
5210
- max,
5309
+ max: maxValue || max,
5211
5310
  "aria-labelledby": label ? id : void 0,
5212
5311
  "aria-label": "Minimum percentage",
5213
5312
  placeholder: "0%"
@@ -5220,7 +5319,7 @@ function PercentageRange(props) {
5220
5319
  onChange: handleMaxChange,
5221
5320
  useMinorUnit,
5222
5321
  maxDecimalScale,
5223
- min,
5322
+ min: minValue || min,
5224
5323
  max,
5225
5324
  "aria-labelledby": label ? id : void 0,
5226
5325
  "aria-label": "Maximum percentage",
@@ -5295,6 +5394,7 @@ function FilterMenu(props) {
5295
5394
  filters,
5296
5395
  values,
5297
5396
  defaultValues,
5397
+ resetValues = {},
5298
5398
  onChange,
5299
5399
  onClose,
5300
5400
  useClear,
@@ -5320,11 +5420,11 @@ function FilterMenu(props) {
5320
5420
  onClose?.();
5321
5421
  }, [onChange, onClose, internalValues]);
5322
5422
  const handleClear = (0, import_react39.useCallback)(() => {
5323
- const clearedValues = defaultValues || {};
5423
+ const clearedValues = resetValues || {};
5324
5424
  setInternalValues(clearedValues);
5325
5425
  onChange?.(clearedValues);
5326
5426
  onClose?.();
5327
- }, [defaultValues, setInternalValues, onChange, onClose]);
5427
+ }, [resetValues, setInternalValues, onChange, onClose]);
5328
5428
  return /* @__PURE__ */ import_react39.default.createElement(
5329
5429
  ModalDialog,
5330
5430
  {
package/dist/index.js CHANGED
@@ -4121,7 +4121,9 @@ var CalendarButton2 = styled13(IconButton_default, {
4121
4121
  "&:focus": {
4122
4122
  "--Icon-color": "currentColor",
4123
4123
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4124
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4124
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4125
+ "palette-focusVisible"
4126
+ )}`
4125
4127
  }
4126
4128
  }));
4127
4129
  var StyledPopper2 = styled13(Popper3, {
@@ -4147,6 +4149,32 @@ var DateRangePickerRoot = styled13("div", {
4147
4149
  })({
4148
4150
  width: "100%"
4149
4151
  });
4152
+ var validValueFormat2 = (value, format) => {
4153
+ try {
4154
+ const [date1Str, date2Str] = value.split(" - ");
4155
+ if (!date1Str || !date2Str) {
4156
+ return false;
4157
+ }
4158
+ const parsedDate1 = parseDate2(date1Str, format);
4159
+ const parsedDate2 = parseDate2(date2Str, format);
4160
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4161
+ return false;
4162
+ }
4163
+ const formattedValue = formatValueString2(
4164
+ [parsedDate1, parsedDate2],
4165
+ format
4166
+ );
4167
+ if (value !== formattedValue) {
4168
+ return false;
4169
+ }
4170
+ const regex = new RegExp(
4171
+ `^${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")}$`
4172
+ );
4173
+ return regex.test(value);
4174
+ } catch (e) {
4175
+ return false;
4176
+ }
4177
+ };
4150
4178
  var formatValueString2 = ([date1, date2], format) => {
4151
4179
  const getStr = (date) => {
4152
4180
  let day = `${date.getDate()}`;
@@ -4243,6 +4271,7 @@ var DateRangePicker = forwardRef8(
4243
4271
  sx,
4244
4272
  className,
4245
4273
  format = "YYYY/MM/DD",
4274
+ displayFormat = "YYYY/MM/DD",
4246
4275
  size,
4247
4276
  inputReadOnly,
4248
4277
  hideClearButton,
@@ -4259,12 +4288,27 @@ var DateRangePicker = forwardRef8(
4259
4288
  [props.name, onChange]
4260
4289
  )
4261
4290
  );
4291
+ const [displayValue, setDisplayValue] = useState7(
4292
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4293
+ );
4262
4294
  const [anchorEl, setAnchorEl] = useState7(null);
4263
4295
  const open = Boolean(anchorEl);
4264
4296
  const calendarValue = useMemo9(
4265
4297
  () => value ? parseDates(value, format) : void 0,
4266
4298
  [value, format]
4267
4299
  );
4300
+ useEffect6(() => {
4301
+ if (value) {
4302
+ try {
4303
+ const dates = parseDates(value, format);
4304
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4305
+ setDisplayValue(newDisplayValue);
4306
+ } catch (error2) {
4307
+ }
4308
+ } else {
4309
+ setDisplayValue("");
4310
+ }
4311
+ }, [displayFormat, value, format]);
4268
4312
  useEffect6(() => {
4269
4313
  if (!anchorEl) {
4270
4314
  innerRef.current?.blur();
@@ -4275,9 +4319,41 @@ var DateRangePicker = forwardRef8(
4275
4319
  ]);
4276
4320
  const handleChange = useCallback10(
4277
4321
  (event) => {
4278
- setValue(event.target.value);
4322
+ const value2 = event.target.value;
4323
+ setDisplayValue(
4324
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4325
+ );
4326
+ setValue(value2);
4279
4327
  },
4280
- [setValue]
4328
+ [displayFormat, format, setValue]
4329
+ );
4330
+ const handleDisplayInputChange = useCallback10(
4331
+ (event) => {
4332
+ if (event.target.value === "") {
4333
+ handleChange({
4334
+ target: {
4335
+ name: props.name,
4336
+ value: ""
4337
+ }
4338
+ });
4339
+ return;
4340
+ }
4341
+ const isValidDisplayValue = validValueFormat2(
4342
+ event.target.value,
4343
+ displayFormat
4344
+ );
4345
+ if (isValidDisplayValue) {
4346
+ const dates = parseDates(event.target.value, displayFormat);
4347
+ const formattedValue = formatValueString2(dates, format);
4348
+ handleChange({
4349
+ target: {
4350
+ name: props.name,
4351
+ value: formattedValue
4352
+ }
4353
+ });
4354
+ }
4355
+ },
4356
+ [displayFormat, format, handleChange, props.name]
4281
4357
  );
4282
4358
  const handleCalendarToggle = useCallback10(
4283
4359
  (event) => {
@@ -4289,10 +4365,26 @@ var DateRangePicker = forwardRef8(
4289
4365
  const handleCalendarChange = useCallback10(
4290
4366
  ([date1, date2]) => {
4291
4367
  if (!date1 || !date2) return;
4292
- setValue(formatValueString2([date1, date2], format));
4368
+ const formattedValue = formatValueString2([date1, date2], format);
4369
+ if (props.value !== void 0) {
4370
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4371
+ } else {
4372
+ setDisplayValue(
4373
+ formatValueString2([date1, date2], displayFormat)
4374
+ );
4375
+ setValue(formattedValue);
4376
+ }
4293
4377
  setAnchorEl(null);
4294
4378
  },
4295
- [setValue, setAnchorEl, format]
4379
+ [
4380
+ props.value,
4381
+ props.name,
4382
+ onChange,
4383
+ setValue,
4384
+ setAnchorEl,
4385
+ format,
4386
+ displayFormat
4387
+ ]
4296
4388
  );
4297
4389
  const handleInputMouseDown = useCallback10(
4298
4390
  (event) => {
@@ -4310,17 +4402,21 @@ var DateRangePicker = forwardRef8(
4310
4402
  color: error ? "danger" : innerProps.color,
4311
4403
  ref,
4312
4404
  size,
4313
- value,
4314
- onChange: handleChange,
4405
+ value: displayValue,
4406
+ onChange: handleDisplayInputChange,
4315
4407
  disabled,
4316
4408
  required,
4317
- placeholder: `${format} - ${format}`,
4409
+ placeholder: `${displayFormat} - ${displayFormat}`,
4318
4410
  slotProps: {
4319
4411
  input: {
4320
4412
  component: TextMaskAdapter5,
4321
4413
  ref: innerRef,
4322
- format,
4323
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4414
+ format: displayFormat,
4415
+ sx: {
4416
+ "&:hover": {
4417
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4418
+ }
4419
+ },
4324
4420
  onMouseDown: handleInputMouseDown
4325
4421
  }
4326
4422
  },
@@ -4390,6 +4486,7 @@ var DateRangePicker = forwardRef8(
4390
4486
  color: "neutral",
4391
4487
  onClick: () => {
4392
4488
  setValue("");
4489
+ setDisplayValue("");
4393
4490
  setAnchorEl(null);
4394
4491
  }
4395
4492
  },
@@ -4552,7 +4649,7 @@ function CheckboxGroup(props) {
4552
4649
  {
4553
4650
  key: `${id}-${option.value}`,
4554
4651
  label: option.label,
4555
- checked: internalValue.includes(option.value),
4652
+ checked: internalValue?.includes(option.value),
4556
4653
  onChange: handleCheckboxChange(option.value)
4557
4654
  }
4558
4655
  )));
@@ -4636,6 +4733,7 @@ function DateRange(props) {
4636
4733
  disableFuture,
4637
4734
  disablePast,
4638
4735
  format = "YYYY/MM/DD",
4736
+ displayFormat,
4639
4737
  inputReadOnly,
4640
4738
  hideClearButton
4641
4739
  } = props;
@@ -4790,6 +4888,7 @@ function DateRange(props) {
4790
4888
  disableFuture,
4791
4889
  disablePast,
4792
4890
  format,
4891
+ displayFormat,
4793
4892
  inputReadOnly,
4794
4893
  hideClearButton
4795
4894
  }
@@ -5177,7 +5276,7 @@ function PercentageRange(props) {
5177
5276
  useMinorUnit,
5178
5277
  maxDecimalScale,
5179
5278
  min,
5180
- max,
5279
+ max: maxValue || max,
5181
5280
  "aria-labelledby": label ? id : void 0,
5182
5281
  "aria-label": "Minimum percentage",
5183
5282
  placeholder: "0%"
@@ -5190,7 +5289,7 @@ function PercentageRange(props) {
5190
5289
  onChange: handleMaxChange,
5191
5290
  useMinorUnit,
5192
5291
  maxDecimalScale,
5193
- min,
5292
+ min: minValue || min,
5194
5293
  max,
5195
5294
  "aria-labelledby": label ? id : void 0,
5196
5295
  "aria-label": "Maximum percentage",
@@ -5265,6 +5364,7 @@ function FilterMenu(props) {
5265
5364
  filters,
5266
5365
  values,
5267
5366
  defaultValues,
5367
+ resetValues = {},
5268
5368
  onChange,
5269
5369
  onClose,
5270
5370
  useClear,
@@ -5290,11 +5390,11 @@ function FilterMenu(props) {
5290
5390
  onClose?.();
5291
5391
  }, [onChange, onClose, internalValues]);
5292
5392
  const handleClear = useCallback19(() => {
5293
- const clearedValues = defaultValues || {};
5393
+ const clearedValues = resetValues || {};
5294
5394
  setInternalValues(clearedValues);
5295
5395
  onChange?.(clearedValues);
5296
5396
  onClose?.();
5297
- }, [defaultValues, setInternalValues, onChange, onClose]);
5397
+ }, [resetValues, setInternalValues, onChange, onClose]);
5298
5398
  return /* @__PURE__ */ React37.createElement(
5299
5399
  ModalDialog,
5300
5400
  {