Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions app/Nova/Actions/BulkUploadMediaFiles.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
<?php

namespace App\Nova\Actions;

use App\MediaUpload;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Laravel\Nova\Actions\Action;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Fields\File;
use Laravel\Nova\Http\Requests\NovaRequest;

class BulkUploadMediaFiles extends Action
{
use InteractsWithQueue, Queueable, SerializesModels;

/**
* The displayable name of the action.
*
* @var string
*/
public $name = 'Bulk Upload Files';

/**
* Perform the action on the given models.
*
* @param \Laravel\Nova\Fields\ActionFields $fields
* @param \Illuminate\Support\Collection $models
* @return mixed
*/
public function handle(ActionFields $fields, Collection $models)
{
$uploadedFiles = $fields->files ?? request()->file('files');
if (!$uploadedFiles) {
return Action::danger('Please select one or more files.');
}

if (!is_array($uploadedFiles)) {
$uploadedFiles = [$uploadedFiles];
}

$allowedExtensions = [
'jpg', 'jpeg', 'png', 'gif', 'webp', 'svg',
'pdf', 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'txt',
];

$uploaded = 0;
$skipped = 0;

foreach ($uploadedFiles as $file) {
if (!$file) {
$skipped++;
continue;
}

$extension = strtolower((string) $file->getClientOriginalExtension());
if (!in_array($extension, $allowedExtensions, true)) {
$skipped++;
continue;
}

$baseName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$safeBaseName = Str::slug($baseName) ?: 'upload-file';
$destination = 'nova/uploads/' . now()->format('Y/m');
$storedPath = $file->storeAs(
$destination,
$safeBaseName . '-' . Str::random(8) . '.' . $extension,
'resources'
);

if (!$storedPath) {
$skipped++;
continue;
}

MediaUpload::create([
'title' => trim(str_replace(['-', '_'], ' ', $baseName)),
'file_path' => $storedPath,
'disk' => 'resources',
]);

$uploaded++;
}

return Action::message("Bulk upload completed: {$uploaded} uploaded, {$skipped} skipped.");
}

/**
* Get the fields available on the action.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function fields(NovaRequest $request): array
{
return [
File::make('Files', 'files')
->withMeta([
'extraAttributes' => [
'multiple' => true,
'accept' => '.jpg,.jpeg,.png,.gif,.webp,.svg,.pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx,.txt',
],
])
->rules('required')
->help('Drag and drop multiple files or click to select. Supported: images, PDF, Office docs, and TXT.'),
];
}

/**
* Indicate that this action can be run without any models.
*/
public function standalone()
{
return true;
}
}
18 changes: 18 additions & 0 deletions app/Nova/MediaUpload.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

namespace App\Nova;

use App\Nova\Actions\BulkUploadMediaFiles;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\File;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Http\Requests\NovaRequest;

class MediaUpload extends Resource
{
Expand Down Expand Up @@ -40,6 +42,10 @@ public function fields(Request $request): array
->nullable()
->help('Optional label to help identify this file in Nova.'),

Text::make('File Name', function () {
return basename((string) $this->file_path);
})->onlyOnIndex(),

File::make('File', 'file_path')
->disk('resources')
->path('nova/uploads')
Expand All @@ -65,4 +71,16 @@ public function fields(Request $request): array
})->onlyOnIndex(),
];
}

public static function indexQuery(NovaRequest $request, $query)
{
return $query->orderBy('created_at', 'desc');
}

public function actions(Request $request): array
{
return [
new BulkUploadMediaFiles,
];
}
}
7 changes: 7 additions & 0 deletions app/School.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Spatie\Activitylog\LogOptions;
use Spatie\Activitylog\Traits\LogsActivity;

/**
Expand Down Expand Up @@ -49,6 +50,12 @@ public function getDescriptionForEvent(string $eventName): string

protected static $logFillable = true;

public function getActivitylogOptions(): LogOptions
{
return LogOptions::defaults()
->setDescriptionForEvent(fn (string $eventName) => "School {$this->id} has been {$eventName}");
}

public function path()
{
return '/school/'.$this->id;
Expand Down
Loading