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 | 97x 97x 97x 97x 97x 3x 3x 3x 3x 3x 2x 2x 2x 1x 3x 97x 2x 24x 16x | /**
* Create role dialog component
*/
import { useState } 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';
interface CreateRoleDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
onSubmit: (data: { name: string; description?: string }) => Promise<void>;
}
export default function CreateRoleDialog({ open, onOpenChange, onSubmit }: CreateRoleDialogProps) {
const [name, setName] = useState('');
const [description, setDescription] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setLoading(true);
setError(null);
try {
await onSubmit({
name,
description: description || undefined,
});
// Reset form
setName('');
setDescription('');
onOpenChange(false);
} catch (err: unknown) {
setError(err instanceof Error ? err.message : 'Failed to create role');
} finally {
setLoading(false);
}
};
return (
<AppDialog
open={open}
onOpenChange={onOpenChange}
title="Create Role"
description="Create a new role. You can configure permissions for this role after creation."
footer={
<>
<Button
type="button"
variant="outline"
onClick={() => onOpenChange(false)}
disabled={loading}
>
Cancel
</Button>
<Button type="submit" form="create-role-form" disabled={loading || !name}>
{loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
Create Role
</Button>
</>
}
>
<form id="create-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)}
placeholder="editor"
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)}
placeholder="Can edit content but not publish"
rows={3}
disabled={loading}
/>
</div>
{error && (
<div className="text-sm text-destructive bg-destructive/10 p-3 rounded-md">
{error}
</div>
)}
</form>
</AppDialog>
);
}
|