From fd7b93e49fbca7332045a32910fcb4f59a1df784 Mon Sep 17 00:00:00 2001 From: Slymee Date: Thu, 25 Jan 2024 14:32:39 +0545 Subject: [PATCH] scroll pagination: wip && product tags: complete --- app/Http/Controllers/ProductAdController.php | 21 ++- app/Models/ProductAd.php | 5 + app/Models/Tag.php | 20 +++ .../2024_01_25_080043_create_tags_table.php | 30 ++++ resources/js/app.js | 2 + resources/js/product-ad.js | 31 ++++ resources/js/select-child-category.js | 52 ------- .../views/userend/create-product.blade.php | 143 ++++++++++++------ routes/web.php | 1 + 9 files changed, 203 insertions(+), 102 deletions(-) create mode 100644 app/Models/Tag.php create mode 100644 database/migrations/2024_01_25_080043_create_tags_table.php create mode 100644 resources/js/product-ad.js delete mode 100644 resources/js/select-child-category.js diff --git a/app/Http/Controllers/ProductAdController.php b/app/Http/Controllers/ProductAdController.php index 84a9303..aa1fc0e 100644 --- a/app/Http/Controllers/ProductAdController.php +++ b/app/Http/Controllers/ProductAdController.php @@ -6,6 +6,7 @@ use App\Http\Requests\CreateProductAdRequest; use App\Models\Category; use App\Models\ProductAd; +use App\Models\Tag; use Illuminate\Http\Request; use Illuminate\Support\Str; @@ -30,6 +31,14 @@ public function create(Category $category) return view('userend.create-product', compact('mainParent')); } + /** + * Getting paginated parent category + */ + public function getPaginatedCategory(Category $category){ + $mainParent = $category->whereNull('parent_id')->get(); + return response()->json(['items' => $mainParent->items()]); + } + /** * Store a newly created resource in storage. */ @@ -51,7 +60,14 @@ public function store(CreateProductAdRequest $request) $productAd->categories()->attach($request->input('parent_category')); $productAd->categories()->attach($request->input('sub_category')); $productAd->categories()->attach($request->input('sub_sub_category')); - return redirect()->back()->with('message', 'Product Added.'); + $tagNames = $request->input('product_tags', []); // Assuming 'product_tags' is an array in the request + $productAd->tags()->saveMany( + array_map(function ($tagName) { + return new Tag(['tag_name' => $tagName]); + }, $tagNames) + ); + return redirect()->back()->with('message', 'Product Add Success.'); + } return redirect()->back()->with('message', 'Product Add Failed.'); @@ -61,11 +77,12 @@ public function store(CreateProductAdRequest $request) } /** - * Select child category + * Select child category for selecting multilevel category */ public function displayChildCategory(string $parentId){ $data = Category::where('parent_id', $parentId)->paginate(10); return response()->json($data); + // return response()->json(['items' => $data->items()]); } /** diff --git a/app/Models/ProductAd.php b/app/Models/ProductAd.php index f8e46da..e0a7649 100644 --- a/app/Models/ProductAd.php +++ b/app/Models/ProductAd.php @@ -29,4 +29,9 @@ public function categories() { return $this->belongsToMany(Category::class, 'product_category'); } + + public function tags() + { + return $this->hasMany(Tag::class, 'product_id'); + } } diff --git a/app/Models/Tag.php b/app/Models/Tag.php new file mode 100644 index 0000000..0cc799c --- /dev/null +++ b/app/Models/Tag.php @@ -0,0 +1,20 @@ +belongsTo(ProductAd::class, 'product_ads'); + } +} diff --git a/database/migrations/2024_01_25_080043_create_tags_table.php b/database/migrations/2024_01_25_080043_create_tags_table.php new file mode 100644 index 0000000..ada2a2d --- /dev/null +++ b/database/migrations/2024_01_25_080043_create_tags_table.php @@ -0,0 +1,30 @@ +id(); + $table->unsignedBigInteger('product_id'); + $table->foreign('product_id')->references('id')->on('product_ads')->onDelete('cascade'); + $table->string('tag_name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tags'); + } +}; diff --git a/resources/js/app.js b/resources/js/app.js index e59d6a0..8a239ae 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1 +1,3 @@ import './bootstrap'; + +import './product-ad'; \ No newline at end of file diff --git a/resources/js/product-ad.js b/resources/js/product-ad.js new file mode 100644 index 0000000..c28663c --- /dev/null +++ b/resources/js/product-ad.js @@ -0,0 +1,31 @@ +$(document).ready(function(){ + +$('#subCategoryDiv').hide(); +$('#subSubCategoryDiv').hide(); + +/** +* Level 2 category fetch +*/ +async function fetchSubCategory() { + $('#subCategoryDiv').show(); + $('#subCategory').html(''); + + var parentId = $('#parentCategory').val(); + const url = 'get-child-option/' + parentId; + + try { + let response = await axios.get(url); + + if (response.status === 200) { + let categories = response.data.items; + categories.forEach(category => { + $('#subCategory').append(``); + }); + } else { + console.error('Error fetching data:', response.statusText); + } + } catch (error) { + console.error('Error fetching data:', error.message); + } +} +}); \ No newline at end of file diff --git a/resources/js/select-child-category.js b/resources/js/select-child-category.js deleted file mode 100644 index 087a6ce..0000000 --- a/resources/js/select-child-category.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Level 2 Category - */ - -async function fetchSubCategory(){ - document.querySelector('#subCategory').innerHTML = ''; - // document.querySelector('#subCategory').innerHTML = ''; - - var parentID = document.querySelector('#parentCategory').value; - const URL = 'get-child-option/'+parentID; - let response = await axios.get(URL); - if(response.status===200){ - paginatedData = response.data; - console.log(paginatedData); - paginatedData.data.forEach(function (category) { - $('#subCategory').append(''); - }); - } - // request.open("GET", "get-child-option/"+parentID, true); - // request.send(); - // request.onreadystatechange = function(){ - // if(request.readyState == 4 && request.status == 200){ - // var data = JSON.parse(request.responseText); - // console.log(data); - // console.log(data[1]['data'][0]['category_name']) - // data.forEach(function (category) { - // $('#subCategory').append(''); - // }); - // } - // } - } - - -/** - * Level 3 Category - */ - - async function fetchSubSubCategory(){ - document.querySelector('#subSubCategory').innerHTML = ''; - // document.querySelector('#subCategory').innerHTML = ''; - - var parentID = document.querySelector('#subCategory').value; - const URL = 'get-child-option/'+parentID; - let response = await axios.get(URL); - if(response.status===200){ - paginatedData = response.data; - console.log(paginatedData); - paginatedData.data.forEach(function (category) { - $('#subSubCategory').append(''); - }); - } - } diff --git a/resources/views/userend/create-product.blade.php b/resources/views/userend/create-product.blade.php index c435408..fb742bf 100644 --- a/resources/views/userend/create-product.blade.php +++ b/resources/views/userend/create-product.blade.php @@ -15,7 +15,6 @@ -
Create an Ad @@ -46,21 +45,21 @@ @endforeach
-
+
-
-
+
-
-
- +
+ @@ -74,32 +73,101 @@ @if($errors->any()) @foreach ($errors->all() as $error) - {{ $error }}
+
{{ $error }} @endforeach @endif
+ + {{-- @vite(['resources/js/app.js']) --}} diff --git a/routes/web.php b/routes/web.php index 3438d24..3ed7ae6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -57,6 +57,7 @@ Route::get('my-product-ads', [ProductAdController::class, 'index'])->name('my-product-ads'); Route::get('product-ad', [ProductAdController::class, 'create'])->name('product-ad-form'); Route::post('product-ad', [ProductAdController::class, 'store'])->name('product-ad-post'); + Route::get('get-parent-category', [ProductAdController::class, 'getPaginatedCategory'])->name('paginated-category'); Route::get('get-child-option/{parentId}', [ProductAdController::class, 'displayChildCategory'])->name('get-child-option'); });