pesona-ui 1.0.14 → 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 +55 -33
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +55 -33
- package/dist/index.esm.js.map +1 -1
- package/dist/styles/pesona-ui.css +1 -1
- package/dist/types/components/Form/DatePicker/DropdownDatePicker.d.ts +1 -0
- package/dist/types/components/Form/Radio/RadioButtonGroup.d.ts +1 -1
- package/package.json +1 -1
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
|
-
|
|
8227
|
-
const
|
|
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:
|
|
8230
|
-
month:
|
|
8231
|
-
year:
|
|
8236
|
+
day: initialDate.getDate(),
|
|
8237
|
+
month: initialDate.getMonth() + 1,
|
|
8238
|
+
year: initialDate.getFullYear(),
|
|
8232
8239
|
});
|
|
8233
|
-
|
|
8234
|
-
|
|
8235
|
-
|
|
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
|
|
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:
|
|
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 &&
|
|
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:
|
|
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:
|
|
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:
|
|
8260
|
-
floatingLabel &&
|
|
8261
|
-
|
|
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
|
|
|
@@ -8497,21 +8528,12 @@ const Radio = React.forwardRef(({ name, label, options, error, ...rest }, ref) =
|
|
|
8497
8528
|
});
|
|
8498
8529
|
|
|
8499
8530
|
const RadioButtonGroup = React.forwardRef(({ name, label, size = 'md', options, selectedValue, error, required, ...rest }, ref) => {
|
|
8500
|
-
const [stringSelectedValue, setStringSelectedValue] = React.useState(selectedValue || '');
|
|
8501
|
-
// Update the state when selectedValue changes
|
|
8502
|
-
React.useEffect(() => {
|
|
8503
|
-
if (selectedValue !== undefined) {
|
|
8504
|
-
// Convert selectedValue to string if it's a boolean
|
|
8505
|
-
const valueAsString = typeof selectedValue === 'boolean' ? (selectedValue ? 'true' : 'false') : selectedValue.toString();
|
|
8506
|
-
setStringSelectedValue(valueAsString);
|
|
8507
|
-
}
|
|
8508
|
-
}, [selectedValue]);
|
|
8509
8531
|
return (React.createElement(React.Fragment, null,
|
|
8510
8532
|
label && (React.createElement("label", { htmlFor: name },
|
|
8511
8533
|
label,
|
|
8512
8534
|
" ",
|
|
8513
8535
|
required && React.createElement("span", { className: "text-danger" }, "*"))),
|
|
8514
|
-
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 ===
|
|
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' : ''}` },
|
|
8515
8537
|
React.createElement("input", { type: "radio", id: option.value.toString(), name: name, value: option.value, ref: ref, ...rest }),
|
|
8516
8538
|
React.createElement("span", null, option.label))))),
|
|
8517
8539
|
error !== undefined && React.createElement("small", { className: "form-message" }, error)));
|