diff --git a/src/modules/admin/pages/tiers/AddPlan.jsx b/src/modules/admin/pages/tiers/AddPlan.jsx index fe69c1f..e3c1d31 100644 --- a/src/modules/admin/pages/tiers/AddPlan.jsx +++ b/src/modules/admin/pages/tiers/AddPlan.jsx @@ -160,9 +160,22 @@ export default function AddPlan() { defaultValues: { tier_category_id: "", label: "", description: "", features: [], duration_value: 30, duration_unit: "day", price: "", currency: "USD" }, }); - const { fields: featureFields, append: appendFeature, remove: removeFeature } = + const { fields: featureFields, append: appendFeature, remove: removeFeature, insert: insertFeature } = useFieldArray({ control, name: "features" }); + // Pasting a multi-line list should fan out into separate feature rows + // instead of dumping every line into a single input. + const handleFeaturePaste = (e, index) => { + const lines = e.clipboardData.getData("text") + .split(/\r\n|\r|\n/) + .map((l) => l.trim()) + .filter(Boolean); + if (lines.length <= 1) return; + e.preventDefault(); + setValue(`features.${index}.text`, lines[0], { shouldDirty: true }); + insertFeature(index + 1, lines.slice(1).map((text) => ({ text }))); + }; + // selectedCourseIds lives outside the form — this is a create page so it // always starts empty, meaning any selection is a genuine unsaved change. const { bypassOnce, dialog: unsavedChangesDialog } = useUnsavedChangesGuard( @@ -309,6 +322,7 @@ export default function AddPlan() {
handleFeaturePaste(e, index)} {...register(`features.${index}.text`)} /> diff --git a/src/modules/admin/pages/tiers/EditPlan.jsx b/src/modules/admin/pages/tiers/EditPlan.jsx index f32b919..846e24d 100644 --- a/src/modules/admin/pages/tiers/EditPlan.jsx +++ b/src/modules/admin/pages/tiers/EditPlan.jsx @@ -97,9 +97,22 @@ export default function EditPlan() { resolver: zodResolver(schema), }); - const { fields: featureFields, append: appendFeature, remove: removeFeature } = + const { fields: featureFields, append: appendFeature, remove: removeFeature, insert: insertFeature } = useFieldArray({ control, name: "features" }); + // Pasting a multi-line list should fan out into separate feature rows + // instead of dumping every line into a single input. + const handleFeaturePaste = (e, index) => { + const lines = e.clipboardData.getData("text") + .split(/\r\n|\r|\n/) + .map((l) => l.trim()) + .filter(Boolean); + if (lines.length <= 1) return; + e.preventDefault(); + setValue(`features.${index}.text`, lines[0], { shouldDirty: true }); + insertFeature(index + 1, lines.slice(1).map((text) => ({ text }))); + }; + const { bypassOnce, dialog: unsavedChangesDialog } = useUnsavedChangesGuard(isDirty); useEffect(() => { @@ -242,6 +255,7 @@ export default function EditPlan() {
handleFeaturePaste(e, index)} {...register(`features.${index}.text`)} />