Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 121x 121x 121x 121x 121x 36x 17x 17x 121x 5x 5x 5x 5x 5x 5x 3x 2x 5x 121x 80x 1x 15x 21x | /**
* Edit role dialog component
*/
import { useState, useEffect } from 'react';
import { AppDialog } from '@/components/common/AppDialog';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { Loader2 } from 'lucide-react';
import type { RoleListItem } from '@/services/roles.service';
interface EditRoleDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
role: RoleListItem | null;
onSubmit: (roleId: number, data: { name: string; description?: string }) => Promise<void>;
}
export default function EditRoleDialog({ open, onOpenChange, role, onSubmit }: EditRoleDialogProps) {
const [name, setName] = useState('');
const [description, setDescription] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
if (role) {
setName(role.name);
setDescription(role.description || '');
}
}, [role]);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
Iif (!role) return;
setLoading(true);
setError(null);
try {
await onSubmit(role.id, {
name,
description: description || undefined,
});
onOpenChange(false);
} catch (err: unknown) {
setError(err instanceof Error ? err.message : 'Failed to update role');
} finally {
setLoading(false);
}
};
if (!role) return null;
return (
<AppDialog
open={open}
onOpenChange={onOpenChange}
title="Edit Role"
description="Update the role name and description."
footer={
<>
<Button
type="button"
variant="outline"
onClick={() => onOpenChange(false)}
disabled={loading}
>
Cancel
</Button>
<Button type="submit" form="edit-role-form" disabled={loading || !name}>
{loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
Save Changes
</Button>
</>
}
>
<form id="edit-role-form" onSubmit={handleSubmit} className="space-y-4">
<div className="space-y-2">
<Label htmlFor="name">Name *</Label>
<Input
id="name"
value={name}
onChange={(e) => setName(e.target.value)}
required
disabled={loading}
/>
</div>
<div className="space-y-2">
<Label htmlFor="description">Description (optional)</Label>
<Textarea
id="description"
value={description}
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setDescription(e.target.value)}
rows={3}
disabled={loading}
/>
</div>
{error && (
<div className="text-sm text-destructive bg-destructive/10 p-3 rounded-md">
{error}
</div>
)}
</form>
</AppDialog>
);
}
|