diff --git a/app/Http/Controllers/PredefinedMutationController.php b/app/Http/Controllers/PredefinedMutationController.php index 4b8151a..45f5d60 100644 --- a/app/Http/Controllers/PredefinedMutationController.php +++ b/app/Http/Controllers/PredefinedMutationController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Models\Dynamic; +use App\Models\Ledger; use App\Models\PredefinedMutation; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; @@ -15,20 +16,21 @@ class PredefinedMutationController extends Controller /** * Display a listing of the resource. */ - public function index(Dynamic $dynamic) + public function index(Dynamic $dynamic, Ledger $ledger) { $this->authorize('update', $dynamic); - return Inertia::render('Dynamics/PredefinedMutations/Index', [ + return Inertia::render('Ledgers/PredefinedMutations/Index', [ 'dynamic' => $dynamic, - 'predefined_mutations' => $dynamic->predefinedMutations()->latest()->get(), + 'ledger' => $ledger, + 'predefined_mutations' => $ledger->predefinedMutations()->latest()->get(), ]); } /** * Store a newly created resource in storage. */ - public function store(Request $request, Dynamic $dynamic) + public function store(Request $request, Dynamic $dynamic, Ledger $ledger) { $this->authorize('update', $dynamic); @@ -36,23 +38,23 @@ class PredefinedMutationController extends Controller 'name' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'amount' => ['required', 'integer'], - 'type' => ['required', 'string', 'in:reward,penalty'], ]); - $dynamic->predefinedMutations()->create($request->all()); + $ledger->predefinedMutations()->create($request->all()); - return redirect()->route('dynamics.predefined-mutations.index', $dynamic); + return redirect()->route('dynamics.ledgers.predefined-mutations.index', [$dynamic, $ledger]); } /** * Show the form for editing the specified resource. */ - public function edit(Dynamic $dynamic, PredefinedMutation $predefinedMutation) + public function edit(Dynamic $dynamic, Ledger $ledger, PredefinedMutation $predefinedMutation) { $this->authorize('update', $dynamic); - return Inertia::render('Dynamics/PredefinedMutations/Edit', [ + return Inertia::render('Ledgers/PredefinedMutations/Edit', [ 'dynamic' => $dynamic, + 'ledger' => $ledger, 'predefined_mutation' => $predefinedMutation, ]); } @@ -60,7 +62,7 @@ class PredefinedMutationController extends Controller /** * Update the specified resource in storage. */ - public function update(Request $request, Dynamic $dynamic, PredefinedMutation $predefinedMutation) + public function update(Request $request, Dynamic $dynamic, Ledger $ledger, PredefinedMutation $predefinedMutation) { $this->authorize('update', $dynamic); @@ -68,23 +70,22 @@ class PredefinedMutationController extends Controller 'name' => ['required', 'string', 'max:255'], 'description' => ['nullable', 'string'], 'amount' => ['required', 'integer'], - 'type' => ['required', 'string', 'in:reward,penalty'], ]); $predefinedMutation->update($request->all()); - return redirect()->route('dynamics.predefined-mutations.index', $dynamic); + return redirect()->route('dynamics.ledgers.predefined-mutations.index', [$dynamic, $ledger]); } /** * Remove the specified resource from storage. */ - public function destroy(Dynamic $dynamic, PredefinedMutation $predefinedMutation) + public function destroy(Dynamic $dynamic, Ledger $ledger, PredefinedMutation $predefinedMutation) { $this->authorize('update', $dynamic); $predefinedMutation->delete(); - return redirect()->route('dynamics.predefined-mutations.index', $dynamic); + return redirect()->route('dynamics.ledgers.predefined-mutations.index', [$dynamic, $ledger]); } } diff --git a/app/Models/PredefinedMutation.php b/app/Models/PredefinedMutation.php index 4460d99..76d7c60 100644 --- a/app/Models/PredefinedMutation.php +++ b/app/Models/PredefinedMutation.php @@ -12,16 +12,15 @@ class PredefinedMutation extends Model use HasFactory; protected $fillable = [ - 'dynamic_id', + 'ledger_id', 'name', 'description', 'amount', - 'type', ]; - public function dynamic(): BelongsTo + public function ledger(): BelongsTo { - return $this->belongsTo(Dynamic::class); + return $this->belongsTo(Ledger::class); } protected static function booted(): void diff --git a/database/migrations/2026_06_16_225928_create_predefined_mutations_table.php b/database/migrations/2026_06_16_225928_create_predefined_mutations_table.php index 1f157e0..787c51d 100644 --- a/database/migrations/2026_06_16_225928_create_predefined_mutations_table.php +++ b/database/migrations/2026_06_16_225928_create_predefined_mutations_table.php @@ -13,11 +13,10 @@ return new class extends Migration { Schema::create('predefined_mutations', function (Blueprint $table) { $table->id(); - $table->foreignId('dynamic_id')->constrained()->cascadeOnDelete(); + $table->foreignId('ledger_id')->constrained()->cascadeOnDelete(); $table->string('name'); $table->text('description')->nullable(); $table->integer('amount'); - $table->string('type')->default('reward'); $table->timestamps(); }); } diff --git a/resources/js/components/AddMutationForm.vue b/resources/js/components/AddMutationForm.vue index 07e7703..22185ba 100644 --- a/resources/js/components/AddMutationForm.vue +++ b/resources/js/components/AddMutationForm.vue @@ -3,8 +3,8 @@ import { useForm } from '@inertiajs/vue3'; import { route } from 'ziggy-js'; const props = defineProps<{ - dynamicId: number; - ledgerId: number; + dynamicId: string; + ledgerId: string; }>(); const form = useForm({ diff --git a/resources/js/components/Chat.vue b/resources/js/components/Chat.vue index e7fd644..1ecf782 100644 --- a/resources/js/components/Chat.vue +++ b/resources/js/components/Chat.vue @@ -33,18 +33,23 @@ const props = withDefaults( } | null; }>; dynamicId: string; - initialMessages: { + initialMessages?: { data: Array; next_page_url: string | null; - }; + } | null; }>(), { participants: () => [], + initialMessages: null, } ); -const messages = ref(props.initialMessages.data.reverse()); -const nextPageUrl = ref(props.initialMessages.next_page_url); +const messages = ref( + props.initialMessages + ? props.initialMessages.data.slice().reverse() + : (props.chat.messages || []).slice() +); +const nextPageUrl = ref(props.initialMessages?.next_page_url || null); function loadMoreMessages() { if (!nextPageUrl.value) { diff --git a/resources/js/components/MutationList.vue b/resources/js/components/MutationList.vue index 49d0252..30f62c8 100644 --- a/resources/js/components/MutationList.vue +++ b/resources/js/components/MutationList.vue @@ -4,8 +4,8 @@ import { route } from 'ziggy-js'; import Chat from '@/components/Chat.vue'; const props = defineProps<{ - dynamicId: number; - ledgerId: number; + dynamicId: string; + ledgerId: string; ledgerAlignment?: string; mutations: Array<{ id: number; diff --git a/resources/js/layouts/AppLayout.vue b/resources/js/layouts/AppLayout.vue index 9efc800..3ad120d 100644 --- a/resources/js/layouts/AppLayout.vue +++ b/resources/js/layouts/AppLayout.vue @@ -2,16 +2,22 @@ import AppLayout from '@/layouts/app/AppSidebarLayout.vue'; import type { BreadcrumbItem } from '@/types'; import { usePushNotifications } from '@/composables/usePushNotifications'; +import { computed } from 'vue'; +import { usePage } from '@inertiajs/vue3'; -const { breadcrumbs = [] } = defineProps<{ +const props = defineProps<{ breadcrumbs?: BreadcrumbItem[]; }>(); +const resolvedBreadcrumbs = computed(() => { + return props.breadcrumbs || (usePage().props.breadcrumbs as BreadcrumbItem[]) || []; +}); + const { isSubscribed, subscribe, unsubscribe } = usePushNotifications();