From d61b4f1c3c47e3fce33091cd392e7af400ed5ec6 Mon Sep 17 00:00:00 2001 From: Nabeel Shahzad Date: Thu, 15 Jun 2017 22:45:25 -0500 Subject: [PATCH] #13 show airport map on details page with aerodome info --- .../Controllers/Admin/AirportController.php | 7 +- composer.json | 5 +- composer.lock | 846 +++++++++++++++++- config/app.php | 5 +- database/seeds/dev.yml | 6 + public/img/admin/airport-icon.png | Bin 0 -> 37509 bytes public/img/admin/control-tower.png | Bin 0 -> 3335 bytes public/js/admin/admin.js | 80 ++ resources/views/admin/aircraft/show.blade.php | 8 +- resources/views/admin/airports/show.blade.php | 38 +- .../admin/airports/show_fields.blade.php | 54 +- resources/views/admin/app.blade.php | 15 +- resources/views/admin/sidebar.blade.php | 4 +- .../cornford/googlmapper/circle.blade.php | 22 + .../cornford/googlmapper/javascript.blade.php | 37 + .../views/cornford/googlmapper/map.blade.php | 106 +++ .../cornford/googlmapper/mapper.blade.php | 19 + .../cornford/googlmapper/marker.blade.php | 110 +++ .../cornford/googlmapper/overlay.blade.php | 12 + .../cornford/googlmapper/polygon.blade.php | 21 + .../cornford/googlmapper/polyline.blade.php | 20 + .../cornford/googlmapper/rectangle.blade.php | 21 + .../cornford/googlmapper/streetview.blade.php | 39 + 23 files changed, 1407 insertions(+), 68 deletions(-) create mode 100644 public/img/admin/airport-icon.png create mode 100644 public/img/admin/control-tower.png create mode 100644 public/js/admin/admin.js create mode 100644 resources/views/cornford/googlmapper/circle.blade.php create mode 100644 resources/views/cornford/googlmapper/javascript.blade.php create mode 100644 resources/views/cornford/googlmapper/map.blade.php create mode 100644 resources/views/cornford/googlmapper/mapper.blade.php create mode 100644 resources/views/cornford/googlmapper/marker.blade.php create mode 100644 resources/views/cornford/googlmapper/overlay.blade.php create mode 100644 resources/views/cornford/googlmapper/polygon.blade.php create mode 100644 resources/views/cornford/googlmapper/polyline.blade.php create mode 100644 resources/views/cornford/googlmapper/rectangle.blade.php create mode 100644 resources/views/cornford/googlmapper/streetview.blade.php diff --git a/app/Http/Controllers/Admin/AirportController.php b/app/Http/Controllers/Admin/AirportController.php index f39b0591..d5c3da56 100644 --- a/app/Http/Controllers/Admin/AirportController.php +++ b/app/Http/Controllers/Admin/AirportController.php @@ -34,7 +34,8 @@ class AirportController extends InfyOmBaseController $airports = $this->airportRepository->all(); return view('admin.airports.index') - ->with('airports', $airports); + ->with('airports', $airports) + ->with('coords', ['lat' => '', 'lon' => '']); } /** @@ -78,11 +79,11 @@ class AirportController extends InfyOmBaseController if (empty($airport)) { Flash::error('Airport not found'); - return redirect(route('admin.airports.index')); } - return view('admin.airports.show')->with('airport', $airport); + return view('admin.airports.show') + ->with('airport', $airport); } /** diff --git a/composer.json b/composer.json index b302cf7b..c721f295 100755 --- a/composer.json +++ b/composer.json @@ -18,7 +18,10 @@ "zizaco/entrust": "5.2.x-dev", "prettus/l5-repository": "^2.6", "spatie/laravel-pjax": "^1.3", - "symfony/yaml": "^3.3" + "symfony/yaml": "^3.3", + "cornford/googlmapper": "2.*", + "league/geotools": "@stable", + "toin0u/geotools-laravel": "^1.0" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index d8847b07..9dab9214 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "2a812ab5f98781a23f47744c8a1f4fdd", + "content-hash": "54a87d4ef6ab895374f978fe8563b529", "packages": [ { "name": "barryvdh/laravel-ide-helper", @@ -121,6 +121,56 @@ ], "time": "2016-06-13T19:28:20+00:00" }, + { + "name": "cornford/googlmapper", + "version": "v2.25.0", + "source": { + "type": "git", + "url": "https://github.com/bradcornford/Googlmapper.git", + "reference": "4ad8ed16874143b475154a61f867af59bb1d4251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bradcornford/Googlmapper/zipball/4ad8ed16874143b475154a61f867af59bb1d4251", + "reference": "4ad8ed16874143b475154a61f867af59bb1d4251", + "shasum": "" + }, + "require": { + "illuminate/support": "5.*", + "illuminate/view": "5.*", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "0.9.1", + "phpspec/phpspec": "2.0.*@dev" + }, + "type": "library", + "autoload": { + "psr-0": { + "Cornford\\Googlmapper": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bradley Cornford", + "email": "me@bradleycornford.co.uk" + } + ], + "description": "An easy way to integrate Google Maps with Laravel.", + "keywords": [ + "google", + "laravel", + "map", + "mapping", + "maps", + "streetview" + ], + "time": "2017-04-20T08:30:20+00:00" + }, { "name": "doctrine/annotations", "version": "v1.4.0", @@ -652,6 +702,85 @@ "homepage": "https://github.com/dompdf/dompdf", "time": "2016-05-11T00:36:29+00:00" }, + { + "name": "egeloen/http-adapter", + "version": "0.8.0", + "source": { + "type": "git", + "url": "https://github.com/egeloen/ivory-http-adapter.git", + "reference": "9641f11487ec26b24c6bbcee4f267cf62f60b855" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egeloen/ivory-http-adapter/zipball/9641f11487ec26b24c6bbcee4f267cf62f60b855", + "reference": "9641f11487ec26b24c6bbcee4f267cf62f60b855", + "shasum": "" + }, + "require": { + "php": ">=5.4.8", + "zendframework/zend-diactoros": "^1.1" + }, + "require-dev": { + "cakephp/cakephp": "^3.0.3", + "ext-curl": "*", + "guzzle/guzzle": "^3.9.4@dev", + "guzzlehttp/guzzle": "^4.1.4|^5.0|^6.0", + "kriswallsmith/buzz": "^0.13", + "nategood/httpful": "^0.2.17", + "phpunit/phpunit": "^4.0", + "phpunit/phpunit-mock-objects": "dev-matcher-verify as 2.3.x-dev", + "psr/log": "^1.0", + "react/dns": "^0.4.1", + "react/http-client": "^0.4", + "satooshi/php-coveralls": "^0.6", + "symfony/event-dispatcher": "^2.0", + "zendframework/zend-http": "^2.3.4", + "zendframework/zendframework1": ">=1.12.9,<=1.12.14|^1.12.16" + }, + "suggest": { + "ext-curl": "Allows you to use the cURL adapter", + "ext-http": "Allows you to use the PECL adapter", + "guzzle/guzzle": "Allows you to use the Guzzle 3 adapter", + "guzzlehttp/guzzle": "Allows you to use the Guzzle 4 adapter", + "kriswallsmith/buzz": "Allows you to use the Buzz adapter", + "nategood/httpful": "Allows you to use the httpful adapter", + "psr/log": "Allows you to use the logger event subscriber", + "symfony/event-dispatcher": "Allows you to use the event lifecycle", + "symfony/stopwatch": "Allows you to use the stopwatch http adapter and event subscriber", + "zendframework/zend-http": "Allows you to use the Zend 2 adapter", + "zendframework/zendframework1": "Allows you to use the Zend 1 adapter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.8-dev" + } + }, + "autoload": { + "psr-4": { + "Ivory\\HttpAdapter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + } + ], + "description": "Issue HTTP request for PHP 5.3+.", + "keywords": [ + "http", + "http-adapter", + "http-client", + "psr-7" + ], + "abandoned": "php-http/httplug", + "time": "2015-08-12T09:35:40+00:00" + }, { "name": "erusev/parsedown", "version": "1.6.2", @@ -694,6 +823,51 @@ ], "time": "2017-03-29T16:04:15+00:00" }, + { + "name": "igorw/get-in", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/igorw/get-in.git", + "reference": "170ded831f49abc6a6061f655aba9bdbcf7b8111" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/get-in/zipball/170ded831f49abc6a6061f655aba9bdbcf7b8111", + "reference": "170ded831f49abc6a6061f655aba9bdbcf7b8111", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "files": [ + "src/get_in.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Functions for for hash map (assoc array) traversal.", + "keywords": [ + "assoc-array", + "hash-map" + ], + "time": "2014-12-15T23:03:51+00:00" + }, { "name": "infyomlabs/adminlte-templates", "version": "5.3.x-dev", @@ -737,7 +911,7 @@ "laravel", "templates" ], - "time": "2017-05-20 10:43:37" + "time": "2017-05-20T10:43:37+00:00" }, { "name": "infyomlabs/laravel-generator", @@ -792,7 +966,7 @@ "test", "view" ], - "time": "2016-08-18 14:19:50" + "time": "2016-08-18T14:19:50+00:00" }, { "name": "infyomlabs/swagger-generator", @@ -829,7 +1003,7 @@ "swagger", "templates" ], - "time": "2016-02-14 10:41:03" + "time": "2016-02-14T10:41:03+00:00" }, { "name": "jeremeamia/SuperClosure", @@ -932,7 +1106,7 @@ "laravel", "swagger" ], - "time": "2016-01-25 15:38:17" + "time": "2016-01-25T15:38:17+00:00" }, { "name": "laracasts/flash", @@ -979,16 +1153,16 @@ }, { "name": "laravel/framework", - "version": "v5.4.25", + "version": "v5.4.26", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "6bcc9b1f542b3deed16d51f6aa1fe318ab407c2a" + "reference": "a7ebbfab64111e24f8e584db64e2be9279ded357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/6bcc9b1f542b3deed16d51f6aa1fe318ab407c2a", - "reference": "6bcc9b1f542b3deed16d51f6aa1fe318ab407c2a", + "url": "https://api.github.com/repos/laravel/framework/zipball/a7ebbfab64111e24f8e584db64e2be9279ded357", + "reference": "a7ebbfab64111e24f8e584db64e2be9279ded357", "shasum": "" }, "require": { @@ -1104,7 +1278,7 @@ "framework", "laravel" ], - "time": "2017-06-07T13:35:12+00:00" + "time": "2017-06-13T18:58:49+00:00" }, { "name": "laravelcollective/html", @@ -1307,6 +1481,80 @@ ], "time": "2017-03-12T01:28:43+00:00" }, + { + "name": "league/geotools", + "version": "0.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/geotools.git", + "reference": "011c9649aed56e355de0fb7d51c9ccde0343da8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/geotools/zipball/011c9649aed56e355de0fb7d51c9ccde0343da8e", + "reference": "011c9649aed56e355de0fb7d51c9ccde0343da8e", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "react/event-loop": "0.4.*", + "react/promise": "~2.2", + "symfony/console": "~2.7|~3.0", + "symfony/property-access": "~2.7|~3.0", + "symfony/serializer": "~2.7|~3.0", + "willdurand/geocoder": "~3.2" + }, + "replace": { + "toin0u/geotools": "*" + }, + "require-dev": { + "guzzle/guzzle": "~3.7", + "kriswallsmith/buzz": "~0.10", + "predis/predis": "~1.0", + "zendframework/zend-http": "~2.2" + }, + "bin": [ + "bin/geotools" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.7-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Geotools\\": "src", + "League\\Geotools\\Tests\\": "tests" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antoine Corcy", + "email": "contact@sbin.dk", + "homepage": "http://sbin.dk", + "role": "Developer" + } + ], + "description": "Geo-related tools PHP 5.4+ library (use 0.4 if you're using PHP 5.3)", + "homepage": "http://geotools-php.org/", + "keywords": [ + "async", + "batch", + "bounds", + "distance", + "geocoder", + "geocoding", + "geoip", + "geometry", + "geotools" + ], + "time": "2016-02-03T16:31:33+00:00" + }, { "name": "maatwebsite/excel", "version": "2.1.17", @@ -1874,6 +2122,56 @@ ], "time": "2015-06-08T23:53:46+00:00" }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, { "name": "psr/log", "version": "1.0.2", @@ -2003,6 +2301,94 @@ ], "time": "2017-03-26T20:37:53+00:00" }, + { + "name": "react/event-loop", + "version": "v0.4.3", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "reference": "8bde03488ee897dc6bb3d91e4e17c353f9c5252f", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-event": "~1.0", + "ext-libev": "*", + "ext-libevent": ">=0.1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Event loop abstraction layer that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "time": "2017-04-27T10:56:23+00:00" + }, + { + "name": "react/promise", + "version": "v2.5.1", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "62785ae604c8d69725d693eb370e1d67e94c4053" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/62785ae604c8d69725d693eb370e1d67e94c4053", + "reference": "62785ae604c8d69725d693eb370e1d67e94c4053", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "time": "2017-03-25T12:08:31+00:00" + }, { "name": "spatie/laravel-pjax", "version": "1.3.1", @@ -2650,6 +3036,63 @@ "homepage": "https://symfony.com", "time": "2017-06-06T03:59:58+00:00" }, + { + "name": "symfony/inflector", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/inflector.git", + "reference": "aed5a0874a3bcfd8d0393a2d91b4cf828f29c7fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/inflector/zipball/aed5a0874a3bcfd8d0393a2d91b4cf828f29c7fb", + "reference": "aed5a0874a3bcfd8d0393a2d91b4cf828f29c7fb", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Inflector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Inflector Component", + "homepage": "https://symfony.com", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string", + "symfony", + "words" + ], + "time": "2017-04-12T14:14:56+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.4.0", @@ -2765,6 +3208,65 @@ ], "time": "2017-06-09T08:25:21+00:00" }, + { + "name": "symfony/polyfill-php70", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "032fd647d5c11a9ceab8ee8747e13b5448e93874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/032fd647d5c11a9ceab8ee8747e13b5448e93874", + "reference": "032fd647d5c11a9ceab8ee8747e13b5448e93874", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2017-06-09T14:24:12+00:00" + }, { "name": "symfony/polyfill-util", "version": "v1.4.0", @@ -2866,6 +3368,74 @@ "homepage": "https://symfony.com", "time": "2017-05-22T12:32:03+00:00" }, + { + "name": "symfony/property-access", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "70bbfe28f77070d41957495bc6fed34f139fe6f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/70bbfe28f77070d41957495bc6fed34f139fe6f7", + "reference": "70bbfe28f77070d41957495bc6fed34f139fe6f7", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/inflector": "~3.1", + "symfony/polyfill-php70": "~1.0" + }, + "require-dev": { + "symfony/cache": "~3.1" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony PropertyAccess Component", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2017-06-02T09:51:43+00:00" + }, { "name": "symfony/routing", "version": "v3.3.2", @@ -2944,6 +3514,83 @@ ], "time": "2017-06-02T09:51:43+00:00" }, + { + "name": "symfony/serializer", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "cc9b41611f4853cd01216f8765faba3db91a1583" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/cc9b41611f4853cd01216f8765faba3db91a1583", + "reference": "cc9b41611f4853cd01216f8765faba3db91a1583", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "conflict": { + "symfony/dependency-injection": "<3.2", + "symfony/property-access": ">=3.0,<3.0.4|>=2.8,<2.8.4", + "symfony/property-info": "<3.1", + "symfony/yaml": "<3.3" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "phpdocumentor/reflection-docblock": "~3.0", + "symfony/cache": "~3.1", + "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~3.2", + "symfony/http-foundation": "~2.8|~3.0", + "symfony/property-access": "~2.8|~3.0", + "symfony/property-info": "~3.1", + "symfony/yaml": "~3.3" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/http-foundation": "To use the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Serializer Component", + "homepage": "https://symfony.com", + "time": "2017-05-22T09:36:51+00:00" + }, { "name": "symfony/translation", "version": "v3.3.2", @@ -3179,6 +3826,68 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "time": "2016-09-20T12:50:39+00:00" }, + { + "name": "toin0u/geotools-laravel", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/toin0u/Geotools-laravel.git", + "reference": "262e4209bd6368c9b69a59b55bea90dbbb5d221b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/toin0u/Geotools-laravel/zipball/262e4209bd6368c9b69a59b55bea90dbbb5d221b", + "reference": "262e4209bd6368c9b69a59b55bea90dbbb5d221b", + "shasum": "" + }, + "require": { + "league/geotools": "~0.4", + "php": ">=5.4" + }, + "require-dev": { + "orchestra/testbench": "~2.0", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "~0.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.3-dev" + } + }, + "autoload": { + "psr-4": { + "Toin0u\\Geotools\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antoine Corcy", + "email": "contact@sbin.dk", + "homepage": "http://sbin.dk", + "role": "Developer" + } + ], + "description": "Geo-related tools PHP 5.3 library for Laravel 5", + "homepage": "http://geotools-php.org/", + "keywords": [ + "async", + "batch", + "bounds", + "distance", + "geocoder", + "geocoding", + "geoip", + "geometry", + "geotools", + "laravel" + ], + "time": "2015-02-23T12:40:40+00:00" + }, { "name": "vlucas/phpdotenv", "version": "v2.4.0", @@ -3229,6 +3938,66 @@ ], "time": "2016-09-01T10:05:43+00:00" }, + { + "name": "willdurand/geocoder", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/geocoder-php/Geocoder.git", + "reference": "ccc178e2984c0af24881faa0ffe515f20e5e8c23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/geocoder-php/Geocoder/zipball/ccc178e2984c0af24881faa0ffe515f20e5e8c23", + "reference": "ccc178e2984c0af24881faa0ffe515f20e5e8c23", + "shasum": "" + }, + "require": { + "egeloen/http-adapter": "~0.8", + "igorw/get-in": "~1.0", + "php": ">=5.4.0" + }, + "require-dev": { + "geoip2/geoip2": "~2.0", + "symfony/stopwatch": "~2.5" + }, + "suggest": { + "ext-geoip": "Enabling the geoip extension allows you to use the MaxMindProvider.", + "geoip/geoip": "If you are going to use the MaxMindBinaryProvider (conflict with geoip extension).", + "geoip2/geoip2": "If you are going to use the GeoIP2DatabaseProvider.", + "symfony/stopwatch": "If you want to use the TimedGeocoder" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-0": { + "Geocoder": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "William Durand", + "email": "william.durand1@gmail.com" + } + ], + "description": "The almost missing Geocoder PHP 5.4 library.", + "homepage": "http://geocoder-php.org", + "keywords": [ + "abstraction", + "geocoder", + "geocoding", + "geoip" + ], + "time": "2015-12-06T20:17:20+00:00" + }, { "name": "yajra/laravel-datatables-oracle", "version": "v6.24.1", @@ -3289,6 +4058,58 @@ ], "time": "2017-01-24T02:46:52+00:00" }, + { + "name": "zendframework/zend-diactoros", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-diactoros.git", + "reference": "b03f285a333f51e58c95cce54109a4a9ed691436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/b03f285a333f51e58c95cce54109a4a9ed691436", + "reference": "b03f285a333f51e58c95cce54109a4a9ed691436", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "phpunit/phpunit": "^4.6 || ^5.5", + "zendframework/zend-coding-standard": "~1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev", + "dev-develop": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://github.com/zendframework/zend-diactoros", + "keywords": [ + "http", + "psr", + "psr-7" + ], + "time": "2017-04-06T16:18:34+00:00" + }, { "name": "zircote/swagger-php", "version": "2.0.10", @@ -3417,7 +4238,7 @@ "permission", "roles" ], - "time": "2016-12-29 06:25:06" + "time": "2016-12-29T06:25:06+00:00" } ], "packages-dev": [ @@ -4895,7 +5716,8 @@ "infyomlabs/adminlte-templates": 20, "infyomlabs/swagger-generator": 20, "jlapp/swaggervel": 20, - "zizaco/entrust": 20 + "zizaco/entrust": 20, + "league/geotools": 0 }, "prefer-stable": false, "prefer-lowest": false, diff --git a/config/app.php b/config/app.php index a026b01b..a0a30d4a 100755 --- a/config/app.php +++ b/config/app.php @@ -101,10 +101,12 @@ return [ * Application Service Providers... */ App\Providers\AppServiceProvider::class, - // App\Providers\BroadcastServiceProvider::class, + App\Providers\BroadcastServiceProvider::class, App\Providers\AuthServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + + Toin0u\Geotools\GeotoolsServiceProvider::class, ], 'aliases' => [ @@ -145,6 +147,7 @@ return [ 'Html' => Collective\Html\HtmlFacade::class, 'Flash' => Laracasts\Flash\Flash::class, 'Yaml' => Symfony\Component\Yaml\Yaml::class, + 'Geotools' => Toin0u\Geotools\Facade\Geotools::class, ], ]; diff --git a/database/seeds/dev.yml b/database/seeds/dev.yml index 1fce6fe6..e05d3fda 100644 --- a/database/seeds/dev.yml +++ b/database/seeds/dev.yml @@ -50,6 +50,12 @@ aircraft_classes: - id: 1 code: H name: Heavy + - id: 2 + code: M + name: Medium + - id: 3 + code: L + name: Light # aircraft: diff --git a/public/img/admin/airport-icon.png b/public/img/admin/airport-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d17a0ad2a620952bc301ec8635fc7529588d53f GIT binary patch literal 37509 zcmX6^1yqyo_kYLe9F2gagwmbTh%^de{VYA-0e*gdybi8TUe=cG?|9uj z?edSLX#wB^hN_ahp8xzoA)ZO*OfHH;$fcr5St-d@d%oG>x3Fd&yF)&^=6tzo2OCOt zUZdhrW2$-7TXO-E!iH4uDkMFG+J+QU`4wbQ+1G{?i_%>YOI~!Y7$vbC;n{xt{rda$ zkNc3Z?ehl>j>LfD&VrTWf^%*Z0HB~uaXlWsDB(4;p7baK++&CgQyZxQu0s@t0-hy_ zrR*Bb$D#?fohKKNJKV@9fu0d*>+`U$Zph-@0+iq0HY(}iJk0hdB8=4q3ELG7BRU>2 zpGrTUxp4@##Vrj!VP}f#>OpEp;o$O-FSFi21o1YbUML)Q$wdy+CpL@ub&5(OPFD zlRW@YVpBlXMcLsUle6GvMukdI`5W&R!(vI#uP+RJQ%_A5A;JJIOZvo${0-q6PXrEg zv3ml4VkwVg)A_Yz7;+gVg5o}c`;p5}08DWc5ywjY>5!M=8Z`3E`t+>li47j$2!E)fO@hP(4!Ki&_hX~HR|~e`6x^n zH6k0o0z_Z~@(1b{jBJQZofkAJmd(Zk+biL)Mn4P~5hf83VXt+9Dm<}P;9jH0XS9m) zIzJvtos)`OA^yjx_w-I1Qh;}lo6hMP7p*Y{lNviP?Qz4G2Sb?>C=uGEq2i1eJ|HYY z(j0>GftQ}~l2!tLA4<;k4< zl2)YAt84I@M3MC1Lfi3q*0F)h}XEp2mfi74Ii~1gSVuhW)JDy6OVwCji>v};n+OjbrNNU_n@dlQ-s!E#`-Z4uwZ{M)z z_jls&(WIx=D}rMVXi}6NsF=P$oK#8ozj`;iZE>_(dYBO?g%g&fHJf;*JR4^u9g4c( z9Btb}5jQaPoo+lb`GW|CtI>_cSZu&8!ju4IfE(+spakjs50XXw0t}rkKB;4QLTc+l zhNjv2hVs6R_F_dZe4z*RG(yOCM-gI!C$_a6qrGMlk3QIG6*uCAnq!L40 zv;|(108;`4sSR1gBNvxo#$^GKpL>mQxD%r{GQ@#Qg*dt^phaLi&eBJD37~i3c^a0= zACV4;U=kGU*H|n3n4a15{x`VAUC@c<7fnQMqD`u49mW3r(+u-?I=rW_vNehups^)Gb2kA@UwDe+h z1ZV*%DijB9g@+)TMl3P9CHDtI81Usp9$O_aMlj_(d%30X2NO+UL7-mZ4v;X)L;j=c zc6L=tmIIeqo}vsC1VRsRBbcx$nk2|tFo>Yo{b3?m7s?P!0b>P!5l3uVfF~YBjkk2; z!HOG^^ErPsxAL()Ak2hZVJ2KtNoK-W&&9wG^KmU%8Sd9kQRu}zI+a4WBms!P4N1A2>&!WE6!h zSFZmf+v7J{S<^SsfSw-6r0o;AivaeLKuI}^hqs~%CFQLekoQcKp3z}Kxr0eK;CJc)bblJfW0b) zfko-lP^Q+o0!;Vz)NEc7Ep7STY4ug#Dy+~IeG-_{*GTi$KRu`dabj7w+L*G)haMV$ z)?%l_ENLZ(ToY|k0^c4yHd8r2%z4}8?AO5_2QLNDXaX4Z0+5o1xlhE}qoX|^_h&4u z4WxqWu7H{$Okp@3eGFD$m?WLY>h0yfC<%9u+Pj{Bhu*E1PkVzM&`zIr6 z>1J$$R|Xv~mV5#mT@pq#J{f1m3R8m6OGK6||-NJXFkw$KbPuQ{nu zIu#S|EBNigwneq)n7+_G92O`=i5lGc$j(Hk3H@Gt=~tL399LX)FB@7pQi*r7LN0

;eDgi~ibBM~bjo`3-D)>kkw5mx(ZH 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 literal 0 HcmV?d00001 diff --git a/public/img/admin/control-tower.png b/public/img/admin/control-tower.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bdcf5496772a82ed0082feaa347b829c53a6aa GIT binary patch literal 3335 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 Brw#xB literal 0 HcmV?d00001 diff --git a/public/js/admin/admin.js b/public/js/admin/admin.js new file mode 100644 index 00000000..edb3d576 --- /dev/null +++ b/public/js/admin/admin.js @@ -0,0 +1,80 @@ +/** + * admin functions, mostly map/mapping related + */ + +function phpvms_render_airspace_map(opts) { + opts = __parse_opts(opts); + var map = __draw_base_map(opts); + if(opts.set_marker == true) { L.marker(coords).addTo(map); } + return map; +} + +function __parse_opts(opts) { + _.defaults(opts, { + render_elem: 'map', + overlay_elem: '', + lat: 0, + lon: 0, + zoom: 12, + layers: [], + set_marker: false, + }); + + return opts; +} + +function __draw_base_map(opts) { + + var coords = [opts.lat, opts.lon]; + + /*var openaip_airspace_labels = new L.TileLayer.WMS( + "http://{s}.tile.maps.openaip.net/geowebcache/service/wms", { + maxZoom: 14, + minZoom: 12, + layers: 'openaip_approved_airspaces_labels', + tileSize: 1024, + detectRetina: true, + subdomains: '12', + format: 'image/png', + transparent: true + }); + + openaip_airspace_labels.addTo(map);*/ + + var opencyclemap_phys_osm = new L.TileLayer( + 'http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=f09a38fa87514de4890fc96e7fe8ecb1', { + maxZoom: 14, + minZoom: 4, + format: 'image/png', + transparent: true + }); + + var openaip_cached_basemap = new L.TileLayer("http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png", { + maxZoom: 14, + minZoom: 4, + tms: true, + detectRetina: false, + subdomains: '12', + format: 'image/png', + transparent: true + }); + + var openaip_basemap_phys_osm = L.featureGroup([opencyclemap_phys_osm, openaip_cached_basemap]); + + var map = L.map('map', { + layers: [openaip_basemap_phys_osm], + center: coords, + zoom: opts.zoom, + scrollWheelZoom: false, + }).setView(coords, opts.zoom); + + var attrib = L.control.attribution({position: 'bottomleft'}); + attrib.addAttribution("Thunderforest"); + attrib.addAttribution("openAIP"); + attrib.addAttribution("OpenStreetMap contributors"); + attrib.addAttribution("OpenWeatherMap"); + + attrib.addTo(map); + + return map; +} \ No newline at end of file diff --git a/resources/views/admin/aircraft/show.blade.php b/resources/views/admin/aircraft/show.blade.php index b35d4bcd..9dd5a13b 100644 --- a/resources/views/admin/aircraft/show.blade.php +++ b/resources/views/admin/aircraft/show.blade.php @@ -1,8 +1,14 @@ @extends('admin.app') @section('content') -

{!! $aircraft->name !!}

+
+

{!! $aircraft->name !!}

+

+ Edit +

+
+
@include('admin.aircraft.show_fields')
diff --git a/resources/views/admin/airports/show.blade.php b/resources/views/admin/airports/show.blade.php index d2ac23d5..e20ff75f 100644 --- a/resources/views/admin/airports/show.blade.php +++ b/resources/views/admin/airports/show.blade.php @@ -1,19 +1,35 @@ @extends('admin.app') @section('content') -
-

- {!! $airport->name !!} -

-
-
-
-
-
- @include('admin.airports.show_fields') - Back +
+

{!! $airport->name !!} - {!! $airport->location !!}

+

+ Edit +

+
+
+
+
+ @include('admin.airports.show_fields') +
+
+
+
+
+
+
+
+
+@endsection +@section('scripts') + @endsection diff --git a/resources/views/admin/airports/show_fields.blade.php b/resources/views/admin/airports/show_fields.blade.php index e106cbf5..a3f2968b 100644 --- a/resources/views/admin/airports/show_fields.blade.php +++ b/resources/views/admin/airports/show_fields.blade.php @@ -1,38 +1,22 @@ - -
- {!! Form::label('icao', 'ICAO:') !!} -

{!! $airport->icao !!}

+ +
+
+
+

ICAO

+
+
+

{!! $airport->icao !!}

+
+
-
- {!! Form::label('name', 'Name:') !!} -

{!! $airport->name !!}

+
+
+
+

Coordinates

+
+
+

{!! $airport->lat!!}/{!! $airport->lon !!}

+
+
- -
- {!! Form::label('location', 'Location:') !!} -

{!! $airport->location !!}

-
- -
- {!! Form::label('lat', 'Latitude:') !!} -

{!! $airport->lat !!}

-
- -
- {!! Form::label('lon', 'Longitude:') !!} -

{!! $airport->lon !!}

-
- - -
- {!! Form::label('created_at', 'Created At:') !!} -

{!! $airport->created_at !!}

-
- - -
- {!! Form::label('updated_at', 'Updated At:') !!} -

{!! $airport->updated_at !!}

-
- diff --git a/resources/views/admin/app.blade.php b/resources/views/admin/app.blade.php index 4f9977d7..d1da6ec3 100644 --- a/resources/views/admin/app.blade.php +++ b/resources/views/admin/app.blade.php @@ -11,6 +11,11 @@ + {{-- --}} + + {{----}} @@ -21,7 +26,7 @@ @yield('css') - + @if (!Auth::guest())
@@ -177,7 +182,7 @@
@endif - + @@ -188,6 +193,12 @@ + + + {{-- --}} + @yield('scripts') diff --git a/resources/views/admin/sidebar.blade.php b/resources/views/admin/sidebar.blade.php index cf1e84bd..d5d230fb 100644 --- a/resources/views/admin/sidebar.blade.php +++ b/resources/views/admin/sidebar.blade.php @@ -25,12 +25,12 @@ @include('admin.menu') - --}}
diff --git a/resources/views/cornford/googlmapper/circle.blade.php b/resources/views/cornford/googlmapper/circle.blade.php new file mode 100644 index 00000000..3ebd7f84 --- /dev/null +++ b/resources/views/cornford/googlmapper/circle.blade.php @@ -0,0 +1,22 @@ +var circleCoordinates_{!! $id !!} = ( + @foreach ($options['coordinates'] as $key => $coordinate) + new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}) + @endforeach +); + +var circle_{!! $id !!} = new google.maps.Circle({ + strokeColor: '{!! $options['strokeColor'] !!}', + strokeOpacity: {!! $options['strokeOpacity'] !!}, + strokeWeight: {!! $options['strokeWeight'] !!}, + fillColor: '{!! $options['fillColor'] !!}', + fillOpacity: {!! $options['fillOpacity'] !!}, + center: circleCoordinates_{!! $id !!}, + radius: {!! $options['radius'] !!}, + editable: {!! $options['editable'] ? 'true' : 'false' !!} +}); + +circle_{!! $id !!}.setMap({!! $options['map'] !!}); + +shapes.push({ + 'circle_{!! $id !!}': circle_{!! $id !!} +}); \ No newline at end of file diff --git a/resources/views/cornford/googlmapper/javascript.blade.php b/resources/views/cornford/googlmapper/javascript.blade.php new file mode 100644 index 00000000..9e73d377 --- /dev/null +++ b/resources/views/cornford/googlmapper/javascript.blade.php @@ -0,0 +1,37 @@ +@if (!$view->shared('javascript', false)) + + @if ($view->share('javascript', true)) @endif + + @if ($options['async']) + + + + @else + + + + @endif + + @if ($options['cluster']) + + + + @endif + + @if ($options['async']) + + + + @endif + +@endif \ No newline at end of file diff --git a/resources/views/cornford/googlmapper/map.blade.php b/resources/views/cornford/googlmapper/map.blade.php new file mode 100644 index 00000000..501fd892 --- /dev/null +++ b/resources/views/cornford/googlmapper/map.blade.php @@ -0,0 +1,106 @@ +
+ + \ No newline at end of file diff --git a/resources/views/cornford/googlmapper/mapper.blade.php b/resources/views/cornford/googlmapper/mapper.blade.php new file mode 100644 index 00000000..db61b974 --- /dev/null +++ b/resources/views/cornford/googlmapper/mapper.blade.php @@ -0,0 +1,19 @@ +@include('googlmapper::javascript') + +@foreach ($items as $id => $item) + + {!! $item->render($id, $view) !!} + + @if ($options['async']) + + + + @endif + +@endforeach diff --git a/resources/views/cornford/googlmapper/marker.blade.php b/resources/views/cornford/googlmapper/marker.blade.php new file mode 100644 index 00000000..c5f3163c --- /dev/null +++ b/resources/views/cornford/googlmapper/marker.blade.php @@ -0,0 +1,110 @@ +@if ($options['user'] && $options['place']) + + var service = new google.maps.places.PlacesService({!! $options['map'] !!}); + var request = { + placeId: '{!! $options['place'] !!}' + }; + + service.getDetails(request, function(placeResult, status) { + if (status != google.maps.places.PlacesServiceStatus.OK) { + alert('Unable to find the Place details.'); + return; + } + +@endif + +var markerPosition_{!! $id !!} = new google.maps.LatLng({!! $options['latitude'] !!}, {!! $options['longitude'] !!}); + +var marker_{!! $id !!} = new google.maps.Marker({ + position: markerPosition_{!! $id !!}, + @if ($options['user'] && $options['place']) + place: { + placeId: '{!! $options['place'] !!}', + location: { lat: {!! $options['latitude'] !!}, lng: {!! $options['longitude'] !!} } + }, + attribution: { + source: document.title, + webUrl: document.URL + }, + @endif + + @if (isset($options['draggable']) && $options['draggable'] == true) + draggable:true, + @endif + + title: {!! json_encode((string) $options['title']) !!}, + label: {!! json_encode((string) $options['label']) !!}, + animation: @if (empty($options['animation']) || $options['animation'] == 'NONE') '' @else google.maps.Animation.{!! $options['animation'] !!} @endif, + @if ($options['symbol']) + icon: { + path: google.maps.SymbolPath.{!! $options['symbol'] !!}, + scale: {!! $options['scale'] !!} + } + @else + icon: {!! json_encode((is_array($options['icon']) ? (array) $options['icon'] : (string) $options['icon'])) !!} + @endif +}); + +bounds.extend(marker_{!! $id !!}.position); + +marker_{!! $id !!}.setMap({!! $options['map'] !!}); +markers.push(marker_{!! $id !!}); + +@if ($options['user'] && $options['place']) + + marker_{!! $id !!}.addListener('click', function() { + infowindow.setContent('' + placeResult.name + ''); + infowindow.open({!! $options['map'] !!}, this); + }); + }); + +@else + + @if (!empty($options['content'])) + + var infowindow_{!! $id !!} = new google.maps.InfoWindow({ + content: {!! json_encode((string) $options['content']) !!} + }); + + @if (isset($options['maxWidth'])) + + infowindow_{!! $id !!}.setOptions({ maxWidth: {!! $options['maxWidth'] !!} }); + + @endif + + @if (isset($options['open']) && $options['open']) + + infowindow_{!! $id !!}.open({!! $options['map'] !!}, marker_{!! $id !!}); + + @endif + + google.maps.event.addListener(marker_{!! $id !!}, 'click', function() { + + @if (isset($options['autoClose']) && $options['autoClose']) + + for (var i = 0; i < infowindows.length; i++) { + infowindows[i].close(); + } + + @endif + + infowindow_{!! $id !!}.open({!! $options['map'] !!}, marker_{!! $id !!}); + }); + + infowindows.push(infowindow_{!! $id !!}); + + @endif + +@endif + +@foreach (['eventClick', 'eventRightClick', 'eventMouseOver', 'eventMouseDown', 'eventMouseUp', 'eventMouseOut', 'eventDrag', 'eventDragStart', 'eventDragEnd', 'eventDomReady'] as $event) + + @if (isset($options[$event])) + + google.maps.event.addListener(marker_{!! $id !!}, '{!! str_replace('event', '', strtolower($event)) !!}', function (event) { + {!! $options[$event] !!} + }); + + @endif + +@endforeach diff --git a/resources/views/cornford/googlmapper/overlay.blade.php b/resources/views/cornford/googlmapper/overlay.blade.php new file mode 100644 index 00000000..da22bbce --- /dev/null +++ b/resources/views/cornford/googlmapper/overlay.blade.php @@ -0,0 +1,12 @@ +var overlayCoordinates_{!! $id !!} = new google.maps.LatLngBounds( + @foreach ($options['coordinates'] as $coordinate) + new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}), + @endforeach +); + +overlay_{!! $id !!} = new google.maps.GroundOverlay( + '{!! $options['image'] !!}', + overlayCoordinates_{!! $id !!} +); + +overlay_{!! $id !!}.setMap({!! $options['map'] !!}); diff --git a/resources/views/cornford/googlmapper/polygon.blade.php b/resources/views/cornford/googlmapper/polygon.blade.php new file mode 100644 index 00000000..3c7030ca --- /dev/null +++ b/resources/views/cornford/googlmapper/polygon.blade.php @@ -0,0 +1,21 @@ +var polygonCoordinates_{!! $id !!} = [ + @foreach ($options['coordinates'] as $coordinate) + new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}), + @endforeach +]; + +var polygon_{!! $id !!} = new google.maps.Polygon({ + paths: polygonCoordinates_{!! $id !!}, + strokeColor: '{!! $options['strokeColor'] !!}', + strokeOpacity: {!! $options['strokeOpacity'] !!}, + strokeWeight: {!! $options['strokeWeight'] !!}, + fillColor: '{!! $options['fillColor'] !!}', + fillOpacity: {!! $options['fillOpacity'] !!}, + editable: {!! $options['editable'] ? 'true' : 'false' !!} +}); + +polygon_{!! $id !!}.setMap({!! $options['map'] !!}); + +shapes.push({ + 'polygon_{!! $id !!}': polygon_{!! $id !!} +}); \ No newline at end of file diff --git a/resources/views/cornford/googlmapper/polyline.blade.php b/resources/views/cornford/googlmapper/polyline.blade.php new file mode 100644 index 00000000..1b4b5e91 --- /dev/null +++ b/resources/views/cornford/googlmapper/polyline.blade.php @@ -0,0 +1,20 @@ +var polylineCoordinates_{!! $id !!} = [ + @foreach ($options['coordinates'] as $coordinate) + new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!}), + @endforeach +]; + +var polyline_{!! $id !!} = new google.maps.Polyline({ + path: polylineCoordinates_{!! $id !!}, + geodesic: {!! $options['strokeColor'] ? 'true' : 'false' !!}, + strokeColor: '{!! $options['strokeColor'] !!}', + strokeOpacity: {!! $options['strokeOpacity'] !!}, + strokeWeight: {!! $options['strokeWeight'] !!}, + editable: {!! $options['editable'] ? 'true' : 'false' !!} +}); + +polyline_{!! $id !!}.setMap({!! $options['map'] !!}); + +shapes.push({ + 'polyline_{!! $id !!}': polyline_{!! $id !!} +}); \ No newline at end of file diff --git a/resources/views/cornford/googlmapper/rectangle.blade.php b/resources/views/cornford/googlmapper/rectangle.blade.php new file mode 100644 index 00000000..1f354e3b --- /dev/null +++ b/resources/views/cornford/googlmapper/rectangle.blade.php @@ -0,0 +1,21 @@ +var rectangleCoordinates_{!! $id !!} = new google.maps.LatLngBounds( + @foreach ($options['coordinates'] as $key => $coordinate) + new google.maps.LatLng({!! $coordinate['latitude'] !!}, {!! $coordinate['longitude'] !!})@if (count($options['coordinates']) - 1 > $key), @endif + @endforeach +); + +var rectangle_{!! $id !!} = new google.maps.Rectangle({ + strokeColor: '{!! $options['strokeColor'] !!}', + strokeOpacity: {!! $options['strokeOpacity'] !!}, + strokeWeight: {!! $options['strokeWeight'] !!}, + fillColor: '{!! $options['fillColor'] !!}', + fillOpacity: {!! $options['fillOpacity'] !!}, + bounds: rectangleCoordinates_{!! $id !!}, + editable: {!! $options['editable'] ? 'true' : 'false' !!} +}); + +rectangle_{!! $id !!}.setMap({!! $options['map'] !!}); + +shapes.push({ + 'rectangle_{!! $id !!}': rectangle_{!! $id !!} +}); \ No newline at end of file diff --git a/resources/views/cornford/googlmapper/streetview.blade.php b/resources/views/cornford/googlmapper/streetview.blade.php new file mode 100644 index 00000000..9f223dd1 --- /dev/null +++ b/resources/views/cornford/googlmapper/streetview.blade.php @@ -0,0 +1,39 @@ +
+ + \ No newline at end of file