components([ Section::make('Projekt Details') ->label(fn (?Projekte $record): ?string => ($record?->created_at) ? 'Erstellt: '.$record?->created_at->diffForHumans().' | Geändert: '.$record?->updated_at->diffForHumans() : '') ->collapsed(fn ($operation) => $operation == 'create' ? false : true) ->icon('heroicon-o-rectangle-stack') ->schema([ Tabs::make('Tabs') ->contained(false) ->tabs([ Tab::make('Benennung') ->icon('phosphor-article-medium') ->schema([ TextInput::make('offizieller_name') ->columnSpan(2) ->label('Offizieller Name') ->suffixAction( Action::make('copy') ->tooltip('Kopieren') ->icon('heroicon-s-clipboard-document-check') ->action(function ($livewire, $state) { $livewire->js('window.navigator.clipboard.writeText("'.$state.'");'); }) ) ->belowContent([ 'Als Platzhalter "###OFFIZIELLER_NAME###"', ]) ->required(), TextInput::make('interner_name') ->columnSpan(2) ->label('Interner Name') ->suffixAction( Action::make('copy') ->tooltip('Kopieren') ->icon('heroicon-s-clipboard-document-check') ->action(function ($livewire, $state) { $livewire->js('window.navigator.clipboard.writeText("'.$state.'");'); }) ) ->belowContent([ 'Als Platzhalter "###INTERNER_NAME###"', ]) ->required(), Select::make('status') ->selectablePlaceholder(false) ->options(ProjektStatus::class) ->required(), TextInput::make('id')->disabled()->label('Interne ID'), TextInput::make('cloned_from_id')->disabled()->label('Geklont von Id'), TextInput::make('original_name')->disabled()->placeholder(fn($record)=> $record?->cloned_from_id ? Projekte::where('id', $record->cloned_from_id)->value('interner_name') : '')->label('Original Name') ])->columns(4), Tab::make('Ort & Datum') ->icon('phosphor-calendar-check') ->schema([ TextInput::make('ort')->required()->suffix('am') ->belowContent([ 'Als Platzhalter "###ORT###"', ]), DatePicker::make('erstellung') ->label('Datum der Erstellung') ->required() ->belowContent([ 'Als Platzhalter "###DATUM###"', ]), ])->columns(2), Tab::make('Gutachter & Auftraggeber') ->icon('phosphor-identification-card') ->schema([ Select::make('gutachter_id')->relationship(name: 'gutachter', titleAttribute: 'company')->required(), Select::make('auftraggeber_id') ->searchable() ->loadingMessage('Lade Auftraggeber...') ->relationship(name: 'auftraggeber', titleAttribute: 'company') ->required(), Radio::make('status')->options(ProjektStatus::class)->required(), ]), Tab::make('Notizen') ->icon('phosphor-notebook') ->schema([ RichEditor::make('beschreibung') ->label('Notizen') ->extraInputAttributes(['style' => 'min-height: 20rem; max-height: 50vh; overflow-y: auto;']) ->toolbarButtons([ ['bold', 'italic', 'underline', 'strike', 'subscript', 'superscript', 'link', 'textColor', 'clearFormatting'], ['alignStart', 'alignCenter', 'alignEnd'], ['bulletList', 'orderedList', 'table'], ['undo', 'redo'], ])->floatingToolbars([ 'table' => [ 'tableAddColumnBefore', 'tableAddColumnAfter', 'tableDeleteColumn', 'tableAddRowBefore', 'tableAddRowAfter', 'tableDeleteRow', 'tableMergeCells', 'tableSplitCell', 'tableToggleHeaderRow', 'tableDelete', ], ]) ->columnSpan(2), ]), Tab::make('Farben') ->icon('phosphor-palette') ->schema([ Toggle::make('projekt_farben_verwenden') ->label('Eigene Farben verwenden') ->afterStateUpdated(function ($record, ?string $state) { $state = $state ? 0 : 1; Projekte::where('id', $record->id)->update(['projekt_farben_verwenden' => $state]); }) ->belowContent('Die standard Farben können unter Verwaltung/Gutachter definiert werden.') ->live(), ColorPicker::make('deckblatt_bg')->label('Deckblatt') ->disabled(fn ($record) => ! $record?->projekt_farben_verwenden) ->belowContent('Farbe des Hintergrundes am Deckblatt.'), ColorPicker::make('schmuckfarbe_header')->label('Überschriften') ->disabled(fn ($record) => ! $record?->projekt_farben_verwenden) ->belowContent('Farbe des Hintergrundes bei Überschriften.'), ColorPicker::make('farbe_borders')->label('Rahmen') ->disabled(fn ($record) => ! $record?->projekt_farben_verwenden) ->belowContent('Farbe von Rahmen und Rändern bei Tabellen und Boxen.'), ])->columns(4) ->columnSpanFull(), Tab::make('PDF') ->icon('phosphor-file-pdf') ->schema([ Radio::make('pdf_nutzwerte_tabellen_umbruch') ->label('PDF Nutzwertberechnung') ->aboveContent('Bei Tabellen die nicht mehr komplett auf eine Seite passen.') ->options([ '0' => 'Tabellen zusammenhalten und eine neue Seite beginnen', '1' => 'Tabellen umbrechen', ])->afterStateUpdated(function ($record, ?string $state) { Projekte::where('id', $record->id)->update(['pdf_nutzwerte_tabellen_umbruch' => $state]); })->live(), ])->columns(2) ->columnSpanFull(), ]), ])->columnSpanFull(), ]); } }