components([ Grid::make() ->schema([ Section::make() ->schema([ TextInput::make('init_parameter') ->label(__('osurg_initials.fields.init_parameter')) ->required() ->maxLength(50) ->unique(table: OsurgInitial::class, column: 'init_parameter', ignoreRecord: true), TextInput::make('init_value') ->label(__('osurg_initials.fields.init_value')) ->maxLength(50), FileUpload::make('attachment') ->label(__('osurg_initials.fields.attachment')) ->disk('public') ->directory('initials') ->image() ->imagePreviewHeight('120') ->columnSpanFull(), ]) ->columns(2) ->columnSpanFull() ->footerActions([ fn (string $operation) => Action::make('create') ->label(__('filament-panels::resources/pages/create-record.form.actions.create.label')) ->submit('create') ->keyBindings(['mod+s']) ->visible($operation === 'create'), fn (string $operation) => Action::make('createAnother') ->label(__('filament-panels::resources/pages/create-record.form.actions.create_another.label')) ->action('createAnother') ->keyBindings(['mod+shift+s']) ->color('gray') ->visible($operation === 'create'), fn (string $operation) => Action::make('cancelCreate') ->label(__('filament-panels::resources/pages/create-record.form.actions.cancel.label')) ->url(static::getUrl('index')) ->color('gray') ->visible($operation === 'create'), fn (string $operation) => Action::make('save') ->label(__('filament-panels::resources/pages/edit-record.form.actions.save.label')) ->submit('save') ->keyBindings(['mod+s']) ->visible($operation === 'edit'), fn (string $operation) => Action::make('cancelEdit') ->label(__('filament-panels::resources/pages/edit-record.form.actions.cancel.label')) ->url(static::getUrl('index')) ->color('gray') ->visible($operation === 'edit'), ]), ]) ->columnSpanFull(), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('init_parameter') ->label(__('osurg_initials.fields.init_parameter')) ->searchable() ->sortable(), TextColumn::make('init_value') ->label(__('osurg_initials.fields.init_value')) ->searchable() ->placeholder('—'), ImageColumn::make('attachment') ->label(__('osurg_initials.fields.attachment')) ->disk('public') ->square() ->size(48), TextColumn::make('created_at') ->label(__('osurg_initials.fields.created_at')) ->sortable(), ]) ->recordActions([ EditAction::make(), DeleteAction::make(), ]) ->toolbarActions([ BulkActionGroup::make([ DeleteBulkAction::make(), BulkAction::make('export_excel_selected') ->label(__('table.export_excel_selected')) ->icon('heroicon-o-table-cells') ->color('success') ->action(function (Collection $records) { $tempPath = tempnam(sys_get_temp_dir(), 'export_') . '.xlsx'; $writer = new Writer(); $writer->openToFile($tempPath); $writer->addRow(Row::fromValues([ 'ID', __('osurg_initials.fields.init_parameter'), __('osurg_initials.fields.init_value'), __('osurg_initials.fields.created_at'), ])); foreach ($records as $record) { $writer->addRow(Row::fromValues([ $record->id, $record->init_parameter, $record->init_value, $record->created_at, ])); } $writer->close(); return response()->streamDownload(function () use ($tempPath) { readfile($tempPath); @unlink($tempPath); }, 'osurg-initials-' . now()->format('Y-m-d') . '.xlsx', [ 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]); }), ]), ActionGroup::make([ Action::make('export_excel') ->label(__('table.export_excel')) ->color('success') ->icon('heroicon-o-table-cells') ->action(function () { $records = OsurgInitial::all(); $tempPath = tempnam(sys_get_temp_dir(), 'export_') . '.xlsx'; $writer = new Writer(); $writer->openToFile($tempPath); $writer->addRow(Row::fromValues([ 'ID', __('osurg_initials.fields.init_parameter'), __('osurg_initials.fields.init_value'), __('osurg_initials.fields.created_at'), ])); foreach ($records as $record) { $writer->addRow(Row::fromValues([ $record->id, $record->init_parameter, $record->init_value, $record->created_at, ])); } $writer->close(); return response()->streamDownload(function () use ($tempPath) { readfile($tempPath); @unlink($tempPath); }, 'osurg-initials-' . now()->format('Y-m-d') . '.xlsx', [ 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]); }), Action::make('export_pdf') ->label(__('table.export_pdf')) ->color('danger') ->icon('heroicon-o-document-arrow-down') ->action(function () { $records = OsurgInitial::all(); return PdfService::download( 'exports.osurg-initials-pdf', ['records' => $records], 'osurg-initials-' . now()->format('Y-m-d') . '.pdf', ); }), ]) ->label(__('table.export')) ->color('orange') ->button(), ]); } public static function getPages(): array { return [ 'index' => Pages\ListOsurgInitials::route('/'), 'create' => Pages\CreateOsurgInitial::route('/create'), 'edit' => Pages\EditOsurgInitial::route('/{record}/edit'), ]; } }