Skip to content

Commit 849d2de

Browse files
committed
chore: refactor basic deck functions
1 parent e1268a9 commit 849d2de

File tree

13 files changed

+302
-129
lines changed

13 files changed

+302
-129
lines changed

app/Domain/Dto/FeDeckView.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Domain\Dto;
6+
7+
use Spatie\LaravelData\Data;
8+
use Spatie\TypeScriptTransformer\Attributes\TypeScript;
9+
10+
#[TypeScript]
11+
class FeDeckView extends Data
12+
{
13+
public function __construct(
14+
public readonly int $id,
15+
public readonly string $name,
16+
public readonly ?string $description
17+
) {}
18+
}

app/Http/Controllers/DeckController.php

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66

77
use App\Domain\Dto\BeDeck;
88
use App\Domain\Dto\FeDeck;
9+
use App\Domain\Dto\FeDeckView;
10+
use App\Models\Deck;
911
use Illuminate\Http\RedirectResponse;
1012
use Illuminate\Http\Request;
13+
use Illuminate\Support\Facades\DB;
1114
use Inertia\Inertia;
1215
use Inertia\Response;
1316
use Redirect;
@@ -19,41 +22,65 @@ public function list(Request $req): Response
1922
$user = $req->user();
2023

2124
return Inertia::render('Decks/DeckList', [
22-
'decks' => FeDeck::collect($user->decks()->get()),
25+
'decks' => fn () => FeDeck::collect($user->decks()->get()),
26+
]);
27+
}
28+
29+
public function show(Deck $deck): Response
30+
{
31+
return Inertia::render('Decks/Show', [
32+
2333
]);
2434
}
2535

2636
public function create(Request $req): RedirectResponse
2737
{
2838
$user = $req->user();
2939

30-
$deck = $user->decks()
31-
->create(BeDeck::from($req)->all());
40+
$deck = DB::transaction(function () use (&$user, &$req) {
41+
$deck = $user->decks()
42+
->create(BeDeck::from($req)->all());
3243

33-
return Redirect::route('deck.edit', [
34-
'id' => $deck->id,
44+
// create a default deck view
45+
$view = $deck->views()->create([
46+
'name' => 'Default',
47+
]);
48+
49+
// create some default categories
50+
$view->categories()->createMany([
51+
['name' => 'Creatures'],
52+
['name' => 'Instants'],
53+
['name' => 'Sorceries'],
54+
['name' => 'Enchantments'],
55+
['name' => 'Artifacts'],
56+
['name' => 'Planeswalkers'],
57+
['name' => 'Lands'],
58+
['name' => 'Sideboard'],
59+
['name' => 'Other'],
60+
]);
61+
62+
return $deck;
63+
});
64+
65+
return Redirect::route('decks.edit', [
66+
'deck' => $deck->id,
3567
]);
3668
}
3769

38-
public function edit(Request $req, int $id): Response
70+
public function edit(Deck $deck): Response
3971
{
40-
$deck = $req->user()->decks()->find($id);
41-
4272
return Inertia::render('Decks/EditDeck', [
43-
'deck' => FeDeck::from($deck),
73+
'deck' => fn () => FeDeck::from($deck),
74+
'views' => fn () => FeDeckView::collect(
75+
$deck->views()->get()
76+
),
4477
]);
4578
}
4679

47-
public function update(Request $req, int $id): RedirectResponse
80+
public function update(Deck $deck, Request $req): RedirectResponse
4881
{
49-
/**
50-
* @var \App\Models\Deck
51-
*/
52-
$deck = $req->user()->decks()
53-
->find($id);
54-
5582
$deck->update(BeDeck::from($req)->all());
5683

57-
return Redirect::route('deck.list');
84+
return Redirect::route('decks.list');
5885
}
5986
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::table('views', function (Blueprint $table) {
15+
$table->dropUnique('views_name_unique');
16+
});
17+
}
18+
19+
/**
20+
* Reverse the migrations.
21+
*/
22+
public function down(): void
23+
{
24+
Schema::table('views', function (Blueprint $table) {
25+
$table->unique(['name'], 'views_name_unique');
26+
});
27+
}
28+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::table('categories', function (Blueprint $table) {
15+
$table->dropUnique('categories_name_unique');
16+
});
17+
}
18+
19+
/**
20+
* Reverse the migrations.
21+
*/
22+
public function down(): void
23+
{
24+
Schema::table('categories', function (Blueprint $table) {
25+
$table->unique(['name'], 'categories_name_unique');
26+
});
27+
}
28+
};

resources/js/Layouts/Partials/Navigation.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default function Navigation() {
2222

2323
<NavigationMenu.Item>
2424
<NavigationMenu.Link asChild>
25-
<Link href={route('deck.list')}>Decks</Link>
25+
<Link href={route('decks.list')}>Decks</Link>
2626
</NavigationMenu.Link>
2727
</NavigationMenu.Item>
2828

@@ -58,7 +58,7 @@ export default function Navigation() {
5858

5959
<NavigationMenu.Item>
6060
<NavigationMenu.Link asChild>
61-
<Link href={route('deck.list')}>Decks</Link>
61+
<Link href={route('decks.list')}>Decks</Link>
6262
</NavigationMenu.Link>
6363
</NavigationMenu.Item>
6464

resources/js/Pages/Decks/DeckList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ export default function DeckList({
2424
key={deck.id}
2525
>
2626
<div className="w-full p-2 bg-white/10 backdrop-blur-[3px] text-md font-semibold rounded-t-md">
27-
<Link href={route('deck.cards', { id: deck.id })}>
27+
<Link href={route('decks.show', { id: deck.id })}>
2828
{deck.name}
2929
</Link>
3030
</div>
3131
<div className="w-full p-2 bg-white/10 backdrop-blur-[3px] text-sm rounded-b-md">
3232
<Link
3333
className="underline"
34-
href={route('deck.edit', { id: deck.id })}
34+
href={route('decks.edit', { id: deck.id })}
3535
>
3636
Edit
3737
</Link>

resources/js/Pages/Decks/EditDeck.tsx

Lines changed: 17 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,23 @@
11
import Authenticated from '@/Layouts/AuthenticatedLayout';
2-
import { useForm } from '@inertiajs/react';
3-
import clsx from 'clsx';
4-
import { Form } from 'radix-ui';
5-
import { FormEventHandler } from 'react';
6-
7-
export default function EditDeck({ deck }: { deck: App.Domain.Dto.FeDeck }) {
8-
const { data, setData, patch, processing, errors } = useForm({
9-
name: deck.name,
10-
note: deck.note ?? '',
11-
commander: deck.commander ?? false,
12-
});
13-
14-
const submit: FormEventHandler = (e) => {
15-
e.preventDefault();
16-
17-
patch(route('deck.update', { id: deck.id }));
18-
};
19-
2+
import DeckViewsList from './Partials/DeckViewsList';
3+
import EditDeckForm from './Partials/EditDeckForm';
4+
5+
export default function EditDeck({
6+
deck,
7+
views,
8+
}: {
9+
deck: App.Domain.Dto.FeDeck;
10+
views: App.Domain.Dto.FeDeckView[];
11+
}) {
2012
return (
2113
<Authenticated>
22-
<div className="flex justify-center">
23-
<Form.Root onSubmit={submit} className="max-w-lg w-lg">
24-
<fieldset className="fieldset bg-base-200 border border-base-300 p-4 rounded-box space-y-2">
25-
<legend className="fieldset-legend">Deck settings</legend>
26-
27-
<Form.Field className="space-y-1" name="name">
28-
<Form.Label htmlFor="name" className="fieldset-label">
29-
Name
30-
</Form.Label>
31-
<Form.Control asChild>
32-
<input
33-
className={clsx('input w-full', {
34-
'input-error': errors.name,
35-
})}
36-
type="text"
37-
required
38-
name="name"
39-
id="name"
40-
value={data.name}
41-
onChange={(e) => setData('name', e.currentTarget.value)}
42-
/>
43-
</Form.Control>
44-
<Form.Message match="valueMissing">
45-
Provide a new for your deck
46-
</Form.Message>
47-
{!!errors.name && <Form.Message>{errors.name}</Form.Message>}
48-
</Form.Field>
49-
50-
<Form.Field className="space-y-1" name="note">
51-
<Form.Label htmlFor="note" className="fieldset-label">
52-
Notes
53-
</Form.Label>
54-
<Form.Control asChild>
55-
<textarea
56-
className={clsx('textarea h-12 w-full', {
57-
'input-error': errors.note,
58-
})}
59-
name="note"
60-
id="note"
61-
value={data.note}
62-
onChange={(e) => setData('note', e.currentTarget.value)}
63-
/>
64-
</Form.Control>
65-
</Form.Field>
66-
67-
<Form.Field name="commander">
68-
<Form.Label className="fieldset-label">
69-
<input
70-
name="commander"
71-
id="commander"
72-
type="checkbox"
73-
className="checkbox checkbox-primary"
74-
checked={data.commander}
75-
onChange={(e) =>
76-
setData('commander', e.currentTarget.checked)
77-
}
78-
/>
79-
Is Commander
80-
</Form.Label>
81-
</Form.Field>
82-
83-
<div>
84-
<Form.Submit
85-
disabled={processing}
86-
className="btn btn-primary w-24"
87-
>
88-
Save
89-
</Form.Submit>
90-
</div>
91-
</fieldset>
92-
</Form.Root>
14+
<div className="flex flex-wrap justify-center gap-4 p-7">
15+
<div className="flex justify-center">
16+
<DeckViewsList views={views} />
17+
</div>
18+
<div className="flex justify-center">
19+
<EditDeckForm deck={deck} />
20+
</div>
9321
</div>
9422
</Authenticated>
9523
);

resources/js/Pages/Decks/Partials/CreateDeckForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default function CreateDeckForm() {
1111
const submit: FormEventHandler = (e) => {
1212
e.preventDefault();
1313

14-
post(route('deck.create'));
14+
post(route('decks.create'));
1515
};
1616

1717
return (
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Form } from 'radix-ui';
2+
3+
export default function DeckViewsList({
4+
views,
5+
}: {
6+
views: App.Domain.Dto.FeDeckView[];
7+
}) {
8+
return (
9+
<ul className="list border border-base-300 max-w-lg w-lg bg-base-200 rounded-box shadow-md p-2 m-4">
10+
<li className="text-xs opacity-60">Deck views</li>
11+
{views.map((view) => (
12+
<li key={view.id} className="list-row flex items-center">
13+
<div className="uppercase font-semibold">{view.name}</div>
14+
<div className="flex-1"></div>
15+
<button className="btn">Delete</button>
16+
<button className="btn">Edit</button>
17+
</li>
18+
))}
19+
<li className="list-row flex items-center">
20+
<Form.Root className="w-full flex gap-4 items-center">
21+
<Form.Field className="w-full" name="newView">
22+
<Form.Control asChild>
23+
<input
24+
type="text"
25+
id="newView"
26+
name="newView"
27+
className="input w-full"
28+
placeholder="Enter view name"
29+
/>
30+
</Form.Control>
31+
</Form.Field>
32+
<div className="flex-1"></div>
33+
<Form.Submit className="btn btn-primary">Add</Form.Submit>
34+
</Form.Root>
35+
</li>
36+
</ul>
37+
);
38+
}

0 commit comments

Comments
 (0)