From 3ff5f7543d4975b5e661ef317ac8b196676b24ef Mon Sep 17 00:00:00 2001 From: A1Gard Date: Mon, 29 Jul 2024 17:05:43 +0330 Subject: [PATCH] added attachment temp download link added simple attachs list fixed area seeder --- app/Http/Controllers/Admin/ClipController.php | 25 ++++++++++ app/Http/Controllers/ClientController.php | 16 +++++++ app/Http/Requests/AttachmentSaveRequest.php | 2 +- app/Models/Attachment.php | 4 ++ app/Models/Clip.php | 8 ++++ database/seeders/AreaSeeder.php | 14 +++--- .../attachments/attachment-form.blade.php | 2 +- .../SimpleAttachmentList.blade.php | 43 ++++++++++++++++++ .../SimpleAttachmentList.js | 0 .../SimpleAttachmentList.json | 10 ++++ .../SimpleAttachmentList.php | 27 +++++++++++ .../SimpleAttachmentList.scss | 12 +++++ .../SimpleAttachmentList/screenshot.png | Bin 0 -> 28654 bytes routes/web.php | 1 + 14 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.blade.php create mode 100644 resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.js create mode 100644 resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.json create mode 100644 resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.php create mode 100644 resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.scss create mode 100644 resources/views/segments/attachments/SimpleAttachmentList/screenshot.png diff --git a/app/Http/Controllers/Admin/ClipController.php b/app/Http/Controllers/Admin/ClipController.php index 1a09eec..2236fc9 100644 --- a/app/Http/Controllers/Admin/ClipController.php +++ b/app/Http/Controllers/Admin/ClipController.php @@ -9,6 +9,10 @@ use App\Models\Access; use App\Models\Clip; use Illuminate\Http\Request; use App\Helper; +use Spatie\Image\Enums\AlignPosition; +use Spatie\Image\Enums\Fit; +use Spatie\Image\Enums\Unit; +use Spatie\Image\Image; use function App\Helpers\hasCreateRoute; class ClipController extends XController @@ -67,7 +71,28 @@ class ClipController extends XController // } if ($request->has('cover')){ $clip->cover = $this->storeFile('cover',$clip, 'clips'); + + $key = 'cover'; + $format = $request->file($key)->guessExtension(); + if (strtolower($format) == 'png'){ + $format = 'webp'; + } + $i = Image::load($request->file($key)->getPathname()) + ->optimize() +// ->nonQueued() + ->format($format); + if (getSetting('watermark2')) { + $i->watermark(public_path('upload/images/logo.png'), + AlignPosition::BottomLeft, 5, 5, Unit::Percent, + config('app.media.watermark_size'), Unit::Percent, + config('app.media.watermark_size'), Unit::Percent, Fit::Contain, + config('app.media.watermark_opacity')); + } + $i->save(storage_path() . '/app/public/cover/optimized-'. $clip->$key); } + + + if ($request->has('clip')){ $clip->file = $this->storeFile('clip',$clip, 'clips'); } diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index d7a111c..16f0628 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Attachment; use App\Models\Comment; use App\Models\Customer; use App\Models\Gallery; @@ -27,6 +28,10 @@ class ClientController extends Controller public function post(Post $post) { + + if ($post->status = 0 && !auth()->check()){ + return abort(403); + } $area = 'post'; $title = $post->title; $subtitle = $post->subtitle; @@ -35,6 +40,9 @@ class ClientController extends Controller } public function gallery(Gallery $gallery) { + if ($gallery->status = 0 && !auth()->check()){ + return abort(403); + } $area = 'gallery'; $title = $gallery->title; $subtitle = \Str::limit(strip_tags($gallery->description),15); @@ -120,4 +128,12 @@ class ClientController extends Controller $posts = $group->posts()->orderByDesc('id')->paginate($this->paginate); return view('client.group', compact('area', 'posts', 'title', 'subtitle','group')); } + + public function attachDl(Attachment $attachment){ + $attachment->increment('downloads'); + $file = (storage_path().'/app/public/attachments/'. $attachment->file); + if (file_exists($file)) { + return response()->download($file); + } + } } diff --git a/app/Http/Requests/AttachmentSaveRequest.php b/app/Http/Requests/AttachmentSaveRequest.php index 987f38b..c010501 100644 --- a/app/Http/Requests/AttachmentSaveRequest.php +++ b/app/Http/Requests/AttachmentSaveRequest.php @@ -26,7 +26,7 @@ class AttachmentSaveRequest extends FormRequest 'title' => ['required','string','min:2'], 'body' => ['nullable','string'], 'subtitle' => ['nullable','string'], - 'file' => ['nullable','mimes:png,jpg,svg,mp4,pdf,docx,zip,rar','max:'.getMaxUploadSize()] + 'file' => ['nullable','mimes:png,jpg,svg,mp4,pdf,docx,zip,rar,mp3','max:'.getMaxUploadSize()] ]; } } diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php index 25f4ad7..9f72df6 100644 --- a/app/Models/Attachment.php +++ b/app/Models/Attachment.php @@ -31,10 +31,14 @@ class Attachment extends Model public function tempUrl() // WIP { + if ($this->file == null) { return asset('/assets/upload/logo.svg'); } + return \URL::temporarySignedRoute( + 'client.attach-dl', now()->addMinutes(60), [$this->slug] + ); return \Storage::url('attachments/' . $this->file); } diff --git a/app/Models/Clip.php b/app/Models/Clip.php index 23d33fc..ac86e27 100644 --- a/app/Models/Clip.php +++ b/app/Models/Clip.php @@ -25,6 +25,14 @@ class Clip extends Model return asset('assets/upload/logo.svg');; } + return \Storage::url('clips/optimized-' . $this->cover); + } + public function imgOriginalUrl() + { + if ($this->cover == null) { + return asset('assets/upload/logo.svg');; + } + return \Storage::url('clips/' . $this->cover); } diff --git a/database/seeders/AreaSeeder.php b/database/seeders/AreaSeeder.php index 6d9cbaa..32d6acc 100644 --- a/database/seeders/AreaSeeder.php +++ b/database/seeders/AreaSeeder.php @@ -37,7 +37,7 @@ class AreaSeeder extends Seeder 'name' => 'index', 'valid_segments' => json_encode( ["top", "slider", "header", "footer", "menu", - "parallax", "other", "posts", "products", "attachments" + "parallax", "other", "posts", "products" , "groups", "categories", "category", "group", "index", "ads", "galleries"] ), 'max' => 10, @@ -48,7 +48,7 @@ class AreaSeeder extends Seeder 'name' => 'post', 'valid_segments' => json_encode( ["top", "header", "footer", "menu", - "parallax", "other", "post", "comments", "ads"] + "parallax", "other", "post", "comments", "ads" , "attachments"] ), 'max' => 6, 'preview' => 'client.post', @@ -68,7 +68,7 @@ class AreaSeeder extends Seeder 'name' => 'clip', 'valid_segments' => json_encode( ["top", "header", "footer", "menu", - "parallax", "other", "clip", "comments", "ads"] + "parallax", "other", "clip", "comments", "ads", "attachments"] ), 'max' => 6, 'preview' => 'client.clip', @@ -88,7 +88,7 @@ class AreaSeeder extends Seeder 'name' => 'gallery', 'valid_segments' => json_encode( ["top", "header", "footer", "menu", - "parallax", "other", "gallery", "comments", "ads"] + "parallax", "other", "gallery", "comments", "ads", "attachments"] ), 'max' => 6, 'preview' => 'client.gallery', @@ -108,7 +108,7 @@ class AreaSeeder extends Seeder 'name' => 'product', 'valid_segments' => json_encode( ["top", "header", "footer", "menu", - "parallax", "other", "product", "comments", "ads"] + "parallax", "other", "product", "comments", "ads", "attachments"] ), 'max' => 6, 'preview' => 'client.product', @@ -148,7 +148,7 @@ class AreaSeeder extends Seeder 'name' => 'category', 'valid_segments' => json_encode( ["top", "header", "footer", "menu", - "parallax", "other", "category", "ads", "products_page"] + "parallax", "other", "category", "ads", "products_page", "attachments"] ), 'max' => 6, 'preview' => 'client.attachment', @@ -168,7 +168,7 @@ class AreaSeeder extends Seeder 'name' => 'group', 'valid_segments' => json_encode( ["top", "header", "footer", "menu", - "parallax", "other", "group", "ads", 'posts_page'] + "parallax", "other", "group", "ads", 'posts_page', "attachments"] ), 'max' => 6, 'preview' => 'client.group', diff --git a/resources/views/admin/attachments/attachment-form.blade.php b/resources/views/admin/attachments/attachment-form.blade.php index e6f73cc..5ad6810 100644 --- a/resources/views/admin/attachments/attachment-form.blade.php +++ b/resources/views/admin/attachments/attachment-form.blade.php @@ -137,7 +137,7 @@ + accept=".png,.jpg,.svg,.mp4,.pdf,.docx,.zip,.rar,.mp3"/>
diff --git a/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.blade.php b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.blade.php new file mode 100644 index 0000000..2827c38 --- /dev/null +++ b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.blade.php @@ -0,0 +1,43 @@ +
+
+ @if(count($data['attachs']) > 0) +

+ {{__("Attachments")}} +

+ + + + + + + + @foreach($data['attachs'] as $attach) + + + + + + + @endforeach +
+ {{__("Name")}} + + {{__("File name")}} + + {{__("Size")}} + + - +
+ {{$attach->title}} + + {{$attach->title}} [ {{$attach->ext}} ] + + {{formatFileSize($attach->size)}} + + + + +
+ @endif +
+
diff --git a/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.js b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.js new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.json b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.json new file mode 100644 index 0000000..713977f --- /dev/null +++ b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.json @@ -0,0 +1,10 @@ +{ + "name": "SimpleAttachmentList", + "version": "1.0", + "author": "xStack", + "email": "xshop@xstack.ir", + "license": "GPL-3.0-or-later", + "url": "https:\/\/xstack.ir", + "author_url": "https:\/\/4xmen.ir", + "packages": [] +} \ No newline at end of file diff --git a/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.php b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.php new file mode 100644 index 0000000..8d12969 --- /dev/null +++ b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.php @@ -0,0 +1,27 @@ +attachs = $model->attachs; + return $part; + } +} diff --git a/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.scss b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.scss new file mode 100644 index 0000000..ec061a6 --- /dev/null +++ b/resources/views/segments/attachments/SimpleAttachmentList/SimpleAttachmentList.scss @@ -0,0 +1,12 @@ +.SimpleAttachmentList { + // scss\ + padding: 2rem 0; + .attach-table { + border-radius: var(--xshop-border-radius); + overflow: hidden; + span{ + color: var(--xshop-secondary); + } + + } +} diff --git a/resources/views/segments/attachments/SimpleAttachmentList/screenshot.png b/resources/views/segments/attachments/SimpleAttachmentList/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b85e767f05eff744f8a43f369f98a29b0a3d267f GIT binary patch literal 28654 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 fLjOe<@py9!29{AZFFqdnelrw3group(function (){ Route::get('/group/{group}', [\App\Http\Controllers\ClientController::class,'group'])->name('group'); Route::get('/gallery/{gallery}', [\App\Http\Controllers\ClientController::class,'gallery'])->name('gallery'); Route::get('/search', [\App\Http\Controllers\ClientController::class,'search'])->name('search'); + Route::get('attach/download/{attachment}', [\App\Http\Controllers\ClientController::class,'attachDl'])->name('attach-dl'); Route::get('/{post}', [\App\Http\Controllers\ClientController::class,'post'])->name('post');