Merge branch 'order-search' into 'master'

Search & Filter Orders

See merge request CIEFWorldwideSdnBhd/izyim!13
This commit is contained in:
omair saleh
2019-03-28 08:49:08 +00:00
15 changed files with 455 additions and 4 deletions
@@ -26,7 +26,7 @@ class ListsCompanyCompleteOrders
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
* @throws CannotListCompanyOrderCategoryException
*/
public function execute(int $id){
public function execute(int $id){
try {
/** @var Order $orders */
@@ -0,0 +1,34 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 22/03/2019
* Time: 10:00 AM
*/
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\Orders\Services\ListsOrder;
class ListOrderLogic
{
/** @var ListsOrder
* */
private $ListOrder;
/**
* ListOrderLogic constructor.
* @param ListsOrder $ListOrder
*/
public function __construct(ListsOrder $ListOrder)
{
$this->ListOrder = $ListOrder;
}
public function execute(String $category){
return $this->ListOrder->execute($category);
}
}
@@ -0,0 +1,42 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 25/03/2019
* Time: 10:53 AM
*/
namespace App\Classes\Modules\ControllersLogic\Orders;
use App\Classes\Modules\Orders\Services\SearchesOrder;
use App\Classes\ValueObjects\Constants\OrderSteps;
use App\Classes\Modules\Companies\Services\FetchCompanyOrderCategorySteps;
use Carbon\Carbon;
use Illuminate\Http\Request;
class SearchOrderLogic
{
/** @var FetchCompanyOrderCategorySteps */
private $fetchCompanyOrderCategorySteps;
/** @var SearchesOrder */
private $searchesOrder;
/**
* SearchOrderLogic constructor.
* @param FetchCompanyOrderCategorySteps $fetchCompanyOrderCategorySteps
* @param SearchesOrder $searchesOrder
*/
public function __construct(FetchCompanyOrderCategorySteps $fetchCompanyOrderCategorySteps, SearchesOrder $searchesOrder)
{
$this->fetchCompanyOrderCategorySteps = $fetchCompanyOrderCategorySteps;
$this->searchesOrder = $searchesOrder;
}
public function execute(Request $request)
{
return $this->searchesOrder->execute($request, $request->input('status') ? $this->fetchCompanyOrderCategorySteps->execute($request->input('status')) : []);
}
}
@@ -0,0 +1,39 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 22/03/2019
* Time: 10:03 AM
*/
namespace App\Classes\Modules\Orders\Services;
use App\Models\Order;
use App\Http\Resources\Order as OrderResource;
class ListsOrder
{
/** @var Order */
private $repository;
/**
* ListsOrder constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
public function execute(String $category){
//$order = $this->repository->where('complete',1)->paginate(10);
$category === 'complete' ? $order = $this->repository->where('complete',true)->paginate(10) :
$order = $this->repository->where('complete',false)->paginate(10);
return OrderResource::collection($order);
}
}
@@ -0,0 +1,65 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 25/03/2019
* Time: 10:53 AM
*/
namespace App\Classes\Modules\Orders\Services;
use App\Models\Order;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Resources\Order as OrderResource;
class SearchesOrder
{
/** @var Order */
private $repository;
/**
* SearchesOrder constructor.
* @param Order $repository
*/
public function __construct(Order $repository)
{
$this->repository = $repository;
}
public function execute(Request $request,array $status)
{
$order = $this->repository;
if($request->input('marking') !== null)
{
$order = $order->where('marking','LIKE','%'.$request->input('marking').'%');
}
if($request->input('startDate') !== null)
{
$startDate = Carbon::createFromFormat('d-m-Y', $request->input('startDate'))->format('Y-m-d');
$order = $order->where('created_at', '>=', $startDate);
}
if($request->input('endDate') !== null)
{
$endDate = Carbon::createFromFormat('d-m-Y', $request->input('endDate'))->format('Y-m-d');
$order = $order->where('created_at', '<=', $endDate);
}
if(count($status))
{
$order = $order->whereIn('current_step', $status);
}
$order = $order->paginate(10);
return OrderResource::collection($order);
}
}
@@ -0,0 +1,21 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 22/03/2019
* Time: 10:00 AM
*/
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\ListOrderLogic;
class ListOrderController
{
public function list(String $category,ListOrderLogic $logic){
return $logic->execute($category);
}
}
@@ -0,0 +1,22 @@
<?php
/**
* Created by PhpStorm.
* User: user
* Date: 25/03/2019
* Time: 10:52 AM
*/
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\ControllersLogic\Orders\SearchOrderLogic;
use Illuminate\Http\Request;
class SearchOrderController
{
public function search(Request $request, SearchOrderLogic $logic)
{
return $logic->execute($request);
}
}
+14
View File
@@ -20,6 +20,9 @@ Vue.component('slide-up-down', SlideUpDown);
*/
//general elements
Vue.component('order-search-component', require('./components/common/OrdersSearchComponent.vue'));
Vue.component('loading-component', require('./components/common/LoadingComponent.vue'));
Vue.component('pagination-component', require('./components/common/PaginationComponent.vue'));
Vue.component('modal-component', require('./components/common/ModalComponent.vue'));
@@ -34,6 +37,11 @@ Vue.component('select-component', require('./components/form_elements/SelectComp
Vue.component('address-component', require('./components/form_elements/AddressComponent.vue'));
//lists
Vue.component('search-order-list-component',require('./components/order/lists/SearchOrdersComponent.vue'));
Vue.component('invite-account-list-component',require('./components/account/lists/AccountsInviteListComponent.vue'));
Vue.component('accounts-list-component', require('./components/account/lists/AccountsListComponent.vue'));
Vue.component('invite-account-list-component', require('./components/account/lists/AccountsInviteListComponent.vue'));
@@ -49,6 +57,10 @@ Vue.component('orders-list-component', require('./components/order/lists/OrdersL
//elements
Vue.component('search-order-component', require('./components/order/elements/SearchOrderComponent.vue'));
Vue.component('invite-account-component',require('./components/account/elements/AccountInviteComponent.vue'));
Vue.component('account-component', require('./components/account/elements/AccountComponent.vue'));
Vue.component('invite-account-component', require('./components/account/elements/AccountInviteComponent.vue'));
@@ -62,6 +74,8 @@ Vue.component('warehouse-profile-component', require('./components/warehouse/ele
Vue.component('warehouse-component', require('./components/warehouse/elements/WarehouseComponenet.vue'));
Vue.component('warehouse-summary-component', require('./components/warehouse/elements/WarehouseSummaryComponenet.vue'));
Vue.component('order-page-component', require('./components/order/elements/OrdersPageComponent.vue'));
Vue.component('order-component', require('./components/order/elements/OrderComponenet.vue'));
Vue.component('confirm-order-component', require('./components/order/elements/ConfirmOrderComponent.vue'));
Vue.component('receive-step-component', require('./components/order/elements/ReceiveStepComponenet.vue'));
@@ -29,7 +29,7 @@
//turn on loading animation
this.isLoading = true;
fetch(route('api.account.list') + '?page='+ page).then(response => response.json())
fetch(route('api.account.invite.list') + '?page='+ page).then(response => response.json())
.then(response => {
this.accounts = response.data;
@@ -0,0 +1,196 @@
<template>
<div class="row m-t-30">
<div class="col-4">
<div class="row no-margin">
<div class="col bg-white" style="-webkit-box-shadow: 0px 7px 25px -19px rgba(0,0,0,0.75); -moz-box-shadow: 0px 7px 25px -19px rgba(0,0,0,0.75); box-shadow: 0px 7px 25px -30px rgba(0,0,0,0.75);">
<div class="row">
<div class="col">
<div class="row p-t-10 p-b-10 b-b b-grey m-b-15 text-white bg-success hint-text">
<div class="col">
<small class="bold all-caps">
Search Filters
</small>
</div>
</div>
<div class="row">
<div class="col">
<div class="row align-items-center justify-content-center">
<div class="col">
<div class="form-group form-group-default m-b-15" >
<label>Order No.</label>
<input type="text" class="form-control" v-model="searchOrder.marking">
</div>
</div>
</div>
<div class="row align-items-center justify-content-center">
<div class="col">
<div class="form-group form-group-default form-group-default-select2 m-b-15" >
<label>Status</label>
<select-component :options="['All', 'processing', 'receiving', 'shipping']"></select-component>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<small class="all-caps muted fs-10 bold">Select Date Range</small>
</div>
</div>
<div class="row p-b-10 p-t-10 bg-white tab-container">
<div class="col text-master">
<div class="row align-items-center justify-content-center">
<div class="col p-r-5">
<div class="form-group form-group-default" >
<label>Start Date</label>
<date-picker-component class="form-control" v-model="searchOrder.startDate" name="start_date" v-on:updateDate="setStartDate($event)"></date-picker-component>
</div>
</div>
<div class="col p-l-5">
<div class="form-group form-group-default" >
<label>End Date</label>
<date-picker-component class="form-control" v-model="searchOrder.endDate" name="end_date" v-on:updateDate="setEndDate($event)"></date-picker-component>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="row p-b-10">
<div class="col">
<div class="btn btn-sm btn-block b-success text-success all-caps bold" @click="searchOrders()">
Search Orders
</div>
</div>
</div>
<div class="row p-b-15">
<div class="col">
<div class="btn btn-sm btn-block bg-white b-grey all-caps muted" @click="clearForm()">
<span>Clear</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="card no-border bg-transparent">
<div class="row" v-show="this.searchActive">
<div class="col">
<div class="relative" style="min-height: 300px">
<loading-component v-show="isLoading"></loading-component>
<div class="row" v-if="!orders.length && isLoading === false">
<div class="col text-center p-t-30 p-b-30 bg-white">
<div class="row">
<div class="col text-center">
<img src="https://static.thenounproject.com/png/10066-200.png" width="60" class="hint-text">
</div>
</div>
<div class="row">
<div class="col">
<div class="bold all-caps p-t-15 fs-12 text-primary">No orders found</div>
</div>
</div>
<div class="row">
<div class="col">
<small class="all-caps fs-10 muted">No orders matching your criteria</small>
</div>
</div>
</div>
</div>
<order-component v-for="order in orders" v-bind:key="order.id" :data="order"></order-component>
<pagination-component class="m-b-20" ref="pagination" v-on:changePage="searchOrders($event)"></pagination-component>
</div>
</div>
</div>
<div class="tab-content bg-transparent p-l-0 p-r-0" v-show="!this.searchActive">
<div class="tab-pane active" id="orders">
<ul class="nav nav-tabs nav-tabs-simple" role="tablist" data-init-reponsive-tabs="dropdownfx">
<li>
<a class="active" data-toggle="tab" href="#processing">
Processing
</a>
</li>
<li>
<a data-toggle="tab" href="#completed">
Completed
</a>
</li>
</ul>
<div class="tab-content bg-transparent p-l-0 p-r-0">
<div class="tab-pane active" id="processing">
<orders-list-component type="forwarder" category="processing"></orders-list-component>
</div>
<div class="tab-pane" id="completed">
<orders-list-component type="forwarder" category="complete"></orders-list-component>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data(){
return {
searchOrder: {
marking: null,
// status: 'All',
startDate: null,
endDate: null
},
orders: [],
searchActive: false,
isLoading: false
}
},
methods: {
searchOrders(page = 1){
//turn on loading animation
this.isLoading = true;
fetch(route('api.order.search') + '?page='+ page, {
method: 'post',
body: JSON.stringify(this.searchOrder),
headers: {
'content-type': 'application/json'
}
}).then(response => response.json())
.then(response => {
this.orders = response.data;
this.searchActive = true;
//turn off loading animation
this.isLoading = false;
this.$refs.pagination.makePagination(response.meta, response.links);
})
},
setStartDate(date){
this.searchOrder.startDate = date;
},
setEndDate(date){
this.searchOrder.endDate = date;
},
clearForm(){
this.searchOrder = {
marking: '',
startDate: '',
endDate: ''
};
}
}
}
</script>
@@ -36,7 +36,7 @@
},
'id': {
type: String,
required: true
required: false
},
'category': {
type: String,
@@ -68,6 +68,10 @@
url = route('api.warehouse.order.list', {id: this.id, category: this.category});
}
if(this.type === 'forwarder'){
url = route('api.order.list', {category: this.category});
}
fetch(url + '?page='+ page)
.then(response => response.json())
.then(response => {
@@ -0,0 +1,5 @@
@extends('layouts.base_portal')
@section('inner_content')
<order-page-component></order-page-component>
@endsection
@@ -13,7 +13,7 @@
</a>
</li>
<li>
<a href="{{route('dashboard')}}" class="b-r b-grey">
<a href="{{route('order')}}" class="b-r b-grey">
<div class="inline v-align-middle">
<span class="block m-b-5 lh-13 fs-12 semi-bold">Orders</span>
<span class="block muted lh-11 fs-10 all-caps">Manage & Track</span>
+5
View File
@@ -19,6 +19,8 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::group(['prefix' => 'account', 'as' => 'account.', 'namespace' => 'Account'], function () {
Route::get('/list', 'ListUserController@list')->name('list');
Route::post('/create', 'RegisterAccountController@register')->name('create');
Route::post('/update/{id}', 'UpdateUserController@update')->name('update');
Route::group(['prefix' => 'invite', 'as' => 'invite.'], function () {
Route::post('/invite', 'InviteUserController@invite')->name('create');
Route::get('/list/active', 'ListUserController@list')->name('list');
@@ -126,6 +128,9 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function
Route::post('/{orderId}/shipping-arrangement', 'OrderController@orderShippingArrangement')->name('shipping.arrangement.create');
Route::post('/{orderId}/shipping-arrangement/reschedule', 'OrderController@rescheduleShipping')->name('shipping.arrangement.reschedule');
Route::get('/list/{category}', 'ListOrderController@list')->name('list');
Route::post('/search','SearchOrderController@search')->name('search');
});
+4
View File
@@ -44,6 +44,10 @@ Route::group(['middleware' => ['secure', 'clearcache']], function (): void {
Route::get('/order/profile', function(){
return view('pages.orders.profile');
})->name('order.profile');
Route::get('/order', function(){
return view('pages.orders.index');
})->name('order');
});