mirror of
https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal.git
synced 2025-12-11 06:46:47 +00:00
bitcoin event front end forms added
This commit is contained in:
77
app/Http/Controllers/Api/VenueController.php
Normal file
77
app/Http/Controllers/Api/VenueController.php
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Lecturer;
|
||||||
|
use App\Models\Venue;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class VenueController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
return Venue::query()
|
||||||
|
->with(['city:id,name,country_id', 'city.country:id,name,code'])
|
||||||
|
->select('id', 'name', 'city_id')
|
||||||
|
->orderBy('name')
|
||||||
|
->when(
|
||||||
|
$request->search,
|
||||||
|
fn(Builder $query) => $query
|
||||||
|
->where('name', 'ilike', "%{$request->search}%")
|
||||||
|
)
|
||||||
|
->when(
|
||||||
|
$request->exists('selected'),
|
||||||
|
fn(Builder $query) => $query->whereIn('id',
|
||||||
|
$request->input('selected', [])),
|
||||||
|
fn(Builder $query) => $query->limit(10)
|
||||||
|
)
|
||||||
|
->get()
|
||||||
|
->map(function (Venue $venue) {
|
||||||
|
$venue->flag = asset('vendor/blade-country-flags/4x3-'.$venue->city->country->code.'.svg');
|
||||||
|
|
||||||
|
return $venue;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function store(Request $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function show(Lecturer $lecturer)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function update(Request $request, Lecturer $lecturer)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function destroy(Lecturer $lecturer)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
||||||
82
app/Http/Livewire/BitcoinEvent/Form/BitcoinEventForm.php
Normal file
82
app/Http/Livewire/BitcoinEvent/Form/BitcoinEventForm.php
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Livewire\BitcoinEvent\Form;
|
||||||
|
|
||||||
|
use App\Models\BitcoinEvent;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
use Livewire\Component;
|
||||||
|
use Livewire\WithFileUploads;
|
||||||
|
use WireUi\Traits\Actions;
|
||||||
|
|
||||||
|
class BitcoinEventForm extends Component
|
||||||
|
{
|
||||||
|
use WithFileUploads;
|
||||||
|
use Actions;
|
||||||
|
|
||||||
|
public string $country;
|
||||||
|
|
||||||
|
public ?BitcoinEvent $bitcoinEvent = null;
|
||||||
|
|
||||||
|
public $image;
|
||||||
|
|
||||||
|
public ?string $fromUrl = '';
|
||||||
|
|
||||||
|
protected $queryString = [
|
||||||
|
'fromUrl' => [
|
||||||
|
'except' => null,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'image' => [Rule::requiredIf(!$this->bitcoinEvent->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'],
|
||||||
|
|
||||||
|
'bitcoinEvent.venue_id' => 'required',
|
||||||
|
'bitcoinEvent.from' => 'required',
|
||||||
|
'bitcoinEvent.to' => 'required',
|
||||||
|
'bitcoinEvent.title' => 'required',
|
||||||
|
'bitcoinEvent.description' => 'required',
|
||||||
|
'bitcoinEvent.link' => 'required|url',
|
||||||
|
'bitcoinEvent.show_worldwide' => 'bool',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mount()
|
||||||
|
{
|
||||||
|
if (!$this->bitcoinEvent) {
|
||||||
|
$this->bitcoinEvent = new BitcoinEvent(
|
||||||
|
[
|
||||||
|
'description' => '',
|
||||||
|
'show_worldwide' => true,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
} elseif (!auth()
|
||||||
|
->user()
|
||||||
|
->can('update', $this->bitcoinEvent)) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->fromUrl) {
|
||||||
|
$this->fromUrl = url()->previous();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function submit()
|
||||||
|
{
|
||||||
|
$this->validate();
|
||||||
|
$this->bitcoinEvent->save();
|
||||||
|
|
||||||
|
if ($this->image) {
|
||||||
|
$this->bitcoinEvent->addMedia($this->image)
|
||||||
|
->toMediaCollection('logo');
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect($this->fromUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.bitcoin-event.form.bitcoin-event-form');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,24 +33,24 @@ class LibraryItemForm extends Component
|
|||||||
public ?string $fromUrl = '';
|
public ?string $fromUrl = '';
|
||||||
|
|
||||||
protected $queryString = [
|
protected $queryString = [
|
||||||
'fromUrl' => ['except' => ''],
|
'fromUrl' => ['except' => ''],
|
||||||
'lecturer' => ['except' => false],
|
'lecturer' => ['except' => false],
|
||||||
];
|
];
|
||||||
|
|
||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'image' => [Rule::requiredIf(! $this->libraryItem->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'],
|
'image' => [Rule::requiredIf(!$this->libraryItem->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'],
|
||||||
|
|
||||||
'library' => 'required',
|
'library' => 'required',
|
||||||
|
|
||||||
'selectedTags' => 'array|min:1',
|
'selectedTags' => 'array|min:1',
|
||||||
|
|
||||||
'libraryItem.lecturer_id' => 'required',
|
'libraryItem.lecturer_id' => 'required',
|
||||||
'libraryItem.name' => 'required',
|
'libraryItem.name' => 'required',
|
||||||
'libraryItem.type' => 'required',
|
'libraryItem.type' => 'required',
|
||||||
'libraryItem.language_code' => 'required',
|
'libraryItem.language_code' => 'required',
|
||||||
'libraryItem.value' => [
|
'libraryItem.value' => [
|
||||||
'required',
|
'required',
|
||||||
Rule::when(
|
Rule::when(
|
||||||
$this->libraryItem->type !== LibraryItemType::MarkdownArticle
|
$this->libraryItem->type !== LibraryItemType::MarkdownArticle
|
||||||
@@ -58,19 +58,19 @@ class LibraryItemForm extends Component
|
|||||||
&& $this->libraryItem->type !== LibraryItemType::DownloadableFile, ['url']
|
&& $this->libraryItem->type !== LibraryItemType::DownloadableFile, ['url']
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
'libraryItem.subtitle' => 'required',
|
'libraryItem.subtitle' => 'required',
|
||||||
'libraryItem.excerpt' => 'required',
|
'libraryItem.excerpt' => 'required',
|
||||||
'libraryItem.main_image_caption' => 'required',
|
'libraryItem.main_image_caption' => 'required',
|
||||||
'libraryItem.read_time' => 'required',
|
'libraryItem.read_time' => 'required',
|
||||||
'libraryItem.approved' => 'boolean',
|
'libraryItem.approved' => 'boolean',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
if (! $this->libraryItem) {
|
if (!$this->libraryItem) {
|
||||||
$this->libraryItem = new LibraryItem([
|
$this->libraryItem = new LibraryItem([
|
||||||
'approved' => true,
|
'approved' => true,
|
||||||
'read_time' => 1,
|
'read_time' => 1,
|
||||||
]);
|
]);
|
||||||
if ($this->lecturer) {
|
if ($this->lecturer) {
|
||||||
@@ -81,13 +81,13 @@ class LibraryItemForm extends Component
|
|||||||
$this->selectedTags = $this->libraryItem->tags()
|
$this->selectedTags = $this->libraryItem->tags()
|
||||||
->where('type', 'library_item')
|
->where('type', 'library_item')
|
||||||
->get()
|
->get()
|
||||||
->map(fn ($tag) => $tag->name)
|
->map(fn($tag) => $tag->name)
|
||||||
->toArray();
|
->toArray();
|
||||||
$this->library = $this->libraryItem->libraries()
|
$this->library = $this->libraryItem->libraries()
|
||||||
->first()
|
->first()
|
||||||
->id;
|
->id;
|
||||||
}
|
}
|
||||||
if (! $this->fromUrl) {
|
if (!$this->fromUrl) {
|
||||||
$this->fromUrl = url()->previous();
|
$this->fromUrl = url()->previous();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ class LibraryItemForm extends Component
|
|||||||
{
|
{
|
||||||
$selectedTags = collect($this->selectedTags);
|
$selectedTags = collect($this->selectedTags);
|
||||||
if ($selectedTags->contains($name)) {
|
if ($selectedTags->contains($name)) {
|
||||||
$selectedTags = $selectedTags->filter(fn ($tag) => $tag !== $name);
|
$selectedTags = $selectedTags->filter(fn($tag) => $tag !== $name);
|
||||||
} else {
|
} else {
|
||||||
$selectedTags->push($name);
|
$selectedTags->push($name);
|
||||||
}
|
}
|
||||||
@@ -134,21 +134,21 @@ class LibraryItemForm extends Component
|
|||||||
public function render()
|
public function render()
|
||||||
{
|
{
|
||||||
return view('livewire.library.form.library-item-form', [
|
return view('livewire.library.form.library-item-form', [
|
||||||
'types' => Options::forEnum(LibraryItemType::class)
|
'types' => Options::forEnum(LibraryItemType::class)
|
||||||
->filter(
|
->filter(
|
||||||
fn ($type) => $type !== LibraryItemType::PodcastEpisode
|
fn($type) => $type !== LibraryItemType::PodcastEpisode
|
||||||
&& $type !== LibraryItemType::MarkdownArticle
|
&& $type !== LibraryItemType::MarkdownArticle
|
||||||
)
|
)
|
||||||
->toArray(),
|
->toArray(),
|
||||||
'libraries' => Library::query()
|
'libraries' => Library::query()
|
||||||
->where('is_public', true)
|
->where('is_public', true)
|
||||||
->get()
|
->get()
|
||||||
->map(fn ($library) => [
|
->map(fn($library) => [
|
||||||
'id' => $library->id,
|
'id' => $library->id,
|
||||||
'name' => $library->name,
|
'name' => $library->name,
|
||||||
])
|
])
|
||||||
->toArray(),
|
->toArray(),
|
||||||
'tags' => Tag::query()
|
'tags' => Tag::query()
|
||||||
->where('type', 'library_item')
|
->where('type', 'library_item')
|
||||||
->get(),
|
->get(),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -35,7 +35,14 @@ class BitcoinEventTable extends DataTableComponent
|
|||||||
];
|
];
|
||||||
})
|
})
|
||||||
->setColumnSelectStatus(false)
|
->setColumnSelectStatus(false)
|
||||||
->setPerPage(10);
|
->setPerPage(10)
|
||||||
|
->setConfigurableAreas([
|
||||||
|
'toolbar-left-end' => [
|
||||||
|
'columns.bitcoin_events.areas.toolbar-left-end', [
|
||||||
|
'country' => $this->country,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function filters(): array
|
public function filters(): array
|
||||||
|
|||||||
71
app/Http/Livewire/Venue/Form/VenueForm.php
Normal file
71
app/Http/Livewire/Venue/Form/VenueForm.php
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Livewire\Venue\Form;
|
||||||
|
|
||||||
|
use App\Models\Venue;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
use Livewire\Component;
|
||||||
|
use Livewire\WithFileUploads;
|
||||||
|
use WireUi\Traits\Actions;
|
||||||
|
|
||||||
|
class VenueForm extends Component
|
||||||
|
{
|
||||||
|
use WithFileUploads;
|
||||||
|
use Actions;
|
||||||
|
|
||||||
|
public string $country;
|
||||||
|
|
||||||
|
public ?Venue $venue = null;
|
||||||
|
|
||||||
|
public $images;
|
||||||
|
|
||||||
|
public ?string $fromUrl = '';
|
||||||
|
|
||||||
|
protected $queryString = ['fromUrl' => ['except' => '']];
|
||||||
|
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'images.*' => [Rule::requiredIf(!$this->venue->id), 'nullable', 'mimes:jpeg,png,jpg,gif', 'max:10240'],
|
||||||
|
|
||||||
|
'venue.city_id' => 'required',
|
||||||
|
'venue.name' => 'required',
|
||||||
|
'venue.street' => 'required',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mount()
|
||||||
|
{
|
||||||
|
if (!$this->venue) {
|
||||||
|
$this->venue = new Venue();
|
||||||
|
} elseif (!auth()
|
||||||
|
->user()
|
||||||
|
->can('update', $this->venue)) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->fromUrl) {
|
||||||
|
$this->fromUrl = url()->previous();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function submit()
|
||||||
|
{
|
||||||
|
$this->validate();
|
||||||
|
$this->venue->save();
|
||||||
|
|
||||||
|
if (count($this->images) > 0) {
|
||||||
|
foreach ($this->images as $item) {
|
||||||
|
$this->venue->addMedia($item)
|
||||||
|
->toMediaCollection('images');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect($this->fromUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.venue.form.venue-form');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,15 @@ trait NostrTrait
|
|||||||
{
|
{
|
||||||
public function publishOnNostr($model, $text): array
|
public function publishOnNostr($model, $text): array
|
||||||
{
|
{
|
||||||
|
if (app()->environment('local')) {
|
||||||
|
return [
|
||||||
|
'success' => true,
|
||||||
|
'output' => 'local',
|
||||||
|
'exitCode' => 0,
|
||||||
|
'errorOutput' => ''
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
//noscl publish "Good morning!"
|
//noscl publish "Good morning!"
|
||||||
$result = Process::timeout(60 * 5)
|
$result = Process::timeout(60 * 5)
|
||||||
->run('noscl publish "'.$text.'"');
|
->run('noscl publish "'.$text.'"');
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<div class="w-full mb-4 md:w-auto md:mb-0">
|
||||||
|
<x-button :href="route('bitcoinEvent.form', ['country' => $country, 'bitcoinEvent' => null])">
|
||||||
|
<i class="fa fa-thin fa-plus"></i>
|
||||||
|
{{ __('Register event') }}
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||||
|
|
||||||
|
<div class="pb-5 flex flex-row justify-between">
|
||||||
|
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Bitcoin Event') }}</h3>
|
||||||
|
<div class="flex flex-row space-x-2 items-center">
|
||||||
|
<div>
|
||||||
|
@if($bitcoinEvent->id)
|
||||||
|
<x-button negative wire:click="deleteMe">
|
||||||
|
<i class="fa fa-thin fa-trash"></i>
|
||||||
|
{{ __('Delete') }}
|
||||||
|
</x-button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<x-button :href="$fromUrl">
|
||||||
|
<i class="fa fa-thin fa-arrow-left"></i>
|
||||||
|
{{ __('Back') }}
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||||
|
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||||
|
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||||
|
|
||||||
|
<x-input.group :for="md5('image')" :label="__('Logo')">
|
||||||
|
<div class="py-4">
|
||||||
|
@if ($image)
|
||||||
|
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||||
|
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||||
|
@endif
|
||||||
|
@if ($bitcoinEvent->getFirstMediaUrl('logo'))
|
||||||
|
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||||
|
<img class="h-48 object-contain" src="{{ $bitcoinEvent->getFirstMediaUrl('logo') }}">
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<input class="text-gray-200" type="file" wire:model="image">
|
||||||
|
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('venue_id')">
|
||||||
|
<x-slot name="label">
|
||||||
|
<div class="flex flex-row space-x-4 items-center">
|
||||||
|
<div>
|
||||||
|
{{ __('Venue') }}
|
||||||
|
</div>
|
||||||
|
<x-button xs href="{{ route('venue.form') }}">
|
||||||
|
<i class="fa fa-thin fa-plus"></i>
|
||||||
|
{{ __('Create venue') }}
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
|
</x-slot>
|
||||||
|
<x-select
|
||||||
|
autocomplete="off"
|
||||||
|
wire:model.debounce="bitcoinEvent.venue_id"
|
||||||
|
:placeholder="__('Venue')"
|
||||||
|
:async-data="[
|
||||||
|
'api' => route('api.venues.index'),
|
||||||
|
'method' => 'GET', // default is GET
|
||||||
|
]"
|
||||||
|
:template="[
|
||||||
|
'name' => 'user-option',
|
||||||
|
'config' => ['src' => 'flag']
|
||||||
|
]"
|
||||||
|
option-label="name"
|
||||||
|
option-value="id"
|
||||||
|
option-description="city.name"
|
||||||
|
/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('bitcoinEvent.from')" :label="__('Start')">
|
||||||
|
<x-datetime-picker
|
||||||
|
:clearable="false"
|
||||||
|
time-format="24"
|
||||||
|
timezone="UTC"
|
||||||
|
user-timezone="{{ config('app.user-timezone') }}"
|
||||||
|
autocomplete="off"
|
||||||
|
wire:model.debounce="bitcoinEvent.from"
|
||||||
|
display-format="DD-MM-YYYY HH:mm"
|
||||||
|
:placeholder="__('Start')"/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('bitcoinEvent.to')" :label="__('To')">
|
||||||
|
<x-datetime-picker
|
||||||
|
:clearable="false"
|
||||||
|
time-format="24"
|
||||||
|
timezone="UTC"
|
||||||
|
user-timezone="{{ config('app.user-timezone') }}"
|
||||||
|
autocomplete="off"
|
||||||
|
wire:model.debounce="bitcoinEvent.to"
|
||||||
|
display-format="DD-MM-YYYY HH:mm"
|
||||||
|
:placeholder="__('To')"/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('bitcoinEvent.title')" :label="__('Title')">
|
||||||
|
<x-input autocomplete="off" wire:model.debounce="bitcoinEvent.title"
|
||||||
|
:placeholder="__('Title')"/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('bitcoinEvent.description')" :label="__('Description')">
|
||||||
|
<div
|
||||||
|
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||||
|
<x-input.simple-mde wire:model.defer="bitcoinEvent.description"/>
|
||||||
|
@error('bitcoinEvent.description') <span class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('bitcoinEvent.link')" :label="__('Link')">
|
||||||
|
<x-input autocomplete="off" wire:model.debounce="bitcoinEvent.link"
|
||||||
|
:placeholder="__('Link')"/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('bitcoinEvent.show_worldwide')" :label="__('Show worldwide')">
|
||||||
|
<x-toggle lg autocomplete="off" wire:model.debounce="bitcoinEvent.show_worldwide"
|
||||||
|
:placeholder="__('Show worldwide')"/>
|
||||||
|
<p class="text-xs py-2 text-gray-200">{{ __('If checked, the event will be shown everywhere.') }}</p>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('action')" :label="__('Action')">
|
||||||
|
<x-button primary wire:click="submit">
|
||||||
|
<i class="fa fa-thin fa-save"></i>
|
||||||
|
{{ __('Save') }}
|
||||||
|
</x-button>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
@@ -23,12 +23,10 @@
|
|||||||
{{ __('Author') }}
|
{{ __('Author') }}
|
||||||
</div>
|
</div>
|
||||||
<div x-data="{currentUrl: window.location.href}">
|
<div x-data="{currentUrl: window.location.href}">
|
||||||
<a x-bind:href="'/content-creator/form/?fromUrl='+currentUrl">
|
<x-button xs :href="route('contentCreator.form')">
|
||||||
<x-button xs>
|
|
||||||
<i class="fa fa-thin fa-plus"></i>
|
<i class="fa fa-thin fa-plus"></i>
|
||||||
{{ __('Create new author') }}
|
{{ __('Create new author') }}
|
||||||
</x-button>
|
</x-button>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</x-slot>
|
</x-slot>
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
<div>
|
<div>
|
||||||
{{ __('City/Area') }}
|
{{ __('City/Area') }}
|
||||||
</div>
|
</div>
|
||||||
<x-button xs :href="route('city.form')" target="_blank">
|
<x-button xs :href="route('city.form')">
|
||||||
<i class="fa fa-thin fa-plus"></i>
|
<i class="fa fa-thin fa-plus"></i>
|
||||||
{{ __('New City') }}
|
{{ __('New City') }}
|
||||||
</x-button>
|
</x-button>
|
||||||
|
|||||||
94
resources/views/livewire/venue/form/venue-form.blade.php
Normal file
94
resources/views/livewire/venue/form/venue-form.blade.php
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||||
|
|
||||||
|
<div class="pb-5 flex flex-row justify-between">
|
||||||
|
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Venue') }}</h3>
|
||||||
|
<div class="flex flex-row space-x-2 items-center">
|
||||||
|
<div>
|
||||||
|
@if($venue->id)
|
||||||
|
<x-button negative wire:click="deleteMe">
|
||||||
|
<i class="fa fa-thin fa-trash"></i>
|
||||||
|
{{ __('Delete') }}
|
||||||
|
</x-button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<x-button :href="$fromUrl">
|
||||||
|
<i class="fa fa-thin fa-arrow-left"></i>
|
||||||
|
{{ __('Back') }}
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||||
|
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||||
|
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||||
|
|
||||||
|
<x-input.group :for="md5('image')" :label="__('Images')">
|
||||||
|
<div class="py-4">
|
||||||
|
@if ($images)
|
||||||
|
<div class="grid grid-cols-4 gap-1">
|
||||||
|
@foreach($images as $image)
|
||||||
|
<div>
|
||||||
|
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||||
|
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
{{--@if ($venue->getFirstMediaUrl('images'))
|
||||||
|
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||||
|
<img class="h-48 object-contain" src="{{ $venue->getFirstMediaUrl('logo') }}">
|
||||||
|
@endif--}}
|
||||||
|
</div>
|
||||||
|
<input class="text-gray-200" type="file" multiple wire:model="images">
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('city_id')">
|
||||||
|
<x-slot name="label">
|
||||||
|
<div class="flex flex-row space-x-4 items-center">
|
||||||
|
<div>
|
||||||
|
{{ __('City') }}
|
||||||
|
</div>
|
||||||
|
<x-button xs href="{{ route('city.form') }}">
|
||||||
|
<i class="fa fa-thin fa-plus"></i>
|
||||||
|
{{ __('New City') }}
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
|
</x-slot>
|
||||||
|
<x-select
|
||||||
|
:clearable="false"
|
||||||
|
autocomplete="off"
|
||||||
|
wire:model.debounce="venue.city_id"
|
||||||
|
:placeholder="__('City/Area')"
|
||||||
|
:async-data="[
|
||||||
|
'api' => route('api.cities.index'),
|
||||||
|
'method' => 'GET', // default is GET
|
||||||
|
]"
|
||||||
|
option-label="name"
|
||||||
|
option-value="id"
|
||||||
|
option-description="country.name"
|
||||||
|
/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('venue.name')" :label="__('Name')">
|
||||||
|
<x-input autocomplete="off" wire:model.debounce="venue.name"
|
||||||
|
:placeholder="__('Name')"/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('venue.street')" :label="__('Address')">
|
||||||
|
<x-input autocomplete="off" wire:model.debounce="venue.street"
|
||||||
|
:placeholder="__('Address')"/>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
<x-input.group :for="md5('action')" :label="__('Action')">
|
||||||
|
<x-button primary wire:click="submit">
|
||||||
|
<i class="fa fa-thin fa-save"></i>
|
||||||
|
{{ __('Save') }}
|
||||||
|
</x-button>
|
||||||
|
</x-input.group>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
@@ -28,15 +28,6 @@
|
|||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if(str(request()->route()->getName())->contains('bitcoinEvent.'))
|
|
||||||
<div>
|
|
||||||
<x-button xs amber href="/nova/resources/bitcoin-events" target="_blank">
|
|
||||||
<i class="fa fa-thin fa-plus"></i>
|
|
||||||
{{ __('Register event') }}
|
|
||||||
</x-button>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<x-button xs amber href="{{ route('profile.show') }}"
|
<x-button xs amber href="{{ route('profile.show') }}"
|
||||||
:active="request()->routeIs('profile.show')">
|
:active="request()->routeIs('profile.show')">
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ Route::middleware([])
|
|||||||
Route::resource('meetup', \App\Http\Controllers\Api\MeetupController::class);
|
Route::resource('meetup', \App\Http\Controllers\Api\MeetupController::class);
|
||||||
Route::resource('lecturers', \App\Http\Controllers\Api\LecturerController::class);
|
Route::resource('lecturers', \App\Http\Controllers\Api\LecturerController::class);
|
||||||
Route::resource('cities', \App\Http\Controllers\Api\CityController::class);
|
Route::resource('cities', \App\Http\Controllers\Api\CityController::class);
|
||||||
|
Route::resource('venues', \App\Http\Controllers\Api\VenueController::class);
|
||||||
Route::resource('languages', \App\Http\Controllers\Api\LanguageController::class);
|
Route::resource('languages', \App\Http\Controllers\Api\LanguageController::class);
|
||||||
Route::get('meetups', function () {
|
Route::get('meetups', function () {
|
||||||
return \App\Models\Meetup::query()
|
return \App\Models\Meetup::query()
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Route;
|
|
||||||
use Laravel\Socialite\Facades\Socialite;
|
use Laravel\Socialite\Facades\Socialite;
|
||||||
|
|
||||||
Route::middleware([])
|
Route::middleware([])
|
||||||
@@ -9,7 +8,8 @@ Route::middleware([])
|
|||||||
->name('welcome');
|
->name('welcome');
|
||||||
|
|
||||||
Route::get('/img/{path}', \App\Http\Controllers\ImageController::class)
|
Route::get('/img/{path}', \App\Http\Controllers\ImageController::class)
|
||||||
->where('path', '.*')->name('img');
|
->where('path', '.*')
|
||||||
|
->name('img');
|
||||||
|
|
||||||
Route::get('auth/auth47', \App\Http\Livewire\Auth\Auth47Component::class)
|
Route::get('auth/auth47', \App\Http\Livewire\Auth\Auth47Component::class)
|
||||||
->name('auth.auth47');
|
->name('auth.auth47');
|
||||||
@@ -52,6 +52,32 @@ Route::middleware([
|
|||||||
->name('form');
|
->name('form');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bitcoin Event
|
||||||
|
* */
|
||||||
|
Route::middleware([
|
||||||
|
'auth',
|
||||||
|
])
|
||||||
|
->as('bitcoinEvent.')
|
||||||
|
->prefix('/bitcoin-event')
|
||||||
|
->group(function () {
|
||||||
|
Route::get('/form/{bitcoinEvent?}', \App\Http\Livewire\BitcoinEvent\Form\BitcoinEventForm::class)
|
||||||
|
->name('form');
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Venue
|
||||||
|
* */
|
||||||
|
Route::middleware([
|
||||||
|
'auth',
|
||||||
|
])
|
||||||
|
->as('venue.')
|
||||||
|
->prefix('/venue')
|
||||||
|
->group(function () {
|
||||||
|
Route::get('/form/{venue?}', \App\Http\Livewire\Venue\Form\VenueForm::class)
|
||||||
|
->name('form');
|
||||||
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Cities
|
* Cities
|
||||||
* */
|
* */
|
||||||
@@ -100,12 +126,12 @@ Route::get('/auth/twitter/callback', function () {
|
|||||||
$twitterAccount = \App\Models\TwitterAccount::updateOrCreate([
|
$twitterAccount = \App\Models\TwitterAccount::updateOrCreate([
|
||||||
'twitter_id' => $twitterUser->id,
|
'twitter_id' => $twitterUser->id,
|
||||||
], [
|
], [
|
||||||
'twitter_id' => $twitterUser->id,
|
'twitter_id' => $twitterUser->id,
|
||||||
'refresh_token' => $twitterUser->refreshToken,
|
'refresh_token' => $twitterUser->refreshToken,
|
||||||
'nickname' => $twitterUser->nickname,
|
'nickname' => $twitterUser->nickname,
|
||||||
'token' => $twitterUser->token,
|
'token' => $twitterUser->token,
|
||||||
'expires_in' => $twitterUser->expiresIn,
|
'expires_in' => $twitterUser->expiresIn,
|
||||||
'data' => [],
|
'data' => [],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
echo 'Twitter account updated. We can now tweet on: '.$twitterUser->name;
|
echo 'Twitter account updated. We can now tweet on: '.$twitterUser->name;
|
||||||
|
|||||||
Reference in New Issue
Block a user