better image uploading & user roles
Some checks failed
Docker / build (push) Has been cancelled

This commit is contained in:
yuriko 🦊 2025-08-09 23:01:27 -04:00
parent 21e59d775a
commit f60ae41bf6
26 changed files with 741 additions and 70 deletions

View file

@ -0,0 +1 @@
<wa-tag size="{{ $size }}" variant="{{ $variant }}" pill>{{ $name }}</wa-tag>

View file

@ -25,11 +25,17 @@
<wa-card>
<div class="wa-stack wa-gap-l">
<div class="wa-stack">
<span class="wa-heading-m">Profile picture</span>
<input type="file" wire:model.live="avatar" wire:loading.attr="disabled" />
@error('avatar')
<span class="wa-caption-m">{{ $message }}</span>
@enderror
<span class="wa-heading-s">Profile picture</span>
<label for="avatar" class="wa-cluster wa-placeholder">
<livewire:app.icon name="image-user" class="wa-caption-l" style="font-size: var(--wa-font-size-3xl)" />
<div class="wa-stack wa-gap-3xs">
<span class="wa-heading-m">Click to upload a new profile picture.</span>
@error('avatar')
<span class="wa-caption-m">{{ $message }}</span>
@enderror
</div>
<input id="avatar" type="file" wire:model.live="avatar" wire:loading.attr="disabled" style="opacity: 0;" />
</label>
</div>
<wa-divider></wa-divider>

View file

@ -4,23 +4,40 @@
<wa-breadcrumb-item>upload</wa-breadcrumb-item>
</wa-breadcrumb>
<form wire:submit="createPost" class="wa-stack wa-gap-xl">
<wa-card class="wa-stack">
<input wire:model="file" type="file" label="file" placeholder="Select a file to upload." />
@error('file')
<span class="wa-caption-m">{{ $message }}</span>
@enderror
</wa-card>
<form wire:submit="createPost">
<div class="wa-stack wa-gap-xl"
x-data="{ uploading: false, progress: 0 }"
x-on:livewire-upload-start="uploading = true"
x-on:livewire-upload-finish="uploading = false"
x-on:livewire-upload-cancel="uploading = false"
x-on:livewire-upload-error="uploading = false"
x-on:livewire-upload-progress="progress = $event.detail.progress"
>
<label for="files" class="wa-cluster wa-placeholder wa-link-plain">
<livewire:app.icon name="file-image" class="wa-caption-l" style="font-size: var(--wa-font-size-3xl)" />
<div class="wa-stack wa-gap-3xs" wire:loading.remove>
<span class="wa-heading-m">Click to select files to upload.</span>
@error('files.*')
<span class="wa-caption-l">{{ $message }}</span>
@enderror
</div>
<div class="wa-stack wa-gap-3xs" wire:loading>
<span class="wa-heading-m">Uploading files...</span>
<wa-progress-bar x-show="uploading" x-bind.value="progress" style="--track-height: 6px;"></wa-progress-bar>
</div>
<input id="files" wire:model="files" type="file" style="opacity: 0;" multiple />
</label>
<wa-select wire:model="rating" label="Rating" value="safe" hint="Select a content rating that matches the file.">
<wa-option value="safe">Safe</wa-option>
<wa-option value="suggestive">Suggestive</wa-option>
<wa-option value="explicit">Explicit</wa-option>
</wa-select>
<wa-select wire:model="rating" label="Rating" value="safe" hint="Select a content rating that matches the file.">
<wa-option value="safe">Safe</wa-option>
<wa-option value="suggestive">Suggestive</wa-option>
<wa-option value="explicit">Explicit</wa-option>
</wa-select>
<wa-button type="submit" variant="brand" wire:loading.attr="disabled">
<livewire:app.icon slot="prefix" name="arrow-up-from-bracket" />
Upload
</wa-button>
<wa-button type="submit" variant="brand" wire:loading.attr="disabled">
<livewire:app.icon slot="prefix" name="arrow-up-from-bracket" />
Upload
</wa-button>
</div>
</form>
</div>

View file

@ -21,8 +21,10 @@
</div>
<div class="wa-cluster wa-gap-xs">
<livewire:app.icon name="hashtag" />
<a href="{{ url("posts/$post->id") }}" wire:navigate.hover>{{ $post->id }}</a>
<livewire:app.icon name="tags" />
@foreach($tags as $tag)
<a href="{{ route('tags.view', $tag) }}" style="color: {{ $tag->tagGroup->color }};" wire:navigate.hover>{{ $tag->name }}</a>
@endforeach
</div>
</div>
</div>

View file

@ -0,0 +1,11 @@
<div class="wa-stack wa-gap-3xl">
<wa-breadcrumb class="wa-heading-l">
<wa-breadcrumb-item href="{{ route('home') }}" wire:navigate.hover>{{ config('app.name') }}</wa-breadcrumb-item>
<wa-breadcrumb-item>posts</wa-breadcrumb-item>
</wa-breadcrumb>
<a class="wa-stack wa-align-items-center wa-placeholder wa-link-plain" href="{{ route('upload') }}" wire:navigate.hover>
<livewire:app.icon name="image-slash" class="wa-caption-l" style="font-size: var(--wa-font-size-3xl)" />
<span class="wa-heading-m">No posts available</span>
<p class="wa-caption-l">Click here to start uploading!</p>
</a>
</div>

View file

@ -8,5 +8,4 @@
<livewire:posts.thumbnail :$post lazy />
@endforeach
</div>
{{ $posts->links('livewire.app.pagination') }}
</div>

View file

@ -19,7 +19,7 @@
<tbody>
{{-- Untagged posts --}}
<tr>
<td>Untagged</td>
<td><a href="{{ route('tags.view-untagged') }}" wire:navigate.hover>Untagged</a></td>
<td></td>
<td><wa-format-number value="{{ $untaggedPosts->count() }}"></wa-format-number> {{ Str::plural('post', $untaggedPosts->count()) }}</td>
<td></td>
@ -27,7 +27,7 @@
@foreach ($tags as $tag)
<tr>
<td style="color: {{ $tag->tagGroup->color }}">{{ $tag->name }}</td>
<td><a href="{{ route('tags.view', $tag) }}" style="color: {{ $tag->tagGroup->color }}" wire:navigate.hover>{{ $tag->name }}</a></td>
<td>
@if ($tag->implies)
@foreach ($tag->implies as $impliesTagId)
@ -51,12 +51,17 @@
<wa-input wire:model="name" type="text" label="Tag name" @error('name') hint="{{ $message }}" @enderror></wa-input>
<wa-select wire:model="group" label="Tag group" @error('group') hint="{{ $message }}" @enderror>
@foreach ($tagGroups as $tagGroup)
<wa-option value="{{ $tagGroup->id }}" style="color: {{ $tagGroup->color }};">{{ $tagGroup->name }}</wa-option>
<wa-option value="{{ $tagGroup->id }}">{{ $tagGroup->name }}</wa-option>
@endforeach
</wa-select>
<wa-select wire:model="implies" label="Implied tags" multiple clearable @error('implies') hint="{{ $message }}" @enderror>
@foreach ($tags->all() as $tagToImply)
<wa-option value="{{ $tagToImply->id }}" style="color: {{ $tagToImply->tagGroup->color }};">{{ $tagToImply->name }}</wa-option>
<wa-option value="{{ $tagToImply->id }}">
<div class="wa-split">
<span>{{ $tagToImply->name }}</span>
<span class="wa-caption-s">{{ $tagToImply->tagGroup->name }}</span>
</div>
</wa-option>
@endforeach
</wa-select>
<wa-button type="submit" variant="brand" appearance="outlined">

View file

@ -1,3 +1,12 @@
<div>
{{-- To attain knowledge, add things every day; To attain wisdom, subtract things every day. --}}
<div class="wa-stack wa-gap-3xl">
<wa-breadcrumb class="wa-heading-l">
<wa-breadcrumb-item href="{{ route('home') }}" wire:navigate.hover>{{ config('app.name') }}</wa-breadcrumb-item>
<wa-breadcrumb-item href="{{ route('tags.home') }}" wire:navigate.hover>tags</wa-breadcrumb-item>
<wa-breadcrumb-item>{{ $tag->name ?? "Untagged" }}</wa-breadcrumb-item>
</wa-breadcrumb>
<div class="wa-cluster wa-gap-s">
@foreach ($posts as $post)
<livewire:posts.thumbnail wire:key="{{ $post->id }}" :$post lazy />
@endforeach
</div>
</div>