¨4.0.1¨
This commit is contained in:
@@ -3,13 +3,14 @@
|
||||
namespace Modules\Review\Admin;
|
||||
|
||||
use Modules\Admin\Ui\AdminTable;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
class ReviewTable extends AdminTable
|
||||
{
|
||||
/**
|
||||
* Make table response for the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function make()
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ class ReviewTabs extends Tabs
|
||||
->add($this->general());
|
||||
}
|
||||
|
||||
|
||||
private function general()
|
||||
{
|
||||
return tap(new Tab('review', trans('review::reviews.tabs.general')), function (Tab $tab) {
|
||||
|
||||
@@ -27,6 +27,7 @@ class CreateReviewsTable extends Migration
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace Modules\Review\Entities;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\User\Entities\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Modules\Support\Eloquent\Model;
|
||||
use Modules\Product\Entities\Product;
|
||||
@@ -32,7 +33,16 @@ class Review extends Model
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $appends = ['rating_percent', 'created_at_formatted'];
|
||||
protected $appends = ['rating_percent', 'status', 'created_at_formatted'];
|
||||
|
||||
|
||||
public static function countAndAvgRating(Product $product)
|
||||
{
|
||||
return self::select(DB::raw('count(*) as count, avg(rating) as avg_rating'))
|
||||
->where('product_id', $product->id)
|
||||
->first();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Perform any actions required after the model boots.
|
||||
@@ -46,28 +56,25 @@ class Review extends Model
|
||||
});
|
||||
}
|
||||
|
||||
public static function countAndAvgRating(Product $product)
|
||||
{
|
||||
return self::select(DB::raw('count(*) as count, avg(rating) as avg_rating'))
|
||||
->where('product_id', $product->id)
|
||||
->first();
|
||||
}
|
||||
|
||||
public function getAvgRatingAttribute($avgRating)
|
||||
{
|
||||
return $avgRating ?: 0;
|
||||
}
|
||||
|
||||
|
||||
public function getRatingPercentAttribute()
|
||||
{
|
||||
return ($this->rating / 5) * 100;
|
||||
}
|
||||
|
||||
public function getCreatedAtFormattedAttribute()
|
||||
|
||||
public function getStatusAttribute()
|
||||
{
|
||||
return $this->created_at->toFormattedDateString();
|
||||
return $this->status();
|
||||
}
|
||||
|
||||
|
||||
public function status()
|
||||
{
|
||||
if ($this->is_approved) {
|
||||
@@ -77,21 +84,31 @@ class Review extends Model
|
||||
return trans('review::statuses.unapproved');
|
||||
}
|
||||
|
||||
|
||||
public function getCreatedAtFormattedAttribute()
|
||||
{
|
||||
return $this->created_at->toFormattedDateString();
|
||||
}
|
||||
|
||||
|
||||
public function product()
|
||||
{
|
||||
return $this->belongsTo(Product::class)->withTrashed();
|
||||
}
|
||||
|
||||
|
||||
public function reviewer()
|
||||
{
|
||||
return $this->belongsTo(User::class, 'reviewer_id');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get table data for the resource
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
* @param Request $request
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function table(Request $request)
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Modules\Review\Http\Controllers\Admin;
|
||||
|
||||
use Illuminate\Http\Response;
|
||||
use Modules\Review\Entities\Review;
|
||||
use Modules\Admin\Traits\HasCrudActions;
|
||||
use Modules\Admin\Ui\Facades\TabManager;
|
||||
@@ -39,11 +40,13 @@ class ReviewController
|
||||
*/
|
||||
protected $validation = UpdateReviewRequest::class;
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
@@ -54,11 +57,13 @@ class ReviewController
|
||||
return view('review::admin.reviews.edit', compact('review', 'tabs'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function update($id)
|
||||
{
|
||||
@@ -66,16 +71,18 @@ class ReviewController
|
||||
|
||||
$review->update(request()->all());
|
||||
|
||||
return back()->withSuccess(trans('admin::messages.resource_saved', ['resource' => $this->getLabel()]));
|
||||
return back()->withSuccess(trans('admin::messages.resource_updated', ['resource' => $this->getLabel()]));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Destroy resources by given ids.
|
||||
*
|
||||
* @param string $ids
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function destroy($ids)
|
||||
public function destroy(string $ids)
|
||||
{
|
||||
Review::withoutGlobalScope('approved')
|
||||
->whereIn('id', explode(',', $ids))
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Modules\Review\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Response;
|
||||
use Modules\Review\Entities\Review;
|
||||
use Modules\Product\Entities\Product;
|
||||
use Modules\Review\Http\Requests\StoreReviewRequest;
|
||||
@@ -12,23 +13,26 @@ class ProductReviewController
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @param int $productId
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function index($productId)
|
||||
{
|
||||
return Review::where('product_id', $productId)->latest()->paginate(4);
|
||||
return Review::where('product_id', $productId)->latest()->paginate(5);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param int $productId
|
||||
* @param \Modules\Review\Http\Requests\StoreReviewRequest $request
|
||||
* @return \Illuminate\Http\Response
|
||||
* @param StoreReviewRequest $request
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function store($productId, StoreReviewRequest $request)
|
||||
{
|
||||
if (! setting('reviews_enabled')) {
|
||||
if (!setting('reviews_enabled')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
24
Modules/Review/Http/Controllers/ReviewProductController.php
Normal file
24
Modules/Review/Http/Controllers/ReviewProductController.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Review\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class ReviewProductController
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
return auth()->user()
|
||||
->reviews()
|
||||
->withoutGlobalScope('approved')
|
||||
->with('product.files')
|
||||
->whereHas('product')
|
||||
->latest()
|
||||
->paginate(10);
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ class StoreReviewRequest extends Request
|
||||
*/
|
||||
protected $availableAttributes = 'review::attributes';
|
||||
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
|
||||
@@ -13,6 +13,7 @@ class UpdateReviewRequest extends Request
|
||||
*/
|
||||
protected $availableAttributes = 'review::attributes';
|
||||
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
|
||||
@@ -3,15 +3,11 @@
|
||||
namespace Modules\Review\Providers;
|
||||
|
||||
use Modules\Review\Admin\ReviewTabs;
|
||||
use Modules\Support\Traits\AddsAsset;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Modules\Admin\Ui\Facades\TabManager;
|
||||
use Modules\Review\Admin\ProductTabsExtender;
|
||||
|
||||
class ReviewServiceProvider extends ServiceProvider
|
||||
{
|
||||
use AddsAsset;
|
||||
|
||||
/**
|
||||
* Bootstrap the application services.
|
||||
*
|
||||
@@ -20,6 +16,5 @@ class ReviewServiceProvider extends ServiceProvider
|
||||
public function boot()
|
||||
{
|
||||
TabManager::register('reviews', ReviewTabs::class);
|
||||
TabManager::extend('products', ProductTabsExtender::class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'submitted_for_approval' => 'Your review is submitted for approval.',
|
||||
'submitted_for_approval' => 'Your review is submitted for approval',
|
||||
];
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
return [
|
||||
'review' => 'Review',
|
||||
'reviews' => 'Reviews',
|
||||
'products' => [
|
||||
'reviews' => 'Reviews',
|
||||
],
|
||||
'table' => [
|
||||
'product' => 'Product',
|
||||
'reviewer_name' => 'Reviewer Name',
|
||||
@@ -13,10 +16,7 @@ return [
|
||||
'group' => [
|
||||
'review_information' => 'Review Information',
|
||||
],
|
||||
'general' => 'general',
|
||||
'products' => [
|
||||
'reviews' => 'Reviews',
|
||||
],
|
||||
'general' => 'General',
|
||||
],
|
||||
'form' => [
|
||||
'approve_this_review' => 'Approve this review',
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
<script>
|
||||
<script type="module">
|
||||
keypressAction([
|
||||
{ key: 'b', route: "{{ route('admin.products.edit', $productId) }}" },
|
||||
]);
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
@endcomponent
|
||||
|
||||
@push('scripts')
|
||||
<script>
|
||||
<script type="module">
|
||||
Mousetrap.bind('del', function () {
|
||||
$('#product-reviews-table_wrapper .btn-delete').trigger('click');
|
||||
});
|
||||
|
||||
DataTable.setRoutes('#product-reviews-table', {
|
||||
index: {
|
||||
name: 'admin.reviews.index',
|
||||
table: {
|
||||
name: 'admin.reviews.table',
|
||||
params: { productId: '{{ $product->id }}' }
|
||||
},
|
||||
edit: { name: 'admin.reviews.edit' },
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
@endpush
|
||||
|
||||
@push('scripts')
|
||||
<script>
|
||||
<script type="module">
|
||||
keypressAction([
|
||||
{ key: 'b', route: "{{ route('admin.reviews.index') }}" },
|
||||
]);
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
@endcomponent
|
||||
|
||||
@push('scripts')
|
||||
<script>
|
||||
<script type="module">
|
||||
new DataTable('#reviews-table .table', {
|
||||
columns: [
|
||||
{ data: 'checkbox', orderable: false, searchable: false, width: '3%' },
|
||||
|
||||
@@ -25,3 +25,9 @@ Route::delete('reviews/{ids?}', [
|
||||
'uses' => 'ReviewController@destroy',
|
||||
'middleware' => 'can:admin.reviews.destroy',
|
||||
]);
|
||||
|
||||
Route::get('reviews/index/table', [
|
||||
'as' => 'admin.reviews.table',
|
||||
'uses' => 'ReviewController@table',
|
||||
'middleware' => 'can:admin.reviews.index',
|
||||
]);
|
||||
|
||||
@@ -7,3 +7,7 @@ Route::get('products/{productId}/reviews', 'ProductReviewController@index')->nam
|
||||
Route::post('products/{productId}/reviews', 'ProductReviewController@store')
|
||||
->name('products.reviews.store')
|
||||
->middleware(ProtectAgainstSpam::class);
|
||||
|
||||
Route::get('reviews/products', 'ReviewProductController@index')
|
||||
->name('reviews.products.index')
|
||||
->middleware('auth');
|
||||
|
||||
@@ -14,7 +14,7 @@ class SidebarExtender extends BaseSidebarExtender
|
||||
$menu->group(trans('admin::sidebar.content'), function (Group $group) {
|
||||
$group->item(trans('product::sidebar.products'), function (Item $item) {
|
||||
$item->item(trans('review::sidebar.reviews'), function (Item $item) {
|
||||
$item->weight(30);
|
||||
$item->weight(40);
|
||||
$item->route('admin.reviews.index');
|
||||
$item->authorize(
|
||||
$this->auth->hasAccess('admin.reviews.index')
|
||||
|
||||
Reference in New Issue
Block a user