Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,325 changes: 482 additions & 843 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"vue-tsc": "^2.2.4"
},
"dependencies": {
"@inertiajs/vue3": "^2.0.0",
"@inertiajs/vue3": "^2.1.0",
"@tailwindcss/vite": "^4.1.11",
"@vitejs/plugin-vue": "^6.0.0",
"@vueuse/core": "^12.8.2",
Expand Down
56 changes: 28 additions & 28 deletions resources/js/components/DeleteUser.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { useForm } from '@inertiajs/vue3';
import { Form } from '@inertiajs/vue3';
import { ref } from 'vue';

// Components
Expand All @@ -20,32 +20,12 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';

const passwordInput = ref<HTMLInputElement | null>(null);

const form = useForm({
password: '',
});

const deleteUser = (e: Event) => {
e.preventDefault();

form.delete(route('profile.destroy'), {
preserveScroll: true,
onSuccess: () => closeModal(),
onError: () => passwordInput.value?.focus(),
onFinish: () => form.reset(),
});
};

const closeModal = () => {
form.clearErrors();
form.reset();
};
</script>

<template>
<div class="space-y-6">
<HeadingSmall title="Delete account" description="Delete your account and all of its resources" />
<div class="space-y-4 rounded-lg border border-red-100 bg-red-50 p-4 dark:border-red-200/10 dark:bg-red-700/10">
<div class="p-4 space-y-4 border border-red-100 rounded-lg bg-red-50 dark:border-red-200/10 dark:bg-red-700/10">
<div class="relative space-y-0.5 text-red-600 dark:text-red-100">
<p class="font-medium">Warning</p>
<p class="text-sm">Please proceed with caution, this cannot be undone.</p>
Expand All @@ -55,7 +35,17 @@ const closeModal = () => {
<Button variant="destructive">Delete account</Button>
</DialogTrigger>
<DialogContent>
<form method="POST" class="space-y-6" @submit="deleteUser">
<Form
method="delete"
:action="route('profile.destroy')"
reset-on-success
@error="() => passwordInput?.focus()"
:options="{
preserveScroll: true,
}"
class="space-y-6"
v-slot="{ errors, processing, reset, clearErrors }"
>
<DialogHeader class="space-y-3">
<DialogTitle>Are you sure you want to delete your account?</DialogTitle>
<DialogDescription>
Expand All @@ -66,18 +56,28 @@ const closeModal = () => {

<div class="grid gap-2">
<Label for="password" class="sr-only">Password</Label>
<Input id="password" type="password" name="password" ref="passwordInput" v-model="form.password" placeholder="Password" />
<InputError :message="form.errors.password" />
<Input id="password" type="password" name="password" ref="passwordInput" placeholder="Password" />
<InputError :message="errors.password" />
</div>

<DialogFooter class="gap-2">
<DialogClose as-child>
<Button variant="secondary" @click="closeModal"> Cancel </Button>
<Button
variant="secondary"
@click="
() => {
clearErrors();
reset();
}
"
>
Cancel
</Button>
</DialogClose>

<Button type="submit" variant="destructive" :disabled="form.processing"> Delete account </Button>
<Button type="submit" variant="destructive" :disabled="processing"> Delete account </Button>
</DialogFooter>
</form>
</Form>
</DialogContent>
</Dialog>
</div>
Expand Down
28 changes: 8 additions & 20 deletions resources/js/pages/auth/ConfirmPassword.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,38 @@ import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import AuthLayout from '@/layouts/AuthLayout.vue';
import { Head, useForm } from '@inertiajs/vue3';
import { Form, Head } from '@inertiajs/vue3';
import { LoaderCircle } from 'lucide-vue-next';

const form = useForm({
password: '',
});

const submit = () => {
form.post(route('password.confirm'), {
onFinish: () => {
form.reset();
},
});
};
</script>

<template>
<AuthLayout title="Confirm your password" description="This is a secure area of the application. Please confirm your password before continuing.">
<Head title="Confirm password" />

<form method="POST" @submit.prevent="submit">
<Form method="post" :action="route('password.confirm')" reset-on-success v-slot="{ errors, processing }">
<div class="space-y-6">
<div class="grid gap-2">
<Label htmlFor="password">Password</Label>
<Input
id="password"
type="password"
class="mt-1 block w-full"
v-model="form.password"
name="password"
class="block w-full mt-1"
required
autocomplete="current-password"
autofocus
/>

<InputError :message="form.errors.password" />
<InputError :message="errors.password" />
</div>

<div class="flex items-center">
<Button class="w-full" :disabled="form.processing">
<LoaderCircle v-if="form.processing" class="h-4 w-4 animate-spin" />
<Button class="w-full" :disabled="processing">
<LoaderCircle v-if="processing" class="w-4 h-4 animate-spin" />
Confirm Password
</Button>
</div>
</div>
</form>
</Form>
</AuthLayout>
</template>
22 changes: 7 additions & 15 deletions resources/js/pages/auth/ForgotPassword.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,12 @@ import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import AuthLayout from '@/layouts/AuthLayout.vue';
import { Head, useForm } from '@inertiajs/vue3';
import { Form, Head } from '@inertiajs/vue3';
import { LoaderCircle } from 'lucide-vue-next';

defineProps<{
status?: string;
}>();

const form = useForm({
email: '',
});

const submit = () => {
form.post(route('password.email'));
};
</script>

<template>
Expand All @@ -30,20 +22,20 @@ const submit = () => {
</div>

<div class="space-y-6">
<form method="POST" @submit.prevent="submit">
<Form method="post" :action="route('password.email')" v-slot="{ errors, processing }">
<div class="grid gap-2">
<Label for="email">Email address</Label>
<Input id="email" type="email" name="email" autocomplete="off" v-model="form.email" autofocus placeholder="email@example.com" />
<InputError :message="form.errors.email" />
<Input id="email" type="email" name="email" autocomplete="off" autofocus placeholder="email@example.com" />
<InputError :message="errors.email" />
</div>

<div class="my-6 flex items-center justify-start">
<Button class="w-full" :disabled="form.processing">
<LoaderCircle v-if="form.processing" class="h-4 w-4 animate-spin" />
<Button class="w-full" :disabled="processing">
<LoaderCircle v-if="processing" class="h-4 w-4 animate-spin" />
Email password reset link
</Button>
</div>
</form>
</Form>

<div class="space-x-1 text-center text-sm text-muted-foreground">
<span>Or, return to</span>
Expand Down
36 changes: 12 additions & 24 deletions resources/js/pages/auth/Login.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,50 +6,38 @@ import { Checkbox } from '@/components/ui/checkbox';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import AuthBase from '@/layouts/AuthLayout.vue';
import { Head, useForm } from '@inertiajs/vue3';
import { Form, Head } from '@inertiajs/vue3';
import { LoaderCircle } from 'lucide-vue-next';

defineProps<{
status?: string;
canResetPassword: boolean;
}>();

const form = useForm({
email: '',
password: '',
remember: false,
});

const submit = () => {
form.post(route('login'), {
onFinish: () => form.reset('password'),
});
};
</script>

<template>
<AuthBase title="Log in to your account" description="Enter your email and password below to log in">
<Head title="Log in" />

<div v-if="status" class="mb-4 text-center text-sm font-medium text-green-600">
<div v-if="status" class="mb-4 text-sm font-medium text-center text-green-600">
{{ status }}
</div>

<form method="POST" @submit.prevent="submit" class="flex flex-col gap-6">
<Form method="post" :action="route('login')" :reset-on-success="['password']" v-slot="{ errors, processing }" class="flex flex-col gap-6">
<div class="grid gap-6">
<div class="grid gap-2">
<Label for="email">Email address</Label>
<Input
id="email"
type="email"
name="email"
required
autofocus
:tabindex="1"
autocomplete="email"
v-model="form.email"
placeholder="email@example.com"
/>
<InputError :message="form.errors.email" />
<InputError :message="errors.email" />
</div>

<div class="grid gap-2">
Expand All @@ -62,32 +50,32 @@ const submit = () => {
<Input
id="password"
type="password"
name="password"
required
:tabindex="2"
autocomplete="current-password"
v-model="form.password"
placeholder="Password"
/>
<InputError :message="form.errors.password" />
<InputError :message="errors.password" />
</div>

<div class="flex items-center justify-between">
<Label for="remember" class="flex items-center space-x-3">
<Checkbox id="remember" v-model="form.remember" :tabindex="3" />
<Checkbox id="remember" name="remember" :tabindex="3" />
<span>Remember me</span>
</Label>
</div>

<Button type="submit" class="mt-4 w-full" :tabindex="4" :disabled="form.processing">
<LoaderCircle v-if="form.processing" class="h-4 w-4 animate-spin" />
<Button type="submit" class="w-full mt-4" :tabindex="4" :disabled="processing">
<LoaderCircle v-if="processing" class="w-4 h-4 animate-spin" />
Log in
</Button>
</div>

<div class="text-center text-sm text-muted-foreground">
<div class="text-sm text-center text-muted-foreground">
Don't have an account?
<TextLink :href="route('register')" :tabindex="5">Sign up</TextLink>
</div>
</form>
</Form>
</AuthBase>
</template>
Loading