diff --git a/app/Http/Controllers/Admin/ResourceController.php b/app/Http/Controllers/Admin/ResourceController.php index 85f8738e..0731178f 100644 --- a/app/Http/Controllers/Admin/ResourceController.php +++ b/app/Http/Controllers/Admin/ResourceController.php @@ -7,7 +7,9 @@ use App\Http\Requests\Resource\BulkVideoStoreRequest; use App\Http\Requests\Resource\StoreResourceRequest; use App\Http\Requests\Resource\UpdateResourceRequest; +use App\Models\Node; use App\Models\Resource; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Http; @@ -160,4 +162,28 @@ public function storeBulkVideos(BulkVideoStoreRequest $request) return back()->with('success', 'YouTube playlist imported successfully.'); } + + public function bulkRename(Request $request, Node $node) + { + $validated = $request->validate([ + 'prefix' => ['required', 'string', 'max:100'], + 'start_number' => ['nullable', 'integer', 'min:0'], + ]); + + $rawPrefix = trim($validated['prefix']); + $cleanPrefix = rtrim($rawPrefix, ' -'); + $startNumber = (int) ($validated['start_number'] ?? 1); + + $resources = $node->resources()->orderBy('id')->get(); + + DB::transaction(function () use ($resources, $cleanPrefix, $startNumber) { + foreach ($resources as $index => $resource) { + $number = str_pad((string) ($startNumber + $index), 2, '0', STR_PAD_LEFT); + $title = $cleanPrefix !== '' ? "{$cleanPrefix} - {$number}" : $number; + $resource->update(['title' => $title]); + } + }); + + return back()->with('success', "Renamed {$resources->count()} resources successfully."); + } } diff --git a/resources/js/components/admin/BulkRenameModal.vue b/resources/js/components/admin/BulkRenameModal.vue new file mode 100644 index 00000000..3ad226f0 --- /dev/null +++ b/resources/js/components/admin/BulkRenameModal.vue @@ -0,0 +1,227 @@ + + + diff --git a/resources/js/pages/admin/Node.vue b/resources/js/pages/admin/Node.vue index ff323aed..79bcc2d2 100644 --- a/resources/js/pages/admin/Node.vue +++ b/resources/js/pages/admin/Node.vue @@ -1,9 +1,16 @@