SimBrief integration #405 (#635)

* SimBrief integration #405

* Add briefing as API response; add acars_xml field #405
This commit is contained in:
Nabeel S
2020-03-23 09:31:35 -04:00
committed by GitHub
parent 04b9e37e1d
commit 9e5386264f
70 changed files with 6816 additions and 192 deletions

View File

@@ -94,6 +94,7 @@
.btn-outline-warning { @include outline-buttons($warning-color, $warning-states-color); }
.btn-outline-danger { @include outline-buttons($danger-color, $danger-states-color); }
.btn-outline-default { @include outline-buttons($default-color, $default-states-color); }
.btn-outline-dark { @include outline-buttons($brand-inverse, $default-states-color); }
.btn-round{
border-width: $border-thin;

View File

@@ -2,8 +2,6 @@
@mixin btn-styles($btn-color, $btn-states-color) {
background-color: $btn-color;
&:hover,
&:focus,
&:not(:disabled):not(.disabled):active,

View File

@@ -1,7 +1,7 @@
<div class="card">
<div class="card-block" style="min-height: 0px; display: flex; justify-content: center; align-items: center;">
<div class="form-group text-right btn-primary my-bids">
<a href="{{ route('frontend.flights.bids') }}">{{ trans_choice('flights.mybid', 2) }}</a>
<div class="form-group text-right">
<a href="{{ route('frontend.flights.bids') }}" class="btn btn-outline-primary">{{ trans_choice('flights.mybid', 2) }}</a>
</div>
</div>
</div>

View File

@@ -28,7 +28,7 @@
</div>
<div class="clear mt-1" style="margin-top: 10px;">
{{ Form::submit(__('common.find'), ['class' => 'btn btn-primary']) }}&nbsp;
{{ Form::submit(__('common.find'), ['class' => 'btn btn-outline-primary']) }}&nbsp;
<a href="{{ route('frontend.flights.index') }}">@lang('common.reset')</a>
</div>
{{ Form::close() }}

View File

@@ -0,0 +1,234 @@
@extends('app')
@section('title', 'Briefing')
@section('content')
<div class="row">
<div class="col-sm-9">
<h2>{{ $simbrief->xml->general->icao_airline }}{{ $simbrief->xml->general->flight_number }}
: {{ $simbrief->xml->origin->icao_code }} to {{ $simbrief->xml->destination->icao_code }}</h2>
</div>
<div class="col-sm-3">
@if (empty($simbrief->pirep_id))
<a class="btn btn-outline-info pull-right btn-lg"
style="margin-top: -10px;margin-bottom: 5px"
href="{{ url(route('frontend.simbrief.prefile', [$simbrief->id])) }}">Prefile PIREP</a>
@endif
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="row">
<div class="col-6">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Dispatch Information
</h6>
<div class="form-container-body">
<div class="row">
<div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Flight</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->general->icao_airline }}{{ $simbrief->xml->general->flight_number }}</p>
</div>
</div>
<div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Departure</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->origin->icao_code }}@if(!empty($simbrief->xml->origin->plan_rwy))
/{{ $simbrief->xml->origin->plan_rwy }}
@endif
</p>
</div>
</div>
<div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Arrival</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->destination->icao_code }}@if(!empty($simbrief->xml->destination->plan_rwy))
/{{ $simbrief->xml->destination->plan_rwy }}
@endif
</p>
</div>
</div>
</div>
<hr/>
<div class="row">
<div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Aircraft</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->aircraft->name }}</p>
</div>
</div>
<div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Enroute Time</p>
<p class="border border-dark rounded p-1 small text-monospace">
@minutestotime($simbrief->xml->times->sched_time_enroute / 60)</p>
</div>
</div>
<div class="col-4 text-center">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Cruise Altitude</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->general->initial_altitude }}</p>
</div>
</div>
</div>
<hr/>
@if (!empty($simbrief->xml->general->dx_rmk))
<div class="row">
<div class="col-12">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Dispatcher Remarks</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->general->dx_rmk }}</p>
</div>
</div>
</div>
@endif
@if (!empty($simbrief->xml->general->sys_rmk))
<div class="row">
<div class="col-12">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">System Remarks</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->general->sys_rmk }}</p>
</div>
</div>
</div>
@endif
</div>
</div>
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Flight Plan
</h6>
<div class="form-container-body">
<div class="row">
<div class="col-12">
<p class="border border-dark rounded p-1 small text-monospace">
{!! str_replace("\n", "<br>", $simbrief->xml->atc->flightplan_text) !!}
</p>
</div>
</div>
</div>
</div>
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Weather
</h6>
<div class="form-container-body">
<div class="row">
<div class="col-12">
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Departure METAR</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->weather->orig_metar }}</p>
</div>
<hr/>
<div><p class="small text-uppercase pb-sm-0 mb-sm-1">Arrival METAR</p>
<p class="border border-dark rounded p-1 small text-monospace">
{{ $simbrief->xml->weather->dest_metar }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-6">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Download Flight Plan
</h6>
<div class="form-container-body">
<div class="row">
<div class="col-12">
<select id="download_fms_select" class="select2 custom-select">
@foreach($simbrief->files as $fms)
<option value="{{ $fms['url'] }}">{{ $fms['name'] }}</option>
@endforeach
</select>
<br/>
<input id="download_fms"
type="submit"
class="btn btn-outline-primary pull-right"
value="Download"/>
</div>
</div>
</div>
</div>
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;OFP
</h6>
<div class="form-container-body border border-dark">
<div class="overflow-auto" style="height: 600px;">
{!! $simbrief->xml->text->plan_html !!}
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Flight Maps
</h6>
<div class="form-container-body">
@foreach($simbrief->images->chunk(2) as $images)
<div class="row">
@foreach($images as $image)
<div class="col-6 text-center">
<p>
<img src="{{ $image['url'] }}" alt="{{ $image['name'] }}"/>
<small class="text-muted">{{ $image['name'] }}</small>
</p>
</div>
@endforeach
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
@if (empty($simbrief->pirep_id))
<a class="btn btn-outline-info pull-right"
style="margin-top: -10px;margin-bottom: 5px"
href="{{ url(route('frontend.simbrief.prefile', [$simbrief->id])) }}">Prefile PIREP</a>
@endif
</div>
</div>
@endsection
@section('scripts')
<script>
$(document).ready(function () {
$("#download_fms").click(e => {
e.preventDefault();
const select = document.getElementById("download_fms_select");
const link = select.options[select.selectedIndex].value;
console.log('Downloading FMS: ', link);
window.open(link, '_blank');
});
});
</script>
@endsection

View File

@@ -0,0 +1,162 @@
@extends('app')
@section('title', 'Generate OFP')
@section('content')
<form id="sbapiform">
<div class="row">
<div class="col-md-12">
<h2>Create Flight Briefing</h2>
<div class="row">
<div class="col-8">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;@lang('pireps.flightinformations')
</h6>
<div class="form-container-body">
<div class="row">
<div class="col-sm-4">
<label for="orig">Departure Airport</label>
<input id="orig"
name="orig"
type="text"
class="form-control"
placeholder="ZZZZ"
maxlength="4"
value="{{ $flight->dpt_airport_id }}"/>
</div>
<div class="col-sm-4">
<label for="dest">Arrival Airport</label>
<input id="dest"
name="dest"
type="text"
class="form-control"
placeholder=""
maxlength="4"
value="{{ $flight->arr_airport_id }}"/>
</div>
<div class="col-sm-4">
<label for="type">Aircraft</label>
<select id="type" name="type" class="custom-select select2">
<option value="a320">A320</option>
<option value="b738">B738</option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;Briefing Options
</h6>
<table class="table table-hover table-striped">
<tr>
<td>Units:</td>
<td><select name="units">
<option value="KGS">KGS</option>
<option value="LBS" selected>LBS</option>
</select></td>
</tr>
<tr>
<td>Cont Fuel:</td>
<td><select name="contpct">
<option value="auto" selected>AUTO</option>
<option value="0">0 PCT</option>
<option value="0.02">2 PCT</option>
<option value="0.03">3 PCT</option>
<option value="0.05">5 PCT</option>
<option value="0.1">10 PCT</option>
<option value="0.15">15 PCT</option>
<option value="0.2">20 PCT</option>
</select></td>
</tr>
<tr>
<td>Reserve Fuel:</td>
<td><select name="resvrule">
<option value="auto">AUTO</option>
<option value="0">0 MIN</option>
<option value="15">15 MIN</option>
<option value="30">30 MIN</option>
<option value="45" selected>45 MIN</option>
<option value="60">60 MIN</option>
<option value="75">75 MIN</option>
<option value="90">90 MIN</option>
</select></td>
</tr>
<tr>
<td>Detailed Navlog:</td>
<td><input type="hidden" name="navlog" value="0"><input type="checkbox" name="navlog" value="1"
checked>
</td>
</tr>
<tr>
<td>ETOPS Planning:</td>
<td><input type="hidden" name="etops" value="0"><input type="checkbox" name="etops" value="1"></td>
</tr>
<tr>
<td>Plan Stepclimbs:</td>
<td><input type="hidden" name="stepclimbs" value="0"><input type="checkbox" name="stepclimbs"
value="1"
checked>
</td>
</tr>
<tr>
<td>Runway Analysis:</td>
<td><input type="hidden" name="tlr" value="0"><input type="checkbox" name="tlr" value="1" checked>
</td>
</tr>
<tr>
<td>Include NOTAMS:</td>
<td><input type="hidden" name="notams" value="0"><input type="checkbox" name="notams" value="1"
checked>
</td>
</tr>
<tr>
<td>FIR NOTAMS:</td>
<td><input type="hidden" name="firnot" value="0"><input type="checkbox" name="firnot" value="1"></td>
</tr>
<tr>
<td>Flight Maps:</td>
<td><select name="maps">
<option value="detail">Detailed</option>
<option value="simple">Simple</option>
<option value="none">None</option>
</select></td>
</tr>
</table>
</div>
</div>
</div>
<input type="hidden" name="airline" value="{{ $flight->airline->icao }}">
<input type="hidden" name="fltnum" value="{{ $flight->flight_number }}">
<input type="hidden" name="date" value="01JAN14">
<input type="hidden" name="deph" value="12">
<input type="hidden" name="depm" value="30">
<input type="hidden" name="steh" value="2">
<input type="hidden" name="stem" value="15">
{{--<input type="hidden" name="reg" value="N123SB">
<input type="hidden" name="selcal" value="GR-FS">--}}
<input type="hidden" name="planformat" value="lido">
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="float-right">
<div class="form-group">
<input type="button"
onclick="simbriefsubmit('{{ $flight->id }}', '{{ url(route('frontend.simbrief.briefing', [''])) }}');"
class="btn btn-outline-primary"
value="Generate">
</div>
</div>
</div>
</div>
</form>
@endsection
@section('scripts')
<script src="{{public_asset('/assets/global/js/simbrief.apiv1.js')}}"></script>
@endsection

View File

@@ -70,8 +70,15 @@
</div>
<div class="row">
<div class="col-sm-12 text-right">
@if ($simbrief !== false)
<a href="{{ route('frontend.simbrief.generate') }}?flight_id={{ $flight->id }}"
class="btn btn-sm btn-outline-primary">
Create SimBrief Flight Plan
</a>
@endif
<a href="{{ route('frontend.pireps.create') }}?flight_id={{ $flight->id }}"
class="btn btn-sm btn-info">
class="btn btn-sm btn-outline-info">
{{ __('pireps.newpirep') }}
</a>
</div>

View File

@@ -7,7 +7,6 @@
<h2>@lang('pireps.newflightreport')</h2>
@include('flash::message')
@if(!empty($pirep))
wee
{{ Form::model($pirep, ['route' => 'frontend.pireps.store']) }}
@else
{{ Form::open(['route' => 'frontend.pireps.store']) }}

View File

@@ -303,22 +303,24 @@ flight reports that have been filed. You've been warned!
&nbsp;{{ trans_choice('common.field', 2) }}
</h6>
<div class="form-container-body">
@if(isset($pirep) && $pirep->fields)
@each('pireps.custom_fields', $pirep->fields, 'field')
@else
@each('pireps.custom_fields', $pirep_fields, 'field')
@endif
<table class="table table-striped">
@if(isset($pirep) && $pirep->fields)
@each('pireps.custom_fields', $pirep->fields, 'field')
@else
@each('pireps.custom_fields', $pirep_fields, 'field')
@endif
</table>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="float-right">
<div class="form-group">
{{ Form::hidden('flight_id') }}
{{ Form::hidden('sb_id', $simbrief_id) }}
@if(isset($pirep) && !$pirep->read_only)
{{ Form::button(__('pireps.deletepirep'), [

View File

@@ -5,7 +5,7 @@
<div class="row">
<div class="col-md-12">
<div style="float:right;">
<a class="btn btn-info pull-right btn-lg"
<a class="btn btn-outline-info pull-right btn-lg"
style="margin-top: -10px;margin-bottom: 5px"
href="{{ route('frontend.pireps.create') }}">@lang('pireps.filenewpirep')</a>
</div>

View File

@@ -3,12 +3,40 @@
@section('content')
<div class="row">
<div class="col-8">
<div class="row">
<div class="col-12">
<h2 style="margin-bottom: 5px;">{{$pirep->airline->code}}{{ $pirep->ident }}</h2>
<div class="col-sm-8">
<h2>{{ $pirep->airline->icao }}{{ $pirep->ident }}
: {{ $pirep->dpt_airport_id }} to {{ $pirep->arr_airport_id }}</h2>
</div>
<div class="col-sm-4">
{{-- Show the link to edit if it can be edited --}}
@if (!empty($pirep->simbrief))
<a href="{{ url(route('frontend.simbrief.briefing', [$pirep->simbrief->id])) }}"
class="btn btn-outline-info">View SimBrief</a>
@endif
@if(!$pirep->read_only)
<div class="float-right" style="margin-bottom: 10px;">
<form method="get"
action="{{ route('frontend.pireps.edit', $pirep->id) }}"
style="display: inline">
@csrf
<button class="btn btn-outline-info">@lang('common.edit')</button>
</form>
&nbsp;
<form method="post"
action="{{ route('frontend.pireps.submit', $pirep->id) }}"
style="display: inline">
@csrf
<button class="btn btn-outline-success">@lang('common.submit')</button>
</form>
</div>
</div>
@endif
</div>
</div>
<div class="row">
<div class="col-8">
<div class="row">
{{--
DEPARTURE INFO
@@ -70,29 +98,7 @@
--}}
<div class="col-4">
<h2>&nbsp;</h2>
{{-- Show the link to edit if it can be edited --}}
@if(!$pirep->read_only)
<div class="float-right" style="margin-bottom: 10px;">
<form method="get"
action="{{ route('frontend.pireps.edit', $pirep->id) }}"
style="display: inline">
@csrf
<button class="btn btn-info">@lang('common.edit')</button>
</form>
&nbsp;
<form method="post"
action="{{ route('frontend.pireps.submit', $pirep->id) }}"
style="display: inline">
@csrf
<button class="btn btn-success">@lang('common.submit')</button>
</form>
</div>
@endif
<table class="table table-striped">
<tr>
<td width="30%">@lang('common.state')</td>
<td>
@@ -102,6 +108,7 @@
</td>
</tr>
@if ($pirep->state !== PirepState::DRAFT)
<tr>
<td width="30%">@lang('common.status')</td>
<td>
@@ -110,6 +117,7 @@
</div>
</td>
</tr>
@endif
<tr>
<td>@lang('pireps.source')</td>
@@ -217,5 +225,22 @@
</div>
</div>
@endif
@endsection
@if(!empty($pirep->simbrief))
<div class="separator"></div>
<div class="row mt-5">
<div class="col-12">
<div class="form-container">
<h6><i class="fas fa-info-circle"></i>
&nbsp;OFP
</h6>
<div class="form-container-body border border-dark">
<div class="overflow-auto" style="height: 600px;">
{!! $pirep->simbrief->xml->text->plan_html !!}
</div>
</div>
</div>
</div>
</div>
@endif
@endsection

View File

@@ -39,16 +39,17 @@
@minutestotime($pirep->flight_time)
</td>
<td class="text-center">
@if($pirep->state === PirepState::PENDING)
<div class="badge badge-warning">
@elseif($pirep->state === PirepState::ACCEPTED)
<div class="badge badge-success">
@elseif($pirep->state === PirepState::REJECTED)
<div class="badge badge-danger">
@else
<div class="badge badge-info">
@endif
{{ PirepState::label($pirep->state) }}</div>
@php
$color = 'badge-info';
if($pirep->state === PirepState::PENDING) {
$color = 'badge-warning';
} elseif ($pirep->state === PirepState::ACCEPTED) {
$color = 'badge-success';
} elseif ($pirep->state === PirepState::REJECTED) {
$color = 'badge-danger';
}
@endphp
<div class="badge {{ $color }}">{{ PirepState::label($pirep->state) }}</div>
</td>
<td>
@if(filled($pirep->submitted_at))
@@ -58,7 +59,7 @@
<td>
@if(!$pirep->read_only)
<a href="{{ route('frontend.pireps.edit', [$pirep->id]) }}"
class="btn btn-info btn-sm"
class="btn btn-outline-info btn-sm"
style="z-index: 9999"
title="@lang('common.edit')">
@lang('common.edit')