From cdaf978a6796b8ecf7bc9487a3bbcd091b6a5d42 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Thu, 18 May 2017 09:45:48 +0700 Subject: [PATCH] Added ajax product search with html response Redirect back to search query after item addition Added 200ms delay each search query keyup --- app/Http/Controllers/Api/ProductsController.php | 8 ++++-- app/Http/Controllers/CartController.php | 3 ++ resources/views/cart/index.blade.php | 33 ++++++++++++++++++++++ .../cart/partials/product-search-box.blade.php | 7 ++++- .../partials/product-search-result-box.blade.php | 9 +++--- tests/Feature/Cart/SearchProductsTest.php | 25 ++++++++++------ 6 files changed, 69 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/Api/ProductsController.php b/app/Http/Controllers/Api/ProductsController.php index dd69ce7..3ef84df 100644 --- a/app/Http/Controllers/Api/ProductsController.php +++ b/app/Http/Controllers/Api/ProductsController.php @@ -10,7 +10,10 @@ class ProductsController extends Controller { public function search(Request $request) { - $query = $request->get('query'); + $query = $request->get('query'); + $draftType = $request->get('draftType'); + $draftKey = $request->get('draftKey'); + $formToken = $request->get('formToken'); $queriedProducts = []; if ($query) { $queriedProducts = Product::where(function ($q) use ($query) { @@ -18,7 +21,6 @@ class ProductsController extends Controller })->with('unit')->get(); } - return response()->json($queriedProducts, 200); - // return view('cart.partials.product-search-result-box', $queriedProducts); + return view('cart.partials.product-search-result-box', compact('queriedProducts','draftType','draftKey','formToken')); } } diff --git a/app/Http/Controllers/CartController.php b/app/Http/Controllers/CartController.php index 8a78d78..8a317ae 100644 --- a/app/Http/Controllers/CartController.php +++ b/app/Http/Controllers/CartController.php @@ -62,6 +62,9 @@ class CartController extends Controller $item = new Item($product, $request->qty); $this->cart->addItemToDraft($draftKey, $item); + if ($request->has('query')); + return redirect()->route('cart.show', [$draftKey, 'query' => $request->get('query')]); + return back(); } diff --git a/resources/views/cart/index.blade.php b/resources/views/cart/index.blade.php index c4d9768..808c222 100644 --- a/resources/views/cart/index.blade.php +++ b/resources/views/cart/index.blade.php @@ -25,4 +25,37 @@ @endif @endif +@endsection + +@section('script') + @endsection \ No newline at end of file diff --git a/resources/views/cart/partials/product-search-box.blade.php b/resources/views/cart/partials/product-search-box.blade.php index 9d6c39e..678e75c 100644 --- a/resources/views/cart/partials/product-search-box.blade.php +++ b/resources/views/cart/partials/product-search-box.blade.php @@ -7,5 +7,10 @@ {{ link_to_route('cart.show', 'Bersihkan Pencarian', [$draft->draftKey], ['class' => 'btn btn-sm']) }} - @includeWhen ($queriedProducts, 'cart.partials.product-search-result-box') +
+ @includeWhen ($queriedProducts, 'cart.partials.product-search-result-box', [ + 'draftType' => $draft->type, + 'draftKey' => $draft->draftKey + ]) +
\ No newline at end of file diff --git a/resources/views/cart/partials/product-search-result-box.blade.php b/resources/views/cart/partials/product-search-result-box.blade.php index 6041773..c843c9e 100644 --- a/resources/views/cart/partials/product-search-result-box.blade.php +++ b/resources/views/cart/partials/product-search-result-box.blade.php @@ -4,7 +4,7 @@ {{ trans('product.name') }} {{ trans('product.unit') }} - {{ trans('product.price') }} ({{ $draft->type }}) + {{ trans('product.price') }} ({{ $draftType }}) {{ trans('app.action') }} @@ -13,10 +13,11 @@ {{ $product->name }} {{ $product->unit->name }} - {{ formatRp($product->getPrice($draft->type)) }} + {{ formatRp($product->getPrice($draftType)) }} -
- {{ csrf_field() }} + + +
diff --git a/tests/Feature/Cart/SearchProductsTest.php b/tests/Feature/Cart/SearchProductsTest.php index 3203b55..ac27374 100644 --- a/tests/Feature/Cart/SearchProductsTest.php +++ b/tests/Feature/Cart/SearchProductsTest.php @@ -2,6 +2,8 @@ namespace Tests\Feature\Cart; +use App\Cart\CartCollection; +use App\Cart\CreditDraft; use App\Product; use Illuminate\Foundation\Testing\DatabaseMigrations; use Tests\TestCase; @@ -16,18 +18,25 @@ class SearchProductsTest extends TestCase $this->disableExceptionHandling(); factory(Product::class)->create(['name' => 'Hemaviton']); factory(Product::class)->create(['name' => 'Zee']); - $product1 = factory(Product::class)->create(['name' => 'Bisolvon 1']); - $product2 = factory(Product::class)->create(['name' => 'Bisolvon 2']); + $product1 = factory(Product::class)->create(['name' => 'Bisolvon 1', 'cash_price' => 2000, 'credit_price' => 2100]); + $product2 = factory(Product::class)->create(['name' => 'Bisolvon 2', 'cash_price' => 3000, 'credit_price' => 3200]); + + $cart = new CartCollection(); + $draft = new CreditDraft(); + $cart->add($draft); $user = $this->loginAsUser(); - $response = $this->post(route('api.products.search'), ['query'=> 'Bis']); + $response = $this->post(route('api.products.search'), [ + 'query'=> 'Bis', + 'draftType'=> $draft->type, + 'draftKey'=> $draft->draftKey, + ]); $response->assertSuccessful(); - - $response->assertJsonFragment([ - 'name' => 'Bisolvon 1', - 'name' => 'Bisolvon 2', - ]); + $response->assertSee($product1->name); + $response->assertSee(route('cart.add-draft-item', [$draft->draftKey, $product1->id])); + $response->assertSee($product2->name); + $response->assertSee(route('cart.add-draft-item', [$draft->draftKey, $product2->id])); } }