update livemap to use rivets.js bindings for data updates
This commit is contained in:
@@ -97,6 +97,26 @@ class PirepController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the active PIREPs
|
||||
* @param $id
|
||||
* @return PirepResource
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$active = [];
|
||||
$pireps = $this->acarsRepo->getPositions();
|
||||
foreach($pireps as $pirep) {
|
||||
if(\count($pirep->position) === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$active[] = $pirep;
|
||||
}
|
||||
|
||||
return PirepResource::collection(collect($active));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
* @return PirepResource
|
||||
|
||||
@@ -25,6 +25,7 @@ class PositionRequest extends FormRequest
|
||||
'positions' => 'required|array',
|
||||
'positions.*.lat' => 'required|numeric',
|
||||
'positions.*.lon' => 'required|numeric',
|
||||
'positions.*.status' => 'nullable',
|
||||
'positions.*.altitude' => 'nullable|numeric',
|
||||
'positions.*.heading' => 'nullable|numeric|between:0,360',
|
||||
'positions.*.vs' => 'nullable',
|
||||
|
||||
@@ -25,6 +25,7 @@ class PrefileRequest extends FormRequest
|
||||
'arr_airport_id' => 'required',
|
||||
'source_name' => 'required',
|
||||
|
||||
'status' => 'nullable',
|
||||
'level' => 'nullable|numeric',
|
||||
'flight_type' => 'nullable',
|
||||
'route_code' => 'nullable',
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use App\Support\Units\Distance;
|
||||
use App\Support\Units\Fuel;
|
||||
use Illuminate\Http\Resources\Json\Resource;
|
||||
|
||||
class Acars extends Resource
|
||||
@@ -14,6 +16,16 @@ class Acars extends Resource
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
return parent::toArray($request);
|
||||
$obj = parent::toArray($request);
|
||||
|
||||
if ($this->distance instanceof Distance) {
|
||||
$obj['distance'] = $this->distance->units;
|
||||
}
|
||||
|
||||
if ($this->fuel instanceof Fuel) {
|
||||
$obj['fuel'] = $this->fuel->units;
|
||||
}
|
||||
|
||||
return $obj;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ class Pirep extends Resource
|
||||
{
|
||||
$pirep = parent::toArray($request);
|
||||
|
||||
$pirep['ident'] = $this->ident;
|
||||
|
||||
if ($this->distance instanceof Distance) {
|
||||
$pirep['distance'] = $this->distance->units;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ class AcarsRepository extends Repository
|
||||
*/
|
||||
public function getPositions()
|
||||
{
|
||||
return Pirep::with(['airline', 'position'])
|
||||
return Pirep::with(['airline', 'position', 'aircraft'])
|
||||
->where(['state' => PirepState::IN_PROGRESS])
|
||||
->get();
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
Route::group([], function () {
|
||||
Route::get('acars', 'AcarsController@index');
|
||||
Route::get('pireps', 'PirepController@index');
|
||||
Route::get('pireps/{pirep_id}', 'PirepController@get');
|
||||
Route::get('pireps/{pirep_id}/acars/geojson', 'PirepController@acars_geojson');
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ class DatabaseService extends Service
|
||||
*/
|
||||
protected function time(): string
|
||||
{
|
||||
return Carbon::now('UTC')->format('Y-m-d H:i:s');
|
||||
return Carbon::now('UTC'); //->format('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -43,7 +43,6 @@ class DatabaseService extends Service
|
||||
public function seed_from_yaml_file($yaml_file, $ignore_errors = false): array
|
||||
{
|
||||
$yml = file_get_contents($yaml_file);
|
||||
|
||||
return $this->seed_from_yaml($yml, $ignore_errors);
|
||||
}
|
||||
|
||||
@@ -61,39 +60,56 @@ class DatabaseService extends Service
|
||||
$imported[$table] = 0;
|
||||
|
||||
foreach ($rows as $row) {
|
||||
# see if this table uses a UUID as the PK
|
||||
# if no ID is specified
|
||||
if (in_array($table, $this->uuid_tables)) {
|
||||
if (!array_key_exists('id', $row)) {
|
||||
$row['id'] = Uuid::generate()->string;
|
||||
}
|
||||
}
|
||||
|
||||
# encrypt any password fields
|
||||
if (array_key_exists('password', $row)) {
|
||||
$row['password'] = bcrypt($row['password']);
|
||||
}
|
||||
|
||||
# if any time fields are == to "now", then insert the right time
|
||||
foreach ($this->time_fields as $tf) {
|
||||
if (array_key_exists($tf, $row) && strtolower($row[$tf]) === 'now') {
|
||||
$row[$tf] = $this->time();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
DB::table($table)->insert($row);
|
||||
++$imported[$table];
|
||||
} catch (QueryException $e) {
|
||||
$row = $this->insert_row($table, $row);
|
||||
} catch(QueryException $e) {
|
||||
if ($ignore_errors) {
|
||||
continue;
|
||||
}
|
||||
|
||||
throw $e;
|
||||
}
|
||||
|
||||
++$imported[$table];
|
||||
}
|
||||
}
|
||||
|
||||
return $imported;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $table
|
||||
* @param $row
|
||||
* @return mixed
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function insert_row($table, $row) {
|
||||
# see if this table uses a UUID as the PK
|
||||
# if no ID is specified
|
||||
if (\in_array($table, $this->uuid_tables, true)) {
|
||||
if (!array_key_exists('id', $row)) {
|
||||
$row['id'] = Uuid::generate()->string;
|
||||
}
|
||||
}
|
||||
|
||||
# encrypt any password fields
|
||||
if (array_key_exists('password', $row)) {
|
||||
$row['password'] = bcrypt($row['password']);
|
||||
}
|
||||
|
||||
# if any time fields are == to "now", then insert the right time
|
||||
foreach($row as $column => $value) {
|
||||
if(strtolower($value) === 'now') {
|
||||
$row[$column] = $this->time();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
DB::table($table)->insert($row);
|
||||
} catch (QueryException $e) {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return $row;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,28 +1,28 @@
|
||||
/*!
|
||||
|
||||
=========================================================
|
||||
* Now-ui-kit - v1.0.0
|
||||
=========================================================
|
||||
|
||||
* Product Page: http://www.creative-tim.com/product/now-ui-kit
|
||||
* Copyright 2017 Creative Tim (http://www.creative-tim.com)
|
||||
* Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md)
|
||||
|
||||
* Designed by www.invisionapp.com Coded by www.creative-tim.com
|
||||
|
||||
=========================================================
|
||||
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
/*!
|
||||
|
||||
=========================================================
|
||||
* Now-ui-kit - v1.0.0
|
||||
=========================================================
|
||||
|
||||
* Product Page: http://www.creative-tim.com/product/now-ui-kit
|
||||
* Copyright 2017 Creative Tim (http://www.creative-tim.com)
|
||||
* Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md)
|
||||
|
||||
* Designed by www.invisionapp.com Coded by www.creative-tim.com
|
||||
|
||||
=========================================================
|
||||
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
*/
|
||||
/* brand Colors */
|
||||
/* light colors */
|
||||
/* ========================================================================
|
||||
* bootstrap-switch - v3.3.2
|
||||
* http://www.bootstrap-switch.org
|
||||
* ========================================================================
|
||||
* Copyright 2012-2013 Mattia Larentis
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
/* ========================================================================
|
||||
* bootstrap-switch - v3.3.2
|
||||
* http://www.bootstrap-switch.org
|
||||
* ========================================================================
|
||||
* Copyright 2012-2013 Mattia Larentis
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
.bootstrap-switch {
|
||||
display: inline-block;
|
||||
@@ -293,9 +293,9 @@
|
||||
}
|
||||
|
||||
/*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */
|
||||
/* Functional styling;
|
||||
* These styles are required for noUiSlider to function.
|
||||
* You don't need to change these rules to apply your design.
|
||||
/* Functional styling;
|
||||
* These styles are required for noUiSlider to function.
|
||||
* You don't need to change these rules to apply your design.
|
||||
*/
|
||||
.noUi-target,
|
||||
.noUi-target * {
|
||||
@@ -353,8 +353,8 @@
|
||||
cursor: inherit !important;
|
||||
}
|
||||
|
||||
/* Painting and performance;
|
||||
* Browsers can paint handles in their own layer.
|
||||
/* Painting and performance;
|
||||
* Browsers can paint handles in their own layer.
|
||||
*/
|
||||
.noUi-base,
|
||||
.noUi-handle {
|
||||
@@ -362,7 +362,7 @@
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
|
||||
/* Slider size and handle placement;
|
||||
/* Slider size and handle placement;
|
||||
*/
|
||||
.noUi-horizontal {
|
||||
height: 1px;
|
||||
@@ -391,7 +391,7 @@
|
||||
top: -17px;
|
||||
}
|
||||
|
||||
/* Styling;
|
||||
/* Styling;
|
||||
*/
|
||||
.noUi-target {
|
||||
background-color: rgba(182, 182, 182, 0.3);
|
||||
@@ -405,7 +405,7 @@
|
||||
transition: background 450ms;
|
||||
}
|
||||
|
||||
/* Handles and cursors;
|
||||
/* Handles and cursors;
|
||||
*/
|
||||
.noUi-draggable {
|
||||
cursor: ew-resize;
|
||||
@@ -419,8 +419,8 @@
|
||||
border-radius: 3px;
|
||||
background: #FFF;
|
||||
cursor: default;
|
||||
-webkit-box-shadow: inset 0 0 1px #FFF,
|
||||
inset 0 1px 7px #EBEBEB,
|
||||
-webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;
|
||||
box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;
|
||||
-webkit-transition: 300ms ease 0s;
|
||||
-moz-transition: 300ms ease 0s;
|
||||
-ms-transition: 300ms ease 0s;
|
||||
@@ -433,7 +433,7 @@
|
||||
transform: scale3d(1.5, 1.5, 1);
|
||||
}
|
||||
|
||||
-webkit-transform: scale3d(1.5, 1.5, 1);
|
||||
/* Disabled state;
|
||||
*/
|
||||
[disabled] .noUi-connect {
|
||||
background: #B8B8B8;
|
||||
@@ -445,8 +445,8 @@
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
[disabled] .noUi-handle {
|
||||
cursor: not-allowed;
|
||||
/* Base;
|
||||
*
|
||||
*/
|
||||
.noUi-pips,
|
||||
.noUi-pips * {
|
||||
@@ -459,8 +459,8 @@
|
||||
color: #999;
|
||||
}
|
||||
|
||||
position: absolute;
|
||||
color: #999;
|
||||
/* Values;
|
||||
*
|
||||
*/
|
||||
.noUi-value {
|
||||
position: absolute;
|
||||
@@ -472,8 +472,8 @@
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
color: #ccc;
|
||||
font-size: 10px;
|
||||
/* Markings;
|
||||
*
|
||||
*/
|
||||
.noUi-marker {
|
||||
position: absolute;
|
||||
@@ -488,8 +488,8 @@
|
||||
background: #AAA;
|
||||
}
|
||||
|
||||
.noUi-marker-large {
|
||||
background: #AAA;
|
||||
/* Horizontal layout;
|
||||
*
|
||||
*/
|
||||
.noUi-pips-horizontal {
|
||||
padding: 10px 0;
|
||||
@@ -518,8 +518,8 @@
|
||||
height: 15px;
|
||||
}
|
||||
|
||||
.noUi-marker-horizontal.noUi-marker-large {
|
||||
height: 15px;
|
||||
/* Vertical layout;
|
||||
*
|
||||
*/
|
||||
.noUi-pips-vertical {
|
||||
padding: 0 10px;
|
||||
@@ -645,10 +645,10 @@
|
||||
background-color: #FF3636;
|
||||
}
|
||||
|
||||
.slider.slider-danger .noUi-handle {
|
||||
background-color: #FF3636;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker)
|
||||
*
|
||||
* Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
|
||||
*/
|
||||
.datepicker {
|
||||
padding: 8px 6px;
|
||||
@@ -2198,17 +2198,17 @@ fieldset[disabled]
|
||||
background-color: #E3E3E3;
|
||||
}
|
||||
|
||||
.input-group[disabled] .input-group-addon {
|
||||
background-color: #E3E3E3;
|
||||
}
|
||||
|
||||
/*.input-group .form-control:first-child,
|
||||
.input-group-addon:first-child,
|
||||
.input-group-btn:first-child > .dropdown-toggle,
|
||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
|
||||
border-right: 0 none;
|
||||
}
|
||||
.input-group .form-control:last-child,
|
||||
/*.input-group .form-control:first-child,
|
||||
.input-group-addon:first-child,
|
||||
.input-group-btn:first-child > .dropdown-toggle,
|
||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
|
||||
border-right: 0 none;
|
||||
}
|
||||
.input-group .form-control:last-child,
|
||||
.input-group-addon:last-child,
|
||||
.input-group-btn:last-child > .dropdown-toggle,
|
||||
.input-group-btn:first-child > .btn:not(:first-child) {
|
||||
border-left: 0 none;
|
||||
}*/
|
||||
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
|
||||
background-color: #E3E3E3;
|
||||
@@ -3755,12 +3755,12 @@ img {
|
||||
box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
-webkit-box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
/* --------------------------------
|
||||
|
||||
/* --------------------------------
|
||||
|
||||
Nucleo Outline Web Font - nucleoapp.com/
|
||||
License - nucleoapp.com/license/
|
||||
Created using IcoMoon - icomoon.io
|
||||
|
||||
-------------------------------- */
|
||||
@font-face {
|
||||
font-family: 'Nucleo Outline';
|
||||
@@ -3770,8 +3770,8 @@ Created using IcoMoon - icomoon.io
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
/*------------------------
|
||||
base class definition
|
||||
-------------------------*/
|
||||
.now-ui-icons {
|
||||
display: inline-block;
|
||||
@@ -3784,11 +3784,11 @@ Created using IcoMoon - icomoon.io
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
/*------------------------
|
||||
change icon size
|
||||
-------------------------*/
|
||||
|
||||
/*------------------------
|
||||
/*----------------------------------
|
||||
add a square/circle background
|
||||
-----------------------------------*/
|
||||
.now-ui-icons.circle {
|
||||
padding: 0.33333333em;
|
||||
@@ -3800,8 +3800,8 @@ Created using IcoMoon - icomoon.io
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.now-ui-icons.circle {
|
||||
border-radius: 50%;
|
||||
/*------------------------
|
||||
list icons
|
||||
-------------------------*/
|
||||
.nc-icon-ul {
|
||||
padding-left: 0;
|
||||
@@ -3825,8 +3825,8 @@ Created using IcoMoon - icomoon.io
|
||||
left: -1.9047619em;
|
||||
}
|
||||
|
||||
top: -0.19047619em;
|
||||
left: -1.9047619em;
|
||||
/*------------------------
|
||||
spinning icons
|
||||
-------------------------*/
|
||||
.now-ui-icons.spin {
|
||||
-webkit-animation: nc-icon-spin 2s infinite linear;
|
||||
@@ -3853,11 +3853,11 @@ Created using IcoMoon - icomoon.io
|
||||
}
|
||||
}
|
||||
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
/*------------------------
|
||||
rotated/flipped icons
|
||||
-------------------------*/
|
||||
|
||||
/*------------------------
|
||||
/*------------------------
|
||||
font icons
|
||||
-------------------------*/
|
||||
.now-ui-icons.ui-1_check:before {
|
||||
content: "\EA22";
|
||||
@@ -5668,21 +5668,21 @@ Created using IcoMoon - icomoon.io
|
||||
}
|
||||
}
|
||||
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
/*.separator{
|
||||
content: "Separator";
|
||||
color: #FFFFFF;
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
}
|
||||
.separator-line{
|
||||
background-color: #EEE;
|
||||
height: 1px;
|
||||
width: 100%;
|
||||
/*.separator{
|
||||
content: "Separator";
|
||||
color: #FFFFFF;
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
}
|
||||
.separator-line{
|
||||
background-color: #EEE;
|
||||
height: 1px;
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
.separator.separator-gray{
|
||||
background-color: #EEEEEE;
|
||||
}*/
|
||||
.social-buttons-demo .btn {
|
||||
margin-right: 5px;
|
||||
|
||||
@@ -5,6 +5,16 @@
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.map-info-box {
|
||||
display: none;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
padding: 20px;
|
||||
height: 100px;
|
||||
z-index: 9999;
|
||||
background-color: rgba(232, 232, 232, 0.9);
|
||||
}
|
||||
|
||||
.dashboard-box {
|
||||
background: #067ec1;
|
||||
color: #FFF;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -6799,31 +6799,31 @@ button.close {
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap.css.map */
|
||||
|
||||
/*!
|
||||
|
||||
=========================================================
|
||||
* Now-ui-kit - v1.0.0
|
||||
=========================================================
|
||||
|
||||
* Product Page: http://www.creative-tim.com/product/now-ui-kit
|
||||
* Copyright 2017 Creative Tim (http://www.creative-tim.com)
|
||||
* Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md)
|
||||
|
||||
* Designed by www.invisionapp.com Coded by www.creative-tim.com
|
||||
|
||||
=========================================================
|
||||
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
/*!
|
||||
|
||||
=========================================================
|
||||
* Now-ui-kit - v1.0.0
|
||||
=========================================================
|
||||
|
||||
* Product Page: http://www.creative-tim.com/product/now-ui-kit
|
||||
* Copyright 2017 Creative Tim (http://www.creative-tim.com)
|
||||
* Licensed under MIT (https://github.com/creativetimofficial/now-ui-kit/blob/master/LICENSE.md)
|
||||
|
||||
* Designed by www.invisionapp.com Coded by www.creative-tim.com
|
||||
|
||||
=========================================================
|
||||
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
*/
|
||||
/* brand Colors */
|
||||
/* light colors */
|
||||
/* ========================================================================
|
||||
* bootstrap-switch - v3.3.2
|
||||
* http://www.bootstrap-switch.org
|
||||
* ========================================================================
|
||||
* Copyright 2012-2013 Mattia Larentis
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
/* ========================================================================
|
||||
* bootstrap-switch - v3.3.2
|
||||
* http://www.bootstrap-switch.org
|
||||
* ========================================================================
|
||||
* Copyright 2012-2013 Mattia Larentis
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
.bootstrap-switch {
|
||||
display: inline-block;
|
||||
@@ -7094,9 +7094,9 @@ button.close {
|
||||
}
|
||||
|
||||
/*! nouislider - 9.1.0 - 2016-12-10 16:00:32 */
|
||||
/* Functional styling;
|
||||
* These styles are required for noUiSlider to function.
|
||||
* You don't need to change these rules to apply your design.
|
||||
/* Functional styling;
|
||||
* These styles are required for noUiSlider to function.
|
||||
* You don't need to change these rules to apply your design.
|
||||
*/
|
||||
.noUi-target,
|
||||
.noUi-target * {
|
||||
@@ -7154,8 +7154,8 @@ button.close {
|
||||
cursor: inherit !important;
|
||||
}
|
||||
|
||||
/* Painting and performance;
|
||||
* Browsers can paint handles in their own layer.
|
||||
/* Painting and performance;
|
||||
* Browsers can paint handles in their own layer.
|
||||
*/
|
||||
.noUi-base,
|
||||
.noUi-handle {
|
||||
@@ -7163,7 +7163,7 @@ button.close {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
|
||||
/* Slider size and handle placement;
|
||||
/* Slider size and handle placement;
|
||||
*/
|
||||
.noUi-horizontal {
|
||||
height: 1px;
|
||||
@@ -7192,7 +7192,7 @@ button.close {
|
||||
top: -17px;
|
||||
}
|
||||
|
||||
/* Styling;
|
||||
/* Styling;
|
||||
*/
|
||||
.noUi-target {
|
||||
background-color: rgba(182, 182, 182, 0.3);
|
||||
@@ -7206,7 +7206,7 @@ button.close {
|
||||
transition: background 450ms;
|
||||
}
|
||||
|
||||
/* Handles and cursors;
|
||||
/* Handles and cursors;
|
||||
*/
|
||||
.noUi-draggable {
|
||||
cursor: ew-resize;
|
||||
@@ -7220,8 +7220,8 @@ button.close {
|
||||
border-radius: 3px;
|
||||
background: #FFF;
|
||||
cursor: default;
|
||||
-webkit-box-shadow: inset 0 0 1px #FFF,
|
||||
inset 0 1px 7px #EBEBEB,
|
||||
-webkit-box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;
|
||||
box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB;
|
||||
-webkit-transition: 300ms ease 0s;
|
||||
-moz-transition: 300ms ease 0s;
|
||||
-ms-transition: 300ms ease 0s;
|
||||
@@ -7234,7 +7234,7 @@ button.close {
|
||||
transform: scale3d(1.5, 1.5, 1);
|
||||
}
|
||||
|
||||
-webkit-transform: scale3d(1.5, 1.5, 1);
|
||||
/* Disabled state;
|
||||
*/
|
||||
[disabled] .noUi-connect {
|
||||
background: #B8B8B8;
|
||||
@@ -7246,8 +7246,8 @@ button.close {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
[disabled] .noUi-handle {
|
||||
cursor: not-allowed;
|
||||
/* Base;
|
||||
*
|
||||
*/
|
||||
.noUi-pips,
|
||||
.noUi-pips * {
|
||||
@@ -7260,8 +7260,8 @@ button.close {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
position: absolute;
|
||||
color: #999;
|
||||
/* Values;
|
||||
*
|
||||
*/
|
||||
.noUi-value {
|
||||
position: absolute;
|
||||
@@ -7273,8 +7273,8 @@ button.close {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
color: #ccc;
|
||||
font-size: 10px;
|
||||
/* Markings;
|
||||
*
|
||||
*/
|
||||
.noUi-marker {
|
||||
position: absolute;
|
||||
@@ -7289,8 +7289,8 @@ button.close {
|
||||
background: #AAA;
|
||||
}
|
||||
|
||||
.noUi-marker-large {
|
||||
background: #AAA;
|
||||
/* Horizontal layout;
|
||||
*
|
||||
*/
|
||||
.noUi-pips-horizontal {
|
||||
padding: 10px 0;
|
||||
@@ -7319,8 +7319,8 @@ button.close {
|
||||
height: 15px;
|
||||
}
|
||||
|
||||
.noUi-marker-horizontal.noUi-marker-large {
|
||||
height: 15px;
|
||||
/* Vertical layout;
|
||||
*
|
||||
*/
|
||||
.noUi-pips-vertical {
|
||||
padding: 0 10px;
|
||||
@@ -7446,10 +7446,10 @@ button.close {
|
||||
background-color: #FF3636;
|
||||
}
|
||||
|
||||
.slider.slider-danger .noUi-handle {
|
||||
background-color: #FF3636;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Datepicker for Bootstrap v1.7.0-dev (https://github.com/uxsolutions/bootstrap-datepicker)
|
||||
*
|
||||
* Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
|
||||
*/
|
||||
.datepicker {
|
||||
padding: 8px 6px;
|
||||
@@ -8999,17 +8999,17 @@ fieldset[disabled]
|
||||
background-color: #E3E3E3;
|
||||
}
|
||||
|
||||
.input-group[disabled] .input-group-addon {
|
||||
background-color: #E3E3E3;
|
||||
}
|
||||
|
||||
/*.input-group .form-control:first-child,
|
||||
.input-group-addon:first-child,
|
||||
.input-group-btn:first-child > .dropdown-toggle,
|
||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
|
||||
border-right: 0 none;
|
||||
}
|
||||
.input-group .form-control:last-child,
|
||||
/*.input-group .form-control:first-child,
|
||||
.input-group-addon:first-child,
|
||||
.input-group-btn:first-child > .dropdown-toggle,
|
||||
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {
|
||||
border-right: 0 none;
|
||||
}
|
||||
.input-group .form-control:last-child,
|
||||
.input-group-addon:last-child,
|
||||
.input-group-btn:last-child > .dropdown-toggle,
|
||||
.input-group-btn:first-child > .btn:not(:first-child) {
|
||||
border-left: 0 none;
|
||||
}*/
|
||||
.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
|
||||
background-color: #E3E3E3;
|
||||
@@ -10556,12 +10556,12 @@ img {
|
||||
box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
-webkit-box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
/* --------------------------------
|
||||
|
||||
/* --------------------------------
|
||||
|
||||
Nucleo Outline Web Font - nucleoapp.com/
|
||||
License - nucleoapp.com/license/
|
||||
Created using IcoMoon - icomoon.io
|
||||
|
||||
-------------------------------- */
|
||||
@font-face {
|
||||
font-family: 'Nucleo Outline';
|
||||
@@ -10571,8 +10571,8 @@ Created using IcoMoon - icomoon.io
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
/*------------------------
|
||||
base class definition
|
||||
-------------------------*/
|
||||
.now-ui-icons {
|
||||
display: inline-block;
|
||||
@@ -10585,11 +10585,11 @@ Created using IcoMoon - icomoon.io
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
/*------------------------
|
||||
change icon size
|
||||
-------------------------*/
|
||||
|
||||
/*------------------------
|
||||
/*----------------------------------
|
||||
add a square/circle background
|
||||
-----------------------------------*/
|
||||
.now-ui-icons.circle {
|
||||
padding: 0.33333333em;
|
||||
@@ -10601,8 +10601,8 @@ Created using IcoMoon - icomoon.io
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.now-ui-icons.circle {
|
||||
border-radius: 50%;
|
||||
/*------------------------
|
||||
list icons
|
||||
-------------------------*/
|
||||
.nc-icon-ul {
|
||||
padding-left: 0;
|
||||
@@ -10626,8 +10626,8 @@ Created using IcoMoon - icomoon.io
|
||||
left: -1.9047619em;
|
||||
}
|
||||
|
||||
top: -0.19047619em;
|
||||
left: -1.9047619em;
|
||||
/*------------------------
|
||||
spinning icons
|
||||
-------------------------*/
|
||||
.now-ui-icons.spin {
|
||||
-webkit-animation: nc-icon-spin 2s infinite linear;
|
||||
@@ -10654,11 +10654,11 @@ Created using IcoMoon - icomoon.io
|
||||
}
|
||||
}
|
||||
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
/*------------------------
|
||||
rotated/flipped icons
|
||||
-------------------------*/
|
||||
|
||||
/*------------------------
|
||||
/*------------------------
|
||||
font icons
|
||||
-------------------------*/
|
||||
.now-ui-icons.ui-1_check:before {
|
||||
content: "\EA22";
|
||||
@@ -12469,21 +12469,21 @@ Created using IcoMoon - icomoon.io
|
||||
}
|
||||
}
|
||||
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
/*.separator{
|
||||
content: "Separator";
|
||||
color: #FFFFFF;
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
}
|
||||
.separator-line{
|
||||
background-color: #EEE;
|
||||
height: 1px;
|
||||
width: 100%;
|
||||
/*.separator{
|
||||
content: "Separator";
|
||||
color: #FFFFFF;
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 20px;
|
||||
}
|
||||
.separator-line{
|
||||
background-color: #EEE;
|
||||
height: 1px;
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
.separator.separator-gray{
|
||||
background-color: #EEEEEE;
|
||||
}*/
|
||||
.social-buttons-demo .btn {
|
||||
margin-right: 5px;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=8f1a1bff7c8d0e2888db",
|
||||
"/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=70c0f73b28bc686d7791",
|
||||
"/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=42f138d32d03b309dec7",
|
||||
"/assets/admin/js/app.js": "/assets/admin/js/app.js?id=e4a5d8869d23f708dd10",
|
||||
"/assets/installer/js/app.js": "/assets/installer/js/app.js?id=27b9f2ce0b268e658f01",
|
||||
"/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=a9c6b70866d562211ec7",
|
||||
"/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=b0a0f05b94a4486db4f2",
|
||||
"/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=cc80aec3cf1646f83d8d",
|
||||
"/assets/admin/js/app.js": "/assets/admin/js/app.js?id=daa4de1b316b95d218ba",
|
||||
"/assets/installer/js/app.js": "/assets/installer/js/app.js?id=3a51850509367b06cd1f",
|
||||
"/assets/fonts/glyphicons-halflings-regular.woff2": "/assets/fonts/glyphicons-halflings-regular.woff2?id=b5b5055c6d812c0f9f0d",
|
||||
"/assets/admin/fonts/glyphicons-halflings-regular.woff2": "/assets/admin/fonts/glyphicons-halflings-regular.woff2?id=b5b5055c6d812c0f9f0d",
|
||||
"/assets/admin/img/clear.png": "/assets/admin/img/clear.png?id=0e92f4c3efc6988a3c96",
|
||||
"/assets/admin/img/loading.gif": "/assets/admin/img/loading.gif?id=90a4b76b4f11558691f6",
|
||||
"/assets/global/js/jquery.js": "/assets/global/js/jquery.js?id=6a07da9fae934baf3f74",
|
||||
"/assets/admin/css/vendor.css": "/assets/admin/css/vendor.css?id=f139af0f666d5cefde4d",
|
||||
"/assets/admin/css/vendor.css": "/assets/admin/css/vendor.css?id=99aedbd62dfa118e7b73",
|
||||
"/assets/admin/js/vendor.js": "/assets/admin/js/vendor.js?id=5130233c88c71fc60135",
|
||||
"/assets/admin/css/blue.png": "/assets/admin/css/blue.png?id=753a3c0dec86d3a38d9c",
|
||||
"/assets/admin/css/blue@2x.png": "/assets/admin/css/blue@2x.png?id=97da23d47b838cbd4bef",
|
||||
"/assets/global/js/vendor.js": "/assets/global/js/vendor.js?id=6436d215691e8f38eb12",
|
||||
"/assets/global/css/vendor.css": "/assets/global/css/vendor.css?id=115d5c4f2370ae94a962",
|
||||
"/assets/installer/css/vendor.css": "/assets/installer/css/vendor.css?id=344796a10af1741dc754",
|
||||
"/assets/installer/css/vendor.css": "/assets/installer/css/vendor.css?id=cd76d2d9611b9a13d644",
|
||||
"/assets/installer/js/vendor.js": "/assets/installer/js/vendor.js?id=01249af00bd2c1267e15"
|
||||
}
|
||||
2
resources/js/bootstrap.js
vendored
2
resources/js/bootstrap.js
vendored
@@ -38,3 +38,5 @@ if (api_key) {
|
||||
window.PHPVMS_USER_API_KEY = false;
|
||||
console.error('API Key not found!')
|
||||
}
|
||||
|
||||
require('./common');
|
||||
|
||||
@@ -1,2 +1,56 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
||||
const rivets = require('rivets');
|
||||
|
||||
/**
|
||||
* Generic formatter to prepend
|
||||
* @param value
|
||||
* @param prepend
|
||||
* @returns {*}
|
||||
*/
|
||||
rivets.formatters.prepend = function (value, prepend) {
|
||||
return prepend + value
|
||||
};
|
||||
|
||||
/**
|
||||
* Format minutes into HHh MMm
|
||||
* @param value
|
||||
* @returns {string}
|
||||
*/
|
||||
rivets.formatters.time_hm = function(value) {
|
||||
const hours = Math.floor(value / 60);
|
||||
const mins = value % 60;
|
||||
return hours + 'h ' + mins + 'm';
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
* @param len
|
||||
* @returns {boolean}
|
||||
*/
|
||||
rivets.formatters.gt = (value, len) => {
|
||||
return value.length > len;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
* @param len
|
||||
* @returns {boolean}
|
||||
*/
|
||||
rivets.formatters.lt = (value, len) => {
|
||||
return value.length < len;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param value
|
||||
* @param len
|
||||
* @returns {boolean}
|
||||
*/
|
||||
rivets.formatters.eq = (value, len) => {
|
||||
return value.length > len;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const leaflet = require('leaflet');
|
||||
const rivets = require('rivets');
|
||||
|
||||
import draw_base_map from './base_map'
|
||||
import {ACTUAL_ROUTE_COLOR} from './config'
|
||||
@@ -33,6 +34,9 @@ export default (opts) => {
|
||||
let layerSelFlightFeature = null;
|
||||
let layerSelFlightLayer = null;
|
||||
|
||||
const r_map_view = rivets.bind($('#map-info-box'), {pirep: {}});
|
||||
const r_table_view = rivets.bind($('#live_flights'), {pireps: []});
|
||||
|
||||
/**
|
||||
* When a flight is clicked on, show the path, etc for that flight
|
||||
* @param feature
|
||||
@@ -41,7 +45,6 @@ export default (opts) => {
|
||||
const onFlightClick = (feature, layer) => {
|
||||
|
||||
const pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);
|
||||
const link_uri = opts.pirep_link_uri.replace('{id}', feature.properties.pirep_id);
|
||||
const geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + "/acars/geojson";
|
||||
|
||||
const pirep_info = $.ajax({
|
||||
@@ -83,49 +86,9 @@ export default (opts) => {
|
||||
//
|
||||
// When the PIREP info is done loading, show the bottom bar
|
||||
//
|
||||
$.when(pirep_info).done(pirep => { pirep = pirep.data;
|
||||
|
||||
let dist, planned_dist;
|
||||
if(opts.units === 'nmi') {
|
||||
dist = pirep.distance.nmi;
|
||||
planned_dist = pirep.planned_distance.nmi;
|
||||
} else if(opts.units === 'mi') {
|
||||
dist = pirep.distance.mi;
|
||||
planned_dist = pirep.planned_distance.mi;
|
||||
} else if(opts.units === 'km') {
|
||||
dist = pirep.distance.km;
|
||||
planned_dist = pirep.planned_distance.km;
|
||||
}
|
||||
|
||||
// Parse flight time
|
||||
const hours = Math.floor(pirep.flight_time / 60);
|
||||
const mins = pirep.flight_time % 60;
|
||||
|
||||
$('#map_flight_id').html(
|
||||
'<a href="' + link_uri + '" target="_blank">' +
|
||||
pirep.airline.icao + pirep.flight_number +
|
||||
'</a>'
|
||||
);
|
||||
|
||||
$('#map_flight_info').text(
|
||||
pirep.dpt_airport.name + ' (' + pirep.dpt_airport.icao + ') to ' +
|
||||
pirep.arr_airport.name + ' (' + pirep.arr_airport.icao + ')'
|
||||
);
|
||||
|
||||
$('#map_flight_stats_middle').html(
|
||||
'Status: <strong>' + pirep.status_text + '</strong><br />' +
|
||||
'Flight Time: <strong>' + hours + 'h ' + mins + 'm</strong><br />' +
|
||||
'Distance: <strong>' + dist + '</strong> / ' + planned_dist + opts.units + '<br />'
|
||||
);
|
||||
|
||||
// Show flight stat info
|
||||
$('#map_flight_stats_right').html(
|
||||
'Ground Speed: <strong>' + pirep.position.gs + '</strong><br />' +
|
||||
'Altitude: <strong>' + pirep.position.altitude + '</strong><br />' +
|
||||
'Heading: <strong>' + pirep.position.heading + '</strong>'
|
||||
);
|
||||
|
||||
$('#map-info-bar').show();
|
||||
$.when(pirep_info).done(pirep => {
|
||||
r_map_view.update({pirep:pirep.data});
|
||||
$('#map-info-box').show();
|
||||
});
|
||||
};
|
||||
|
||||
@@ -136,6 +99,12 @@ export default (opts) => {
|
||||
/**
|
||||
* AJAX UPDATE
|
||||
*/
|
||||
const pirep_uri = opts.pirep_uri.replace('{id}', '');
|
||||
let pireps = $.ajax({
|
||||
url: pirep_uri,
|
||||
dataType: 'json',
|
||||
error: console.log
|
||||
});
|
||||
|
||||
let flights = $.ajax({
|
||||
url: opts.update_uri,
|
||||
@@ -143,7 +112,7 @@ export default (opts) => {
|
||||
error: console.log
|
||||
});
|
||||
|
||||
$.when(flights).done(function (flightGeoJson) {
|
||||
$.when(flights).done(flightGeoJson => {
|
||||
|
||||
if (layerFlights !== null) {
|
||||
layerFlights.clearLayers()
|
||||
@@ -178,7 +147,14 @@ export default (opts) => {
|
||||
if (layerSelFlight !== null) {
|
||||
onFlightClick(layerSelFlightFeature, layerSelFlightLayer)
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
$.when(pireps).done(pireps => {
|
||||
r_table_view.update({
|
||||
pireps: pireps.data,
|
||||
has_data: (pireps.data.length > 0),
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
updateMap();
|
||||
|
||||
@@ -79,6 +79,8 @@
|
||||
{{-- Start of the required tags block. Don't remove these or things will break!! --}}
|
||||
<script src="{{ public_asset('/assets/global/js/vendor.js') }}"></script>
|
||||
<script src="{{ public_asset('/assets/frontend/js/app.js') }}"></script>
|
||||
{{--<script src="bower_components/sightglass/index.js"></script>
|
||||
<script src="bower_components/rivets/dist/rivets.min.js"></script>--}}
|
||||
@yield('scripts')
|
||||
{{-- End the required tags block --}}
|
||||
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
If you change it, remember to change it in the in-array line as well
|
||||
--}}
|
||||
<button class="btn btn-round btn-icon btn-icon-mini
|
||||
{{ in_array($flight->id, $saved, true) ? 'btn-info':'' }}
|
||||
save_flight"
|
||||
{{ in_array($flight->id, $saved, true) ? 'btn-info':'' }}
|
||||
save_flight"
|
||||
x-id="{{ $flight->id }}"
|
||||
x-saved-class="btn-info"
|
||||
type="button"
|
||||
|
||||
@@ -2,28 +2,62 @@
|
||||
<div class="col-md-12">
|
||||
<div class="box-body">
|
||||
|
||||
{{--
|
||||
This map uses rivets.js to fill in the updates from the livemap
|
||||
So the single brackets are used by rivets to fill in the values
|
||||
And then the rv-* attributes are data-binds that will automatically
|
||||
update whenever the base model behind it updates:
|
||||
|
||||
http://rivetsjs.com/docs/guide
|
||||
|
||||
Look in resources/js/maps/live_map.js to see where the actual binding
|
||||
and update() call is made
|
||||
--}}
|
||||
<div id="map" style="width: {{ $config['width'] }}; height: {{ $config['height'] }}">
|
||||
<div id="map-info-bar"
|
||||
style="display: none;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
padding: 20px;
|
||||
height: 100px;
|
||||
z-index: 9999;
|
||||
background-color:rgba(232, 232, 232, 0.9);
|
||||
width: {{ $config['width'] }};">
|
||||
<div style="float: left; margin-right: 30px; width: 50%;">
|
||||
<h3 style="margin: 0" id="map_flight_id"></h3>
|
||||
<p id="map_flight_info"></p>
|
||||
|
||||
{{--
|
||||
This is the bottom bar that appears when you click on a flight in the map.
|
||||
You can show any data you want - use a JS debugger to see the value of "pirep",
|
||||
or look up the API documentation for the /api/pirep/{id}/acars call
|
||||
|
||||
It's basically any of the fields from the database and pirep.position.X is any
|
||||
column from the ACARS table - holds the latest position.
|
||||
|
||||
Again, this is updated automatically via the rivets.js bindings, so be mindful
|
||||
when you're editing the { } - single brackets == rivets, double brackets == laravel
|
||||
|
||||
A couple of places (like the distance) use both to output the correct bindings.
|
||||
--}}
|
||||
<div id="map-info-box" class="map-info-box"
|
||||
style="width: {{ $config['width'] }};">
|
||||
<div style="float: left; width: 50%;">
|
||||
<h3 style="margin: 0" id="map_flight_id">
|
||||
<a rv-href="pirep.id | prepend '{{url('/pireps/')}}/'" target="_blank">
|
||||
{ pirep.airline.icao }{ pirep.flight_number }
|
||||
</a>
|
||||
</h3>
|
||||
<p id="map_flight_info">
|
||||
{ pirep.dpt_airport.name } ({ pirep.dpt_airport.icao }) to
|
||||
{ pirep.arr_airport.name } ({ pirep.arr_airport.icao })
|
||||
</p>
|
||||
</div>
|
||||
<div style="float: left; margin-right: 30px;">
|
||||
<p id="map_flight_stats_middle"></p>
|
||||
<div style="float: right; margin-left: 30px; margin-right: 30px;">
|
||||
<p id="map_flight_stats_right">
|
||||
Ground Speed: <span style="font-weight: bold">{ pirep.position.gs }</span><br/>
|
||||
Altitude: <span style="font-weight: bold">{ pirep.position.altitude }</span><br/>
|
||||
Heading: <span style="font-weight: bold">{ pirep.position.heading }</span><br/>
|
||||
</p>
|
||||
</div>
|
||||
<div style="float: left;">
|
||||
<p id="map_flight_stats_right"></p>
|
||||
<div style="float: right; margin-left: 30px;">
|
||||
<p id="map_flight_stats_middle">
|
||||
Status: <span style="font-weight: bold">{ pirep.status_text }</span><br />
|
||||
Flight Time: <span style="font-weight: bold">{ pirep.flight_time | time_hm }</span><br />
|
||||
Distance: <span style="font-weight: bold">{ pirep.position.distance.{{setting('units.distance')}} }</span>
|
||||
/ <span style="font-weight: bold">
|
||||
{ pirep.planned_distance.{{setting('units.distance')}} }</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -31,26 +65,47 @@
|
||||
|
||||
<div class="clearfix" style="padding-top: 25px"></div>
|
||||
|
||||
{{--<div id="flights_table" class="row">
|
||||
{{--
|
||||
This table is also handled/rendered by rivets from the livemap
|
||||
Handles the updates by automatically updating the data in the row.
|
||||
|
||||
Same note applies from above about the data from the PIREP API being available
|
||||
and being mindful of the rivets bindings
|
||||
--}}
|
||||
<div id="live_flights" class="row">
|
||||
<div class="col-md-12">
|
||||
@if(!filled($pireps))
|
||||
<div class="jumbotron text-center">There are no flights</div>
|
||||
@endif
|
||||
<table class="table">
|
||||
@foreach($pireps as $pirep)
|
||||
<tr>
|
||||
<td>{{ $pirep->airline->code }}{{ $pirep->ident }}</td>
|
||||
<td>{{ $pirep->dpt_airport_id }}</td>
|
||||
<td>{{ $pirep->arr_airport_id }}</td>
|
||||
<td>{{ $pirep->aircraft->name }}</td>
|
||||
<td>
|
||||
{{ PirepStatus::label($pirep->status) }}
|
||||
</td>
|
||||
<div rv-hide="has_data" class="jumbotron text-center">There are no flights</div>
|
||||
<table rv-show="has_data" id="live_flights_table" class="table table-striped">
|
||||
<thead>
|
||||
<tr class="text-small header">
|
||||
<td class="text-small">Flight</td>
|
||||
<td class="text-small">Departure</td>
|
||||
<td class="text-small">Arrival</td>
|
||||
<td class="text-small">Aircraft</td>
|
||||
<td class="text-small">Altitude</td>
|
||||
<td class="text-small">GS</td>
|
||||
<td class="text-small">Distance</td>
|
||||
<td class="text-small">Status</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr rv-each-pirep="pireps">
|
||||
<td>{ pirep.airline.code }{ pirep.ident}</td>
|
||||
{{-- Show the full airport name on hover --}}
|
||||
<td><span rv-title="pirep.dpt_airport.name">{ pirep.dpt_airport.icao }</span></td>
|
||||
<td><span rv-title="pirep.arr_airport.name">{ pirep.arr_airport.icao }</span></td>
|
||||
<td>{ pirep.aircraft.name }</td>
|
||||
<td>{ pirep.position.altitude }</td>
|
||||
<td>{ pirep.position.gs }</td>
|
||||
<td>{ pirep.position.distance.{{setting('units.distance')}} } /
|
||||
{ pirep.planned_distance.{{setting('units.distance')}} }
|
||||
</td>
|
||||
<td>{ pirep.status_text }</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>--}}
|
||||
</div>
|
||||
|
||||
@section('scripts')
|
||||
<script>
|
||||
|
||||
Reference in New Issue
Block a user