156 lines
6.3 KiB
Vue
156 lines
6.3 KiB
Vue
<script setup lang="ts">
|
|
import { Form, Head, Link } from '@inertiajs/vue3';
|
|
import UserManagementController from '@/actions/App/Http/Controllers/Admin/UserManagementController';
|
|
import Heading from '@/components/Heading.vue';
|
|
import InputError from '@/components/InputError.vue';
|
|
import PasswordInput from '@/components/PasswordInput.vue';
|
|
import { Button } from '@/components/ui/button';
|
|
import {
|
|
Card,
|
|
CardContent,
|
|
CardDescription,
|
|
CardHeader,
|
|
CardTitle,
|
|
} from '@/components/ui/card';
|
|
import { Input } from '@/components/ui/input';
|
|
import { Label } from '@/components/ui/label';
|
|
import AppLayout from '@/layouts/AppLayout.vue';
|
|
import { create, index } from '@/routes/admin/users';
|
|
import type { BreadcrumbItem } from '@/types';
|
|
|
|
const breadcrumbs: BreadcrumbItem[] = [
|
|
{
|
|
title: 'User management',
|
|
href: index(),
|
|
},
|
|
{
|
|
title: 'Create user',
|
|
href: create(),
|
|
},
|
|
];
|
|
</script>
|
|
|
|
<template>
|
|
<AppLayout :breadcrumbs="breadcrumbs">
|
|
<Head title="Create user" />
|
|
|
|
<div class="mx-auto flex w-full max-w-3xl flex-1 flex-col gap-6 p-4">
|
|
<Heading
|
|
title="Create user"
|
|
description="Create a user account and optionally force a password change on the next login."
|
|
/>
|
|
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>User details</CardTitle>
|
|
<CardDescription>
|
|
Set an initial password that the user can replace after
|
|
their first sign-in.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
|
|
<CardContent>
|
|
<Form
|
|
v-bind="UserManagementController.store.form()"
|
|
:transform="(data) => ({
|
|
...data,
|
|
must_change_password_on_next_login:
|
|
data.must_change_password_on_next_login === true ||
|
|
data.must_change_password_on_next_login === 'on',
|
|
})"
|
|
class="space-y-6"
|
|
v-slot="{ errors, processing }"
|
|
>
|
|
<div class="grid gap-2">
|
|
<Label for="name">Name</Label>
|
|
<Input
|
|
id="name"
|
|
name="name"
|
|
required
|
|
autofocus
|
|
autocomplete="name"
|
|
placeholder="Jane Admin"
|
|
/>
|
|
<InputError :message="errors.name" />
|
|
</div>
|
|
|
|
<div class="grid gap-2">
|
|
<Label for="email">Email</Label>
|
|
<Input
|
|
id="email"
|
|
name="email"
|
|
type="email"
|
|
required
|
|
autocomplete="email"
|
|
placeholder="jane@example.com"
|
|
/>
|
|
<InputError :message="errors.email" />
|
|
</div>
|
|
|
|
<div class="grid gap-2">
|
|
<Label for="password">Password</Label>
|
|
<PasswordInput
|
|
id="password"
|
|
name="password"
|
|
required
|
|
autocomplete="new-password"
|
|
placeholder="Temporary password"
|
|
/>
|
|
<InputError :message="errors.password" />
|
|
</div>
|
|
|
|
<div class="grid gap-2">
|
|
<Label for="password_confirmation"
|
|
>Confirm password</Label
|
|
>
|
|
<PasswordInput
|
|
id="password_confirmation"
|
|
name="password_confirmation"
|
|
required
|
|
autocomplete="new-password"
|
|
placeholder="Confirm password"
|
|
/>
|
|
</div>
|
|
|
|
<div class="grid gap-2">
|
|
<Label
|
|
for="must_change_password_on_next_login"
|
|
class="flex items-start gap-3 rounded-lg border px-4 py-3"
|
|
>
|
|
<input
|
|
id="must_change_password_on_next_login"
|
|
name="must_change_password_on_next_login"
|
|
type="checkbox"
|
|
checked
|
|
class="border-input text-primary focus:ring-ring mt-0.5 size-4 rounded"
|
|
/>
|
|
<span class="space-y-1">
|
|
<span class="block font-medium">
|
|
Must change password on next login
|
|
</span>
|
|
<span class="text-muted-foreground block text-sm">
|
|
Redirect the user to the security settings page until they save a new password.
|
|
</span>
|
|
</span>
|
|
</Label>
|
|
<InputError
|
|
:message="errors.must_change_password_on_next_login"
|
|
/>
|
|
</div>
|
|
|
|
<div class="flex items-center gap-3">
|
|
<Button type="submit" :disabled="processing">
|
|
Create user
|
|
</Button>
|
|
|
|
<Button as-child variant="outline">
|
|
<Link :href="index()">Cancel</Link>
|
|
</Button>
|
|
</div>
|
|
</Form>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</AppLayout>
|
|
</template>
|