*/ protected array $cachedColumns; protected ?Model $record; protected static ?string $model = null; /** * @param array $columnMap * @param array $options */ public function __construct( protected Export $export, protected array $columnMap, protected array $options, ) {} /** * @return array */ public function __invoke(Model $record): array { $this->record = $record; $columns = $this->getCachedColumns(); $data = []; foreach (array_keys($this->columnMap) as $column) { $data[] = $columns[$column]->getFormattedState(); } return $data; } /** * @return array */ abstract public static function getColumns(): array; /** * @return array */ public static function getOptionsFormComponents(): array { return []; } /** * @return class-string */ public static function getModel(): string { return static::$model ?? (string) str(class_basename(static::class)) ->beforeLast('Exporter') ->prepend('App\\Models\\'); } abstract public static function getCompletedNotificationBody(Export $export): string; public static function getCompletedNotificationTitle(Export $export): string { return __('filament-actions::export.notifications.completed.title'); } /** * @return array */ public function getJobMiddleware(): array { return [ (new WithoutOverlapping("export{$this->export->getKey()}"))->expireAfter(600), ]; } public function getJobRetryUntil(): ?CarbonInterface { return now()->addDay(); } /** * @return array */ public function getJobTags(): array { return ["export{$this->export->getKey()}"]; } public function getJobQueue(): ?string { return null; } public function getJobConnection(): ?string { return null; } public function getJobBatchName(): ?string { return null; } /** * @return array */ public function getCachedColumns(): array { return $this->cachedColumns ??= array_reduce(static::getColumns(), function (array $carry, ExportColumn $column): array { $carry[$column->getName()] = $column->exporter($this); return $carry; }, []); } public function getRecord(): ?Model { return $this->record; } /** * @return array */ public function getOptions(): array { return $this->options; } public function getFileDisk(): string { $disk = config('filament.default_filesystem_disk'); if (($disk === 'public') && array_key_exists('local', config('filesystems.disks'))) { return 'local'; } return $disk; } public function getFileName(Export $export): string { return __('filament-actions::export.file_name', [ 'export_id' => $export->getKey(), 'model' => (string) str(static::getModel()) ->classBasename() ->beforeLast('Exporter') ->kebab() ->replace('-', ' ') ->plural() ->replace(' ', '-'), ]); } public static function getCsvDelimiter(): string { return ','; } /** * @return array */ public function getFormats(): array { return [ExportFormat::Csv, ExportFormat::Xlsx]; } public function getXlsxCellStyle(): ?Style { return null; } public function getXlsxHeaderCellStyle(): ?Style { return null; } public static function modifyQuery(Builder $query): Builder { return $query; } }