basics test
parent
3ba11e5637
commit
87f7581aca
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
class DashboardController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->middleware('auth');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the application dashboard.
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
if (! $request->get('tab')) {
|
||||||
|
return redirect()->route('dashboard', ['tab' => 'active_orders']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('dashboard', [
|
||||||
|
'today' => Carbon::today(),
|
||||||
|
'tab' => $request->get('tab'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
|
|
||||||
class HomeController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Create a new controller instance.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->middleware('auth');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the application dashboard.
|
|
||||||
*
|
|
||||||
* @return \Illuminate\Contracts\Support\Renderable
|
|
||||||
*/
|
|
||||||
public function index()
|
|
||||||
{
|
|
||||||
return view('home');
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Models\Customer;
|
||||||
|
|
||||||
|
class ManagementController extends Controller
|
||||||
|
{
|
||||||
|
protected string $defaultTab = 'customers';
|
||||||
|
|
||||||
|
public function index(?string $tab = null)
|
||||||
|
{
|
||||||
|
if (! $tab) {
|
||||||
|
return redirect()->route('management.index', ['tab' => $this->defaultTab]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view('management.index', [
|
||||||
|
'customers' => Customer::all(),
|
||||||
|
'tab' => $tab,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class OrderProductController extends Controller
|
||||||
|
{
|
||||||
|
public function index() {}
|
||||||
|
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
return view('order-products.create');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(Request $request) {}
|
||||||
|
|
||||||
|
public function show($id) {}
|
||||||
|
|
||||||
|
public function edit($id) {}
|
||||||
|
|
||||||
|
public function update(Request $request, $id) {}
|
||||||
|
|
||||||
|
public function destroy($id) {}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class OrderProductRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'order_id' => ['required', 'exists:orders'],
|
||||||
|
'sku' => ['string', 'nullable'],
|
||||||
|
'product_name' => ['required'],
|
||||||
|
'color' => ['string', 'nullable'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ProductServiceRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'order_product_id' => ['required', 'exists:order_products'],
|
||||||
|
'service_file_id' => ['nullable', 'exists:service_files'],
|
||||||
|
'service_type' => ['required'],
|
||||||
|
'placement' => ['required'],
|
||||||
|
'setup_amount' => ['required'],
|
||||||
|
'amount' => ['nullable'],
|
||||||
|
'amount_price' => ['nullable'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ProductSizeRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'order_product_id' => ['required', 'exists:order_products'],
|
||||||
|
'size' => ['required'],
|
||||||
|
'amount' => ['required'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class ServiceFileRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'code' => ['required'],
|
||||||
|
'name' => ['required'],
|
||||||
|
'width' => ['required', 'numeric'],
|
||||||
|
'height' => ['required', 'numeric'],
|
||||||
|
'unit' => ['required'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire;
|
||||||
|
|
||||||
|
use App\Enums\OrderStatus;
|
||||||
|
use App\Enums\OrderType;
|
||||||
|
use App\Models\Customer;
|
||||||
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class CreateOrder extends Component
|
||||||
|
{
|
||||||
|
public Collection $customers;
|
||||||
|
|
||||||
|
public string $selectedCustomer;
|
||||||
|
|
||||||
|
public $contacts;
|
||||||
|
|
||||||
|
public function mount(Collection $customers)
|
||||||
|
{
|
||||||
|
$this->customers = $customers;
|
||||||
|
$this->contacts = $customers->first()->contacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getContacts()
|
||||||
|
{
|
||||||
|
$this->contacts = Customer::find($this->selectedCustomer)->contacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.create-order', [
|
||||||
|
'contacts' => $this->contacts,
|
||||||
|
'order_types' => OrderType::cases(),
|
||||||
|
'order_status' => OrderStatus::cases(),
|
||||||
|
'customers' => $this->customers,
|
||||||
|
'today' => Carbon::today()->format('Y-m-d'),
|
||||||
|
'due_default' => Carbon::today()->addDay(10)->format('Y-m-d'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire;
|
||||||
|
|
||||||
|
use App\Models\Customer;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class CustomerAndContactSelect extends Component
|
||||||
|
{
|
||||||
|
public Collection $customers;
|
||||||
|
|
||||||
|
public Collection $contacts;
|
||||||
|
|
||||||
|
public string $selectedCustomer;
|
||||||
|
|
||||||
|
public function mount(Collection $customers)
|
||||||
|
{
|
||||||
|
$this->customers = $customers;
|
||||||
|
|
||||||
|
if (isset($this->selectedCustomer)) {
|
||||||
|
$this->contacts = Customer::find($this->selectedCustomer)->contacts;
|
||||||
|
} else {
|
||||||
|
$this->contacts = $customers->first()->contacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateContactList()
|
||||||
|
{
|
||||||
|
$this->contacts = Customer::find($this->selectedCustomer)->contacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.customer-and-contact-select', [
|
||||||
|
'customers' => $this->customers,
|
||||||
|
'contacts' => $this->contacts,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,158 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class OrderProductsCreate extends Component
|
||||||
|
{
|
||||||
|
public Collection $productInputs;
|
||||||
|
|
||||||
|
public Collection $serviceInputs;
|
||||||
|
|
||||||
|
public array $sizes = [];
|
||||||
|
|
||||||
|
public array $totals = [];
|
||||||
|
|
||||||
|
public array $units = [];
|
||||||
|
|
||||||
|
public array $prices = [];
|
||||||
|
|
||||||
|
public array $priceTotals = [];
|
||||||
|
|
||||||
|
public int $totalQuantity = 0;
|
||||||
|
|
||||||
|
public string $totalPrice = '$0.00';
|
||||||
|
|
||||||
|
public function updated()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
foreach ($this->sizes as $index => $size) {
|
||||||
|
$this->totals[$index] = array_sum($size);
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
foreach ($this->units as $index => $unit) {
|
||||||
|
$this->priceTotals[$index] = $unit * $this->prices[$index];
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->totalQuantity = array_sum($this->totals);
|
||||||
|
|
||||||
|
$this->totalPrice = '$'.number_format(round(array_sum($this->priceTotals), 2), 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addProductInput()
|
||||||
|
{
|
||||||
|
$index = $this->productInputs->count();
|
||||||
|
$this->productInputs->push([
|
||||||
|
$index => [
|
||||||
|
'sku' => '',
|
||||||
|
'product_name' => '',
|
||||||
|
'product_color' => '',
|
||||||
|
'size_xs' => '',
|
||||||
|
'size_s' => '',
|
||||||
|
'size_m' => '',
|
||||||
|
'size_l' => '',
|
||||||
|
'size_xl' => '',
|
||||||
|
'size_2xl' => '',
|
||||||
|
'size_3xl' => '',
|
||||||
|
'size_osfa' => '',
|
||||||
|
'product_total' => '',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function determineAddProductRow($index)
|
||||||
|
{
|
||||||
|
if ($index == $this->productInputs->count() - 1) {
|
||||||
|
$this->addProductInput();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function determineAddServiceProductRow($index)
|
||||||
|
{
|
||||||
|
if ($index == $this->serviceInputs->count() - 1) {
|
||||||
|
$this->addServiceInput();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removeProductInput($key)
|
||||||
|
{
|
||||||
|
if ($this->productInputs->count() > 1) {
|
||||||
|
$this->productInputs->pull($key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addServiceInput()
|
||||||
|
{
|
||||||
|
$this->serviceInputs->push([
|
||||||
|
$this->serviceInputs->count() => [
|
||||||
|
'service_name' => '',
|
||||||
|
'product_name' => '',
|
||||||
|
'product_color' => '',
|
||||||
|
'logo_name' => '',
|
||||||
|
'setup_number' => '',
|
||||||
|
'service_width' => '',
|
||||||
|
'service_height' => '',
|
||||||
|
'service_setup_unit' => '',
|
||||||
|
'service_setup_price' => '',
|
||||||
|
'service_total' => '',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function removeServiceInput($key)
|
||||||
|
{
|
||||||
|
if ($this->serviceInputs->count() > 1) {
|
||||||
|
$this->serviceInputs->pull($key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mount()
|
||||||
|
{
|
||||||
|
$this->fill([
|
||||||
|
'productInputs' => collect([
|
||||||
|
[
|
||||||
|
'sku' => '',
|
||||||
|
'product_name' => '',
|
||||||
|
'product_color' => '',
|
||||||
|
'size_xs' => '',
|
||||||
|
'size_s' => '',
|
||||||
|
'size_m' => '',
|
||||||
|
'size_l' => '',
|
||||||
|
'size_xl' => '',
|
||||||
|
'size_2xl' => '',
|
||||||
|
'size_3xl' => '',
|
||||||
|
'size_osfa' => '',
|
||||||
|
'product_total' => '0',
|
||||||
|
],
|
||||||
|
]),
|
||||||
|
'serviceInputs' => collect([
|
||||||
|
[
|
||||||
|
'sku' => '',
|
||||||
|
'product_name' => '',
|
||||||
|
'product_color' => '',
|
||||||
|
'logo_name' => '',
|
||||||
|
'setup_number' => '',
|
||||||
|
'service_width' => '',
|
||||||
|
'service_height' => '',
|
||||||
|
'service_setup_unit' => '',
|
||||||
|
'service_setup_price' => '',
|
||||||
|
'service_total' => '',
|
||||||
|
],
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.order-products-create');
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire;
|
||||||
|
|
||||||
|
use App\Models\Order;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
use Livewire\Component;
|
||||||
|
use Livewire\WithPagination;
|
||||||
|
|
||||||
|
class OrdersTable extends Component
|
||||||
|
{
|
||||||
|
use WithPagination;
|
||||||
|
|
||||||
|
protected $paginationTheme = 'bootstrap';
|
||||||
|
|
||||||
|
public bool $showCustomerColumn;
|
||||||
|
|
||||||
|
public string $orderType = 'active';
|
||||||
|
|
||||||
|
public string $search = '';
|
||||||
|
|
||||||
|
public string $title = '';
|
||||||
|
|
||||||
|
public string $customer_id = '';
|
||||||
|
|
||||||
|
public Carbon $today;
|
||||||
|
|
||||||
|
public function mount(bool $showCustomerColumn, string $orderType, string $title, ?string $customer_id = null)
|
||||||
|
{
|
||||||
|
$this->today = Carbon::today();
|
||||||
|
$this->showCustomerColumn = $showCustomerColumn;
|
||||||
|
$this->orderType = $orderType;
|
||||||
|
$this->title = $title;
|
||||||
|
$this->customer_id = $customer_id ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.orders-table', [
|
||||||
|
'orders' => Order::with('customer')
|
||||||
|
->when($this->customer_id != null, fn ($q) => $q->where('customer_id', $this->customer_id))
|
||||||
|
->when($this->orderType === 'active', fn ($q) => $q->active())
|
||||||
|
->when($this->orderType === 'invoiced', fn ($q) => $q->invoiced())
|
||||||
|
->when($this->orderType === 'finished', fn ($q) => $q->finished())
|
||||||
|
->when($this->search !== '', function ($query) {
|
||||||
|
$query->whereHas('customer', function ($query) {
|
||||||
|
$query->where('company_name', 'like', '%'.$this->search.'%');
|
||||||
|
})->orWhere('customer_po', 'like', '%'.$this->search.'%')
|
||||||
|
->orWhere('internal_po', 'like', '%'.$this->search.'%')
|
||||||
|
->orWhere('order_date', 'like', '%'.$this->search.'%')
|
||||||
|
->orWhere('due_date', 'like', '%'.$this->search.'%')
|
||||||
|
->orWhere('status', 'like', '%'.$this->search.'%');
|
||||||
|
})
|
||||||
|
->orderByDesc('rush')
|
||||||
|
->orderBy('due_date')
|
||||||
|
->paginate(15)
|
||||||
|
->withQueryString(),
|
||||||
|
'today' => $this->today,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
class OrderProduct extends Model
|
||||||
|
{
|
||||||
|
use HasFactory, SoftDeletes;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'order_id',
|
||||||
|
'sku',
|
||||||
|
'product_name',
|
||||||
|
'color',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function order(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Order::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function serviceFile(): HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(ServiceFile::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function productSize(): HasMany
|
||||||
|
{
|
||||||
|
return $this->hasMany(ProductSize::class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
class ProductService extends Model
|
||||||
|
{
|
||||||
|
use HasFactory, SoftDeletes;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'order_id',
|
||||||
|
'service_type',
|
||||||
|
'placement',
|
||||||
|
'setup_amount',
|
||||||
|
'amount',
|
||||||
|
'amount_price',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function order(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Order::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function serviceFile(): HasOne
|
||||||
|
{
|
||||||
|
return $this->hasOne(ServiceFile::class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
class ProductSize extends Model
|
||||||
|
{
|
||||||
|
use HasFactory, SoftDeletes;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'order_product_id',
|
||||||
|
'size',
|
||||||
|
'amount',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function orderProduct(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(OrderProduct::class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
|
class ServiceFile extends Model
|
||||||
|
{
|
||||||
|
use HasFactory, SoftDeletes;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'code',
|
||||||
|
'product_service_id',
|
||||||
|
'name',
|
||||||
|
'width',
|
||||||
|
'height',
|
||||||
|
'unit',
|
||||||
|
'setup_number',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function productService(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(ProductService::class);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\OrderProduct;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
class OrderProductFactory extends Factory
|
||||||
|
{
|
||||||
|
protected $model = OrderProduct::class;
|
||||||
|
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'created_at' => Carbon::now(),
|
||||||
|
'updated_at' => Carbon::now(),
|
||||||
|
'sku' => $this->faker->randomElement([$this->faker->randomNumber(4, true), null]),
|
||||||
|
'product_name' => $this->faker->randomElement(['shirts', 'hats', 'jackets', 'pants', 'tote bags', 'backpacks']),
|
||||||
|
'color' => $this->faker->randomElement(['black', 'white', 'navy', 'red', 'gold', 'charcoal']),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\ProductService;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
class ProductServiceFactory extends Factory
|
||||||
|
{
|
||||||
|
protected $model = ProductService::class;
|
||||||
|
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'created_at' => Carbon::now(),
|
||||||
|
'updated_at' => Carbon::now(),
|
||||||
|
'service_type' => $this->faker->randomElement(['embroidery', 'screen printing', 'dtg', 'vinyl']),
|
||||||
|
'placement' => $this->faker->randomElement(['l/c', 'c/f', 'f/b', 'r/c']),
|
||||||
|
'setup_amount' => 0,
|
||||||
|
'amount' => $this->faker->randomNumber(1),
|
||||||
|
'amount_price' => 0,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\ProductSize;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
class ProductSizeFactory extends Factory
|
||||||
|
{
|
||||||
|
protected $model = ProductSize::class;
|
||||||
|
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'created_at' => Carbon::now(),
|
||||||
|
'updated_at' => Carbon::now(),
|
||||||
|
'size' => $this->faker->randomElement(['xs', 's', 'm', 'l', 'xl', '2xl', '3xl']),
|
||||||
|
'amount' => $this->faker->randomNumber(2, false),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Factories;
|
||||||
|
|
||||||
|
use App\Models\ServiceFile;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
class ServiceFileFactory extends Factory
|
||||||
|
{
|
||||||
|
protected $model = ServiceFile::class;
|
||||||
|
|
||||||
|
public function definition(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'created_at' => Carbon::now(),
|
||||||
|
'updated_at' => Carbon::now(),
|
||||||
|
'code' => $this->faker->randomElement(['A', 'B']).$this->faker->randomNumber(4, true),
|
||||||
|
'name' => $this->faker->word(),
|
||||||
|
'width' => round($this->faker->randomFloat(2, 0, 10), 1),
|
||||||
|
'height' => round($this->faker->randomFloat(2, 0, 10), 1),
|
||||||
|
'unit' => 'inch',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('order_products', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->foreignId('order_id')->constrained();
|
||||||
|
$table->string('sku')->nullable();
|
||||||
|
$table->string('product_name');
|
||||||
|
$table->string('color')->nullable();
|
||||||
|
$table->softDeletes();
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('order_products');
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('product_services', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->foreignId('order_id');
|
||||||
|
$table->string('service_type');
|
||||||
|
$table->string('placement');
|
||||||
|
$table->string('setup_amount');
|
||||||
|
$table->string('amount')->nullable();
|
||||||
|
$table->string('amount_price')->nullable();
|
||||||
|
$table->softDeletes();
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('product_services');
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('service_files', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->foreignId('product_service_id')->constrained();
|
||||||
|
$table->string('code');
|
||||||
|
$table->string('name');
|
||||||
|
$table->string('placement');
|
||||||
|
$table->decimal('width')->nullable();
|
||||||
|
$table->decimal('height')->nullable();
|
||||||
|
$table->string('unit')->default('inch');
|
||||||
|
$table->integer('setup_number')->nullable();
|
||||||
|
$table->softDeletes();
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('service_files');
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('product_sizes', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->foreignId('order_product_id');
|
||||||
|
$table->string('size');
|
||||||
|
$table->string('amount');
|
||||||
|
$table->softDeletes();
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('product_sizes');
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,92 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use App\Models\Contact;
|
||||||
|
use App\Models\Customer;
|
||||||
|
use App\Models\Order;
|
||||||
|
use App\Models\OrderProduct;
|
||||||
|
use App\Models\PackingSlip;
|
||||||
|
use App\Models\ProductService;
|
||||||
|
use App\Models\ProductSize;
|
||||||
|
use App\Models\ShippingEntry;
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
|
||||||
|
class CustomerSeeder extends Seeder
|
||||||
|
{
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
Customer::factory(3)
|
||||||
|
->has(Contact::factory(5))
|
||||||
|
->has(PackingSlip::factory(30))
|
||||||
|
->has(ShippingEntry::factory(2))
|
||||||
|
->has(Order::factory(10)
|
||||||
|
->has(OrderProduct::factory(2)
|
||||||
|
->has(ProductSize::factory(3)))
|
||||||
|
->has(ProductService::factory(3)))
|
||||||
|
// ->has(ServiceFile::factory(1))))
|
||||||
|
->create();
|
||||||
|
|
||||||
|
Customer::factory([
|
||||||
|
'company_name' => 'Genumark',
|
||||||
|
'internal_name' => 'genumark',
|
||||||
|
'shipping_address' => '',
|
||||||
|
'billing_address' => '',
|
||||||
|
])
|
||||||
|
->has(Contact::factory([
|
||||||
|
'first_name' => 'Tammy',
|
||||||
|
'last_name' => 'Bookbinder',
|
||||||
|
'email' => 'tbookbinder@genumark.com',
|
||||||
|
'phone' => '+1 778 229 5668',
|
||||||
|
]))
|
||||||
|
->has(Contact::factory([
|
||||||
|
'first_name' => 'Kathlyn',
|
||||||
|
'last_name' => 'Wood',
|
||||||
|
'email' => 'kwood@genumark.com',
|
||||||
|
'phone' => '+1 604 294 2376',
|
||||||
|
'notes' => 'Always CC, unless SOF order',
|
||||||
|
]))
|
||||||
|
->has(Contact::factory([
|
||||||
|
'first_name' => 'Jane',
|
||||||
|
'last_name' => 'Wellman',
|
||||||
|
'email' => 'jwellman@genumark.com',
|
||||||
|
'phone' => '+1 604 742 5584',
|
||||||
|
'notes' => 'Deals with SOF orders',
|
||||||
|
]))
|
||||||
|
->has(Contact::factory([
|
||||||
|
'first_name' => 'Trisha',
|
||||||
|
'last_name' => 'Miller',
|
||||||
|
'email' => 'tmiller@genumark.com',
|
||||||
|
'phone' => '+1 604 802 8486',
|
||||||
|
]))
|
||||||
|
->has(Contact::factory([
|
||||||
|
'first_name' => 'Brenda',
|
||||||
|
'last_name' => 'Kuepfer',
|
||||||
|
'email' => 'bkuepfer@genumark.com',
|
||||||
|
'phone' => '+1 604 305 5002',
|
||||||
|
]))
|
||||||
|
->has(PackingSlip::factory(20))
|
||||||
|
->has(ShippingEntry::factory([
|
||||||
|
'account_title' => 'Genumark',
|
||||||
|
'courier' => 'UPS CampusShip',
|
||||||
|
'contact' => 'https://www.ups.com/lasso/login',
|
||||||
|
'account_username' => 'GenumarkTopNotch',
|
||||||
|
'account_password' => 'TopNotch@13579',
|
||||||
|
'info_needed' => 'Put PO on box',
|
||||||
|
'notify' => 'Various reps, CC Kathlyn Wood',
|
||||||
|
'notes' => 'For Save On Foods orders, see Genumark SOF',
|
||||||
|
]))
|
||||||
|
->has(ShippingEntry::factory([
|
||||||
|
'account_title' => 'Genumark Save-On-Foods',
|
||||||
|
'courier' => 'UPS CampusShip',
|
||||||
|
'contact' => 'https://www.ups.com/lasso/login',
|
||||||
|
'account_username' => 'GenumarkTopNotch',
|
||||||
|
'account_password' => 'TopNotch@13579',
|
||||||
|
'info_needed' => 'Put PO on box',
|
||||||
|
'notify' => 'Jane Wellman',
|
||||||
|
'notes' => 'Don\'t CC Kathlyn for SOF orders',
|
||||||
|
]))
|
||||||
|
->has(Order::factory(10))
|
||||||
|
->create();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"preset": "laravel",
|
||||||
|
"rules": {
|
||||||
|
"binary_operator_spaces": {
|
||||||
|
"default": "single_space",
|
||||||
|
"operators": {
|
||||||
|
"=>": "align_single_space_minimal",
|
||||||
|
"=": "align_single_space_minimal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,144 +0,0 @@
|
|||||||
@extends('layouts.app')
|
|
||||||
|
|
||||||
@section('header')
|
|
||||||
<div class="container-fluid bg-light pt-3">
|
|
||||||
|
|
||||||
<!-- Customer company name row -->
|
|
||||||
<div class="row justify-content-center pb-2">
|
|
||||||
<div class="col-3"></div>
|
|
||||||
<div class="col">
|
|
||||||
<h2></h2>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tabs row -->
|
|
||||||
<div class="row justify-content-center mb-3">
|
|
||||||
<div class="col-3 border-bottom"></div>
|
|
||||||
<div class="col-6 p-0">
|
|
||||||
|
|
||||||
<ul class="nav nav-fill nav-tabs" id="customer-tabs" role="tablist">
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<button class="nav-link link-dark {{$tab == null ? 'active' : ''}}" id="details-tab"
|
|
||||||
data-bs-toggle="tab" data-bs-target="#details" type="button" role="tab"
|
|
||||||
aria-controls="details" aria-selected="{{$tab == null ? 'true' : 'false'}}">
|
|
||||||
<x-bi-list-ul/>
|
|
||||||
Customers
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<button class="nav-link link-dark {{$tab == 'shipping' ? 'active' : ''}}" id="shipping-tab"
|
|
||||||
data-bs-toggle="tab" data-bs-target="#shipping" type="button" role="tab"
|
|
||||||
aria-controls="shipping" aria-selected="{{$tab == 'shipping' ? 'true' : 'false'}}">
|
|
||||||
<x-bi-box-fill/>
|
|
||||||
Orders
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<button class="nav-link link-dark {{$tab == 'packing' ? 'active' : ''}}" id="packing-tab"
|
|
||||||
data-bs-toggle="tab" data-bs-target="#packing" type="button" role="tab"
|
|
||||||
aria-controls="packing" aria-selected="{{$tab == 'packing' ? 'true' : 'false'}}">
|
|
||||||
<x-bi-card-text/>
|
|
||||||
Packing Slips
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{{-- <li class="nav-item" role="presentation">--}}
|
|
||||||
{{-- <button class="nav-link link-dark {{$tab == 'contacts' ? 'active' : ''}}" id="contacts-tab"--}}
|
|
||||||
{{-- data-bs-toggle="tab" data-bs-target="#contacts" type="button" role="tab"--}}
|
|
||||||
{{-- aria-controls="contacts" aria-selected="{{$tab == 'contacts' ? 'true' : 'false'}}">--}}
|
|
||||||
{{-- <x-bi-people-fill/>--}}
|
|
||||||
{{-- Contacts--}}
|
|
||||||
{{-- </button>--}}
|
|
||||||
{{-- </li>--}}
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="col border-bottom"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
@endsection()
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<div class="container">
|
|
||||||
<div class="row justify-content-center mb-3">
|
|
||||||
<div class="col">
|
|
||||||
<div class="d-flex flex-row gap-2">
|
|
||||||
<button class="btn btn-primary" title="Create new customer..."
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#createCustomerModal">
|
|
||||||
<x-bi-person-plus-fill/>
|
|
||||||
Create entry
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<div class="vr"></div>
|
|
||||||
|
|
||||||
<div class="d-inline-flex gap-2">
|
|
||||||
<input type="text" class="form-control" placeholder="Search..."
|
|
||||||
name="" id="">
|
|
||||||
<button class="btn btn-outline-primary">
|
|
||||||
<x-bi-search/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mx-auto"></div>
|
|
||||||
|
|
||||||
<button class="btn btn-danger" title="Delete customer..."
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#deleteCustomerModal">
|
|
||||||
<x-bi-trash-fill/>
|
|
||||||
Delete entry
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col">
|
|
||||||
@if(sizeof($customers) !== 0)
|
|
||||||
<table class="table table-striped table-hover">
|
|
||||||
<thead>
|
|
||||||
<tr class="border-bottom border-black">
|
|
||||||
<th scope="col">Company Name</th>
|
|
||||||
<th scope="col">Internal Name</th>
|
|
||||||
<th scope="col">Shipping Address</th>
|
|
||||||
<th scope="col">Billing Address</th>
|
|
||||||
<th scope="col">Phone</th>
|
|
||||||
<th scope="col">View</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
|
|
||||||
<tbody>
|
|
||||||
|
|
||||||
@foreach($customers as $customer)
|
|
||||||
<tr>
|
|
||||||
<td> {{$customer->company_name}} </td>
|
|
||||||
<td><code>{{$customer->internal_name}}</code></td>
|
|
||||||
<td> {{$customer->shipping_address}} </td>
|
|
||||||
<td> {{$customer->billing_address}} </td>
|
|
||||||
<td class="text-nowrap"> {{$customer->phone}} </td>
|
|
||||||
<td class="align-top">
|
|
||||||
<a class="btn btn-sm btn-outline-secondary"
|
|
||||||
href="{{route('customers.show', [$customer->id, 'tab'=>'details'])}}">
|
|
||||||
<x-bi-arrow-right/>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
@else()
|
|
||||||
No customer data.
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Create Customer Modal -->
|
|
||||||
@include('partials.customers.create-modal')
|
|
||||||
|
|
||||||
<!-- Delete Customer Modal -->
|
|
||||||
@include('partials.customers.delete-all-modal')
|
|
||||||
|
|
||||||
@endsection
|
|
@ -0,0 +1,59 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('header')
|
||||||
|
<div class="container-fluid bg-light pt-3">
|
||||||
|
|
||||||
|
<!-- Customer company name row -->
|
||||||
|
<div class="row justify-content-center pb-2">
|
||||||
|
<div class="col-3"></div>
|
||||||
|
<div class="col">
|
||||||
|
{{-- <h2>Overview</h2>--}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs row -->
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-3 border-bottom"></div>
|
||||||
|
<div class="col-6 p-0">
|
||||||
|
|
||||||
|
<ul class="nav nav-fill nav-tabs" id="home-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders-tab"
|
||||||
|
href="{{route('dashboard', ['tab' => 'active_orders'])}}" type="button" role="tab"
|
||||||
|
aria-controls="active_orders"
|
||||||
|
aria-selected="{{$tab == 'active_orders' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-arrow-clockwise/>
|
||||||
|
Active Orders
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'packing_slips' ? 'active' : ''}}" id="packing-tab"
|
||||||
|
href="{{route('dashboard', ['tab' => 'packing_slips'])}}" type="button" role="tab"
|
||||||
|
aria-controls="packing_slips"
|
||||||
|
aria-selected="{{$tab == 'packing_slips' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-list-ul/>
|
||||||
|
Packing Slips
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col border-bottom"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center my-3">
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders" role="tabpanel"
|
||||||
|
aria-labelledby="active_orders-tab">
|
||||||
|
|
||||||
|
<livewire:orders-table :order-type="'active'" :show-customer-column="true" title="Active Orders"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
@ -1,23 +0,0 @@
|
|||||||
@extends('layouts.app')
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<div class="container">
|
|
||||||
<div class="row justify-content-center">
|
|
||||||
<div class="col-md-8">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-header">{{ __('Dashboard') }}</div>
|
|
||||||
|
|
||||||
<div class="card-body">
|
|
||||||
@if (session('status'))
|
|
||||||
<div class="alert alert-success" role="alert">
|
|
||||||
{{ session('status') }}
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{ __('You are logged in!') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
|
@ -0,0 +1,97 @@
|
|||||||
|
<nav class="navbar navbar-expand-md navbar-light bg-white border-bottom">
|
||||||
|
<div class="container">
|
||||||
|
<a class="navbar-brand" href="{{ url('/') }}">
|
||||||
|
{{ config('app.name', 'Laravel') }}
|
||||||
|
</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
|
||||||
|
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
|
||||||
|
aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
|
<!-- Left Side Of Navbar -->
|
||||||
|
<ul class="navbar-nav me-auto">
|
||||||
|
<li class="nav-item px-2">
|
||||||
|
<a class="nav-link @if(request()->routeIs('dashboard')) active @endif "
|
||||||
|
href="{{route('dashboard')}}">
|
||||||
|
<x-bi-activity/>
|
||||||
|
Dashboard</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link @if(request()->routeIs('search')) active @endif disabled"
|
||||||
|
href="">
|
||||||
|
<x-bi-search/>
|
||||||
|
Search</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item px-2">
|
||||||
|
<a class="nav-link @if(request()->routeIs('orders.*')) active @endif"
|
||||||
|
href="{{route('orders.index')}}">
|
||||||
|
<x-bi-box/>
|
||||||
|
Orders</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item px-2">
|
||||||
|
<a class="nav-link @if(request()->routeIs('quotes')) active @endif disabled"
|
||||||
|
href="">
|
||||||
|
<x-bi-file-text/>
|
||||||
|
Quotes</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item px-2">
|
||||||
|
<a class="nav-link @if(request()->routeIs('invoices')) active @endif disabled"
|
||||||
|
href="">
|
||||||
|
<x-bi-envelope/>
|
||||||
|
Invoices</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown px-2">
|
||||||
|
<a class="nav-link dropdown-toggle @if(request()->routeIs('management.index') || request()->routeIs('customer.*')) active @endif" href="#"
|
||||||
|
role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<x-bi-pencil-square/>
|
||||||
|
Management
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item @if(request()->routeIs('customers.*')) fw-bold @endif" href="{{route('management.index')}}">Customers</a></li>
|
||||||
|
<li><a class="dropdown-item @if(request()->routeIs('packing-slips.*')) fw bold @endif" href="{{route('management.index', 'packing')}}">Packing Slips</a></li>
|
||||||
|
<li><a class="dropdown-item @if(request()->routeIs('service-files.*')) fw bold @endif" href="{{route('management.index', 'files')}}">Service Files</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Right Side Of Navbar -->
|
||||||
|
<ul class="navbar-nav ms-auto">
|
||||||
|
<!-- Authentication Links -->
|
||||||
|
@guest
|
||||||
|
@if (Route::has('login'))
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if (Route::has('register'))
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
|
||||||
|
</li>
|
||||||
|
@endif
|
||||||
|
@else
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
|
||||||
|
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
|
||||||
|
{{ Auth::user()->name }}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
|
||||||
|
<a class="dropdown-item" href="{{ route('logout') }}"
|
||||||
|
onclick="event.preventDefault();
|
||||||
|
document.getElementById('logout-form').submit();">
|
||||||
|
{{ __('Logout') }}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
|
||||||
|
@csrf
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endguest
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
@ -0,0 +1,3 @@
|
|||||||
|
<div>
|
||||||
|
|
||||||
|
</div>
|
@ -0,0 +1,44 @@
|
|||||||
|
<div>
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label for="customer_id" class="col-md-4 col-form-label text-md-end">Customer</label>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<select wire:change="updateContactList" wire:model="selectedCustomer" name="customer_id"
|
||||||
|
class="form-select form-select-sm" id="customer_id" autofocus required>
|
||||||
|
@foreach($customers as $customer)
|
||||||
|
<option value="{{$customer->id}}" {{ old('customer_id') == $customer->id ? "selected" : "" }}>
|
||||||
|
{{$customer->company_name}}
|
||||||
|
</option>
|
||||||
|
@endforeach()
|
||||||
|
</select>
|
||||||
|
|
||||||
|
@error('customer_id')
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
<strong>{{ $message }}</strong>
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label for="contact_id" class="col-md-4 col-form-label text-md-end">Contact</label>
|
||||||
|
<div class="col-md-6">
|
||||||
|
@if(isset($contacts))
|
||||||
|
<select wire:model="contacts" wire:key="{{$customer}}" name="contact_id"
|
||||||
|
class="form-select form-select-sm" id="contact_id">
|
||||||
|
<option value=""></option>
|
||||||
|
@foreach($contacts as $contact)
|
||||||
|
<option value="{{$contact->id}}" {{ old('contact_id') == $contact->id ? "selected" : "" }}>
|
||||||
|
{{$contact->full_name}}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
|
||||||
|
@error('contact_id')
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
<strong>{{ $message }}</strong>
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,299 @@
|
|||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="overflow-x-hidden overflow-y-visible" style="max-height: 730px">
|
||||||
|
<table class="table table-striped table-sm mb-1 ms-0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">#</th>
|
||||||
|
<th scope="col">SKU</th>
|
||||||
|
<th scope="col">Product Name</th>
|
||||||
|
<th scope="col">Color</th>
|
||||||
|
<th scope="col">XS</th>
|
||||||
|
<th scope="col">S</th>
|
||||||
|
<th scope="col">M</th>
|
||||||
|
<th scope="col">L</th>
|
||||||
|
<th scope="col">XL</th>
|
||||||
|
<th scope="col">2XL</th>
|
||||||
|
<th scope="col">3XL</th>
|
||||||
|
<th scope="col">OSFA</th>
|
||||||
|
<th scope="col">Total</th>
|
||||||
|
<th scope="col"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
@foreach($productInputs as $key => $value)
|
||||||
|
|
||||||
|
<tr wire:key="productRow.{{$key}}">
|
||||||
|
|
||||||
|
<input type="hidden" name="productInputCount[]" value="1">
|
||||||
|
|
||||||
|
<th scope="row" class="align-middle">{{$loop->index+1}}</th>
|
||||||
|
<td class="col-1">
|
||||||
|
<!-- SKU -->
|
||||||
|
|
||||||
|
<input id="sku_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm @error('sku') is-invalid @enderror"
|
||||||
|
name="sku[]" value="{{@old('sku')}}" autofocus
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="col-3">
|
||||||
|
<!-- product_name -->
|
||||||
|
|
||||||
|
<input id="product_name_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm @error('product_name') is-invalid @enderror"
|
||||||
|
name="product_name[]" value="{{@old('product_name')}}"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="col-1">
|
||||||
|
<!-- product_color -->
|
||||||
|
|
||||||
|
<input id="product_color_{{$key}}" type="text" min="0"
|
||||||
|
class="form-control form-control-sm @error('product_color') is-invalid @enderror"
|
||||||
|
name="product_color[]" value="{{@old('product_color')}}"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_xs -->
|
||||||
|
|
||||||
|
<input id="size_xs_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_xs') is-invalid @enderror"
|
||||||
|
name="size_xs[]" value="{{@old('size_xs')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.xs"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_s -->
|
||||||
|
|
||||||
|
<input id="size_s_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_s') is-invalid @enderror"
|
||||||
|
name="size_s[]" value="{{@old('size_s')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.s"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_m -->
|
||||||
|
|
||||||
|
<input id="size_m_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_m') is-invalid @enderror"
|
||||||
|
name="size_m[]" value="{{@old('size_m')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.m"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_l -->
|
||||||
|
|
||||||
|
<input id="size_l_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_l') is-invalid @enderror"
|
||||||
|
name="size_l[]" value="{{@old('size_l')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.l"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_xl -->
|
||||||
|
|
||||||
|
<input id="size_xl_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_xl') is-invalid @enderror"
|
||||||
|
name="size_xl[]" value="{{@old('size_xl')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.xl"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_2xl -->
|
||||||
|
|
||||||
|
<input id="size_2xl_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_2xl') is-invalid @enderror"
|
||||||
|
name="size_2xl[]" value="{{@old('size_2xl')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.2xl"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td class="" style="width: 55px">
|
||||||
|
<!-- size_3xl -->
|
||||||
|
|
||||||
|
<input id="size_3xl_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_3xl') is-invalid @enderror"
|
||||||
|
name="size_3xl[]"
|
||||||
|
wire:model.live="sizes.{{$key}}.3xl"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})">
|
||||||
|
</td>
|
||||||
|
<td style="width: 55px">
|
||||||
|
<!-- size_osfa -->
|
||||||
|
|
||||||
|
<input id="size_osfa_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('size_osfa') is-invalid @enderror"
|
||||||
|
name="size_osfa[]" value="{{@old('size_osfa')}}"
|
||||||
|
wire:model.live="sizes.{{$key}}.osfa"
|
||||||
|
wire:change="determineAddProductRow({{$loop->index}})"
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td class="col" style="width: 55px">
|
||||||
|
<input id="product_total_{{$key}}" type="number"
|
||||||
|
class="form-control form-control-sm @error('product_total') is-invalid @enderror"
|
||||||
|
name="product_total[]" readonly
|
||||||
|
wire:model.live="totals.{{$key}}"
|
||||||
|
>
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td class="col" style="width: 40px">
|
||||||
|
@if($key > 0)
|
||||||
|
<button class="btn btn-sm" type="button" wire:click="removeProductInput({{$key}})">
|
||||||
|
<x-bi-trash3/>
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="d-flex gap-2">
|
||||||
|
<label for="total-quantity" class="text-nowrap col-form-label">Total Quantity:</label>
|
||||||
|
|
||||||
|
<input type="number" name="total-quantity" id="" class="form-control-plaintext" readonly
|
||||||
|
wire:model.live="totalQuantity">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Title -->
|
||||||
|
<div class="row px-2 border-bottom mt-4">
|
||||||
|
<div class="row fw-bold">
|
||||||
|
<div class="col-1 px-1 text-end" style="width: 40px;">#</div>
|
||||||
|
<div class="col-1 px-1">Service</div>
|
||||||
|
<div class="col-2 px-1">Placement</div>
|
||||||
|
<div class="col-3 px-1">Logo Name</div>
|
||||||
|
|
||||||
|
<div class="col-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col px-1">Setup</div>
|
||||||
|
<div class="col px-1">Width</div>
|
||||||
|
<div class="col px-1">Height</div>
|
||||||
|
<div class="col px-1">Unit</div>
|
||||||
|
<div class="col px-1">Price</div>
|
||||||
|
<div class="col px-1">Total</div>
|
||||||
|
<div class="col px-1"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Row -->
|
||||||
|
|
||||||
|
@foreach($serviceInputs as $key => $value)
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<input type="hidden" name="serviceInputCount[]" value="1">
|
||||||
|
|
||||||
|
<div class="@if($loop->index % 2 != 1) bg-body-tertiary @endif border-bottom py-2">
|
||||||
|
<div class="row mb-1">
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-1 px-1 fw-bold text-end" style="width: 40px;">{{$loop->index+1}}</div>
|
||||||
|
<div class="col-1 px-1">
|
||||||
|
<input id="service_name_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm m-0 @error('service_name') is-invalid @enderror"
|
||||||
|
name="service_type[]" value="{{@old('service_name')}}" placeholder="Service"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
<div class="col-2 px-1">
|
||||||
|
<input id="placement_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm @error('placement') is-invalid @enderror"
|
||||||
|
name="placement[]" value="{{@old('placement')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
<div class="col-3 px-1">
|
||||||
|
<input id="logo_name_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm @error('logo_name') is-invalid @enderror"
|
||||||
|
name="logo_name[]" value="{{@old('logo_name')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
<div class="col-5">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col px-1">
|
||||||
|
<input id="setup_number_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('setup_number') is-invalid @enderror"
|
||||||
|
name="setup_amount[]" value="{{@old('setup_number')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
<div class="col px-1">
|
||||||
|
<input id="service_width_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('service_width') is-invalid @enderror"
|
||||||
|
name="service_width[]" value="{{@old('service_width')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
<div class="col px-1">
|
||||||
|
<input id="service_height_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('service_height') is-invalid @enderror"
|
||||||
|
name="service_height[]" value="{{@old('service_height')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
<div class="col px-1">
|
||||||
|
<input id="service_setup_unit_{{$key}}" type="number" min="0"
|
||||||
|
class="form-control form-control-sm @error('service_setup_unit') is-invalid @enderror"
|
||||||
|
name="amount[]"
|
||||||
|
value="{{@old('service_setup_unit')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})"
|
||||||
|
wire:model.live="units.{{$key}}"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="col px-1">
|
||||||
|
<input id="service_setup_price_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm @error('service_setup_price') is-invalid @enderror"
|
||||||
|
name="amount_price[]"
|
||||||
|
value="{{@old('service_setup_price')}}"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})"
|
||||||
|
wire:model.live="prices.{{$key}}"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="col px-1">
|
||||||
|
<input id="service_total_{{$key}}" type="number" precision="2"
|
||||||
|
class="form-control form-control-sm px-1 @error('service_total') is-invalid @enderror"
|
||||||
|
name="service_total" readonly
|
||||||
|
wire:model.live="priceTotals.{{$key}}">
|
||||||
|
</div>
|
||||||
|
<div class="col px-1 text-end" style="width: 40px;">
|
||||||
|
@if($key > 0)
|
||||||
|
<button class="btn btn-sm" type="button"
|
||||||
|
wire:click="removeServiceInput({{$key}})">
|
||||||
|
<x-bi-trash3/>
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mx-0 px-0">
|
||||||
|
<div class="col-1" style="width: 40px;"></div>
|
||||||
|
<div class="col-1 px-1">
|
||||||
|
<input id="service_file_name_{{$key}}" type="text"
|
||||||
|
class="form-control form-control-sm @error('service_file_name') is-invalid @enderror"
|
||||||
|
name="service_file_name[]" value="{{@old('service_file_name')}}"
|
||||||
|
placeholder="File"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-9 px-1">
|
||||||
|
<textarea name="contents[]" id="contents_{{$key}}" style="resize: none" rows="2"
|
||||||
|
class="form-control form-control-sm"
|
||||||
|
placeholder="Thread colors"
|
||||||
|
wire:change="determineAddServiceProductRow({{$loop->index}})"
|
||||||
|
>{{ old('contents') }}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
{{-- <div class="row">--}}
|
||||||
|
<div class="d-flex flex-row gap-2 ">
|
||||||
|
<label for="total-price" class="col-form-label text-nowrap">Total Price:</label>
|
||||||
|
<input type="text" name="total-price" id="" class="col-1 form-control-plaintext" readonly
|
||||||
|
wire:model.live="totalPrice">
|
||||||
|
</div>
|
||||||
|
{{-- </div>--}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
@ -0,0 +1,111 @@
|
|||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="row justify-content-center mb-3">
|
||||||
|
<div class="col-9">
|
||||||
|
<div class="d-flex flex-row gap-2">
|
||||||
|
<div class="d-inline-flex">
|
||||||
|
<h4 class="my-auto">{{$this->title}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="mx-auto"></div>
|
||||||
|
<a href="{{route('orders.create')}}"
|
||||||
|
class="btn btn-sm btn-primary" title="Create new order...">
|
||||||
|
<x-bi-plus-circle-fill/>
|
||||||
|
Create entry
|
||||||
|
</a>
|
||||||
|
<div class="vr"></div>
|
||||||
|
|
||||||
|
<div class="d-inline-flex">
|
||||||
|
<select name="" id="" class="form-select form-select-sm">
|
||||||
|
<option value="">Sort by...</option>
|
||||||
|
<option value="">Customer</option>
|
||||||
|
<option value="">Internal PO</option>
|
||||||
|
<option value="">Customer PO</option>
|
||||||
|
<option value="">Order Date</option>
|
||||||
|
<option value="">Due Date</option>
|
||||||
|
<option value="">Status</option>
|
||||||
|
<option value="">Rush</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-inline-flex">
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<button class="btn btn-sm btn-secondary">Asc</button>
|
||||||
|
<button class="btn btn-sm btn-outline-secondary">Desc</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="vr"></div>
|
||||||
|
|
||||||
|
<div class="d-inline-flex gap-2">
|
||||||
|
<input wire:model.live.debounce.50ms="search" type="text" class="form-control form-control-sm"
|
||||||
|
placeholder="Search..."
|
||||||
|
name="" id="searchText">
|
||||||
|
<button class="btn btn-sm btn-outline-primary" id="searchButton">
|
||||||
|
<x-bi-search/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-9">
|
||||||
|
<table class="table table-striped table-sm table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr class="border-bottom border-black">
|
||||||
|
{{-- @if($this->showCustomerColumn)--}}
|
||||||
|
<th scope="col">Customer</th>
|
||||||
|
{{-- @endif()--}}
|
||||||
|
<th scope="col">Internal PO</th>
|
||||||
|
<th scope="col">Customer PO</th>
|
||||||
|
<th scope="col">Order Date</th>
|
||||||
|
<th scope="col">Due Date</th>
|
||||||
|
<th scope="col">Status</th>
|
||||||
|
<th scope="col">Rush</th>
|
||||||
|
<th scope="col">View</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($orders as $order)
|
||||||
|
<tr class="@if($today > $order->due_date && $order->active()) table-danger @elseif($order->rush && $order->active()) table-warning @endif">
|
||||||
|
<td><a class="text-reset text-decoration-none"
|
||||||
|
href="{{route('customers.show', [$order->customer, 'details'])}}">{{$order->customer->company_name}}</a>
|
||||||
|
</td>
|
||||||
|
<td class="fw-bold"><code>{{$order->internal_po}}</code></td>
|
||||||
|
<td class=""><code>{{$order->customer_po}}</code></td>
|
||||||
|
<td class="text-nowrap">{{$order->order_date}}</td>
|
||||||
|
|
||||||
|
<td class="text-nowrap ">
|
||||||
|
{{$order->due_date}}
|
||||||
|
@if($order->due_date < $today && $order->active())
|
||||||
|
<x-bi-exclamation-triangle/>
|
||||||
|
@endif </td>
|
||||||
|
|
||||||
|
<td>{{$order->status->value}}</td>
|
||||||
|
<td>
|
||||||
|
@if($order->rush)
|
||||||
|
<x-bi-check-lg class="text-danger"></x-bi-check-lg>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
<td class="align-top">
|
||||||
|
<a class="btn btn-sm btn-outline-secondary px-1 py-0 m-0"
|
||||||
|
href="">
|
||||||
|
<x-bi-arrow-right/>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col"></div>
|
||||||
|
<div class="col-9">
|
||||||
|
{{$orders->links()}}
|
||||||
|
</div>
|
||||||
|
<div class="col"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
@ -0,0 +1,27 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('header')
|
||||||
|
@include('partials.management.index.management-tabs')
|
||||||
|
|
||||||
|
@endsection()
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="tab-content">
|
||||||
|
|
||||||
|
@include('partials.management.index.customers')
|
||||||
|
|
||||||
|
@include('partials.management.index.packing-slips')
|
||||||
|
|
||||||
|
@include('partials.management.index.service-files')
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Create Customer Modal -->
|
||||||
|
@include('partials.customers.index.create-modal')
|
||||||
|
|
||||||
|
<!-- Delete Customer Modal -->
|
||||||
|
@include('partials.customers.index.delete-all-modal')
|
||||||
|
|
||||||
|
@endsection
|
@ -0,0 +1,39 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
|
||||||
|
@section('header')
|
||||||
|
<div class="container-fluid bg-light pt-3">
|
||||||
|
|
||||||
|
<!-- name row -->
|
||||||
|
<div class="row justify-content-center pb-2">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs row -->
|
||||||
|
<div class="row justify-content-center mb-3">
|
||||||
|
<div class="col-3 border-bottom"></div>
|
||||||
|
<div class="col-6 p-0">
|
||||||
|
<ul class="nav nav-fill nav-tabs" id="management-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark active" id="order-tab"
|
||||||
|
href="#" type="button" role="tab" aria-controls="order" aria-selected="true">
|
||||||
|
<x-bi-box/>
|
||||||
|
Add Products To Order
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col border-bottom"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-10 pt-3">
|
||||||
|
<livewire:order-products-create/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
@ -1,130 +1,217 @@
|
|||||||
@extends('layouts.app')
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
|
||||||
|
@section('header')
|
||||||
|
<div class="container-fluid bg-light pt-3">
|
||||||
|
|
||||||
|
<!-- name row -->
|
||||||
|
<div class="row justify-content-center pb-2">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs row -->
|
||||||
|
<div class="row justify-content-center mb-2">
|
||||||
|
<div class="col-3 border-bottom"></div>
|
||||||
|
<div class="col-6 p-0">
|
||||||
|
<ul class="nav nav-fill nav-tabs" id="management-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark active" id="order-tab"
|
||||||
|
href="#" type="button" role="tab"
|
||||||
|
aria-controls="order" aria-selected="true">
|
||||||
|
<x-bi-box/>
|
||||||
|
Create Order
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col border-bottom"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="container">
|
<div class="container-fluid mt-3" style="max-width: 1800px">
|
||||||
<div class="row justify-content-center">
|
|
||||||
<div class="col-8 pt-4">
|
|
||||||
<h4>Create Order</h4>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="customer_id" class="col-md-4 col-form-label text-md-end">Customer</label>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<select name="customer_id" class="form-select" id="customer_id" autofocus>
|
|
||||||
@foreach($customers as $customer)
|
|
||||||
<option value="{{$customer->id}}">{{$customer->company_name}}</option>
|
|
||||||
@endforeach()
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
<form action="{{route('orders.store') }}" method="post">
|
||||||
<label for="order_type" class="col-md-4 col-form-label text-md-end">Order Type</label>
|
@csrf
|
||||||
<div class="col-md-6">
|
|
||||||
<select name="order_type" class="form-select" id="order_type" autofocus>
|
|
||||||
@foreach($order_types as $case)
|
|
||||||
<option value="{{$case->name}}">{{$case->value}}</option>
|
|
||||||
@endforeach()
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row justify-content-center">
|
||||||
<label for="order_status" class="col-md-4 col-form-label text-md-end">Order Status</label>
|
<div class="col-11 col-xl-4 border-end" style="height: 730px">
|
||||||
<div class="col-md-6">
|
|
||||||
<select name="order_status" class="form-select" id="order_status" autofocus>
|
|
||||||
@foreach($order_status as $case)
|
|
||||||
<option value="{{$case->name}}">{{$case->value}}</option>
|
|
||||||
@endforeach()
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="border-secondary-subtle mx-4 px-0">
|
<livewire:customer-and-contact-select :customers="$customers"/>
|
||||||
|
|
||||||
<div class="row mb-3">
|
<hr class="border-secondary-subtle px-0">
|
||||||
<label class="col-md-4 col-form-label text-md-end">Attributes</label>
|
|
||||||
<div class="col-md-3">
|
<div class="row mb-2">
|
||||||
<div class="form-check ">
|
<label for="order_type" class="col-md-4 col-form-label text-md-end">Order Type</label>
|
||||||
<input class="form-check-input" type="checkbox" value="" id="new_art">
|
<div class="col-md-6">
|
||||||
<label class="form-check-label" for="new_art">New art</label>
|
<select name="order_type" class="form-select form-select-sm" id="order_type">
|
||||||
</div>
|
@foreach($order_types as $case)
|
||||||
<div class="form-check ">
|
<option value="{{$case->name}}">{{$case->value}}</option>
|
||||||
<input class="form-check-input" type="checkbox" value="" id="rush">
|
@endforeach()
|
||||||
<label class="form-check-label" for="rush">Rush</label>
|
</select>
|
||||||
</div>
|
|
||||||
<div class="form-check ">
|
@error('order_type')
|
||||||
<input class="form-check-input" type="checkbox" value="" id="digitizing">
|
<span class="invalid-feedback" role="alert">
|
||||||
<label class="form-check-label" for="digitizing">Digitizing</label>
|
<strong>{{ $message }}</strong>
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check ">
|
</div>
|
||||||
<input class="form-check-input" type="checkbox" value="" id="supplied_file">
|
|
||||||
<label class="form-check-label" for="supplied_file">Customer Supplied File</label>
|
<div class="row mb-2">
|
||||||
|
<label for="order_status" class="col-md-4 col-form-label text-md-end">Order
|
||||||
|
Status</label>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<select name="status" class="form-select form-select-sm" id="order_status">
|
||||||
|
@foreach($order_status as $case)
|
||||||
|
<option value="{{$case->value}}" {{ $case->name === 'APPROVED' ? 'selected' : '' }}>
|
||||||
|
{{$case->value}}
|
||||||
|
</option>
|
||||||
|
@endforeach()
|
||||||
|
</select>
|
||||||
|
|
||||||
|
@error('status')
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
<strong>{{ $message }}</strong>
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="form-check ">
|
<hr class="border-secondary-subtle px-0">
|
||||||
<input class="form-check-input" type="checkbox" value="" id="repeat">
|
|
||||||
<label class="form-check-label" for="repeat">Repeat</label>
|
<div class="row mb-2">
|
||||||
|
<label class="col-md-4 col-form-label text-md-end">Customer PO</label>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<input id="customer_po" type="text"
|
||||||
|
class="form-control form-control-sm @error('customer_po') is-invalid @enderror"
|
||||||
|
name="customer_po" value="{{@old('customer_po')}}" required>
|
||||||
|
|
||||||
|
@error('customer_po')
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
<strong>{{ $message }}</strong>
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check ">
|
</div>
|
||||||
<input class="form-check-input" type="checkbox" value="" id="event">
|
|
||||||
<label class="form-check-label" for="event">Event</label>
|
<hr class="border-secondary-subtle px-0">
|
||||||
|
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label class="col-md-4 col-form-label text-md-end">Attributes</label>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="form-check ">
|
||||||
|
<input class="form-check-input" type="checkbox" id="new_art" name="new_art"
|
||||||
|
value="1">
|
||||||
|
<label class="form-check-label" for="new_art">New art</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check ">
|
||||||
|
<input class="form-check-input" type="checkbox" id="rush" name="rush" value="1">
|
||||||
|
<label class="form-check-label" for="rush">Rush</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check ">
|
||||||
|
<input class="form-check-input" type="checkbox" id="digitizing"
|
||||||
|
name="digitizing" value="1">
|
||||||
|
<label class="form-check-label" for="digitizing">Digitizing</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check ">
|
||||||
|
<input class="form-check-input" type="checkbox" id="supplied_file"
|
||||||
|
name="customer_supplied_file" value="1">
|
||||||
|
<label class="form-check-label" for="supplied_file">
|
||||||
|
Customer Supplied File
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check ">
|
<div class="col-md-3">
|
||||||
<input class="form-check-input" type="checkbox" value="" id="purchased_garments">
|
<div class="form-check ">
|
||||||
<label class="form-check-label" for="purchased_garments">Purchased garments</label>
|
<input class="form-check-input" type="checkbox" id="repeat" name="repeat"
|
||||||
|
value="1">
|
||||||
|
<label class="form-check-label" for="repeat">Repeat</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check ">
|
||||||
|
<input class="form-check-input" type="checkbox" id="event" name="event"
|
||||||
|
value="1">
|
||||||
|
<label class="form-check-label" for="event">Event</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check ">
|
||||||
|
<input class="form-check-input" type="checkbox" id="purchased_garments"
|
||||||
|
value="1"
|
||||||
|
name="purchased_garment">
|
||||||
|
<label class="form-check-label" for="purchased_garments">
|
||||||
|
Purchased
|
||||||
|
garments</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="border-secondary-subtle mx-4 px-0">
|
<hr class="border-secondary-subtle px-0">
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-2">
|
||||||
<label for="order_date" class="col-md-4 col-form-label text-md-end">Order date</label>
|
<label for="order_date" class="col-md-4 col-form-label text-md-end">Order date</label>
|
||||||
|
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<input id="order_date" type="date"
|
<input id="order_date" type="date"
|
||||||
class="form-control @error('order_date') is-invalid @enderror"
|
class="form-control form-control-sm @error('order_date') is-invalid @enderror"
|
||||||
name="order_date" value="{{ old('order_date') ?? $today }}" required
|
name="order_date" value="{{ old('order_date') ?? $today }}" required
|
||||||
autocomplete="order_date">
|
>
|
||||||
|
|
||||||
@error('order_date')
|
@error('order_date')
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
<strong>{{ $message }}</strong>
|
<strong>{{ $message }}</strong>
|
||||||
</span>
|
</span>
|
||||||
@enderror
|
@enderror
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-2">
|
||||||
<label for="due_date" class="col-md-4 col-form-label text-md-end">Due date</label>
|
<label for="due_date" class="col-md-4 col-form-label text-md-end">Due date</label>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<input id="due_date" type="date"
|
||||||
|
class="form-control form-control-sm @error('due_date') is-invalid @enderror"
|
||||||
|
name="due_date" value="{{ old('due_date') ?? $due_default }}" required
|
||||||
|
>
|
||||||
|
|
||||||
<div class="col-md-6">
|
@error('due_date')
|
||||||
<input id="due_date" type="date"
|
<span class="invalid-feedback" role="alert">
|
||||||
class="form-control @error('due_date') is-invalid @enderror"
|
<strong>{{ $message }}</strong>
|
||||||
name="due_date" value="{{ old('due_date') ?? $due_default }}" required
|
</span>
|
||||||
autocomplete="due_date">
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="border-secondary-subtle px-0">
|
||||||
|
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label for="notes" class="col-md-4 col-form-label text-md-end">Notes</label>
|
||||||
|
|
||||||
@error('due_date')
|
<div class="col-md-6">
|
||||||
<span class="invalid-feedback" role="alert">
|
<textarea name="notes" id="notes" cols="30" rows="4" class="form-control form-control-sm"
|
||||||
|
>{{ old('notes') }}</textarea>
|
||||||
|
|
||||||
|
@error('notes')
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
<strong>{{ $message }}</strong>
|
<strong>{{ $message }}</strong>
|
||||||
</span>
|
</span>
|
||||||
@enderror
|
@enderror
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="border-secondary-subtle mx-4 px-0">
|
<div class="col-11 col-xl-7">
|
||||||
|
<livewire:order-products-create/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<hr class="border-secondary-subtle px-0">
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row">
|
||||||
<label for="contact_id" class="col-md-4 col-form-label text-md-end">Contact</label>
|
<div class="col text-end">
|
||||||
<div class="col-md-6">
|
<button type="submit" class="btn btn-primary">
|
||||||
<select name="contact_id" class="form-select" id="contact_id" autofocus>
|
Save Order
|
||||||
<option value=""></option>
|
</button>
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
@ -0,0 +1,91 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('header')
|
||||||
|
<div class="container-fluid bg-light pt-3">
|
||||||
|
|
||||||
|
<!-- Customer company name row -->
|
||||||
|
<div class="row justify-content-center pb-2">
|
||||||
|
<div class="col-3"></div>
|
||||||
|
<div class="col">
|
||||||
|
{{-- <h2>Overview</h2>--}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs row -->
|
||||||
|
<div class="row justify-content-center mb-3">
|
||||||
|
<div class="col-3 border-bottom"></div>
|
||||||
|
<div class="col-6 p-0">
|
||||||
|
|
||||||
|
<ul class="nav nav-fill nav-tabs" id="home-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'all' ? 'active' : ''}}" id="all-tab"
|
||||||
|
href="{{route('orders.index', ['tab' => 'all'])}}" type="button" role="tab"
|
||||||
|
aria-controls="all" aria-selected="{{$tab == 'all' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-journals/>
|
||||||
|
All Orders
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'active_orders' ? 'active' : ''}}" id="active-orders-tab"
|
||||||
|
href="{{route('orders.index', ['tab' => 'active_orders'])}}" type="button" role="tab"
|
||||||
|
aria-controls="active_orders"
|
||||||
|
aria-selected="{{$tab == 'active_orders' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-arrow-clockwise/>
|
||||||
|
Active Orders
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'finished_orders' ? 'active' : ''}}"
|
||||||
|
id="finished-orders-tab"
|
||||||
|
href="{{route('orders.index', ['tab' => 'finished_orders'])}}" type="button" role="tab"
|
||||||
|
aria-controls="finished_orders"
|
||||||
|
aria-selected="{{$tab == 'finished_orders' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-check-all/>
|
||||||
|
Finished Orders
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'invoice' ? 'active' : ''}}" id="invoice-tab"
|
||||||
|
href="{{route('orders.index', ['tab' => 'invoice'])}}" type="button" role="tab"
|
||||||
|
aria-controls="invoice" aria-selected="{{$tab == 'invoice' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-envelope/>
|
||||||
|
Invoiced Orders
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col border-bottom"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center my-3">
|
||||||
|
<div class="tab-content">
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders" role="tabpanel"
|
||||||
|
aria-labelledby="active-orders-tab">
|
||||||
|
<livewire:orders-table order-type="active" :show-customer-column='true' :title="'Active Orders'"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'finished_orders' ? 'active' : ''}}" id="finished-orders" role="tabpanel"
|
||||||
|
aria-labelledby="finished-orders-tab">
|
||||||
|
<livewire:orders-table order-type="finished" :show-customer-column='true' title="Finished Orders"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'all' ? 'active' : ''}}" id="all-orders" role="tabpanel"
|
||||||
|
aria-labelledby="all-orders-tab">
|
||||||
|
<livewire:orders-table order-type="all" :show-customer-column='true' title="All Orders"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'invoice' ? 'active' : ''}}" id="invoice-orders" role="tabpanel"
|
||||||
|
aria-labelledby="invoice-orders-tab">
|
||||||
|
<livewire:orders-table order-type="invoiced" :show-customer-column='true' title="Invoiced Orders"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
@ -0,0 +1,71 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('header')
|
||||||
|
<div class="container-fluid bg-light pt-3">
|
||||||
|
|
||||||
|
<!-- Customer company name row -->
|
||||||
|
<div class="row justify-content-center pb-2">
|
||||||
|
<div class="col-3"></div>
|
||||||
|
<div class="col">
|
||||||
|
{{-- <h2>Overview</h2>--}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs row -->
|
||||||
|
<div class="row justify-content-center mb-3">
|
||||||
|
<div class="col-3 border-bottom"></div>
|
||||||
|
<div class="col-6 p-0">
|
||||||
|
|
||||||
|
<ul class="nav nav-fill nav-tabs" id="home-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'details' ? 'active' : ''}}" id="details-tab"
|
||||||
|
href="{{route('orders.index', ['tab' => 'details'])}}" type="button" role="tab"
|
||||||
|
aria-controls="details" aria-selected="{{$tab == 'details' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-list-ul/>
|
||||||
|
Order Details
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'timeline' ? 'active' : ''}}" id="timeline-tab"
|
||||||
|
href="{{route('orders.index', ['tab' => 'timeline'])}}" type="button" role="tab"
|
||||||
|
aria-controls="timeline" aria-selected="{{$tab == 'timeline' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-calendar-range/>
|
||||||
|
Timeline
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col border-bottom"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center my-3">
|
||||||
|
<div class="tab-content">
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'active_orders' ? 'active' : ''}}" id="active_orders" role="tabpanel"
|
||||||
|
aria-labelledby="active-orders-tab">
|
||||||
|
<livewire:orders-table order-type="active" :show-customer-column='true' :title="'Active Orders'"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'finished_orders' ? 'active' : ''}}" id="finished-orders" role="tabpanel"
|
||||||
|
aria-labelledby="finished-orders-tab">
|
||||||
|
<livewire:orders-table order-type="finished" :show-customer-column='true' title="Finished Orders"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'all' ? 'active' : ''}}" id="all-orders" role="tabpanel"
|
||||||
|
aria-labelledby="all-orders-tab">
|
||||||
|
<livewire:orders-table order-type="all" :show-customer-column='true' title="All Orders"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane {{$tab == 'invoice' ? 'active' : ''}}" id="invoice-orders" role="tabpanel"
|
||||||
|
aria-labelledby="invoice-orders-tab">
|
||||||
|
<livewire:orders-table order-type="invoiced" :show-customer-column='true' title="Invoiced Orders"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
@ -1,110 +0,0 @@
|
|||||||
<div class="modal modal-lg fade" id="editCustomerModal" tabindex="-1" aria-labelledby="editCustomerModalLabel"
|
|
||||||
aria-hidden="true">
|
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h1 class="modal-title fs-5" id="editCustomerModalLabel">Edit Customer</h1>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form action="{{route('customers.update', $customer)}}" method="post">
|
|
||||||
@csrf
|
|
||||||
@method('PATCH')
|
|
||||||
|
|
||||||
<div class="modal-body">
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="company_name" class="col-md-4 col-form-label text-md-end">Company Name</label>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<input id="company_name" type="text"
|
|
||||||
class="form-control @error('company_name') is-invalid @enderror"
|
|
||||||
name="company_name" value="{{$customer->company_name}}" required
|
|
||||||
autocomplete="company_name" autofocus>
|
|
||||||
|
|
||||||
@error('company_name')
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
<strong>{{ $message }}</strong>
|
|
||||||
</span>
|
|
||||||
@enderror
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="internal_name" class="col-md-4 col-form-label text-md-end">Internal Name</label>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<input id="internal_name" type="text"
|
|
||||||
class="form-control @error('internal_name') is-invalid @enderror"
|
|
||||||
name="internal_name" value="{{ $customer->internal_name }}" required
|
|
||||||
autocomplete="internal_name"
|
|
||||||
>
|
|
||||||
|
|
||||||
@error('internal_name')
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
<strong>{{ $message }}</strong>
|
|
||||||
</span>
|
|
||||||
@enderror
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="shipping_address" class="col-md-4 col-form-label text-md-end">
|
|
||||||
Shipping Address
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<input id="shipping_address" type="text"
|
|
||||||
class="form-control @error('shipping_address') is-invalid @enderror"
|
|
||||||
name="shipping_address" value="{{ $customer->shipping_address }}" required
|
|
||||||
autocomplete="shipping_address">
|
|
||||||
|
|
||||||
@error('shipping_address')
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
<strong>{{ $message }}</strong>
|
|
||||||
</span>
|
|
||||||
@enderror
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="billing_address" class="col-md-4 col-form-label text-md-end">Billing Address</label>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<input id="billing_address" type="text"
|
|
||||||
class="form-control @error('billing_address') is-invalid @enderror"
|
|
||||||
name="billing_address" value="{{ $customer->billing_address }}" required
|
|
||||||
autocomplete="billing_address" >
|
|
||||||
|
|
||||||
@error('billing_address')
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
<strong>{{ $message }}</strong>
|
|
||||||
</span>
|
|
||||||
@enderror
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mb-3">
|
|
||||||
<label for="phone" class="col-md-4 col-form-label text-md-end">Phone number</label>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<input id="phone" type="text" class="form-control @error('phone') is-invalid @enderror"
|
|
||||||
name="phone" value="{{ $customer->phone }}" required autocomplete="phone">
|
|
||||||
|
|
||||||
@error('phone')
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
<strong>{{ $message }}</strong>
|
|
||||||
</span>
|
|
||||||
@enderror
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button>
|
|
||||||
<button type="submit" class="btn btn-primary">Edit customer</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,76 +0,0 @@
|
|||||||
<div class="tab-pane {{$tab == 'details' ? 'active' : ''}}" id="details" role="tabpanel"
|
|
||||||
aria-labelledby="details-tab">
|
|
||||||
|
|
||||||
<div class="row justify-content-center mb-3">
|
|
||||||
<div class="col-9">
|
|
||||||
<div class="d-flex flex-row gap-2">
|
|
||||||
<div class="d-inline-flex">
|
|
||||||
<h4 class="my-auto">Active orders</h4>
|
|
||||||
</div>
|
|
||||||
<div class="mx-auto"></div>
|
|
||||||
<button class="btn btn-sm btn-primary" title="Create new shipping entry..."
|
|
||||||
data-bs-toggle="modal" data-bs-target="#createShippingEntryModal">
|
|
||||||
<x-bi-plus-circle-fill/>
|
|
||||||
Create entry
|
|
||||||
</button>
|
|
||||||
<div class="vr"></div>
|
|
||||||
|
|
||||||
<div class="d-inline-flex gap-2">
|
|
||||||
<input type="text" class="form-control form-control-sm" placeholder="Search..."
|
|
||||||
name="" id="searchText">
|
|
||||||
<button class="btn btn-sm btn-outline-primary" id="searchButton">
|
|
||||||
<x-bi-search/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row justify-content-center">
|
|
||||||
<div class="col-9">
|
|
||||||
<table class="table table-striped table-sm table-hover">
|
|
||||||
<thead>
|
|
||||||
<tr class="border-bottom border-black">
|
|
||||||
<th scope="col">Internal PO</th>
|
|
||||||
<th scope="col">Customer PO</th>
|
|
||||||
<th scope="col">Order Date</th>
|
|
||||||
<th scope="col">Due Date</th>
|
|
||||||
<th scope="col">Status</th>
|
|
||||||
<th scope="col">Rush</th>
|
|
||||||
<th scope="col">View</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach($active_orders as $order)
|
|
||||||
<tr>
|
|
||||||
<td class="fw-bold"><code>{{$order->internal_po}}</code></td>
|
|
||||||
<td class=""><code>{{$order->customer_po}}</code></td>
|
|
||||||
<td class="text-nowrap">{{$order->order_date}}</td>
|
|
||||||
<td class="text-nowrap">{{$order->due_date}}</td>
|
|
||||||
<td>{{$order->status->value}}</td>
|
|
||||||
<td>
|
|
||||||
@if($order->rush)
|
|
||||||
<x-bi-check-lg class="text-danger"></x-bi-check-lg>
|
|
||||||
@endif
|
|
||||||
</td>
|
|
||||||
<td class="align-top">
|
|
||||||
<a class="btn btn-sm btn-outline-secondary"
|
|
||||||
href="">
|
|
||||||
<x-bi-arrow-right/>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
@endforeach
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col"></div>
|
|
||||||
<div class="col-4">
|
|
||||||
{{$active_orders->links()}}
|
|
||||||
</div>
|
|
||||||
<div class="col"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
@ -0,0 +1,6 @@
|
|||||||
|
<div class="tab-pane {{$tab == 'details' ? 'active' : ''}}" id="details" role="tabpanel"
|
||||||
|
aria-labelledby="details-tab">
|
||||||
|
|
||||||
|
<livewire:orders-table :show-customer-column="false" order-type="active" title="Active orders"
|
||||||
|
:customer_id="$customer->id"/>
|
||||||
|
</div>
|
@ -0,0 +1,76 @@
|
|||||||
|
<div class="tab-pane {{$tab == 'customers' ? 'active' : ''}}" id="customers" role="tabpanel"
|
||||||
|
aria-labelledby="customers-tab">
|
||||||
|
<div class="row justify-content-center mb-3">
|
||||||
|
<div class="col">
|
||||||
|
<div class="d-flex flex-row gap-2">
|
||||||
|
<button class="btn btn-primary" title="Create new customer..."
|
||||||
|
data-bs-toggle="modal"
|
||||||
|
data-bs-target="#createCustomerModal">
|
||||||
|
<x-bi-person-plus-fill/>
|
||||||
|
Create entry
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="vr"></div>
|
||||||
|
|
||||||
|
<div class="d-inline-flex gap-2">
|
||||||
|
<input type="text" class="form-control" placeholder="Search..."
|
||||||
|
name="" id="">
|
||||||
|
<button class="btn btn-outline-primary">
|
||||||
|
<x-bi-search/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mx-auto"></div>
|
||||||
|
|
||||||
|
<button class="btn btn-danger" title="Delete customer..."
|
||||||
|
data-bs-toggle="modal"
|
||||||
|
data-bs-target="#deleteCustomerModal">
|
||||||
|
<x-bi-trash-fill/>
|
||||||
|
Delete entry
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col">
|
||||||
|
@if(sizeof($customers) !== 0)
|
||||||
|
<table class="table table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr class="border-bottom border-black">
|
||||||
|
<th scope="col">Company Name</th>
|
||||||
|
<th scope="col">Internal Name</th>
|
||||||
|
<th scope="col">Shipping Address</th>
|
||||||
|
<th scope="col">Billing Address</th>
|
||||||
|
<th scope="col">Phone</th>
|
||||||
|
<th scope="col">View</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
@foreach($customers as $customer)
|
||||||
|
<tr>
|
||||||
|
<td> {{$customer->company_name}} </td>
|
||||||
|
<td><code>{{$customer->internal_name}}</code></td>
|
||||||
|
<td> {{$customer->shipping_address}} </td>
|
||||||
|
<td> {{$customer->billing_address}} </td>
|
||||||
|
<td class="text-nowrap"> {{$customer->phone}} </td>
|
||||||
|
<td class="align-top">
|
||||||
|
<a class="btn btn-sm btn-outline-secondary"
|
||||||
|
href="{{route('customers.show', [$customer->id, 'tab'=>'details'])}}">
|
||||||
|
<x-bi-arrow-right/>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
@else()
|
||||||
|
No customer data.
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,43 @@
|
|||||||
|
<div class="container-fluid bg-light pt-3">
|
||||||
|
|
||||||
|
<!-- Customer company name row -->
|
||||||
|
<div class="row justify-content-center pb-2">
|
||||||
|
<div class="col-3"></div>
|
||||||
|
<div class="col">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs row -->
|
||||||
|
<div class="row justify-content-center mb-3">
|
||||||
|
<div class="col-3 border-bottom"></div>
|
||||||
|
<div class="col-6 p-0">
|
||||||
|
<ul class="nav nav-fill nav-tabs" id="management-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'customers' ? 'active' : ''}}" id="customers-tab"
|
||||||
|
href="{{route('management.index', 'customers')}}" type="button" role="tab"
|
||||||
|
aria-controls="customers" aria-selected="{{$tab == 'customers' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-list-ul/>
|
||||||
|
Customers
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'packing' ? 'active' : ''}}" id="packing-tab"
|
||||||
|
href="{{route('management.index', 'packing')}}" type="button" role="tab"
|
||||||
|
aria-controls="packing" aria-selected="{{$tab == 'packing' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-card-text/>
|
||||||
|
Packing Slips
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<a class="nav-link link-dark {{$tab == 'files' ? 'active' : ''}}" id="files-tab"
|
||||||
|
href="{{route('management.index', 'files')}}" type="button" role="tab"
|
||||||
|
aria-controls="files" aria-selected="{{$tab == 'files' ? 'true' : 'false'}}">
|
||||||
|
<x-bi-file-earmark/>
|
||||||
|
Service Files
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col border-bottom"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,5 @@
|
|||||||
|
<div class="tab-pane {{$tab == 'packing' ? 'active' : ''}}" id="packing" role="tabpanel"
|
||||||
|
aria-labelledby="packing-tab">
|
||||||
|
|
||||||
|
packing slips
|
||||||
|
</div>
|
@ -0,0 +1,5 @@
|
|||||||
|
<div class="tab-pane {{$tab == 'files' ? 'active' : ''}}" id="files" role="tabpanel"
|
||||||
|
aria-labelledby="files-tab">
|
||||||
|
|
||||||
|
Files
|
||||||
|
</div>
|
@ -1,46 +0,0 @@
|
|||||||
@if ($paginator->hasPages())
|
|
||||||
<nav>
|
|
||||||
<ul class="pagination">
|
|
||||||
{{-- Previous Page Link --}}
|
|
||||||
@if ($paginator->onFirstPage())
|
|
||||||
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
|
|
||||||
<span class="page-link" aria-hidden="true">‹</span>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">‹</a>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Pagination Elements --}}
|
|
||||||
@foreach ($elements as $element)
|
|
||||||
{{-- "Three Dots" Separator --}}
|
|
||||||
@if (is_string($element))
|
|
||||||
<li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Array Of Links --}}
|
|
||||||
@if (is_array($element))
|
|
||||||
@foreach ($element as $page => $url)
|
|
||||||
@if ($page == $paginator->currentPage())
|
|
||||||
<li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
|
|
||||||
@else
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
{{-- Next Page Link --}}
|
|
||||||
@if ($paginator->hasMorePages())
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">›</a>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
|
|
||||||
<span class="page-link" aria-hidden="true">›</span>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
@endif
|
|
@ -1,88 +0,0 @@
|
|||||||
@if ($paginator->hasPages())
|
|
||||||
<nav class="d-flex justify-items-center justify-content-between">
|
|
||||||
<div class="d-flex justify-content-between flex-fill d-sm-none">
|
|
||||||
<ul class="pagination">
|
|
||||||
{{-- Previous Page Link --}}
|
|
||||||
@if ($paginator->onFirstPage())
|
|
||||||
<li class="page-item disabled" aria-disabled="true">
|
|
||||||
<span class="page-link">@lang('pagination.previous')</span>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Next Page Link --}}
|
|
||||||
@if ($paginator->hasMorePages())
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="page-item disabled" aria-disabled="true">
|
|
||||||
<span class="page-link">@lang('pagination.next')</span>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="d-none flex-sm-fill d-sm-flex align-items-sm-center justify-content-sm-between">
|
|
||||||
<div>
|
|
||||||
<p class="small text-muted">
|
|
||||||
{!! __('Showing') !!}
|
|
||||||
<span class="fw-semibold">{{ $paginator->firstItem() }}</span>
|
|
||||||
{!! __('to') !!}
|
|
||||||
<span class="fw-semibold">{{ $paginator->lastItem() }}</span>
|
|
||||||
{!! __('of') !!}
|
|
||||||
<span class="fw-semibold">{{ $paginator->total() }}</span>
|
|
||||||
{!! __('results') !!}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<ul class="pagination">
|
|
||||||
{{-- Previous Page Link --}}
|
|
||||||
@if ($paginator->onFirstPage())
|
|
||||||
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
|
|
||||||
<span class="page-link" aria-hidden="true">‹</span>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">‹</a>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Pagination Elements --}}
|
|
||||||
@foreach ($elements as $element)
|
|
||||||
{{-- "Three Dots" Separator --}}
|
|
||||||
@if (is_string($element))
|
|
||||||
<li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Array Of Links --}}
|
|
||||||
@if (is_array($element))
|
|
||||||
@foreach ($element as $page => $url)
|
|
||||||
@if ($page == $paginator->currentPage())
|
|
||||||
<li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
|
|
||||||
@else
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
{{-- Next Page Link --}}
|
|
||||||
@if ($paginator->hasMorePages())
|
|
||||||
<li class="page-item">
|
|
||||||
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">›</a>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
|
|
||||||
<span class="page-link" aria-hidden="true">›</span>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
@endif
|
|
@ -1,46 +0,0 @@
|
|||||||
@if ($paginator->hasPages())
|
|
||||||
<nav>
|
|
||||||
<ul class="pagination">
|
|
||||||
{{-- Previous Page Link --}}
|
|
||||||
@if ($paginator->onFirstPage())
|
|
||||||
<li class="disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
|
|
||||||
<span aria-hidden="true">‹</span>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li>
|
|
||||||
<a href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">‹</a>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Pagination Elements --}}
|
|
||||||
@foreach ($elements as $element)
|
|
||||||
{{-- "Three Dots" Separator --}}
|
|
||||||
@if (is_string($element))
|
|
||||||
<li class="disabled" aria-disabled="true"><span>{{ $element }}</span></li>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- Array Of Links --}}
|
|
||||||
@if (is_array($element))
|
|
||||||
@foreach ($element as $page => $url)
|
|
||||||
@if ($page == $paginator->currentPage())
|
|
||||||
<li class="active" aria-current="page"><span>{{ $page }}</span></li>
|
|
||||||
@else
|
|
||||||
<li><a href="{{ $url }}">{{ $page }}</a></li>
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
{{-- Next Page Link --}}
|
|
||||||
@if ($paginator->hasMorePages())
|
|
||||||
<li>
|
|
||||||
<a href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">›</a>
|
|
||||||
</li>
|
|
||||||
@else
|
|
||||||
<li class="disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
|
|
||||||
<span aria-hidden="true">›</span>
|
|
||||||
</li>
|
|
||||||
@endif
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
@endif
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue