pesona-ui 1.0.15 → 1.0.16

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.js CHANGED
@@ -8222,46 +8222,77 @@ const Select = React.forwardRef(({ name, label, selectLabel, size = 'md', floati
8222
8222
  });
8223
8223
  Select.displayName = 'Select';
8224
8224
 
8225
- const DropdownDatePicker = React.forwardRef(({ name, label, floatingLabel, error, ...rest }, ref) => {
8226
- const [locale] = React.useState('en-US'); // Assuming locale is set to 'en-US' for simplicity
8227
- const selectedDate = rest.value ? new Date(rest.value) : new Date();
8225
+ const DropdownDatePicker = React.forwardRef(({ name, label, floatingLabel, locale = 'id', error, value, ...rest }, ref) => {
8226
+ // Helper function to safely parse date
8227
+ const parseDate = (dateString) => {
8228
+ if (!dateString)
8229
+ return new Date();
8230
+ const parsed = new Date(dateString);
8231
+ return isNaN(parsed.getTime()) ? new Date() : parsed;
8232
+ };
8233
+ // Initial date state
8234
+ const initialDate = parseDate(value);
8228
8235
  const [dateValues, setDateValues] = React.useState({
8229
- day: selectedDate.getDate(),
8230
- month: selectedDate.getMonth() + 1,
8231
- year: selectedDate.getFullYear(),
8236
+ day: initialDate.getDate(),
8237
+ month: initialDate.getMonth() + 1,
8238
+ year: initialDate.getFullYear(),
8232
8239
  });
8233
- const dayOptions = generateDayOptions(dateValues.month, dateValues.year);
8234
- const monthOptions = generateMonthOptions(locale);
8235
- const yearOptions = generateYearOptions();
8240
+ // Sync when external value changes
8241
+ React.useEffect(() => {
8242
+ if (value) {
8243
+ const d = parseDate(value);
8244
+ setDateValues({
8245
+ day: d.getDate(),
8246
+ month: d.getMonth() + 1,
8247
+ year: d.getFullYear(),
8248
+ });
8249
+ }
8250
+ }, [value]);
8251
+ // Ensure day is valid for the selected month and year
8252
+ React.useEffect(() => {
8253
+ const maxDay = new Date(dateValues.year, dateValues.month, 0).getDate();
8254
+ if (dateValues.day > maxDay) {
8255
+ setDateValues(prev => ({ ...prev, day: maxDay }));
8256
+ }
8257
+ // eslint-disable-next-line react-hooks/exhaustive-deps
8258
+ }, [dateValues.month, dateValues.year]);
8259
+ // Handle change for day, month, year with validation
8236
8260
  const handleChange = (field, newValue) => {
8237
- const newDateValues = { ...dateValues, [field]: newValue };
8261
+ const numericValue = parseInt(newValue, 10);
8262
+ if (isNaN(numericValue))
8263
+ return; // Guard against invalid input
8264
+ const newDateValues = { ...dateValues, [field]: numericValue };
8238
8265
  setDateValues(newDateValues);
8239
8266
  if (rest.onChange) {
8267
+ const formattedDate = `${newDateValues.year}-${String(newDateValues.month).padStart(2, '0')}-${String(newDateValues.day).padStart(2, '0')}`;
8240
8268
  rest.onChange({
8241
8269
  target: {
8242
8270
  name,
8243
- value: `${newDateValues.year}-${newDateValues.month}-${newDateValues.day}`,
8271
+ value: formattedDate,
8244
8272
  },
8245
8273
  });
8246
8274
  }
8247
8275
  };
8276
+ // Memoized options to prevent unnecessary re-calculations
8277
+ const dayOptions = React.useMemo(() => generateDayOptions(dateValues.month - 1, dateValues.year), [dateValues.month, dateValues.year]);
8278
+ const monthOptions = React.useMemo(() => generateMonthOptions(locale), [locale]);
8279
+ const yearOptions = React.useMemo(() => generateYearOptions(), []);
8280
+ // Label rendering
8281
+ const renderLabel = (React.createElement("label", { htmlFor: name },
8282
+ label,
8283
+ " ",
8284
+ rest.required && React.createElement("span", { className: "text-danger" }, "*")));
8248
8285
  return (React.createElement(React.Fragment, null,
8249
- !floatingLabel && (React.createElement("label", { htmlFor: name },
8250
- label,
8251
- " ",
8252
- rest.required && React.createElement("span", { className: "text-danger" }, "*"))),
8286
+ !floatingLabel && renderLabel,
8253
8287
  React.createElement("div", { className: "row", ref: ref },
8254
8288
  React.createElement("div", { className: "col-md-3" },
8255
- React.createElement(Select, { name: "day", disabled: rest.disabled, options: dayOptions, value: dateValues.day.toString(), onChange: (e) => handleChange('day', e.target.value), role: "day" })),
8289
+ React.createElement(Select, { name: `${name}-day`, disabled: rest.disabled, options: dayOptions, value: dateValues.day.toString(), onChange: (e) => handleChange('day', e.target.value), "aria-label": "Day" })),
8256
8290
  React.createElement("div", { className: "col-md-5" },
8257
- React.createElement(Select, { name: "month", disabled: rest.disabled, options: monthOptions, value: dateValues.month.toString(), onChange: (e) => handleChange('month', e.target.value), role: "month" })),
8291
+ React.createElement(Select, { name: `${name}-month`, disabled: rest.disabled, options: monthOptions, value: dateValues.month.toString(), onChange: (e) => handleChange('month', e.target.value), "aria-label": "Month" })),
8258
8292
  React.createElement("div", { className: "col-md-4" },
8259
- React.createElement(Select, { name: "year", disabled: rest.disabled, options: yearOptions, value: dateValues.year.toString(), onChange: (e) => handleChange('year', e.target.value), role: "year" }))),
8260
- floatingLabel && (React.createElement("label", { htmlFor: name },
8261
- label,
8262
- " ",
8263
- rest.required && React.createElement("span", { className: "text-danger" }, "*"))),
8264
- error && React.createElement("small", { className: "form-message" }, error)));
8293
+ React.createElement(Select, { name: `${name}-year`, disabled: rest.disabled, options: yearOptions, value: dateValues.year.toString(), onChange: (e) => handleChange('year', e.target.value), "aria-label": "Year" }))),
8294
+ floatingLabel && renderLabel,
8295
+ error && React.createElement("small", { className: "form-message text-danger" }, error)));
8265
8296
  });
8266
8297
  DropdownDatePicker.displayName = 'DropdownDatePicker';
8267
8298
 
@@ -8496,17 +8527,16 @@ const Radio = React.forwardRef(({ name, label, options, error, ...rest }, ref) =
8496
8527
  error && React.createElement("small", { className: "form-message" }, error)));
8497
8528
  });
8498
8529
 
8499
- const RadioButtonGroup = React.forwardRef(({ label, required, options, error, defaultValue, ...rest }, ref) => {
8500
- // Convert boolean value to string
8501
- const stringDefaultValue = typeof defaultValue === 'boolean' ? (defaultValue ? 'true' : 'false') : defaultValue;
8502
- return (React.createElement("div", null,
8503
- label && (React.createElement("label", null,
8530
+ const RadioButtonGroup = React.forwardRef(({ name, label, size = 'md', options, selectedValue, error, required, ...rest }, ref) => {
8531
+ return (React.createElement(React.Fragment, null,
8532
+ label && (React.createElement("label", { htmlFor: name },
8504
8533
  label,
8534
+ " ",
8505
8535
  required && React.createElement("span", { className: "text-danger" }, "*"))),
8506
- React.createElement("div", { className: "btn-group", "data-toggle": "buttons" }, options.map((option) => (React.createElement("label", { key: `${option.value}`, className: `btn auto btn-default btn-md ${option.value === stringDefaultValue ? 'active' : ''}` },
8507
- React.createElement("input", { type: "radio", ref: ref, value: option.value, defaultChecked: option.value === stringDefaultValue, ...rest }),
8536
+ React.createElement("div", { className: "btn-group", "data-toggle": "buttons" }, options.map((option) => (React.createElement("label", { key: option.value, className: `btn auto btn-default btn-${size} ${option.value === selectedValue ? 'active' : ''}` },
8537
+ React.createElement("input", { type: "radio", id: option.value.toString(), name: name, value: option.value, ref: ref, ...rest }),
8508
8538
  React.createElement("span", null, option.label))))),
8509
- error && React.createElement("small", { className: "form-message" }, error)));
8539
+ error !== undefined && React.createElement("small", { className: "form-message" }, error)));
8510
8540
  });
8511
8541
  RadioButtonGroup.displayName = 'RadioButtonGroup';
8512
8542