'DR', 4 => 'MR', 6 => 'RW', 9 => 'DC', 10 => 'DM', 11 => 'MC', 12 => 'AM', 15 => 'SW', 16 => 'DC', 17 => 'DM', 18 => 'MC', 19 => 'AM', 20 => 'SM', 21 => 'ST', 23 => 'DC', 24 => 'DM', 25 => 'MC', 26 => 'AM', 30 => 'DL', 32 => 'ML', 34 => 'LM']; public bool $copyDisabled = true; public bool $calculationDisabled = true; public string $calculationColor = 'gray'; public string $copyColor = 'gray'; public string $ss_team_name = ''; public array $boxes = []; public array $beschriftung = []; public function mount(array $filters) { $this->ss_team_name = SofaScoreRosa::where('ss_team_id', $filters['team_id'])->value('ss_team_name'); $this->sourceRecords = PlayerCalculator::load($filters); for ($i = 1; $i <= 35; $i++) { $this->boxes[$i] = []; if (isset($this->activeBoxes[$i])) $this->beschriftung[$i] = $this->activeBoxes[$i]; else $this->beschriftung[$i] = ''; } Log::debug('boxes', $this->boxes); } public function table(Table $table): Table { return $table ->headerActions([ Action::make('close')->icon('phosphor-x')->close(), Action::make('reset')->icon('phosphor-arrows-clockwise'), Action::make('calculate')->icon('phosphor-calculator')->color('gray'), Action::make('download')->icon('phosphor-download')->color('gray'), ]) /** * WICHTIG: Da Filament v5 zwingend eine Query braucht, nutzen wir ein * leeres Modell (z.B. ein beliebiges Basis-Modell deines Projekts) NUR als Dummy-Builder. * Alternativ kannst du ein anonymes Model nutzen. */ ->query(\App\Models\User::query()->whereRaw('1 = 0')) // Verhindert DB-Abfragen ->paginated(false) // ->striped() ->defaultSort('name') ->columns([ ViewColumn::make('drag_card') ->columnSpanFull() ->label('Roster of ' . $this->ss_team_name) ->view('filament.tables.columns.drag-card'), ]) ->filters([ SelectFilter::make('player_position') ->columnSpanFull() ->options([ 'attack' => 'Attack', 'midfield' => 'Midfield', 'defence' => 'Defence', 'goalkeeper' => 'Goalkeeper', ]) ->query(function ($query, array $data) { return $query; }), ], layout: FiltersLayout::AboveContent) ->deferFilters(false) ->records(function () { $collection = collect($this->sourceRecords); $selectedPosition = $this->tableFilters['player_position']['value'] ?? null; if (!empty($selectedPosition)) { $collection = $collection->where('player_position', $selectedPosition); } return $collection; }); } #[On('element-dropped-in-box')] public function handleElementDropped(mixed $elementData, mixed $boxNumber): void { $boxNumber = (int) $boxNumber; $player = is_array($elementData) ? $elementData : json_decode($elementData, true); if (!$player || !isset($player['id'])) { return; } foreach ($this->sourceRecords as $k => $record) { if ($record['id'] == (int) $player['id']) { if ($this->boxes[$boxNumber]) { $this->clearBox($boxNumber); } $this->boxes[$boxNumber] = $record; $this->sourceRecords[$k]['active'] = 1; } } } public function clearBox(int $boxNumber): void { if (isset($this->boxes[$boxNumber])) { $tmp = $this->boxes[$boxNumber]; $player_id = 0; foreach ($tmp as $key => $value) { if ($key == 'id') $player_id = $value; } foreach ($this->sourceRecords as $k => $record) { if ($record['id'] == (int) $player_id) { $this->boxes[$boxNumber] = []; $this->sourceRecords[$k]['active'] = 0; } } } } public function render() { return view('livewire.board-dispatcher'); } // public function setCalculationButton() // { // $count = 1; // for ($i = 1; $i <= 35; $i++) { // $bayKey = "dest-{$i}"; // if (isset($this->lists[$bayKey]) && ! empty($this->lists[$bayKey])) { // $count++; // } // } // if ($count > 2) { // $this->calculationDisabled = false; // $this->calculationColor = 'info'; // } else { // $this->calculationDisabled = true; // $this->calculationColor = 'gray'; // } // } // public function setCopyButton() // { // if (\count($this->results) > 0) { // $this->copyDisabled = false; // $this->copyColor = 'info'; // } else { // $this->copyDisabled = true; // $this->copyColor = 'gray'; // } // } // public function calculate() // { // $this->results = []; // for ($i = 1; $i <= 35; $i++) { // $bayKey = "dest-{$i}"; // if (isset($this->lists[$bayKey]) && ! empty($this->lists[$bayKey])) { // $this->results[] = $this->lists[$bayKey][0]; // } // } // $this->setCopyButton(); // } // public function copyResult() // { // $copystring = ''; // foreach ($this->results as $row) { // unset($row['origin']); // unset($row['pcolor']); // unset($row['ecolor']); // unset($row['info']); // $copystring .= implode("\t", $row) . "\n"; // } // $this->js("navigator.clipboard.writeText(`$copystring`)"); // } // public function moveItem($itemId, $fromList, $toList, $newIndex) // { // $itemId = (string) $itemId; // $newIndex = (int) $newIndex; // if (! $toList || $fromList === $toList || ! isset($this->lists[$fromList]) || ! isset($this->lists[$toList])) { // $this->boardVersion = uniqid(); // return; // } // // Limit-Guard: Wenn das Ziel bereits ein Element enthält, abbrechen // if (count($this->lists[$toList]) >= 1) { // $this->boardVersion = uniqid(); // return; // } // $foundItem = null; // foreach ($this->lists[$fromList] as $key => $item) { // if ((string) $item['id'] === $itemId) { // $item['position'] = $this->positions($toList); // $foundItem = $item; // unset($this->lists[$fromList][$key]); // $this->lists[$fromList] = array_values($this->lists[$fromList]); // break; // } // } // if ($foundItem) { // array_splice($this->lists[$toList], $newIndex, 0, [$foundItem]); // } // $this->setCalculationButton(); // $this->boardVersion = uniqid(); // } // public function positions(string $pos) // { // $pos = (int) str_replace('dest-', '', $pos); // $options = [2 => 'DR', 4 => 'MR', 6 => 'RW', 9 => 'DC', 10 => 'DM', 11 => 'MC', 12 => 'AM', 15 => 'SW', 16 => 'DC', 17 => 'DM', 18 => 'MC', 19 => 'AM', 20 => 'SM', 21 => 'ST', 23 => 'DC', 24 => 'DM', 25 => 'MC', 26 => 'AM', 30 => 'DL', 32 => 'ML', 34 => 'LM']; // if (isset($options[$pos])) // return $options[$pos]; // else // return $pos; // } // public function returnToOrigin($itemId, $currentListId) // { // $itemId = (string) $itemId; // // Log::info($this->boardVersion); // // Log::info('itemId, currentListId', [$itemId, $currentListId]); // // Log::info('OLD LIST', $this->lists); // if (! isset($this->lists[$currentListId])) { // $this->boardVersion = uniqid(); // return; // } // $foundItem = null; // foreach ($this->lists[$currentListId] as $key => $item) { // if ((string) $item['id'] === $itemId) { // $foundItem = $item; // unset($this->lists[$currentListId][$key]); // $this->lists[$currentListId] = array_values($this->lists[$currentListId]); // break; // } // } // if ($foundItem && isset($this->lists[$foundItem['origin']])) { // // Nur zurücklegen, wenn die Quelle wirklich frei ist // array_unshift($this->lists[$foundItem['origin']], $foundItem); // // if (count($this->lists[$foundItem['origin']]) < 2) { // // Log::info('origin'); // // array_unshift($this->lists[$foundItem['origin']], $foundItem); // // } else { // // // Ausfallsicherheit gegen Datenverlust: Zurück in die Bucht schieben // // array_unshift($this->lists[$currentListId], $foundItem); // // Log::info('box'); // // } // } // $this->setCalculationButton(); // $this->boardVersion = uniqid(); // } // public function resetBoard() // { // // Alle 21 Zielbays durchlaufen // for ($i = 1; $i <= 21; $i++) { // $bayKey = "dest-{$i}"; // if (isset($this->lists[$bayKey]) && ! empty($this->lists[$bayKey])) { // foreach ($this->lists[$bayKey] as $item) { // $targetOrigin = $item['origin']; // // Element zurück in sein Original-Quell-Tab schieben // if (isset($this->lists[$targetOrigin])) { // array_unshift($this->lists[$targetOrigin], $item); // } // } // // Die Zielbucht komplett leeren // $this->lists[$bayKey] = []; // } // } // // Falls Sie die boardVersion-Logik nutzen, erneuern wir sie hier für den DOM-Refresh: // if (property_exists($this, 'boardVersion')) { // $this->boardVersion = uniqid(); // } // // Falls Sie die Javascript-Event/ignore-Logik nutzen, feuern wir das Refresh-Event: // $this->dispatch('refreshBoard', lists: $this->lists); // $this->results = []; // $this->setCalculationButton(); // $this->setCopyButton(); // } }