user()->isAdmin(), 403); $groups = MetrikaGroup::withCount('groupItems')->get()->map(fn($g) => [ 'id' => $g->metrika_group_id, 'name' => $g->name, 'description' => $g->description, 'items_count' => $g->group_items_count, ]); $items = MetrikaItem::all()->map(fn($i) => [ 'id' => $i->metrika_item_id, 'name' => $i->name, 'description' => $i->description, 'data_type' => $i->data_type, 'is_active' => $i->is_active, 'code' => $i->code, ]); return Inertia::render('Admin/Metrics/Index', [ 'groups' => $groups, 'items' => $items, ]); } // ── Группы ── public function createGroup() { abort_unless(auth()->user()->isAdmin(), 403); return Inertia::render('Admin/Metrics/Group', [ 'group' => null, 'itemIds' => [], 'allItems' => $this->allItems(), ]); } public function storeGroup(Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $validated = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'items' => 'array', 'items.*' => 'integer|exists:metrika_items,metrika_item_id', ]); $group = MetrikaGroup::create([ 'name' => $validated['name'], 'description' => $validated['description'] ?? null, ]); foreach ($validated['items'] ?? [] as $itemId) { MetrikaGroupItem::create([ 'rf_metrika_group_id' => $group->metrika_group_id, 'rf_metrika_item_id' => $itemId, ]); } return redirect('/admin/metrics')->with('success', 'Группа создана'); } public function showGroup(MetrikaGroup $group) { abort_unless(auth()->user()->isAdmin(), 403); $itemIds = MetrikaGroupItem::where('rf_metrika_group_id', $group->metrika_group_id) ->pluck('rf_metrika_item_id') ->toArray(); return Inertia::render('Admin/Metrics/Group', [ 'group' => ['id' => $group->metrika_group_id, 'name' => $group->name, 'description' => $group->description], 'itemIds' => $itemIds, 'allItems' => $this->allItems(), ]); } public function updateGroup(MetrikaGroup $group, Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $validated = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'items' => 'array', 'items.*' => 'integer|exists:metrika_items,metrika_item_id', ]); $group->update([ 'name' => $validated['name'], 'description' => $validated['description'] ?? null, ]); MetrikaGroupItem::where('rf_metrika_group_id', $group->metrika_group_id)->delete(); foreach ($validated['items'] ?? [] as $itemId) { MetrikaGroupItem::create([ 'rf_metrika_group_id' => $group->metrika_group_id, 'rf_metrika_item_id' => $itemId, ]); } return redirect('/admin/metrics')->with('success', 'Группа сохранена'); } // ── Показатели ── public function createItem() { abort_unless(auth()->user()->isAdmin(), 403); return Inertia::render('Admin/Metrics/Item', ['item' => null]); } public function storeItem(Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $validated = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'data_type' => 'required|string|in:integer,float,string,text,boolean,select', 'is_active' => 'required|boolean', 'is_required' => 'boolean', 'default_value' => 'nullable|string', 'placeholder' => 'nullable|string', ]); MetrikaItem::create([ ...$validated, 'code' => Str::slug($validated['name']), ]); return redirect('/admin/metrics')->with('success', 'Показатель создан'); } public function showItem(MetrikaItem $item) { abort_unless(auth()->user()->isAdmin(), 403); return Inertia::render('Admin/Metrics/Item', [ 'item' => [ 'id' => $item->metrika_item_id, 'name' => $item->name, 'description' => $item->description, 'data_type' => $item->data_type, 'is_active' => $item->is_active, 'is_required' => $item->is_required, 'default_value' => $item->default_value, 'placeholder' => $item->placeholder, 'code' => $item->code, ], ]); } public function updateItem(MetrikaItem $item, Request $request) { abort_unless(auth()->user()->isAdmin(), 403); $validated = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', 'data_type' => 'required|string|in:integer,float,string,text,boolean,select', 'is_active' => 'required|boolean', 'is_required' => 'boolean', 'default_value' => 'nullable|string', 'placeholder' => 'nullable|string', ]); $item->update($validated); return redirect('/admin/metrics')->with('success', 'Показатель сохранён'); } private function allItems(): array { return MetrikaItem::where('is_active', true)->get()->map(fn($i) => [ 'metrika_item_id' => $i->metrika_item_id, 'name' => $i->name, 'data_type' => $i->data_type, ])->toArray(); } }