Refactor of Ticket index view
This commit is contained in:
parent
7566986124
commit
7fa69e5a0f
|
|
@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
|||
use App\Models\Event;
|
||||
use App\Models\Ticket;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Input;
|
||||
use Log;
|
||||
use Response;
|
||||
|
|
@ -16,27 +17,33 @@ use View;
|
|||
|
||||
class EventTicketsController extends MyBaseController
|
||||
{
|
||||
public function showTickets($event_id)
|
||||
public function showTickets(Request $request, $event_id)
|
||||
{
|
||||
$allowed_sorts = ['created_at', 'quantity_sold', 'sales_volume', 'title'];
|
||||
|
||||
$searchQuery = Input::get('q');
|
||||
$sort_by = (in_array(Input::get('sort_by'), $allowed_sorts) ? Input::get('sort_by') : 'created_at');
|
||||
|
||||
$event = Event::scope()->findOrFail($event_id);
|
||||
|
||||
$tickets = $searchQuery
|
||||
? $event->tickets()->where('title', 'like', '%'.$searchQuery.'%')->orderBy($sort_by, 'desc')->paginate(10)
|
||||
: $event->tickets()->orderBy($sort_by, 'desc')->paginate(10);
|
||||
|
||||
$data = [
|
||||
'event' => $event,
|
||||
'tickets' => $tickets,
|
||||
'sort_by' => $sort_by,
|
||||
'q' => $searchQuery ? $searchQuery : '',
|
||||
$allowed_sorts = [
|
||||
'created_at' => 'Creation date',
|
||||
'title' => 'Ticket title',
|
||||
'quantity_sold' => 'Quantity sold',
|
||||
'sales_volume' => 'Sales volume',
|
||||
];
|
||||
|
||||
return View::make('ManageEvent.Tickets', $data);
|
||||
// Getting get parameters.
|
||||
$q = $request->get('q', '');
|
||||
$sort_by = $request->get('sort_by');
|
||||
if (isset($allowed_sorts[$sort_by]) === false)
|
||||
$sort_by = 'title';
|
||||
|
||||
// Find event or return 404 error.
|
||||
$event = Event::scope()->find($event_id);
|
||||
if ($event === null)
|
||||
abort(404);
|
||||
|
||||
// Get tickets for event.
|
||||
$tickets = empty($q) === false
|
||||
? $event->tickets()->where('title', 'like', '%'.$q.'%')->orderBy($sort_by, 'desc')->paginate()
|
||||
: $event->tickets()->orderBy($sort_by, 'desc')->paginate();
|
||||
|
||||
// Return view.
|
||||
return view('ManageEvent.Tickets', compact('event', 'tickets', 'sort_by', 'q', 'allowed_sorts'));
|
||||
}
|
||||
|
||||
public function showEditTicket($event_id, $ticket_id)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ class Ticket extends MyBaseModel
|
|||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $perPage = 10;
|
||||
|
||||
/**
|
||||
* The rules to validate the model.
|
||||
*
|
||||
|
|
@ -179,9 +181,9 @@ class Ticket extends MyBaseModel
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isFree()
|
||||
public function getIsFreeAttribute()
|
||||
{
|
||||
return (int) ceil($this->price) === 0;
|
||||
return ceil($this->price) === 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -191,36 +193,18 @@ class Ticket extends MyBaseModel
|
|||
*/
|
||||
public function getSaleStatusAttribute()
|
||||
{
|
||||
if ($this->start_sale_date !== null) {
|
||||
if ($this->start_sale_date->isFuture()) {
|
||||
if ($this->start_sale_date !== null && $this->start_sale_date->isFuture())
|
||||
return config('attendize.ticket_status_before_sale_date');
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->end_sale_date !== null) {
|
||||
if ($this->end_sale_date->isPast()) {
|
||||
if ($this->end_sale_date !== null && $this->end_sale_date->isPast())
|
||||
return config('attendize.ticket_status_after_sale_date');
|
||||
}
|
||||
}
|
||||
|
||||
if ((int) $this->quantity_available > 0) {
|
||||
if ((int) $this->quantity_remaining <= 0) {
|
||||
if ((int) $this->quantity_available > 0 && (int) $this->quantity_remaining <= 0)
|
||||
return config('attendize.ticket_status_sold_out');
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->event->start_date->lte(\Carbon::now())) {
|
||||
if ($this->event->start_date->lte(\Carbon::now()))
|
||||
return config('attendize.ticket_status_off_sale');
|
||||
}
|
||||
|
||||
return config('attendize.ticket_status_on_sale');
|
||||
}
|
||||
|
||||
// public function setQuantityAvailableAttribute($value) {
|
||||
// $this->attributes['quantity_available'] = trim($value) == '' ? -1 : $value;
|
||||
// }
|
||||
//
|
||||
// public function setMaxPerPersonAttribute($value) {
|
||||
// $this->attributes['max_per_person'] = trim($value) == '' ? -1 : $value;
|
||||
// }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,4 +149,4 @@ body {
|
|||
font-size: 9px;
|
||||
font-weight: normal;
|
||||
}
|
||||
.page-title .title .organiser_logo{position:absolute;height:45px;right:20px;top:5px;bottom:5px}.page-title .title .organiser_logo img{max-height:45px}.nav li.nav-button a span{padding:10px;background-color:#037c9c}.event.panel{margin-top:10px}.event .event-date{border:1px solid #fff;padding-bottom:9px;padding-top:7px;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,0.1);width:46px;position:absolute;background-color:#fff;top:-13px;border-color:#0384a6;color:#666}.event .event-date .day{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:22px;font-weight:500;margin:-2px auto -6px auto}.event .event-date .month{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;margin:-2px auto 0 auto}.event .event-meta{margin:0;padding:0;margin-left:60px;height:55px;margin-top:10px;color:#fff}.event .event-meta li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:12px}.event .event-meta li a{color:#fff}.event .event-meta li.event-title a{font-size:16px}.event .event-meta li.event-organiser a{font-weight:bold}.event .panel-title{height:60px;padding:10px}.event .panel-title a{margin:0;height:40px;display:table-cell;vertical-align:middle;text-indent:50px}.stat-box{padding:20px;background-color:#0398bf;color:#fff;text-align:center;margin-bottom:10px;border-bottom:4px solid rgba(0,0,0,0.2)}.stat-box h3{margin-bottom:5px;margin-top:0;font-weight:200}.stat-box span{text-transform:uppercase;font-weight:lighter;color:#d0f0fe}.stat-box:nth-child(odd){background-color:#0384a6}.top_of_page_alert{border:none;margin:0;text-align:center;border-bottom:5px solid}.v-align-text{text-align:center;position:relative;top:50%;-ms-transform:translateY(-50%);-wekbit-transform:translateY(-50%);transform:translateY(-50%)}@media (max-width:992px){.page-header>[class*=" col-"],.page-header>[class^="col-"]{margin-bottom:10px}}@media (max-width:480px){.btn-group-responsive{margin-bottom:-10px;float:none !important;display:block !important}.btn-group-responsive .btn{width:100%;padding-left:0;padding-right:0;margin-bottom:10px}.btn-group-responsive .pull-left,.btn-group-responsive .pull-right{float:none !important}}label.required::after{content:'*';color:red;padding-left:3px;font-size:9px}.hasDatepicker[disabled],.hasDatepicker[readonly],fieldset[disabled] .hasDatepicker{cursor:pointer !important;background-color:#fff !important;opacity:1}.more-options{display:none}.col-sort{color:#fff}.col-sort :hover{color:#fff}.pac-container{z-index:9999}.dtpicker-overlay{z-index:9999}.dtpicker-close{display:none}.dtpicker-header .dtpicker-title{color:#afafaf;text-align:center;font-size:18px;font-weight:normal}.dtpicker-header .dtpicker-value{padding:.8em .2em .2em .2em;color:#0384a6;text-align:center;font-size:1.4em}.dtpicker-buttonCont .dtpicker-button{background:#0384a6;border-radius:0}.dtpicker-content{border-radius:0}.sidebar-open-ltr body{overflow-x:hidden}.order_options{margin:10px 0;padding:5px 15px;margin-top:0}.order_options .event_count{font-weight:bold;color:#777;line-height:30px}.well{background-color:#f9f9f9;box-shadow:none}.input-group-btn select{width:115px !important;border-left:0;font-size:12px}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;background:red;cursor:inherit;display:block}input[readonly]{background-color:white !important;cursor:text !important}html.working{cursor:progress}
|
||||
.page-title .title .organiser_logo{position:absolute;height:45px;right:20px;top:5px;bottom:5px}.page-title .title .organiser_logo img{max-height:45px}.nav li.nav-button a span{padding:10px;background-color:#037c9c}.event.panel{margin-top:10px}.event .event-date{border:1px solid #fff;padding-bottom:9px;padding-top:7px;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,0.1);width:46px;position:absolute;background-color:#fff;top:-13px;border-color:#0384a6;color:#666}.event .event-date .day{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:22px;font-weight:500;margin:-2px auto -6px auto}.event .event-date .month{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;font-weight:500;margin:-2px auto 0 auto}.event .event-meta{margin:0;padding:0;margin-left:60px;height:55px;margin-top:10px;color:#fff}.event .event-meta li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:12px}.event .event-meta li a{color:#fff}.event .event-meta li.event-title a{font-size:16px}.event .event-meta li.event-organiser a{font-weight:bold}.event .panel-title{height:60px;padding:10px}.event .panel-title a{margin:0;height:40px;display:table-cell;vertical-align:middle;text-indent:50px}.stat-box{padding:20px;background-color:#0398bf;color:#fff;text-align:center;margin-bottom:10px;border-bottom:4px solid rgba(0,0,0,0.2)}.stat-box h3{margin-bottom:5px;margin-top:0;font-weight:200}.stat-box span{text-transform:uppercase;font-weight:lighter;color:#d0f0fe}.stat-box:nth-child(odd){background-color:#0384a6}.top_of_page_alert{border:none;margin:0;text-align:center;border-bottom:5px solid}.v-align-text{text-align:center;position:relative;top:50%;-ms-transform:translateY(-50%);-wekbit-transform:translateY(-50%);transform:translateY(-50%)}@media (max-width:992px){.page-header>[class*=" col-"],.page-header>[class^="col-"]{margin-bottom:10px}}@media (max-width:480px){.btn-group-responsive{margin-bottom:-10px;float:none !important;display:block !important}.btn-group-responsive .btn{width:100%;padding-left:0;padding-right:0;margin-bottom:10px}.btn-group-responsive .pull-left,.btn-group-responsive .pull-right{float:none !important}}label.required::after{content:'*';color:red;padding-left:3px;font-size:9px}.hasDatepicker[disabled],.hasDatepicker[readonly],fieldset[disabled] .hasDatepicker{cursor:pointer !important;background-color:#fff !important;opacity:1}.more-options{display:none}.col-sort{color:#fff}.col-sort :hover{color:#fff}.pac-container{z-index:9999}.dtpicker-overlay{z-index:9999}.dtpicker-close{display:none}.dtpicker-header .dtpicker-title{color:#afafaf;text-align:center;font-size:18px;font-weight:normal}.dtpicker-header .dtpicker-value{padding:.8em .2em .2em .2em;color:#0384a6;text-align:center;font-size:1.4em}.dtpicker-buttonCont .dtpicker-button{background:#0384a6;border-radius:0}.dtpicker-content{border-radius:0}.sidebar-open-ltr body{overflow-x:hidden}.order_options .event_count{font-weight:bold;color:#777;line-height:30px}.well{background-color:#f9f9f9;box-shadow:none}.input-group-btn select{width:115px !important;border-left:0;font-size:12px}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;background:red;cursor:inherit;display:block}input[readonly]{background-color:white !important;cursor:text !important}html.working{cursor:progress}
|
||||
|
|
@ -298,12 +298,6 @@ label.required::after {
|
|||
}
|
||||
}
|
||||
|
||||
.order_options {
|
||||
margin: 10px 0;
|
||||
padding: 5px 15px;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.order_options .event_count {
|
||||
font-weight: bold;
|
||||
color: #777;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
Event Tickets
|
||||
@stop
|
||||
|
||||
|
||||
@section('top_nav')
|
||||
@include('ManageEvent.Partials.TopNav')
|
||||
@stop
|
||||
|
|
@ -15,15 +14,10 @@ Event Tickets
|
|||
Event Tickets
|
||||
@stop
|
||||
|
||||
@section('head')
|
||||
|
||||
@stop
|
||||
|
||||
@section('menu')
|
||||
@include('ManageEvent.Partials.Sidebar')
|
||||
@stop
|
||||
|
||||
|
||||
@section('page_header')
|
||||
<div class="col-md-9">
|
||||
<!-- Toolbar -->
|
||||
|
|
@ -59,52 +53,35 @@ Event Tickets
|
|||
</div>
|
||||
@stop
|
||||
|
||||
|
||||
@section('content')
|
||||
|
||||
<!--Start ticket table-->
|
||||
<div class="row">
|
||||
|
||||
@if($tickets->count())
|
||||
|
||||
<div class='order_options hide'>
|
||||
<div class='order_options'>
|
||||
<div class="row">
|
||||
<div class="col-md-3 col-xs-6">
|
||||
<span class="event_count">
|
||||
{{$tickets->count()}} events
|
||||
</span>
|
||||
<span class="event_count">{{$tickets->count()}} events</span>
|
||||
</div>
|
||||
<div class="col-md-2 col-xs-6 col-md-offset-7">
|
||||
|
||||
{!! Form::select('sort_by_select', [
|
||||
'quantity_sold' => 'Quantity sold',
|
||||
'title' => 'Ticket title',
|
||||
'created_at' => 'Createion date',
|
||||
'sales_volume' => 'Sales volume'
|
||||
|
||||
], $sort_by, ['class' => 'form-control pull right']) !!} </div>
|
||||
|
||||
{!! Form::select('sort_by_select', $allowed_sorts, $sort_by, ['class' => 'form-control pull right']) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<!--Start ticket table-->
|
||||
<div class="row">
|
||||
@if($tickets->count())
|
||||
|
||||
@foreach($tickets as $ticket)
|
||||
|
||||
<div id="ticket_{{$ticket->id}}" class="col-md-4 col-sm-6 ">
|
||||
|
||||
|
||||
<div class="panel panel-success ticket">
|
||||
|
||||
<div style="cursor: pointer;" data-modal-id='ticket-{{ $ticket->id }}' data-href="{{route('showEditTicket', ['event_id'=>$event->id,'ticket_id'=>$ticket->id])}}" class="panel-heading loadModal">
|
||||
<div style="cursor: pointer;" data-modal-id='ticket-{{ $ticket->id }}'
|
||||
data-href="{{ route('showEditTicket', ['event_id' => $event->id, 'ticket_id' => $ticket->id]) }}"
|
||||
class="panel-heading loadModal">
|
||||
<h3 class="panel-title">
|
||||
<i class="ico-ticket ticket_icon mr5 ellipsis"></i>
|
||||
{{{$ticket->title}}}
|
||||
{{$ticket->title}}
|
||||
<span class="pull-right">
|
||||
@if($ticket->isFree())
|
||||
FREE
|
||||
@else
|
||||
{{money($ticket->price, $event->currency->code)}}
|
||||
@endif
|
||||
|
||||
{{ ($ticket->is_free) ? "FREE" : money($ticket->price, $event->currency->code) }}
|
||||
</span>
|
||||
</h3>
|
||||
</div>
|
||||
|
|
@ -113,28 +90,20 @@ Event Tickets
|
|||
<ul class="nav nav-section nav-justified mt5 mb5">
|
||||
<li>
|
||||
<div class="section">
|
||||
<h4 class="nm">{{{$ticket->quantity_sold}}}</h4>
|
||||
<h4 class="nm">{{ $ticket->quantity_sold }}</h4>
|
||||
<p class="nm text-muted">Sold</p>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="section">
|
||||
<h4 class="nm">
|
||||
|
||||
@if($ticket->quantity_available === NULL)
|
||||
∞
|
||||
@else
|
||||
{{$ticket->quantity_remaining}}
|
||||
@endif
|
||||
|
||||
{{ ($ticket->quantity_available === null) ? '∞' : $ticket->quantity_remaining }}
|
||||
</h4>
|
||||
<p class="nm text-muted">Remaining</p>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="section">
|
||||
|
||||
|
||||
<h4 class="nm hint--top" title="{{money($ticket->sales_volume, $event->currency->code)}} + {{money($ticket->organiser_fees_volume, $event->currency->code)}} Organiser Booking Fees">
|
||||
{{money($ticket->sales_volume + $ticket->organiser_fees_volume, $event->currency->code)}} <sub title="Doesn't account for refunds.">*</sub>
|
||||
</h4>
|
||||
|
|
@ -145,42 +114,30 @@ Event Tickets
|
|||
</div>
|
||||
<div class="panel-footer" style="height: 56px;">
|
||||
<ul class="nav nav-section nav-justified">
|
||||
<!-- <li>
|
||||
<a data-modal-id='ticket-{{ $ticket->id }}' href='javascript:void(0);' data-href="{{route('showEditTicket', ['event_id'=>$event->id,'ticket_id'=>$ticket->id])}}" class='loadModal'>
|
||||
<i class="ico-edit"></i> Edit
|
||||
</a>
|
||||
</li>-->
|
||||
<li>
|
||||
|
||||
<a href="#">
|
||||
|
||||
<a href="javascript:void(0);">
|
||||
@if($ticket->sale_status === config('attendize.ticket_status_on_sale'))
|
||||
|
||||
@if($ticket->is_paused)
|
||||
Ticket Sales Paused
|
||||
<span class="pauseTicketSales label label-info" data-id="{{$ticket->id}}" data-route="{{route('postPauseTicket', ['event_id'=>$event->id])}}" >
|
||||
<span class="pauseTicketSales label label-info" data-id="{{$ticket->id}}"
|
||||
data-route="{{route('postPauseTicket', ['event_id'=>$event->id])}}">
|
||||
<i class="ico-play4"></i> Resume
|
||||
</span>
|
||||
@else
|
||||
On Sale
|
||||
<span class="pauseTicketSales label label-info" data-id="{{$ticket->id}}" data-route="{{route('postPauseTicket', ['event_id'=>$event->id])}}" >
|
||||
<span class="pauseTicketSales label label-info" data-id="{{$ticket->id}}"
|
||||
data-route="{{route('postPauseTicket', ['event_id'=>$event->id])}}">
|
||||
<i class="ico-pause"></i> Pause
|
||||
</span>
|
||||
@endif
|
||||
|
||||
|
||||
@else
|
||||
{{\App\Models\TicketStatus::find($ticket->sale_status)->name}}
|
||||
@endif
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
|
|
@ -198,7 +155,7 @@ Event Tickets
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{!! $tickets->render() !!}
|
||||
{!! $tickets->appends(['q' => $q, 'sort_by' => $sort_by])->render() !!}
|
||||
</div>
|
||||
</div>
|
||||
@stop
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
</td>
|
||||
<td style="width:180px; text-align: right;">
|
||||
<div class="ticket-pricing" style="margin-right: 20px;">
|
||||
@if($ticket->isFree())
|
||||
@if($ticket->is_free)
|
||||
FREE
|
||||
@else
|
||||
<span title='{{{money($ticket->price, $event->currency->code)}}} Ticket Price + {{money($ticket->total_booking_fee, $event->currency->code)}} Booking Fees'>{{{money($ticket->total_price, $event->currency->code)}}} </span>
|
||||
|
|
|
|||
Loading…
Reference in New Issue