filters updated

This commit is contained in:
Benjamin Takats
2022-12-05 20:24:16 +01:00
parent 0e8fbd5c34
commit 646dd58826
12 changed files with 90 additions and 11 deletions

View File

@@ -18,7 +18,9 @@ class Library extends Component
public function render()
{
return view('livewire.frontend.library', [
'libraries' => \App\Models\Library::get()
'libraries' => \App\Models\Library::query()
->where('is_public', true)
->get()
->prepend(\App\Models\Library::make([
'name' => 'Alle',
])),

View File

@@ -18,7 +18,17 @@ class SearchByTagInLibrary extends Component
{
return view('livewire.frontend.search-by-tag-in-library', [
'tags' => Tag::query()
->with([
'libraryItems.libraries',
'libraryItems.lecturer',
])
->withCount([
'libraryItems',
])
->where('type', 'library_item')
->whereHas('libraryItems.libraries', function ($query) {
$query->where('is_public', true);
})
->get(),
]);
}

View File

@@ -4,10 +4,12 @@ namespace App\Http\Livewire\Tables;
use App\Models\Library;
use App\Models\LibraryItem;
use App\Models\Tag;
use Illuminate\Database\Eloquent\Builder;
use Rappasoft\LaravelLivewireTables\DataTableComponent;
use Rappasoft\LaravelLivewireTables\Views\Column;
use Rappasoft\LaravelLivewireTables\Views\Columns\ImageColumn;
use Rappasoft\LaravelLivewireTables\Views\Filters\MultiSelectFilter;
use Rappasoft\LaravelLivewireTables\Views\Filters\SelectFilter;
class LibraryItemTable extends DataTableComponent
@@ -19,15 +21,43 @@ class LibraryItemTable extends DataTableComponent
{
$this
->setPrimaryKey('id')
->setDefaultSort('order_column', 'asc');
->setDefaultSort('order_column', 'asc')
->setThAttributes(function (Column $column) {
return [
'class' => 'px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider dark:bg-gray-800 dark:text-gray-400',
'default' => false,
];
})
->setTdAttributes(function (Column $column, $row, $columnIndex, $rowIndex) {
return [
'class' => 'px-6 py-4 text-sm font-medium dark:text-white',
'default' => false,
];
})
->setColumnSelectStatus(false)
->setPerPage(50);
}
public function filters(): array
{
return [
MultiSelectFilter::make('Tag')
->options(
Tag::query()
->where('type', 'library_item')
->get()
->pluck('name', 'id')
->toArray()
)
->filter(function (Builder $builder, array $values) {
$builder->whereHas('tags', function (Builder $query) use ($values) {
$query->whereIn('tags.id', $values);
});
}),
SelectFilter::make('Bibliothek')
->options(
Library::query()
->where('is_public', true)
->get()
->prepend(new Library(['name' => 'Alle']))
->pluck('name', 'name')
@@ -73,9 +103,10 @@ class LibraryItemTable extends DataTableComponent
->sortable(),
Column::make("Art", "type")
->sortable(),
Column::make("Sprache", "language_code")
->sortable(),
Column::make("Tags")
->label(
fn($row, Column $column) => view('columns.library_items.tags')->withRow($row)
),
Column::make('')
->label(
fn($row, Column $column) => view('columns.library_items.action')->withRow($row)
@@ -86,6 +117,7 @@ class LibraryItemTable extends DataTableComponent
public function builder(): Builder
{
return LibraryItem::query()
->whereHas('libraries', fn($query) => $query->where('libraries.is_public', true))
->when($this->currentTab !== 'Alle', fn($query) => $query->whereHas('libraries',
fn($query) => $query->where('libraries.name', $this->currentTab)))
->withCount([

View File

@@ -8,4 +8,9 @@ class Tag extends \Spatie\Tags\Tag
{
return $this->morphedByMany(Course::class, 'taggable');
}
public function libraryItems()
{
return $this->morphedByMany(LibraryItem::class, 'taggable');
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Nova;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\MultiSelect;
use Laravel\Nova\Fields\Text;
@@ -47,6 +48,9 @@ class Library extends Resource
Text::make('Name')
->rules('required', 'string'),
Boolean::make('Is public', 'is_public')
->rules('required', 'boolean'),
MultiSelect::make('Languages', 'language_codes')
->options(
config('languages.languages'),

View File

@@ -7,6 +7,7 @@ use Ebess\AdvancedNovaMediaLibrary\Fields\Images;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\BelongsTo;
use Laravel\Nova\Fields\BelongsToMany;
use Laravel\Nova\Fields\Boolean;
use Laravel\Nova\Fields\Code;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Select;
@@ -91,7 +92,7 @@ class LibraryItem extends Resource
BelongsTo::make('Lecturer'),
BelongsToMany::make('Library'),
BelongsToMany::make('Library', 'libraries', Library::class),
];
}

View File

@@ -15,6 +15,8 @@ class CreateLibrariesTable extends Migration
Schema::create('libraries', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->boolean('is_public')
->default(true);
$table->json('language_codes')
->default('[]');
$table->timestamps();

View File

@@ -24,7 +24,8 @@ class CreateLibraryItemsTable extends Migration
$table->string('name');
$table->string('type');
$table->string('language_code');
$table->longText('value');
$table->longText('value')
->nullable();
$table->timestamps();
});

View File

@@ -254,11 +254,28 @@ class DatabaseSeeder extends Seeder
]);
$libraryItem = LibraryItem::create([
'lecturer_id' => 4,
'name' => 'Cryptography is Not Enough - Gigi @ Baltic Honeybadger 2022 ',
'name' => 'Cryptography is Not Enough - Gigi @ Baltic Honeybadger 2022 ',
'type' => 'youtube_video',
'language_code' => 'de',
'value' => 'https://www.youtube.com/watch?v=C7ynm0Zkwfk',
]);
$libraryItem->syncTagsWithType(['Proof of Work'], 'library_item');
$library->libraryItems()
->attach($libraryItem);
$nonPublicLibrary = Library::create([
'name' => 'Einundzwanzig Dozenten',
'is_public' => false,
'language_codes' => ['de', 'en'],
]);
$libraryItem = LibraryItem::create([
'lecturer_id' => 4,
'name' => 'Präsentation: Bitcoin VHS Kurs 2022',
'type' => 'downloadable_file',
'language_code' => 'de',
'value' => null,
]);
$libraryItem->syncTagsWithType(['Präsentationen'], 'library_item');
$nonPublicLibrary->libraryItems()
->attach($libraryItem);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@@ -0,0 +1,5 @@
<div class="flex items-center">
@foreach($row->tags as $tag)
<x-badge>{{ $tag->name }}</x-badge>
@endforeach
</div>

View File

@@ -13,7 +13,7 @@
@endphp
<a
class="{{ $activeClass }} flex relative flex-col flex-shrink-0 justify-between py-1 px-3 w-full h-20 border-0 border-solid duration-300 ease-in-out cursor-pointer bg-opacity-[0.07]"
href="#"
href="{{ route('library', ['country' => $country, 'table' => ['filters' => ['tag' => [$tag->id]]]]) }}"
>
<div
class="flex flex-1 items-center p-0 m-0 text-center align-baseline border-0 border-solid"
@@ -35,14 +35,14 @@
<div
class="hidden p-0 m-0 text-sm leading-3 text-left text-blue-100 align-baseline border-0 border-solid md:block md:text-blue-100 whitespace-nowrap"
>
0
{{ $tag->libraryItems->pluck('lecturer.name')->unique()->count() }}
Dozenten
<span
class="inline-block relative top-px py-0 px-1 m-0 text-xs leading-4 align-baseline border-0 border-solid"
>
</span>
0
{{ $tag->library_items_count }}
Inhalte
</div>
</div>