Skip to content

refactor: page-based secondary navigation #409

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions app/Concerns/PagesSecondaryNavigation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace App\Concerns;

trait PagesSecondaryNavigation
{
public function getSecondaryNavigation(): array
{
return [
[
'label' => 'page.subnav.pages',
'route' => 'admin.pages.index',
],
[
'label' => 'page.subnav.groups',
'route' => 'admin.page_groups.index',
],
];
}
}
10 changes: 10 additions & 0 deletions app/Contracts/HasSecondaryNavigation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace App\Contracts;

interface HasSecondaryNavigation
{
public function getSecondaryNavigation(): array;
}
7 changes: 6 additions & 1 deletion app/Http/Controllers/Admin/PageController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace App\Http\Controllers\Admin;

use App\Concerns\PagesSecondaryNavigation;
use App\Contracts\HasSecondaryNavigation;
use App\Http\Requests\Admin\PageRequest;
use App\Http\Resources\Collections\PageCollection;
use App\Http\Resources\PageResource;
Expand All @@ -12,8 +14,10 @@
use Inertia\Inertia;
use Inertia\Response;

class PageController extends AdminController
class PageController extends AdminController implements HasSecondaryNavigation
{
use PagesSecondaryNavigation;

public function index(): Response
{
return Inertia::render('Pages/Index', [
Expand All @@ -27,6 +31,7 @@ public function index(): Response
->filter()
->paginate()
),
'subnav' => $this->getSecondaryNavigation(),
]);
}

Expand Down
109 changes: 109 additions & 0 deletions app/Http/Controllers/Admin/PageGroupController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<?php

declare(strict_types=1);

namespace App\Http\Controllers\Admin;

use App\Concerns\PagesSecondaryNavigation;
use App\Contracts\HasSecondaryNavigation;
use App\Http\Requests\Admin\PageRequest;
use App\Http\Resources\Collections\PageGroupCollection;
use App\Http\Resources\PageGroupResource;
use App\Models\Page;
use App\Models\PageGroup;
use Illuminate\Http\RedirectResponse;
use Inertia\Inertia;
use Inertia\Response;

class PageGroupController extends AdminController implements HasSecondaryNavigation
{
use PagesSecondaryNavigation;

public function index(): Response
{
return Inertia::render('Pages/Groups/Index', [
'collection' => new PageGroupCollection(
PageGroup::query()
->sort(
defaultColumn: 'created_at',
defaultDirection: 'desc'
)
->filter()
->paginate()
),
'subnav' => $this->getSecondaryNavigation(),
]);
}

public function create(): Response
{
return Inertia::render('Pages/Groups/Edit', [
'subnav' => $this->getSecondaryNavigation(),
])->model(PageGroup::class);
}

public function store(PageGroupRequest $request): RedirectResponse
{
$attributes = $request->validated();

$pageGroup = PageGroup::create($attributes);

// $pageGroup->items()->rebuildTree();

return redirect()->route('admin.page_groups.edit', $pageGroup)
->with('success', __('page_group.event.created'));
}

public function edit(PageGroup $pageGroup): Response
{
return Inertia::render('Pages/Groups/Edit', [
'resource' => PageGroupResource::make($pageGroup),
'pages' => Page::query()
->withDrafted()
->get(['id', 'title']),
'subnav' => $this->getSecondaryNavigation(),
])->model(PageGroup::class);
}

public function update(PageGroupRequest $request, PageGroup $pageGroup): RedirectResponse
{
$attributes = $request->validated();

$pageGroup->update($attributes);

return redirect()->route('admin.page_groups.edit', $pageGroup)
->with('success', __('page_group.event.updated'));
}

public function duplicate(PageGroup $pageGroup): RedirectResponse
{
$duplicate = $pageGroup->duplicate();

return redirect()->route('admin.page_groups.edit', $duplicate)
->with('success', __('page_group.event.duplicated'));
}

public function destroy(PageGroup $pageGroup): RedirectResponse
{
$pageGroup->delete();

return redirect()->route('admin.page_groups.index')
->with('success', __('page_group.event.deleted'));
}

public function restore(PageGroup $pageGroup): RedirectResponse
{
$pageGroup->restore();

return redirect()->route('admin.page_groups.edit', $pageGroup)
->with('success', __('page_group.event.restored'));
}

public function forceDelete(PageGroup $pageGroup): RedirectResponse
{
$pageGroup->forceDelete();

return redirect()->route('admin.page_groups.index')
->with('success', __('page_group.event.deleted'));
}
}
24 changes: 24 additions & 0 deletions app/Http/Requests/Admin/PageGroupRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

declare(strict_types=1);

namespace App\Http\Requests\Admin;

use App\Models\PageGroup;
use App\Services\TranslatableFormRequestRules;

class PageGroupRequest extends MenuRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
return TranslatableFormRequestRules::make(PageGroup::class, [
'title' => ['required', 'string', 'max:200'],
...$this->nestedRules(3),
]);
}
}
17 changes: 17 additions & 0 deletions app/Http/Resources/Collections/PageGroupCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace App\Http\Resources\Collections;

class PageGroupCollection extends ResourceCollection
{
/**
* The default table columns.
*
* @var array
*/
protected array $columns = [
'title', 'pages_count',
];
}
43 changes: 43 additions & 0 deletions app/Http/Resources/PageGroupResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

declare(strict_types=1);

namespace App\Http\Resources;

use Illuminate\Http\Request;

class PageGroupResource extends Resource
{
public array $routeMap = [
'admin.page_groups.index' => 'index',
'admin.page_groups.edit' => 'edit',
];

protected function index(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->title,
'pages_count' => $this->pages_count,
];
}

protected function edit(Request $request): array
{
return [
'id' => $this->id,
'title' => $this->getTranslations('title'),
'items' => $this->items,
];
}

protected function default(Request $request): array
{
$this->withoutPermissions();

return [
'id' => $this->id,
'title' => $this->title,
];
}
}
42 changes: 42 additions & 0 deletions app/Models/PageGroup.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

declare(strict_types=1);

namespace App\Models;

use App\Traits\ClearsResponseCache;
use App\Traits\Duplicatable;
use App\Traits\Filterable;
use App\Traits\Sortable;
use App\Traits\Translatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class PageGroup extends Model
{
use ClearsResponseCache;
use Duplicatable;
use Filterable;
use HasFactory;
use Sortable;
use Translatable;

public array $translatable = [
'title',
];

public array $allowedSorts = [
'title',
];

public array $allowedFilters = [
//
];

public function items(): BelongsToMany
{
return $this->belongsToMany(PageGroupItem::class)
->using(PageGroupItem::class);
}
}
37 changes: 37 additions & 0 deletions app/Models/PageGroupItem.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?php

declare(strict_types=1);

namespace App\Models;

use App\Traits\ClearsResponseCache;
use App\Traits\Sortable;
use App\Traits\Translatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\Pivot;

class PageGroupItem extends Pivot
{
use ClearsResponseCache;
use HasFactory;
use Sortable;
use Translatable;

public array $translatable = [
'title',
];

public array $allowedSorts = [
'title',
];

public array $allowedFilters = [
//
];

public function page(): BelongsTo
{
return $this->belongsTo(Page::class);
}
}
Loading