Added timezones
This commit is contained in:
@@ -17,7 +17,7 @@ class PopulateAirportTimezones extends Command
|
|||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
Airport::whereNull('timezone')->chunk(100, function ($airports) {
|
Airport::whereNull('timezone')->chunkById(100, function ($airports) {
|
||||||
foreach ($airports as $airport) {
|
foreach ($airports as $airport) {
|
||||||
$zoneName = null;
|
$zoneName = null;
|
||||||
$attempts = 0;
|
$attempts = 0;
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
defineProps<{
|
||||||
|
title?: string;
|
||||||
|
blurb?: string;
|
||||||
|
}>();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="glass-box glass glass-border">
|
<div class="glass-box glass glass-border">
|
||||||
|
<h2 v-if="title">{{ title }}</h2>
|
||||||
|
<p v-if="blurb">{{ blurb }}</p>
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -12,8 +17,19 @@
|
|||||||
.glass-box {
|
.glass-box {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
min-height: 50dvh;
|
min-height: 50dvh;
|
||||||
gap:1em;
|
gap: 1em;
|
||||||
padding: 2em;
|
padding: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -3,15 +3,20 @@ import {Link} from "@inertiajs/vue3";
|
|||||||
import MainHeader from "@/Components/FlightsGoneBy/MainHeader.vue";
|
import MainHeader from "@/Components/FlightsGoneBy/MainHeader.vue";
|
||||||
import MainFooter from "@/Components/FlightsGoneBy/MainFooter.vue";
|
import MainFooter from "@/Components/FlightsGoneBy/MainFooter.vue";
|
||||||
import Radar from "@/Components/FlightsGoneBy/Radar.vue";
|
import Radar from "@/Components/FlightsGoneBy/Radar.vue";
|
||||||
|
import { usePage } from "@inertiajs/vue3";
|
||||||
|
const page = usePage();
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Radar>
|
<Radar>
|
||||||
<div class="layoutContainer">
|
<div class="layoutContainer">
|
||||||
<MainHeader />
|
<MainHeader />
|
||||||
<main id="pageContainer">
|
<Transition name="fade" mode="out-in">
|
||||||
<slot />
|
<main id="pageContainer" :key="page.url" >
|
||||||
</main>
|
<slot />
|
||||||
|
</main>
|
||||||
|
</Transition>
|
||||||
<MainFooter />
|
<MainFooter />
|
||||||
</div>
|
</div>
|
||||||
</Radar>
|
</Radar>
|
||||||
@@ -27,10 +32,10 @@ import Radar from "@/Components/FlightsGoneBy/Radar.vue";
|
|||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
flex: 1 0 90dvh; /* THIS is the key */
|
flex: 1 0 90dvh;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
background: var(--surface-alt);
|
background:transparent;
|
||||||
display:flex;
|
display:flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -38,4 +43,15 @@ main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.fade-enter-from,
|
||||||
|
.fade-leave-to {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-enter-active,
|
||||||
|
.fade-leave-active {
|
||||||
|
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import GuestLayout from '@/Layouts/GuestLayout.vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import InputError from '@/Components/InputError.vue';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
import InputLabel from '@/Components/InputLabel.vue';
|
import { Head, useForm } from "@inertiajs/vue3";
|
||||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
|
||||||
import TextInput from '@/Components/TextInput.vue';
|
defineOptions({ layout: MainLayout });
|
||||||
import { Head, useForm } from '@inertiajs/vue3';
|
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
password: '',
|
password: '',
|
||||||
@@ -18,38 +17,53 @@ const submit = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<GuestLayout>
|
<Head title="Confirm Password" />
|
||||||
<Head title="Confirm Password" />
|
<GlassBox>
|
||||||
|
<h2>Confirm Password</h2>
|
||||||
|
<p>This is a secure area. Please confirm your password before continuing.</p>
|
||||||
|
|
||||||
<div class="mb-4 text-sm text-gray-600">
|
<v-form style="width: 100%" @submit.prevent="submit">
|
||||||
This is a secure area of the application. Please confirm your
|
<v-container>
|
||||||
password before continuing.
|
<v-row>
|
||||||
</div>
|
<v-col cols="12">
|
||||||
|
<v-text-field
|
||||||
|
v-model="form.password"
|
||||||
|
label="Password"
|
||||||
|
type="password"
|
||||||
|
autocomplete="current-password"
|
||||||
|
autofocus
|
||||||
|
:error-messages="form.errors.password"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<form @submit.prevent="submit">
|
<v-row>
|
||||||
<div>
|
<v-col cols="12" class="d-flex justify-end">
|
||||||
<InputLabel for="password" value="Password" />
|
<v-btn
|
||||||
<TextInput
|
size="large"
|
||||||
id="password"
|
type="submit"
|
||||||
type="password"
|
:loading="form.processing"
|
||||||
class="mt-1 block w-full"
|
:disabled="form.processing"
|
||||||
v-model="form.password"
|
>
|
||||||
required
|
Confirm
|
||||||
autocomplete="current-password"
|
</v-btn>
|
||||||
autofocus
|
</v-col>
|
||||||
/>
|
</v-row>
|
||||||
<InputError class="mt-2" :message="form.errors.password" />
|
</v-container>
|
||||||
</div>
|
</v-form>
|
||||||
|
</GlassBox>
|
||||||
<div class="mt-4 flex justify-end">
|
|
||||||
<PrimaryButton
|
|
||||||
class="ms-4"
|
|
||||||
:class="{ 'opacity-25': form.processing }"
|
|
||||||
:disabled="form.processing"
|
|
||||||
>
|
|
||||||
Confirm
|
|
||||||
</PrimaryButton>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</GuestLayout>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import GuestLayout from '@/Layouts/GuestLayout.vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import InputError from '@/Components/InputError.vue';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
import InputLabel from '@/Components/InputLabel.vue';
|
import { Head, useForm } from "@inertiajs/vue3";
|
||||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
|
||||||
import TextInput from '@/Components/TextInput.vue';
|
|
||||||
import { Head, useForm } from '@inertiajs/vue3';
|
|
||||||
|
|
||||||
defineProps({
|
defineOptions({ layout: MainLayout });
|
||||||
status: {
|
|
||||||
type: String,
|
defineProps<{
|
||||||
},
|
status?: string;
|
||||||
});
|
}>();
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
email: '',
|
email: '',
|
||||||
@@ -22,47 +19,54 @@ const submit = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<GuestLayout>
|
<Head title="Forgot Password" />
|
||||||
<Head title="Forgot Password" />
|
<GlassBox title="Forgot Your Password?" blurb="No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.">
|
||||||
|
<v-alert v-if="status" type="success" class="mb-2">{{ status }}</v-alert>
|
||||||
|
|
||||||
<div class="mb-4 text-sm text-gray-600">
|
<v-form style="width: 100%" @submit.prevent="submit">
|
||||||
Forgot your password? No problem. Just let us know your email
|
<v-container>
|
||||||
address and we will email you a password reset link that will allow
|
<v-row>
|
||||||
you to choose a new one.
|
<v-col cols="12">
|
||||||
</div>
|
<v-text-field
|
||||||
|
v-model="form.email"
|
||||||
|
label="Email"
|
||||||
|
type="email"
|
||||||
|
autocomplete="username"
|
||||||
|
autofocus
|
||||||
|
:error-messages="form.errors.email"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<div
|
<v-row>
|
||||||
v-if="status"
|
<v-col cols="12" class="d-flex justify-end">
|
||||||
class="mb-4 text-sm font-medium text-green-600"
|
<v-btn
|
||||||
>
|
variant="elevated"
|
||||||
{{ status }}
|
size="large"
|
||||||
</div>
|
block
|
||||||
|
type="submit"
|
||||||
<form @submit.prevent="submit">
|
:loading="form.processing"
|
||||||
<div>
|
:disabled="form.processing"
|
||||||
<InputLabel for="email" value="Email" />
|
>
|
||||||
|
Email Password Reset Link
|
||||||
<TextInput
|
</v-btn>
|
||||||
id="email"
|
</v-col>
|
||||||
type="email"
|
</v-row>
|
||||||
class="mt-1 block w-full"
|
</v-container>
|
||||||
v-model="form.email"
|
</v-form>
|
||||||
required
|
</GlassBox>
|
||||||
autofocus
|
|
||||||
autocomplete="username"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<InputError class="mt-2" :message="form.errors.email" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-4 flex items-center justify-end">
|
|
||||||
<PrimaryButton
|
|
||||||
:class="{ 'opacity-25': form.processing }"
|
|
||||||
:disabled="form.processing"
|
|
||||||
>
|
|
||||||
Email Password Reset Link
|
|
||||||
</PrimaryButton>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</GuestLayout>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,20 +1,14 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import Checkbox from '@/Components/Checkbox.vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import GuestLayout from '@/Layouts/GuestLayout.vue';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
import InputError from '@/Components/InputError.vue';
|
import { Head, Link, useForm } from "@inertiajs/vue3";
|
||||||
import InputLabel from '@/Components/InputLabel.vue';
|
|
||||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
|
||||||
import TextInput from '@/Components/TextInput.vue';
|
|
||||||
import { Head, Link, useForm } from '@inertiajs/vue3';
|
|
||||||
|
|
||||||
defineProps({
|
defineOptions({ layout: MainLayout });
|
||||||
canResetPassword: {
|
|
||||||
type: Boolean,
|
defineProps<{
|
||||||
},
|
canResetPassword: boolean;
|
||||||
status: {
|
status?: string;
|
||||||
type: String,
|
}>();
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
email: '',
|
email: '',
|
||||||
@@ -30,71 +24,88 @@ const submit = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<GuestLayout>
|
<Head title="Log in" />
|
||||||
<Head title="Log in" />
|
<GlassBox title="Welcome Back" blurb="Log in to continue logging your flights.">
|
||||||
|
|
||||||
<div v-if="status" class="mb-4 text-sm font-medium text-green-600">
|
<v-alert v-if="status" type="success" class="mb-2">{{ status }}</v-alert>
|
||||||
{{ status }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form @submit.prevent="submit">
|
<v-form style="width: 100%" @submit.prevent="submit">
|
||||||
<div>
|
<v-container>
|
||||||
<InputLabel for="email" value="Email" />
|
<v-row>
|
||||||
|
<v-col cols="12">
|
||||||
|
<v-text-field
|
||||||
|
v-model="form.email"
|
||||||
|
label="Email"
|
||||||
|
type="email"
|
||||||
|
autocomplete="username"
|
||||||
|
autofocus
|
||||||
|
:error-messages="form.errors.email"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<TextInput
|
<v-row>
|
||||||
id="email"
|
<v-col cols="12">
|
||||||
type="email"
|
<v-text-field
|
||||||
class="mt-1 block w-full"
|
v-model="form.password"
|
||||||
v-model="form.email"
|
label="Password"
|
||||||
required
|
type="password"
|
||||||
autofocus
|
autocomplete="current-password"
|
||||||
autocomplete="username"
|
:error-messages="form.errors.password"
|
||||||
/>
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<InputError class="mt-2" :message="form.errors.email" />
|
<v-row>
|
||||||
</div>
|
<v-col cols="12">
|
||||||
|
<v-checkbox
|
||||||
|
v-model="form.remember"
|
||||||
|
label="Remember me"
|
||||||
|
hide-details
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<div class="mt-4">
|
<v-row>
|
||||||
<InputLabel for="password" value="Password" />
|
<v-col cols="12" class="d-flex align-center justify-end" style="gap: 1rem">
|
||||||
|
<v-btn
|
||||||
<TextInput
|
block
|
||||||
id="password"
|
variant="elevated"
|
||||||
type="password"
|
size="large"
|
||||||
class="mt-1 block w-full"
|
type="submit"
|
||||||
v-model="form.password"
|
:loading="form.processing"
|
||||||
required
|
:disabled="form.processing"
|
||||||
autocomplete="current-password"
|
>
|
||||||
/>
|
Log in
|
||||||
|
</v-btn>
|
||||||
<InputError class="mt-2" :message="form.errors.password" />
|
</v-col>
|
||||||
</div>
|
</v-row>
|
||||||
|
<v-row>
|
||||||
<div class="mt-4 block">
|
<v-col cols="12" class="d-flex align-center justify-end" style="gap: 1rem">
|
||||||
<label class="flex items-center">
|
<Link
|
||||||
<Checkbox name="remember" v-model:checked="form.remember" />
|
v-if="canResetPassword"
|
||||||
<span class="ms-2 text-sm text-gray-600"
|
:href="route('password.request')"
|
||||||
>Remember me</span
|
style="opacity: 0.7; font-size: 0.9rem"
|
||||||
>
|
>
|
||||||
</label>
|
Forgot your password?
|
||||||
</div>
|
</Link>
|
||||||
|
</v-col>
|
||||||
<div class="mt-4 flex items-center justify-end">
|
</v-row>
|
||||||
<Link
|
</v-container>
|
||||||
v-if="canResetPassword"
|
</v-form>
|
||||||
:href="route('password.request')"
|
</GlassBox>
|
||||||
class="rounded-md text-sm text-gray-600 underline hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
|
|
||||||
>
|
|
||||||
Forgot your password?
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
<PrimaryButton
|
|
||||||
class="ms-4"
|
|
||||||
:class="{ 'opacity-25': form.processing }"
|
|
||||||
:disabled="form.processing"
|
|
||||||
>
|
|
||||||
Log in
|
|
||||||
</PrimaryButton>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</GuestLayout>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import GuestLayout from '@/Layouts/GuestLayout.vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import InputError from '@/Components/InputError.vue';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
import InputLabel from '@/Components/InputLabel.vue';
|
import { Head, Link, useForm } from "@inertiajs/vue3";
|
||||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
|
||||||
import TextInput from '@/Components/TextInput.vue';
|
defineOptions({ layout: MainLayout });
|
||||||
import { Head, Link, useForm } from '@inertiajs/vue3';
|
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
name: '',
|
name: '',
|
||||||
@@ -21,93 +20,94 @@ const submit = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<GuestLayout>
|
<Head title="Register" />
|
||||||
<Head title="Register" />
|
<GlassBox title="Create Account" blurb="Start logging your flights today.">
|
||||||
|
<v-form style="width: 100%" @submit.prevent="submit">
|
||||||
|
<v-container>
|
||||||
|
<v-row>
|
||||||
|
<v-col cols="12">
|
||||||
|
<v-text-field
|
||||||
|
v-model="form.name"
|
||||||
|
label="Name"
|
||||||
|
autocomplete="name"
|
||||||
|
autofocus
|
||||||
|
:error-messages="form.errors.name"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<form @submit.prevent="submit">
|
<v-row>
|
||||||
<div>
|
<v-col cols="12">
|
||||||
<InputLabel for="name" value="Name" />
|
<v-text-field
|
||||||
|
v-model="form.email"
|
||||||
|
label="Email"
|
||||||
|
type="email"
|
||||||
|
autocomplete="username"
|
||||||
|
:error-messages="form.errors.email"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<TextInput
|
<v-row>
|
||||||
id="name"
|
<v-col cols="12">
|
||||||
type="text"
|
<v-text-field
|
||||||
class="mt-1 block w-full"
|
v-model="form.password"
|
||||||
v-model="form.name"
|
label="Password"
|
||||||
required
|
type="password"
|
||||||
autofocus
|
autocomplete="new-password"
|
||||||
autocomplete="name"
|
:error-messages="form.errors.password"
|
||||||
/>
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<InputError class="mt-2" :message="form.errors.name" />
|
<v-row>
|
||||||
</div>
|
<v-col cols="12">
|
||||||
|
<v-text-field
|
||||||
|
v-model="form.password_confirmation"
|
||||||
|
label="Confirm Password"
|
||||||
|
type="password"
|
||||||
|
autocomplete="new-password"
|
||||||
|
:error-messages="form.errors.password_confirmation"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<div class="mt-4">
|
<v-row>
|
||||||
<InputLabel for="email" value="Email" />
|
<v-col cols="12" class="d-flex align-center justify-end" style="gap: 1rem">
|
||||||
|
<v-btn
|
||||||
<TextInput
|
variant="elevated"
|
||||||
id="email"
|
size="large"
|
||||||
type="email"
|
block
|
||||||
class="mt-1 block w-full"
|
type="submit"
|
||||||
v-model="form.email"
|
:loading="form.processing"
|
||||||
required
|
:disabled="form.processing"
|
||||||
autocomplete="username"
|
>
|
||||||
/>
|
Register
|
||||||
|
</v-btn>
|
||||||
<InputError class="mt-2" :message="form.errors.email" />
|
</v-col>
|
||||||
</div>
|
</v-row>
|
||||||
|
<v-row>
|
||||||
<div class="mt-4">
|
<v-col cols="12" class="d-flex align-center justify-end" style="gap: 1rem">
|
||||||
<InputLabel for="password" value="Password" />
|
<Link :href="route('login')" style="opacity: 0.7; font-size: 0.9rem">
|
||||||
|
Already registered?
|
||||||
<TextInput
|
</Link>
|
||||||
id="password"
|
</v-col>
|
||||||
type="password"
|
</v-row>
|
||||||
class="mt-1 block w-full"
|
</v-container>
|
||||||
v-model="form.password"
|
</v-form>
|
||||||
required
|
</GlassBox>
|
||||||
autocomplete="new-password"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<InputError class="mt-2" :message="form.errors.password" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-4">
|
|
||||||
<InputLabel
|
|
||||||
for="password_confirmation"
|
|
||||||
value="Confirm Password"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<TextInput
|
|
||||||
id="password_confirmation"
|
|
||||||
type="password"
|
|
||||||
class="mt-1 block w-full"
|
|
||||||
v-model="form.password_confirmation"
|
|
||||||
required
|
|
||||||
autocomplete="new-password"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<InputError
|
|
||||||
class="mt-2"
|
|
||||||
:message="form.errors.password_confirmation"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-4 flex items-center justify-end">
|
|
||||||
<Link
|
|
||||||
:href="route('login')"
|
|
||||||
class="rounded-md text-sm text-gray-600 underline hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
|
|
||||||
>
|
|
||||||
Already registered?
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
<PrimaryButton
|
|
||||||
class="ms-4"
|
|
||||||
:class="{ 'opacity-25': form.processing }"
|
|
||||||
:disabled="form.processing"
|
|
||||||
>
|
|
||||||
Register
|
|
||||||
</PrimaryButton>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</GuestLayout>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,21 +1,14 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import GuestLayout from '@/Layouts/GuestLayout.vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import InputError from '@/Components/InputError.vue';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
import InputLabel from '@/Components/InputLabel.vue';
|
import { Head, useForm } from "@inertiajs/vue3";
|
||||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
|
||||||
import TextInput from '@/Components/TextInput.vue';
|
|
||||||
import { Head, useForm } from '@inertiajs/vue3';
|
|
||||||
|
|
||||||
const props = defineProps({
|
defineOptions({ layout: MainLayout });
|
||||||
email: {
|
|
||||||
type: String,
|
const props = defineProps<{
|
||||||
required: true,
|
email: string;
|
||||||
},
|
token: string;
|
||||||
token: {
|
}>();
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm({
|
||||||
token: props.token,
|
token: props.token,
|
||||||
@@ -32,70 +25,77 @@ const submit = () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<GuestLayout>
|
<Head title="Reset Password" />
|
||||||
<Head title="Reset Password" />
|
<GlassBox>
|
||||||
|
<h2>Reset Password</h2>
|
||||||
|
<p>Choose a new password for your account.</p>
|
||||||
|
|
||||||
<form @submit.prevent="submit">
|
<v-form style="width: 100%" @submit.prevent="submit">
|
||||||
<div>
|
<v-container>
|
||||||
<InputLabel for="email" value="Email" />
|
<v-row>
|
||||||
|
<v-col cols="12">
|
||||||
|
<v-text-field
|
||||||
|
v-model="form.email"
|
||||||
|
label="Email"
|
||||||
|
type="email"
|
||||||
|
autocomplete="username"
|
||||||
|
autofocus
|
||||||
|
:error-messages="form.errors.email"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<TextInput
|
<v-row>
|
||||||
id="email"
|
<v-col cols="12">
|
||||||
type="email"
|
<v-text-field
|
||||||
class="mt-1 block w-full"
|
v-model="form.password"
|
||||||
v-model="form.email"
|
label="Password"
|
||||||
required
|
type="password"
|
||||||
autofocus
|
autocomplete="new-password"
|
||||||
autocomplete="username"
|
:error-messages="form.errors.password"
|
||||||
/>
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<InputError class="mt-2" :message="form.errors.email" />
|
<v-row>
|
||||||
</div>
|
<v-col cols="12">
|
||||||
|
<v-text-field
|
||||||
|
v-model="form.password_confirmation"
|
||||||
|
label="Confirm Password"
|
||||||
|
type="password"
|
||||||
|
autocomplete="new-password"
|
||||||
|
:error-messages="form.errors.password_confirmation"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
|
||||||
<div class="mt-4">
|
<v-row>
|
||||||
<InputLabel for="password" value="Password" />
|
<v-col cols="12" class="d-flex justify-end">
|
||||||
|
<v-btn
|
||||||
<TextInput
|
size="large"
|
||||||
id="password"
|
type="submit"
|
||||||
type="password"
|
:loading="form.processing"
|
||||||
class="mt-1 block w-full"
|
:disabled="form.processing"
|
||||||
v-model="form.password"
|
>
|
||||||
required
|
Reset Password
|
||||||
autocomplete="new-password"
|
</v-btn>
|
||||||
/>
|
</v-col>
|
||||||
|
</v-row>
|
||||||
<InputError class="mt-2" :message="form.errors.password" />
|
</v-container>
|
||||||
</div>
|
</v-form>
|
||||||
|
</GlassBox>
|
||||||
<div class="mt-4">
|
|
||||||
<InputLabel
|
|
||||||
for="password_confirmation"
|
|
||||||
value="Confirm Password"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<TextInput
|
|
||||||
id="password_confirmation"
|
|
||||||
type="password"
|
|
||||||
class="mt-1 block w-full"
|
|
||||||
v-model="form.password_confirmation"
|
|
||||||
required
|
|
||||||
autocomplete="new-password"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<InputError
|
|
||||||
class="mt-2"
|
|
||||||
:message="form.errors.password_confirmation"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-4 flex items-center justify-end">
|
|
||||||
<PrimaryButton
|
|
||||||
:class="{ 'opacity-25': form.processing }"
|
|
||||||
:disabled="form.processing"
|
|
||||||
>
|
|
||||||
Reset Password
|
|
||||||
</PrimaryButton>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</GuestLayout>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import GuestLayout from '@/Layouts/GuestLayout.vue';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
import PrimaryButton from '@/Components/PrimaryButton.vue';
|
import { Head, Link, useForm } from "@inertiajs/vue3";
|
||||||
import { Head, Link, useForm } from '@inertiajs/vue3';
|
import { computed } from "vue";
|
||||||
|
|
||||||
const props = defineProps({
|
defineOptions({ layout: MainLayout });
|
||||||
status: {
|
|
||||||
type: String,
|
const props = defineProps<{
|
||||||
},
|
status?: string;
|
||||||
});
|
}>();
|
||||||
|
|
||||||
const form = useForm({});
|
const form = useForm({});
|
||||||
|
|
||||||
@@ -16,46 +16,57 @@ const submit = () => {
|
|||||||
form.post(route('verification.send'));
|
form.post(route('verification.send'));
|
||||||
};
|
};
|
||||||
|
|
||||||
const verificationLinkSent = computed(
|
const verificationLinkSent = computed(() => props.status === 'verification-link-sent');
|
||||||
() => props.status === 'verification-link-sent',
|
|
||||||
);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<GuestLayout>
|
<Head title="Email Verification" />
|
||||||
<Head title="Email Verification" />
|
<GlassBox>
|
||||||
|
<h2>Verify Your Email</h2>
|
||||||
|
<p>Thanks for signing up! Please verify your email address by clicking the link we sent you. If you didn't receive it, we can send another.</p>
|
||||||
|
|
||||||
<div class="mb-4 text-sm text-gray-600">
|
<v-alert v-if="verificationLinkSent" type="success" class="mb-2">
|
||||||
Thanks for signing up! Before getting started, could you verify your
|
A new verification link has been sent to your email address.
|
||||||
email address by clicking on the link we just emailed to you? If you
|
</v-alert>
|
||||||
didn't receive the email, we will gladly send you another.
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
<v-form style="width: 100%" @submit.prevent="submit">
|
||||||
class="mb-4 text-sm font-medium text-green-600"
|
<v-container>
|
||||||
v-if="verificationLinkSent"
|
<v-row>
|
||||||
>
|
<v-col cols="12" class="d-flex align-center justify-space-between">
|
||||||
A new verification link has been sent to the email address you
|
<v-btn
|
||||||
provided during registration.
|
size="large"
|
||||||
</div>
|
type="submit"
|
||||||
|
:loading="form.processing"
|
||||||
|
:disabled="form.processing"
|
||||||
|
>
|
||||||
|
Resend Verification Email
|
||||||
|
</v-btn>
|
||||||
|
|
||||||
<form @submit.prevent="submit">
|
<Link
|
||||||
<div class="mt-4 flex items-center justify-between">
|
:href="route('logout')"
|
||||||
<PrimaryButton
|
method="post"
|
||||||
:class="{ 'opacity-25': form.processing }"
|
as="button"
|
||||||
:disabled="form.processing"
|
style="opacity: 0.7; font-size: 0.9rem"
|
||||||
>
|
>
|
||||||
Resend Verification Email
|
Log Out
|
||||||
</PrimaryButton>
|
</Link>
|
||||||
|
</v-col>
|
||||||
<Link
|
</v-row>
|
||||||
:href="route('logout')"
|
</v-container>
|
||||||
method="post"
|
</v-form>
|
||||||
as="button"
|
</GlassBox>
|
||||||
class="rounded-md text-sm text-gray-600 underline hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
|
|
||||||
>Log Out</Link
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</GuestLayout>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
opacity: 0.7;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,30 +1,49 @@
|
|||||||
<script setup>
|
<script setup lang="ts">
|
||||||
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue';
|
import MainLayout from "@/Layouts/MainLayout.vue";
|
||||||
import { Head } from '@inertiajs/vue3';
|
import GlassBox from "@/Components/FlightsGoneBy/GlassBox.vue";
|
||||||
|
import { Head, Link } from "@inertiajs/vue3";
|
||||||
|
import { usePage } from "@inertiajs/vue3";
|
||||||
|
import { computed } from "vue";
|
||||||
|
import {SharedProps} from "@/Types/types";
|
||||||
|
import { router } from "@inertiajs/vue3";
|
||||||
|
|
||||||
|
defineOptions({ layout: MainLayout });
|
||||||
|
|
||||||
|
const page = usePage<SharedProps>();
|
||||||
|
const name = computed(() => page?.props?.auth?.user?.name || 'there');
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Head title="Dashboard" />
|
<Head title="Dashboard" />
|
||||||
|
<GlassBox :title="`Hey there ${name} 👋`" blurb="What would you like to do?">
|
||||||
<AuthenticatedLayout>
|
<v-container>
|
||||||
<template #header>
|
<v-row>
|
||||||
<h2
|
<v-col cols="12" md="6">
|
||||||
class="text-xl font-semibold leading-tight text-gray-800"
|
<v-btn size="large" block href="#">
|
||||||
>
|
Add a Flight
|
||||||
Dashboard
|
</v-btn>
|
||||||
</h2>
|
</v-col>
|
||||||
</template>
|
<v-col cols="12" md="6">
|
||||||
|
<v-btn size="large" block href="#">
|
||||||
<div class="py-12">
|
Edit Flights
|
||||||
<div class="mx-auto max-w-7xl sm:px-6 lg:px-8">
|
</v-btn>
|
||||||
<div
|
</v-col>
|
||||||
class="overflow-hidden bg-white shadow-sm sm:rounded-lg"
|
<v-col cols="12" md="6">
|
||||||
>
|
<v-btn size="large" block :href="route('import.fr24')">
|
||||||
<div class="p-6 text-gray-900">
|
Import from FR24
|
||||||
You're logged in!
|
</v-btn>
|
||||||
</div>
|
</v-col>
|
||||||
</div>
|
<v-col cols="12" md="6">
|
||||||
</div>
|
<v-btn size="large" block href="#">
|
||||||
</div>
|
View Profile
|
||||||
</AuthenticatedLayout>
|
</v-btn>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12">
|
||||||
|
<v-btn size="large" block @click="router.post(route('logout'))">
|
||||||
|
Log Out
|
||||||
|
</v-btn>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</v-container>
|
||||||
|
</GlassBox>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -94,9 +94,10 @@ function submit() {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<Head title="Reconcile"></Head>
|
<Head title="Reconcile"></Head>
|
||||||
<GlassBox>
|
<GlassBox
|
||||||
<h2>Reconcile {{flight.flight_number.length > 1 ? 'Flight ' + flight.flight_number: 'This Flight'}}</h2>
|
:title="flight.flight_number.length > 1 ? 'Reconcile ' + flight.flight_number : 'Reconcile This Flight'"
|
||||||
<p>Review and correct your imported flight details before they're saved.</p>
|
blurb="Review and correct your imported flight details before they're saved."
|
||||||
|
>
|
||||||
|
|
||||||
<v-form style="width: 100%">
|
<v-form style="width: 100%">
|
||||||
<v-container>
|
<v-container>
|
||||||
@@ -193,7 +194,7 @@ function submit() {
|
|||||||
<!-- Submit -->
|
<!-- Submit -->
|
||||||
<v-row>
|
<v-row>
|
||||||
<v-col cols="12" class="d-flex justify-end">
|
<v-col cols="12" class="d-flex justify-end">
|
||||||
<v-btn size="large" :loading="form.processing" :disabled="form.processing" @click="submit">
|
<v-btn block size="large" :loading="form.processing" :disabled="form.processing" @click="submit">
|
||||||
Save Flight
|
Save Flight
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|||||||
Reference in New Issue
Block a user