update includes
This commit is contained in:
172
resources/views/admin/workshop/edit.blade.php
Normal file
172
resources/views/admin/workshop/edit.blade.php
Normal file
@@ -0,0 +1,172 @@
|
||||
@php
|
||||
$workshopContent = isset($workshop) ? $workshop->content : '';
|
||||
@endphp
|
||||
<x-layout>
|
||||
<x-mast backRoute="admin.workshop.index" backTitle="Workshops">{{ isset($workshop) ? 'Edit' : 'Create' }} Workshop</x-mast>
|
||||
|
||||
<x-container class="mt-4">
|
||||
<form x-data="{type:'physical',registration:'{{old('registration', $workshop->registration ?? 'none')}}'}" method="POST" action="{{ route('admin.workshop.' . (isset($workshop) ? 'update' : 'store'), $workshop ?? []) }}">
|
||||
@isset($workshop)
|
||||
@method('PUT')
|
||||
@endisset
|
||||
@csrf
|
||||
<div class="mb-4">
|
||||
<x-ui.input label="Title" name="title" value="{!! isset($workshop) ? $workshop->title : '' !!}" />
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<x-ui.media label="Image" name="hero_media_name" value="{{ $workshop->hero_media_name ?? '' }}" allow_uploads="true" />
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:gap-8">
|
||||
<div class="flex-1">
|
||||
<x-ui.select label="Type" name="type" x-model="type">
|
||||
<option value="physical" {{ ($workshop->location_id ?? '') !== '' || !isset($workshop) ? 'selected' : '' }}>Physical</option>
|
||||
<option value="online" {{ ($workshop->location_id ?? '') === null ? 'selected' : '' }}>Online</option>
|
||||
</x-ui.select>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<span x-show="type==='physical'">
|
||||
<x-ui.select label="Location" name="location_id">
|
||||
@foreach(\App\Models\Location::orderByRaw("name = 'Online' DESC, name ASC")->get() as $location)
|
||||
<option value="{{ $location->id }}" {{ ($workshop->location_id ?? '') === $location->id ? 'selected' : '' }}>{{ $location->name }}</option>
|
||||
@endforeach
|
||||
</x-ui.select>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:gap-8">
|
||||
<div class="flex-1">
|
||||
<x-ui.input type="datetime-local" label="Start Date" name="starts_at" value="{{ \App\Helpers::timestampNoSeconds($workshop->starts_at ?? '') }}" onchange="updatedStartsAt()"/>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<x-ui.input type="datetime-local" label="End Date" name="ends_at" value="{{ \App\Helpers::timestampNoSeconds($workshop->ends_at ?? '') }}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:gap-8">
|
||||
<div class="flex-1">
|
||||
<x-ui.select label="Status" name="status">
|
||||
<option value="draft" {{ ($workshop->status ?? '') === 'draft' ? 'selected' : '' }}>Draft</option>
|
||||
<option value="open" {{ ($workshop->status ?? '') === 'open' ? 'selected' : '' }}>Open</option>
|
||||
<option value="private" {{ ($workshop->status ?? '') === 'private' ? 'selected' : '' }}>Private</option>
|
||||
<option value="full" {{ ($workshop->status ?? '') === 'full' ? 'selected' : '' }}>Full</option>
|
||||
<option value="scheduled" {{ ($workshop->status ?? '') === 'scheduled' ? 'selected' : '' }}>Scheduled</option>
|
||||
<option value="closed" {{ ($workshop->status ?? '') === 'closed' ? 'selected' : '' }}>Closed</option>
|
||||
<option value="cancelled" {{ ($workshop->status ?? '') === 'cancelled' ? 'selected' : '' }}>Cancelled</option>
|
||||
</x-ui.select>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<x-ui.input type="datetime-local" label="Publish Date" name="publish_at" value="{{ \App\Helpers::timestampNoSeconds($workshop->publish_at ?? '') }}" onchange="updatedPublishAt()" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:gap-8">
|
||||
<div class="hidden sm:block flex-1">
|
||||
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<x-ui.input type="datetime-local" label="Closes Date" name="closes_at" value="{{ \App\Helpers::timestampNoSeconds($workshop->closes_at ?? '') }}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:gap-8">
|
||||
<div class="flex-1">
|
||||
<x-ui.input label="Price" name="price" info="Leave blank to hide from public. Also supports Free, TBD or TBC" value="{{ $workshop->price ?? '' }}" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<x-ui.input label="Ages" name="ages" info="Leave blank to hide from public" value="{{ $workshop->ages ?? '8+' }}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row sm:gap-8">
|
||||
<div class="flex-1">
|
||||
<x-ui.select label="Registration" name="registration" x-model="registration" onchange="document.getElementsByName('registration_data').forEach((e)=>e.value='')">
|
||||
<option value="none" {{ (old('registration', $workshop->registration ?? '')) === 'none' ? 'selected' : '' }}>None</option>
|
||||
<option value="link" {{ (old('registration', $workshop->registration ?? '')) === 'link' ? 'selected' : '' }}>External Link</option>
|
||||
<option value="email" {{ (old('registration', $workshop->registration ?? '')) === 'email' ? 'selected' : '' }}>External Email</option>
|
||||
<option value="message" {{ (old('registration', $workshop->registration ?? '')) === 'message' ? 'selected' : '' }}>Custom Message</option>
|
||||
</x-ui.select>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<span x-show="registration==='link'">
|
||||
<x-ui.input label="Registration URL" name="registration_url" id="registration_url" value="{!! isset($workshop) ? $workshop->registration_data : '' !!}" error="{{ $errors->first('registration_data') }}" />
|
||||
</span>
|
||||
<span x-show="registration==='email'">
|
||||
<x-ui.input label="Registration Email" name="registration_email" id="registration_email" value="{{ $workshop->registration_data ?? '' }}" error="{{ $errors->first('registration_data') }}" />
|
||||
</span>
|
||||
<span x-show="registration==='message'">
|
||||
<x-ui.input label="Registration Message" name="registration_message" id="registration_message" value="{{ $workshop->registration_data ?? '' }}" error="{{ $errors->first('registration_data') }}" />
|
||||
</span>
|
||||
<input type="hidden" name="registration_data" id="registration_data" value="{{ $workshop->registration_data ?? '' }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<x-ui.editor
|
||||
label="Content"
|
||||
name="content"
|
||||
value="{!! $workshopContent !!}"
|
||||
></x-ui.editor>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<x-ui.filelist
|
||||
label="Files"
|
||||
name="files"
|
||||
editor="true"
|
||||
value="{!! isset($workshop) ? $workshop->files()->orderBy('name')->get() : '' !!}"
|
||||
></x-ui.filelist>
|
||||
</div>
|
||||
<div class="flex justify-end gap-4 mt-8">
|
||||
@isset($workshop)
|
||||
<x-ui.button type="button" color="danger" x-data x-on:click.prevent="SM.confirmDelete('{{ csrf_token() }}', 'Delete workshop?', 'Are you sure you want to delete this workshop? This action cannot be undone', '{{ route('admin.workshop.destroy', $workshop) }}')">Delete</x-ui.button>
|
||||
@endisset
|
||||
<x-ui.button type="submit">{{ isset($workshop) ? 'Save' : 'Create' }}</x-ui.button>
|
||||
</div>
|
||||
</form>
|
||||
</x-container>
|
||||
</x-layout>
|
||||
|
||||
<script>
|
||||
function updatedStartsAt() {
|
||||
const startsAt = document.getElementsByName('starts_at')[0].value;
|
||||
console.log(startsAt);
|
||||
|
||||
const elemEndsAt = document.getElementsByName('ends_at')[0];
|
||||
if(elemEndsAt.value === '') {
|
||||
let endsAt = new Date(startsAt);
|
||||
endsAt.setHours(endsAt.getHours() + 1);
|
||||
document.getElementsByName('ends_at')[0].value = SM.toLocalISOString(endsAt);
|
||||
}
|
||||
|
||||
let closesAt = new Date(startsAt);
|
||||
closesAt.setHours(closesAt.getHours() - 2);
|
||||
document.getElementsByName('closes_at')[0].value = SM.toLocalISOString(closesAt);
|
||||
}
|
||||
|
||||
function updatedPublishAt() {
|
||||
const publishAt = document.getElementsByName('publish_at')[0].value;
|
||||
const now = new Date();
|
||||
|
||||
if (publishAt > now) {
|
||||
document.getElementsByName('status')[0].value = 'scheduled';
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const elementIds = ['registration_url', 'registration_email', 'registration_message'];
|
||||
const registrationElem = document.getElementById('registration_data');
|
||||
|
||||
if(registrationElem) {
|
||||
elementIds.forEach(id => {
|
||||
const elem = document.getElementById(id);
|
||||
if (elem) {
|
||||
elem.addEventListener('change', function(event) {
|
||||
registrationElem.value = event.target.value;
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
/* Initalize */
|
||||
const elemPublishAt = document.getElementsByName('publish_at')[0];
|
||||
if(elemPublishAt && elemPublishAt.value === '') {
|
||||
let publishAt = new Date();
|
||||
document.getElementsByName('publish_at')[0].value = SM.toLocalISOString(publishAt);
|
||||
}
|
||||
|
||||
</script>
|
||||
55
resources/views/admin/workshop/index.blade.php
Normal file
55
resources/views/admin/workshop/index.blade.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<x-layout>
|
||||
<x-mast>Workshops</x-mast>
|
||||
|
||||
<x-container>
|
||||
<div class="flex my-4 items-center">
|
||||
<div class="flex-1">
|
||||
<x-ui.button type="link" href="{{ route('admin.workshop.create') }}">Create</x-ui.button>
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<x-ui.search name="search" label="Search" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if($workshops->isEmpty())
|
||||
<x-none-found item="workshops" search="{{ request()->get('search') }}" />
|
||||
@else
|
||||
<x-ui.table>
|
||||
<x-slot:header>
|
||||
<th>Title</th>
|
||||
<th class="hidden lg:table-cell">Status</th>
|
||||
<th class="hidden lg:table-cell">Location</th>
|
||||
<th class="hidden md:table-cell">Starts</th>
|
||||
<th>Action</th>
|
||||
</x-slot:header>
|
||||
<x-slot:body>
|
||||
@foreach ($workshops as $workshop)
|
||||
<tr>
|
||||
<td class="flex items-center">
|
||||
<img src="{{ $workshop->hero->thumbnail }}" class="max-h-12 max-w-12 -ml-2 -my-3 mr-3 inline rounded" alt="{{ $workshop->hero->title }}" />
|
||||
<div>
|
||||
<div class="whitespace-normal">{{ $workshop->title }}</div>
|
||||
<div class="lg:hidden text-xs text-gray-500">{{ $workshop->location->name }} ({{ ucwords($workshop->status) }})</div>
|
||||
<div class="md:hidden text-xs text-gray-500">{{ \Carbon\Carbon::parse($workshop->starts_at)->format('j/m/Y g:i a') }}</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="hidden lg:table-cell">{{ ucwords($workshop->status) }}</td>
|
||||
<td class="hidden lg:table-cell">{{ $workshop->location->name }}</td>
|
||||
<td class="hidden md:table-cell">{{ \Carbon\Carbon::parse($workshop->starts_at)->format('M j Y, g:i a') }}</td>
|
||||
<td>
|
||||
<div class="flex justify-center gap-3">
|
||||
<a href="{{ route('admin.workshop.edit', $workshop) }}" class="hover:text-primary-color" title="Edit"><i class="fa-solid fa-pen-to-square"></i></a>
|
||||
<a href="{{ route('admin.workshop.duplicate', $workshop) }}" class="hover:text-primary-color" title="Duplicate"><i class="fa-regular fa-copy"></i></a>
|
||||
<a href="#" class="hover:text-red-600" x-data x-on:click.prevent="SM.confirmDelete('{{ csrf_token() }}', 'Delete workshop?', 'Are you sure you want to delete this workshop? This action cannot be undone', '{{ route('admin.workshop.destroy', $workshop) }}')" title="Delete"><i class="fa-solid fa-trash"></i></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</x-slot:body>
|
||||
</x-ui.table>
|
||||
|
||||
{{ $workshops->appends(request()->query())->links() }}
|
||||
@endif
|
||||
|
||||
</x-container>
|
||||
</x-layout>
|
||||
45
resources/views/components/panel-workshop.blade.php
Normal file
45
resources/views/components/panel-workshop.blade.php
Normal file
@@ -0,0 +1,45 @@
|
||||
@props(['workshop'])
|
||||
|
||||
@php
|
||||
$statusClass = $workshop->status;
|
||||
$statusTitle = $workshop->status;
|
||||
|
||||
if($workshop->status === 'scheduled') {
|
||||
$statusClass = 'soon';
|
||||
$statusTitle = 'Open soon';
|
||||
}
|
||||
@endphp
|
||||
|
||||
<a href="{{ route('workshop.show', $workshop) }}" class="flex flex-col bg-white border rounded-lg overflow-hidden hover:shadow-lg hover:scale-[101%] transition-all relative {{ $attributes->get('class') }}">
|
||||
<div class="shadow border rounded px-3 py-2 absolute top-2 left-2 flex flex-col justify-center items-center bg-white">
|
||||
<div class="text-gray-600 font-bold leading-none">{{ $workshop->starts_at->format('j') }}</div>
|
||||
<div class="text-gray-600 text-xs uppercase">{{ $workshop->starts_at->format('M') }}</div>
|
||||
</div>
|
||||
<div class="border border-white border-opacity-50 absolute flex items-center justify-center top-5 -right-9 bg-gray-500 w-36 text-sm text-white font-bold uppercase py-1 rotate-45 h-8 sm-banner-{{ strtolower($statusClass) }}">{{ $statusTitle }}</div>
|
||||
<img src="{{ $workshop->hero?->url }}?md" alt="{{ $workshop->title }}" class="w-full h-64 object-cover object-center">
|
||||
<div class="flex-grow p-4 flex flex-col">
|
||||
<h2 class="flex-grow {{ strlen($workshop->title) > 25 ? 'text-lg' : 'text-xl' }} font-bold mb-2">{{ $workshop->title }}</h2>
|
||||
<div class="text-gray-600 text-sm mb-1 flex gap-2">
|
||||
<div class="w-6 flex items-center justify-center">
|
||||
<i class="fa-regular fa-calendar"></i>
|
||||
</div>{{ $workshop->starts_at->format('j/m/Y @ g:i a') }}
|
||||
</div>
|
||||
<div class="text-gray-600 text-sm mb-1 flex gap-2">
|
||||
<div class="w-6 flex items-center justify-center">
|
||||
<i class="fa-solid fa-location-dot"></i>
|
||||
</div>{{ $workshop->location->name }}
|
||||
</div>
|
||||
@if($workshop->ages)
|
||||
<div class="text-gray-600 text-sm mb-1 flex gap-2">
|
||||
<div class="w-6 flex items-center justify-center">
|
||||
<i class="fa-regular fa-face-smile"></i>
|
||||
</div>{{ isset($workshop->ages) && $workshop->ages !== '' ? 'Ages ' . $workshop->ages : 'All ages' }}
|
||||
</div>
|
||||
@endif
|
||||
<div class="text-gray-600 text-sm mb-1 flex gap-2">
|
||||
<div class="w-6 flex items-center justify-center">
|
||||
<i class="fa-solid fa-dollar-sign"></i>
|
||||
</div>{{ isset($workshop->price) && $workshop->price !== '' && $workshop->price !== '0' ? $workshop->price : 'Free' }}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
5
resources/views/errors/401.blade.php
Normal file
5
resources/views/errors/401.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('errors::minimal')
|
||||
|
||||
@section('title', __('Unauthorized'))
|
||||
@section('code', '401')
|
||||
@section('message', __('Unauthorized'))
|
||||
5
resources/views/errors/402.blade.php
Normal file
5
resources/views/errors/402.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('errors::minimal')
|
||||
|
||||
@section('title', __('Payment Required'))
|
||||
@section('code', '402')
|
||||
@section('message', __('Payment Required'))
|
||||
5
resources/views/errors/419.blade.php
Normal file
5
resources/views/errors/419.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('errors::minimal')
|
||||
|
||||
@section('title', __('Page Expired'))
|
||||
@section('code', '419')
|
||||
@section('message', __('Page Expired'))
|
||||
5
resources/views/errors/429.blade.php
Normal file
5
resources/views/errors/429.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('errors::minimal')
|
||||
|
||||
@section('title', __('Too Many Requests'))
|
||||
@section('code', '429')
|
||||
@section('message', __('Too Many Requests'))
|
||||
5
resources/views/errors/500.blade.php
Normal file
5
resources/views/errors/500.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('errors::minimal')
|
||||
|
||||
@section('title', __('Server Error'))
|
||||
@section('code', '500')
|
||||
@section('message', __('Server Error'))
|
||||
53
resources/views/errors/layout.blade.php
Normal file
53
resources/views/errors/layout.blade.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<title>@yield('title')</title>
|
||||
|
||||
<!-- Styles -->
|
||||
<style>
|
||||
html, body {
|
||||
background-color: #fff;
|
||||
color: #636b6f;
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
font-weight: 100;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.full-height {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.position-ref {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.content {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 36px;
|
||||
padding: 20px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center position-ref full-height">
|
||||
<div class="content">
|
||||
<div class="title">
|
||||
@yield('message')
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
34
resources/views/errors/minimal.blade.php
Normal file
34
resources/views/errors/minimal.blade.php
Normal file
File diff suppressed because one or more lines are too long
58
resources/views/vendor/notifications/email.blade.php
vendored
Normal file
58
resources/views/vendor/notifications/email.blade.php
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
<x-mail::message>
|
||||
{{-- Greeting --}}
|
||||
@if (! empty($greeting))
|
||||
# {{ $greeting }}
|
||||
@else
|
||||
@if ($level === 'error')
|
||||
# @lang('Whoops!')
|
||||
@else
|
||||
# @lang('Hello!')
|
||||
@endif
|
||||
@endif
|
||||
|
||||
{{-- Intro Lines --}}
|
||||
@foreach ($introLines as $line)
|
||||
{{ $line }}
|
||||
|
||||
@endforeach
|
||||
|
||||
{{-- Action Button --}}
|
||||
@isset($actionText)
|
||||
<?php
|
||||
$color = match ($level) {
|
||||
'success', 'error' => $level,
|
||||
default => 'primary',
|
||||
};
|
||||
?>
|
||||
<x-mail::button :url="$actionUrl" :color="$color">
|
||||
{{ $actionText }}
|
||||
</x-mail::button>
|
||||
@endisset
|
||||
|
||||
{{-- Outro Lines --}}
|
||||
@foreach ($outroLines as $line)
|
||||
{{ $line }}
|
||||
|
||||
@endforeach
|
||||
|
||||
{{-- Salutation --}}
|
||||
@if (! empty($salutation))
|
||||
{{ $salutation }}
|
||||
@else
|
||||
@lang('Regards'),<br>
|
||||
{{ config('app.name') }}
|
||||
@endif
|
||||
|
||||
{{-- Subcopy --}}
|
||||
@isset($actionText)
|
||||
<x-slot:subcopy>
|
||||
@lang(
|
||||
"If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
|
||||
'into your web browser:',
|
||||
[
|
||||
'actionText' => $actionText,
|
||||
]
|
||||
) <span class="break-all">[{{ $displayableActionUrl }}]({{ $actionUrl }})</span>
|
||||
</x-slot:subcopy>
|
||||
@endisset
|
||||
</x-mail::message>
|
||||
33
resources/views/workshop/index.blade.php
Normal file
33
resources/views/workshop/index.blade.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<x-layout>
|
||||
<x-slot name="title">Workshops</x-slot>
|
||||
<x-mast title="Workshops" :tabs="[
|
||||
['title' => 'Upcoming', 'route' => route('workshop.index')],
|
||||
['title' => 'Past', 'route' => route('workshop.past.index')],
|
||||
]"/>
|
||||
<section class="bg-gray-100">
|
||||
<x-container class="my-4">
|
||||
<x-ui.search class="md:hidden" name="search" label="Search" value="{{ request()->get('search') }}" />
|
||||
<form class="hidden md:flex gap-4" method="GET" action="{{ request()->url() }}">
|
||||
<x-ui.input no-label class="my-0 flex-1" type="text" name="search" label="Keywords" value="{{ request()->get('search') }}"/>
|
||||
<x-ui.input no-label class="my-0 flex-1" type="text" name="location" label="Location" value="{{ request()->get('location') }}"/>
|
||||
<x-ui.input no-label class="my-0 flex-1" type="text" name="date" label="Date Range" value="{{ request()->get('date') }}"/>
|
||||
<x-ui.button type="submit"><i class="fa-solid fa-magnifying-glass"></i></x-ui.button>
|
||||
</form>
|
||||
</x-container>
|
||||
|
||||
@if($workshops->isEmpty())
|
||||
<x-container class="mt-8">
|
||||
<x-none-found item="workshops" search="{{ request()->get('search') }}" />
|
||||
</x-container>
|
||||
@else
|
||||
<x-container class="mt-4" inner-class="grid md:grid-cols-2 lg:grid-cols-3 gap-8 w-full">
|
||||
@foreach ($workshops as $workshop)
|
||||
<x-panel-workshop :workshop="$workshop" />
|
||||
@endforeach
|
||||
</x-container>
|
||||
<x-container>
|
||||
{{ $workshops->appends(request()->query())->links() }}
|
||||
</x-container>
|
||||
@endif
|
||||
</section>
|
||||
</x-layout>
|
||||
69
resources/views/workshop/show.blade.php
Normal file
69
resources/views/workshop/show.blade.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<x-layout>
|
||||
<x-container>
|
||||
<x-ui.image-hero :image="$workshop->hero?->url" class="my-8" />
|
||||
<div class="flex sm:gap-16 gap-4 flex-col sm:flex-row">
|
||||
<div class="flex flex-col flex-1">
|
||||
<h1 class="text-3xl font-bold mb-6">{!! $workshop->title !!}</h1>
|
||||
<article class="content mb-4">{!! $workshop->content !!}</article>
|
||||
<x-ui.filelist class="mt-16" value="{!! $workshop->files()->orderBy('name')->get() !!}" />
|
||||
</div>
|
||||
<div class="flex flex-col sm:pt-8 basis-64 flex-grow-0 flex-shrink-0">
|
||||
@if($workshop->status === 'closed')
|
||||
<div class="sm-registration-closed">Registration for this event has closed.</div>
|
||||
@elseif($workshop->status === 'full')
|
||||
<div class="sm-registration-full">This workshop is currently full.</div>
|
||||
@elseif($workshop->status === 'private')
|
||||
<div class="sm-registration-private">This is a private event. Please contact the organiser for details.</div>
|
||||
@if($workshop->registration === 'link')
|
||||
<x-ui.button href="{!! $workshop->registration_data !!}" class="my-4">Register for Event</x-ui.button>
|
||||
@elseif($workshop->registration === 'message')
|
||||
<div class="sm-registration-message">{{ $workshop->registration_data }}</div>
|
||||
@endif
|
||||
@elseif($workshop->status === 'scheduled')
|
||||
<div class="sm-registration-scheduled">Registration for this workshop will open soon.</div>
|
||||
@elseif($workshop->status === 'cancelled')
|
||||
<div class="sm-registration-cancelled">This workshop has been cancelled.</div>
|
||||
@elseif($workshop->registration === 'none')
|
||||
<div class="sm-registration-none">Registration not required for this event. Arrive early to avoid disappointment as seating maybe limited.</div>
|
||||
@elseif($workshop->registration === 'link')
|
||||
<x-ui.button href="{!! $workshop->registration_data !!}" class="my-4">Register for Event</x-ui.button>
|
||||
@elseif($workshop->registration === 'email')
|
||||
<div class="sm-registration-email">Registration for this event by emailing <a href="mailto:{{ $workshop->registration_data }}" class="link">{{ $workshop->registration_data }}</a>.</div>
|
||||
@elseif($workshop->registration === 'message')
|
||||
<div class="sm-registration-message">{{ $workshop->registration_data }}</div>
|
||||
@endif
|
||||
@if(auth()->user()?->admin)
|
||||
<x-ui.button class="mb-4" color="primary-outline" href="{{ route('admin.workshop.edit', $workshop) }}">Edit Workshop</x-ui.button>
|
||||
@endif
|
||||
<h2 class="text-gray-600 text-lg font-bold mt-4 mb-2"><i class="mr-1 fa-regular fa-calendar"></i> Date/Time</h2>
|
||||
<p class="text-gray-600 text-sm pl-6 mb-6">{!! implode('<br />', \App\Helpers::createTimeDurationStr($workshop->starts_at, $workshop->ends_at)) !!}</p>
|
||||
<h2 class="text-gray-600 text-lg font-bold mb-2"><i class="mr-1 fa-solid fa-location-dot"></i> Location</h2>
|
||||
<div class="text-gray-600 text-sm pl-6 mb-6">
|
||||
@if($workshop->location->url)
|
||||
<a href="{{ $workshop->location->url }}" class="link">
|
||||
@endif
|
||||
<p>{{ $workshop->location->name }}</p>
|
||||
@if($workshop->location->url)
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@if($workshop->location->address_url)
|
||||
<a href="{{ $workshop->location->address_url }}" class="link" target="_blank">
|
||||
@endif
|
||||
<p class="text-xs">{{ $workshop->location->address }}</p>
|
||||
@if($workshop->location->address_url)
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
<h2 class="text-gray-600 text-lg font-bold mb-2"><i class="mr-1 fa-regular fa-face-smile"></i> {{ isset($workshop->ages) && $workshop->ages !== '' ? 'Ages ' . $workshop->ages : 'All ages' }}</h2>
|
||||
@if(\App\Helpers::isUnderAge($workshop->ages))
|
||||
<p class="text-gray-600 text-xs pl-3 ml-2 mb-6 border-l-4 border-l-yellow-400">Parental supervision may be required for children 8 years of age and under.</p>
|
||||
@endif
|
||||
<h2 class="text-gray-600 text-lg font-bold mb-2"><i class="mr-1 fa-solid fa-dollar-sign"></i> {{ isset($workshop->price) && $workshop->price !== '' && $workshop->price !== '0' ? $workshop->price : 'Free' }}</h2>
|
||||
{{-- @if(isset($workshop->price) && $workshop->price !== '' && $workshop->price !== '0' && strtolower($workshop->price) !== 'free')--}}
|
||||
{{-- <p class="text-gray-600 text-xs pl-3 ml-2 mb-6 border-l-4 border-l-green-500">Payment by cash or EFTPOS accepted. Please ensure correct change.</p>--}}
|
||||
{{-- @endif--}}
|
||||
</div>
|
||||
</div>
|
||||
</x-container>
|
||||
</x-layout>
|
||||
Reference in New Issue
Block a user