Refactor of Ticket index view

This commit is contained in:
Mark Walet 2016-03-16 15:25:14 +01:00
parent 7566986124
commit 7fa69e5a0f
6 changed files with 75 additions and 133 deletions

View File

@ -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)

View File

@ -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;
// }
}

View File

@ -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}

View File

@ -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;

View File

@ -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)
&infin;
@else
{{$ticket->quantity_remaining}}
@endif
{{ ($ticket->quantity_available === null) ? '&infin;' : $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 &nbsp;
<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 &nbsp;
<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

View File

@ -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>