components([ Forms\Components\Section::make('Contact') ->columns(2) ->schema([ Forms\Components\TextInput::make('name')->label('Nume')->required()->maxLength(120), Forms\Components\TextInput::make('phone')->label('Telefon')->tel()->required()->maxLength(40), Forms\Components\TextInput::make('email')->email()->maxLength(120), Forms\Components\Select::make('status') ->options(Lead::STATUSES) ->default('new') ->required(), ]), Forms\Components\Section::make('Auto') ->columns(2) ->schema([ Forms\Components\TextInput::make('car')->label('Marca')->maxLength(60), Forms\Components\TextInput::make('model')->maxLength(60), ]), Forms\Components\Textarea::make('message')->label('Mesaj client')->columnSpanFull()->rows(3), Forms\Components\Section::make('Sursă & Atribuire') ->columns(2) ->schema([ Forms\Components\Select::make('source') ->options(Lead::SOURCES) ->searchable() ->default('manual'), Forms\Components\Select::make('assigned_to') ->label('Responsabil') ->options(fn () => User::pluck('name', 'id')) ->searchable(), Forms\Components\TextInput::make('budget')->label('Buget')->numeric(), ]), Forms\Components\Section::make('Marketing (UTM)') ->collapsed() ->columns(2) ->schema([ Forms\Components\TextInput::make('utm_source'), Forms\Components\TextInput::make('utm_medium'), Forms\Components\TextInput::make('utm_campaign'), Forms\Components\TextInput::make('utm_term'), Forms\Components\TextInput::make('utm_content'), ]), Forms\Components\Textarea::make('notes')->label('Notițe interne')->columnSpanFull()->rows(2), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('created_at')->label('Data')->dateTime('d.m.Y H:i')->sortable(), Tables\Columns\TextColumn::make('name')->searchable()->sortable(), Tables\Columns\TextColumn::make('phone')->copyable()->searchable(), Tables\Columns\TextColumn::make('car')->label('Auto')->formatStateUsing(fn ($state, $record) => trim($state . ' ' . ($record->model ?? ''))), Tables\Columns\TextColumn::make('source')->label('Sursă')->formatStateUsing(fn ($state) => Lead::SOURCES[$state] ?? $state)->badge(), Tables\Columns\TextColumn::make('status') ->formatStateUsing(fn ($state) => Lead::STATUSES[$state] ?? $state) ->badge() ->colors([ 'gray' => ['new'], 'warning' => ['contacted', 'no_answer'], 'info' => ['scheduled'], 'success' => ['converted'], 'danger' => ['lost'], ]), Tables\Columns\TextColumn::make('assignedTo.name')->label('Responsabil')->placeholder('—'), Tables\Columns\TextColumn::make('budget')->money('MDL')->placeholder('—'), ]) ->filters([ Tables\Filters\SelectFilter::make('status')->options(Lead::STATUSES), Tables\Filters\SelectFilter::make('source')->options(Lead::SOURCES), ]) ->actions([ Tables\Actions\Action::make('convert') ->label('Convertește') ->icon('heroicon-m-arrow-right-circle') ->color('success') ->visible(fn (Lead $r) => $r->status !== 'converted') ->requiresConfirmation() ->action(function (Lead $r) { $deal = $r->convert(); Notification::make() ->title('Convertit în deal #' . $deal->id) ->success() ->send(); }), Tables\Actions\EditAction::make(), Tables\Actions\DeleteAction::make(), ]) ->defaultSort('created_at', 'desc'); } public static function getPages(): array { return [ 'index' => Pages\ListLeads::route('/'), 'create' => Pages\CreateLead::route('/create'), 'edit' => Pages\EditLead::route('/{record}/edit'), ]; } }