Merge branch 'release/0.1.2'
This commit is contained in:
commit
c3da2ec5b1
61 changed files with 6729 additions and 490 deletions
9
.babelrc
Normal file
9
.babelrc
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"presets": [
|
||||
["latest", {
|
||||
"es2015": {
|
||||
"modules": false
|
||||
}
|
||||
}]
|
||||
]
|
||||
}
|
18
Makefile
18
Makefile
|
@ -1,13 +1,14 @@
|
|||
# A Makefile to run various tasks
|
||||
|
||||
.PHONY: sass js compress
|
||||
.PHONY: sass frontend js compress lint-sass lint-js
|
||||
jsfiles := $(wildcard resources/assets/js/*.js)
|
||||
sassfiles := $(wildcard resources/assets/sass/*.scss)
|
||||
yarnfiles:= node_modules/whatwg-fetch/fetch.js \
|
||||
node_modules/alertify.js/dist/js/alertify.js \
|
||||
node_modules/store2/dist/store2.min.js \
|
||||
node_modules/autolinker/dist/Autolinker.min.js \
|
||||
node_modules/marked/marked.min.js
|
||||
node_modules/marked/marked.min.js \
|
||||
node_modules/mapbox-gl/dist/mapbox-gl.css
|
||||
assets := public/assets/css/app.css \
|
||||
public/assets/prism/prism.css public/assets/prism/prism.js \
|
||||
$(wildcard public/assets/js/*.js) \
|
||||
|
@ -16,8 +17,9 @@ $(wildcard public/assets/frontend/*.js)
|
|||
|
||||
sass: public/assets/css/app.css
|
||||
|
||||
public/assets/css/app.css: $(sassfiles)
|
||||
public/assets/css/app.css: lint-sass
|
||||
sassc --style compressed --sourcemap resources/assets/sass/app.scss public/assets/css/app.css
|
||||
postcss --use autoprefixer --autoprefixer.browsers "> 5%" --output public/assets/css/app.css public/assets/css/app.css
|
||||
|
||||
frontend: $(yarnfiles)
|
||||
for f in $^; do \
|
||||
|
@ -34,3 +36,13 @@ compress: $(assets)
|
|||
zopfli $$f; \
|
||||
bro --force --quality 11 --input $$f --output $$f.br; \
|
||||
done;
|
||||
|
||||
lint-sass: $(sassfiles)
|
||||
for f in $^; do \
|
||||
stylelint --syntax=scss $$f; \
|
||||
done;
|
||||
|
||||
lint-js: $(jsfiles)
|
||||
for f in $^; do \
|
||||
eslint $$f; \
|
||||
done;
|
||||
|
|
|
@ -103,7 +103,6 @@ class MicropubController extends Controller
|
|||
* appropriately. Further if the request has the query parameter
|
||||
* synidicate-to we respond with the known syndication endpoints.
|
||||
*
|
||||
* @todo Move the syndication endpoints into a .env variable
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
|
|
|
@ -51,6 +51,7 @@ class NotesController extends Controller
|
|||
$note->longitude = $lnglat[0];
|
||||
$note->address = $note->place->name;
|
||||
$note->placeLink = '/places/' . $note->place->slug;
|
||||
$note->geoJson = $this->getGeoJson($note->longitude, $note->latitude, $note->place->name, $note->place->icon);
|
||||
}
|
||||
$photoURLs = [];
|
||||
$photos = $note->getMedia();
|
||||
|
@ -109,16 +110,22 @@ class NotesController extends Controller
|
|||
case 'in-reply-to':
|
||||
$content['source'] = $webmention->source;
|
||||
if (isset($microformats['items'][0]['properties']['published'][0])) {
|
||||
$content['date'] = $carbon->parse($microformats['items'][0]['properties']['published'][0])->toDayDateTimeString();
|
||||
$content['date'] = $carbon->parse(
|
||||
$microformats['items'][0]['properties']['published'][0]
|
||||
)->toDayDateTimeString();
|
||||
} else {
|
||||
$content['date'] = $webmention->updated_at->toDayDateTimeString();
|
||||
}
|
||||
$content['reply'] = $this->filterHTML($microformats['items'][0]['properties']['content'][0]['html']);
|
||||
$content['reply'] = $this->filterHTML(
|
||||
$microformats['items'][0]['properties']['content'][0]['html']
|
||||
);
|
||||
$replies[] = $content;
|
||||
break;
|
||||
|
||||
case 'repost-of':
|
||||
$content['date'] = $carbon->parse($microformats['items'][0]['properties']['published'][0])->toDayDateTimeString();
|
||||
$content['date'] = $carbon->parse(
|
||||
$microformats['items'][0]['properties']['published'][0]
|
||||
)->toDayDateTimeString();
|
||||
$content['source'] = $webmention->source;
|
||||
$reposts[] = $content;
|
||||
break;
|
||||
|
@ -144,6 +151,7 @@ class NotesController extends Controller
|
|||
$note->longitude = $lnglat[0];
|
||||
$note->address = $note->place->name;
|
||||
$note->placeLink = '/places/' . $note->place->slug;
|
||||
$note->geoJson = $this->getGeoJson($note->longitude, $note->latitude, $note->place->name, $note->place->icon);
|
||||
}
|
||||
|
||||
$photoURLs = [];
|
||||
|
@ -311,7 +319,11 @@ class NotesController extends Controller
|
|||
]);
|
||||
$json = json_decode($response->getBody());
|
||||
if (isset($json->address->town)) {
|
||||
$address = '<span class="p-locality">' . $json->address->town . '</span>, <span class="p-country-name">' . $json->address->country . '</span>';
|
||||
$address = '<span class="p-locality">'
|
||||
. $json->address->town
|
||||
. '</span>, <span class="p-country-name">'
|
||||
. $json->address->country
|
||||
. '</span>';
|
||||
Cache::forever($latlng, $address);
|
||||
|
||||
return $address;
|
||||
|
@ -323,7 +335,11 @@ class NotesController extends Controller
|
|||
return $address;
|
||||
}
|
||||
if (isset($json->address->county)) {
|
||||
$address = '<span class="p-region">' . $json->address->county . '</span>, <span class="p-country-name">' . $json->address->country . '</span>';
|
||||
$address = '<span class="p-region">'
|
||||
. $json->address->county
|
||||
. '</span>, <span class="p-country-name">'
|
||||
. $json->address->country
|
||||
. '</span>';
|
||||
Cache::forever($latlng, $address);
|
||||
|
||||
return $address;
|
||||
|
@ -334,4 +350,21 @@ class NotesController extends Controller
|
|||
return $address;
|
||||
});
|
||||
}
|
||||
|
||||
private function getGeoJson($longitude, $latitude, $title, $icon)
|
||||
{
|
||||
$icon = $icon ?? 'marker';
|
||||
|
||||
return '{
|
||||
"type": "Feature",
|
||||
"geometry": {
|
||||
"type": "Point",
|
||||
"coordinates": [' . $longitude . ', ' . $latitude . ']
|
||||
},
|
||||
"properties": {
|
||||
"title": "' . $title . '",
|
||||
"icon": "' . $icon . '"
|
||||
}
|
||||
}';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -235,7 +235,11 @@ class Note extends Model implements HasMedia
|
|||
foreach ($matches[0] as $name) {
|
||||
$name = str_replace('#', '', $name);
|
||||
$replacements[$name] =
|
||||
'<a rel="tag" class="p-category" href="/notes/tagged/' . Tag::normalizeTag($name) . '">#' . $name . '</a>';
|
||||
'<a rel="tag" class="p-category" href="/notes/tagged/'
|
||||
. Tag::normalizeTag($name)
|
||||
. '">#'
|
||||
. $name
|
||||
. '</a>';
|
||||
}
|
||||
|
||||
// Replace #tags with valid microformat-enabled link
|
||||
|
|
|
@ -72,28 +72,35 @@ class NoteService
|
|||
dispatch(new SendWebMentions($note));
|
||||
|
||||
//syndication targets
|
||||
//string sent from either local admin CP or micropub
|
||||
if ($request->input('twitter') == true || $request->input('syndicate-to') == 'https://twitter.com/jonnybarnes') {
|
||||
//from admin CP
|
||||
if ($request->input('twitter')) {
|
||||
dispatch(new SyndicateToTwitter($note));
|
||||
}
|
||||
if ($request->input('facebook') == true || $request->input('syndicate-to') == 'https://facebook.com/jonnybarnes') {
|
||||
if ($request->input('facebook')) {
|
||||
dispatch(new SyndicateToFacebook($note));
|
||||
}
|
||||
|
||||
//micropub request, syndication sent as array
|
||||
if (
|
||||
(is_array($request->input('syndicate-to')))
|
||||
&&
|
||||
(in_array('https://twitter.com/jonnybarnes', $request->input('syndicate-to')))
|
||||
) {
|
||||
dispatch(new SyndicateToTwitter($note));
|
||||
//from a micropub request
|
||||
$targets = array_pluck(config('syndication.targets'), 'uid', 'service.name');
|
||||
if (is_string($request->input('syndicate-to'))) {
|
||||
$service = array_search($request->input('syndicate-to'));
|
||||
if ($service == 'Twitter') {
|
||||
dispatch(new SyndicateToTwitter($note));
|
||||
}
|
||||
if ($service == 'Facebook') {
|
||||
dispatch(new SyndicateToFacebook($note));
|
||||
}
|
||||
}
|
||||
if (
|
||||
(is_array($request->input('syndicate-to')))
|
||||
&&
|
||||
(in_array('https://facebook.com/jonnybarnes', $request->input('syndicate-to')))
|
||||
) {
|
||||
dispatch(new SyndicateToFacebook($note));
|
||||
if (is_array($request->input('syndicate-to'))) {
|
||||
foreach ($targets as $service => $target) {
|
||||
if (in_array($target, $request->input('syndicate-to'))) {
|
||||
if ($service == 'Twitter') {
|
||||
dispatch(new SyndicateToTwitter($note));
|
||||
}
|
||||
if ($service == 'Facebook') {
|
||||
dispatch(new SyndicateToFacebook($note));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $note;
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
# Changelog
|
||||
|
||||
## Version 0.1.2 (2017-01-26)
|
||||
- Improve syndication flow when working out which targets to use
|
||||
- Use webpack/babel/es6 (this was a big one, code wise, functionality now basically the same though)
|
||||
|
||||
## Version 0.1.1 (2016-12-10)
|
||||
- Fix: use correct link for footer iwc icon
|
||||
|
||||
|
|
|
@ -32,7 +32,8 @@
|
|||
"phpunit/phpunit": "~5.0",
|
||||
"symfony/css-selector": "3.1.*",
|
||||
"symfony/dom-crawler": "3.1.*",
|
||||
"barryvdh/laravel-debugbar": "~2.0"
|
||||
"barryvdh/laravel-debugbar": "~2.0",
|
||||
"jakub-onderka/php-parallel-lint": "^0.9.2"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
|
|
587
composer.lock
generated
587
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -6,6 +6,7 @@
|
|||
*/
|
||||
|
||||
return [
|
||||
// if you don’t have any targets, then set this to 'targets' => [];
|
||||
'targets' => [
|
||||
[
|
||||
'uid' => 'https://twitter.com/jonnybarnes',
|
||||
|
|
32
database/migrations/2016_12_28_160024_add_icon_to_places.php
Normal file
32
database/migrations/2016_12_28_160024_add_icon_to_places.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AddIconToPlaces extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('places', function (Blueprint $table) {
|
||||
$table->string('icon')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('places', function (Blueprint $table) {
|
||||
$table->dropColumn('icon');
|
||||
});
|
||||
}
|
||||
}
|
12
package.json
12
package.json
|
@ -6,15 +6,23 @@
|
|||
"dependencies": {
|
||||
"alertify.js": "^1.0.12",
|
||||
"autolinker": "^1.2.0",
|
||||
"mapbox-gl": "^0.29.0",
|
||||
"marked": "^0.3.6",
|
||||
"normalize.css": "^5.0.0",
|
||||
"store2": "^2.3.2",
|
||||
"webStorage": "^1.2.2",
|
||||
"whatwg-fetch": "^1.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-cli": "^6.18.0",
|
||||
"babel-core": "^6.21.0",
|
||||
"babel-loader": "^6.2.10",
|
||||
"babel-preset-es2015": "^6.18.0",
|
||||
"babel-preset-latest": "^6.16.0",
|
||||
"babel-runtime": "^6.20.0",
|
||||
"lint-staged": "^3.2.1",
|
||||
"pre-commit": "^1.1.3",
|
||||
"stylelint-config-standard": "^14.0.0"
|
||||
"stylelint-config-standard": "^14.0.0",
|
||||
"webpack": "^2.2.0"
|
||||
},
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
|
3
public/assets/css/app.css
vendored
3
public/assets/css/app.css
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
|
@ -1,15 +1 @@
|
|||
{
|
||||
"version": 3,
|
||||
"file": "app.css",
|
||||
"sources": [
|
||||
"../../../resources/assets/sass/app.scss",
|
||||
"../../../resources/assets/sass/layout.scss",
|
||||
"../../../resources/assets/sass/styles.scss",
|
||||
"../../../resources/assets/sass/pagination.scss",
|
||||
"../../../resources/assets/sass/note-form.scss",
|
||||
"../../../resources/assets/sass/mapbox.scss",
|
||||
"../../../resources/assets/sass/contacts.scss"
|
||||
],
|
||||
"mappings": "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",
|
||||
"names": []
|
||||
}
|
||||
{"version":3,"sources":["../../../resources/assets/sass/app.scss","../../../resources/assets/sass/layout.scss","../../../resources/assets/sass/styles.scss","../../../resources/assets/sass/pagination.scss","../../../resources/assets/sass/note-form.scss","../../../resources/assets/sass/mapbox.scss","../../../resources/assets/sass/contacts.scss"],"names":[],"mappings":"AAIA,KACI,sBACA,cAAgB,CACnB,qBAKG,kBAAoB,CACvB,KCVG,eACA,cACA,iBACA,kBACA,oBAAsB,CACzB,WAGG,iBAAmB,CACtB,SAGG,gBAAkB,CACrB,MAGG,oBACA,AADA,aACA,4BAAuB,AAAvB,6BAAuB,AAAvB,qBAAuB,CAC1B,eAGG,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,mBACA,yBACA,AADA,8BACA,gBAAkB,CACrB,cAGG,oBACA,AADA,aACA,yBAAoB,AAApB,kBAAoB,CACvB,kBAGG,gBAAkB,CACrB,iBAGG,qBACA,WAAa,CAChB,aAGG,eACA,yBAA2B,CAC9B,OAGG,eAAiB,CACpB,cAGG,eAAiB,CACpB,WAGG,eACA,cACA,iBAAmB,CACtB,sBAGG,cAAgB,CACnB,sBAGG,iBACA,cAAgB,CACnB,KClEG,6JAWe,CAClB,EAGG,qBACA,wBACA,UAAY,CACf,gBAGG,kBAAoB,CACvB,MAGG,WACA,UAAY,CACf,OAGG,iBACA,iBAAmB,CACtB,WAGG,kBAAoB,CACvB,UAGG,YACA,WAAa,CAChB,YC1CG,WACA,YACA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,mBACA,yBACA,AADA,8BACA,yBAAoB,AAApB,kBAAoB,CACvB,eAGG,oBAAsB,CACzB,SCVG,oBACA,AADA,aACA,4BAAuB,AAAvB,6BAAuB,AAAvB,qBAAuB,CAC1B,0BAGG,aACI,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,mBACA,cAAgB,CACnB,CAGL,0BACI,sBACI,UAAY,CACf,CAGL,eACI,UACA,oBACA,gBAAkB,CACrB,oDAIG,mBAAQ,AAAR,MAAQ,CACX,kBAGG,qBAAuB,CAC1B,QAGG,mBAAqB,CACxB,KCnCG,eACA,YAAc,CACjB,QAGG,y4HACA,wBACA,WACA,WAAa,CAChB,UAGG,kBACA,MACA,OACA,iBACA,cAAgB,CACnB,gBAGG,gBACA,gBAAkB,CACrB,SCtBG,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,mBACA,eACA,6BAA+B,CAClC,aAGG,oBACA,YACA,YAAc,CACjB","file":"app.css"}
|
299
public/assets/frontend/mapbox-gl.css
vendored
Normal file
299
public/assets/frontend/mapbox-gl.css
vendored
Normal file
|
@ -0,0 +1,299 @@
|
|||
.mapboxgl-map {
|
||||
font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
||||
}
|
||||
|
||||
.mapboxgl-canvas-container.mapboxgl-interactive,
|
||||
.mapboxgl-ctrl-nav-compass {
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.mapboxgl-canvas-container.mapboxgl-interactive:active,
|
||||
.mapboxgl-ctrl-nav-compass:active {
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.mapboxgl-ctrl-top-left,
|
||||
.mapboxgl-ctrl-top-right,
|
||||
.mapboxgl-ctrl-bottom-left,
|
||||
.mapboxgl-ctrl-bottom-right { position:absolute; pointer-events:none; z-index:2; }
|
||||
.mapboxgl-ctrl-top-left { top:0; left:0; }
|
||||
.mapboxgl-ctrl-top-right { top:0; right:0; }
|
||||
.mapboxgl-ctrl-bottom-left { bottom:0; left:0; }
|
||||
.mapboxgl-ctrl-bottom-right { right:0; bottom:0; }
|
||||
|
||||
.mapboxgl-ctrl { clear:both; pointer-events:auto }
|
||||
.mapboxgl-ctrl-top-left .mapboxgl-ctrl { margin:10px 0 0 10px; float:left; }
|
||||
.mapboxgl-ctrl-top-right .mapboxgl-ctrl{ margin:10px 10px 0 0; float:right; }
|
||||
.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl { margin:0 0 10px 10px; float:left; }
|
||||
.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl { margin:0 10px 10px 0; float:right; }
|
||||
|
||||
.mapboxgl-ctrl-group {
|
||||
border-radius: 4px;
|
||||
-moz-box-shadow: 0px 0px 2px rgba(0,0,0,0.1);
|
||||
-webkit-box-shadow: 0px 0px 2px rgba(0,0,0,0.1);
|
||||
box-shadow: 0px 0px 0px 2px rgba(0,0,0,0.1);
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
}
|
||||
.mapboxgl-ctrl-group > button {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
display: block;
|
||||
padding: 0;
|
||||
outline: none;
|
||||
border: none;
|
||||
border-bottom: 1px solid #ddd;
|
||||
box-sizing: border-box;
|
||||
background-color: rgba(0,0,0,0);
|
||||
cursor: pointer;
|
||||
}
|
||||
/* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */
|
||||
.mapboxgl-ctrl > button::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.mapboxgl-ctrl > button:last-child {
|
||||
border-bottom: 0;
|
||||
}
|
||||
.mapboxgl-ctrl > button:hover {
|
||||
background-color: rgba(0,0,0,0.05);
|
||||
}
|
||||
.mapboxgl-ctrl-icon,
|
||||
.mapboxgl-ctrl-icon > span.arrow {
|
||||
speak: none;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
.mapboxgl-ctrl-icon {
|
||||
padding: 5px;
|
||||
}
|
||||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out {
|
||||
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27m%207%2C9%20c%20-0.554%2C0%20-1%2C0.446%20-1%2C1%200%2C0.554%200.446%2C1%201%2C1%20l%206%2C0%20c%200.554%2C0%201%2C-0.446%201%2C-1%200%2C-0.554%20-0.446%2C-1%20-1%2C-1%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A");
|
||||
}
|
||||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in {
|
||||
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27M%2010%206%20C%209.446%206%209%206.4459904%209%207%20L%209%209%20L%207%209%20C%206.446%209%206%209.446%206%2010%20C%206%2010.554%206.446%2011%207%2011%20L%209%2011%20L%209%2013%20C%209%2013.55401%209.446%2014%2010%2014%20C%2010.554%2014%2011%2013.55401%2011%2013%20L%2011%2011%20L%2013%2011%20C%2013.554%2011%2014%2010.554%2014%2010%20C%2014%209.446%2013.554%209%2013%209%20L%2011%209%20L%2011%207%20C%2011%206.4459904%2010.554%206%2010%206%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A");
|
||||
}
|
||||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%23333%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E");
|
||||
}
|
||||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.watching {
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%2300f%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E");
|
||||
}
|
||||
|
||||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > span.arrow {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin: 5px;
|
||||
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%0A%09%3Cpolygon%20fill%3D%27%23333333%27%20points%3D%276%2C9%2010%2C1%2014%2C9%27%2F%3E%0A%09%3Cpolygon%20fill%3D%27%23CCCCCC%27%20points%3D%276%2C11%2010%2C19%2014%2C11%20%27%2F%3E%0A%3C%2Fsvg%3E");
|
||||
background-repeat: no-repeat;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.mapboxgl-ctrl.mapboxgl-ctrl-attrib {
|
||||
padding: 0 5px;
|
||||
background-color: rgba(255, 255, 255, .5);
|
||||
margin: 0;
|
||||
}
|
||||
.mapboxgl-ctrl-attrib.compact {
|
||||
padding-top: 2px;
|
||||
padding-bottom: 2px;
|
||||
margin: 0 10px 10px 10px;
|
||||
position: relative;
|
||||
padding-right: 24px;
|
||||
background-color: #fff;
|
||||
border-radius: 3px 12px 12px 3px;
|
||||
visibility: hidden;
|
||||
}
|
||||
.mapboxgl-ctrl-attrib.compact:hover {
|
||||
visibility: visible;
|
||||
}
|
||||
.mapboxgl-ctrl-attrib.compact:after {
|
||||
content: '';
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%09%3Cpath%20fill%3D%27%23333333%27%20fill-rule%3D%27evenodd%27%20d%3D%27M4%2C10a6%2C6%200%201%2C0%2012%2C0a6%2C6%200%201%2C0%20-12%2C0%20M9%2C7a1%2C1%200%201%2C0%202%2C0a1%2C1%200%201%2C0%20-2%2C0%20M9%2C10a1%2C1%200%201%2C1%202%2C0l0%2C3a1%2C1%200%201%2C1%20-2%2C0%27%20%2F%3E%0D%0A%3C%2Fsvg%3E");
|
||||
background-color: rgba(255, 255, 255, .5);
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
box-sizing: border-box;
|
||||
visibility: visible;
|
||||
border-radius: 12px;
|
||||
}
|
||||
.mapboxgl-ctrl-attrib a {
|
||||
color: rgba(0,0,0,0.75);
|
||||
text-decoration: none;
|
||||
}
|
||||
.mapboxgl-ctrl-attrib a:hover {
|
||||
color: inherit;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.mapboxgl-ctrl-attrib .mapbox-improve-map {
|
||||
font-weight: bold;
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
||||
.mapboxgl-ctrl-scale {
|
||||
background-color: rgba(255,255,255,0.75);
|
||||
font-size: 10px;
|
||||
border-width: medium 2px 2px;
|
||||
border-style: none solid solid;
|
||||
border-color: #333;
|
||||
padding: 0 5px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.mapboxgl-popup {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
will-change: transform;
|
||||
pointer-events: none;
|
||||
}
|
||||
.mapboxgl-popup-anchor-top,
|
||||
.mapboxgl-popup-anchor-top-left,
|
||||
.mapboxgl-popup-anchor-top-right {
|
||||
-webkit-flex-direction: column;
|
||||
flex-direction: column;
|
||||
}
|
||||
.mapboxgl-popup-anchor-bottom,
|
||||
.mapboxgl-popup-anchor-bottom-left,
|
||||
.mapboxgl-popup-anchor-bottom-right {
|
||||
-webkit-flex-direction: column-reverse;
|
||||
flex-direction: column-reverse;
|
||||
}
|
||||
.mapboxgl-popup-anchor-left {
|
||||
-webkit-flex-direction: row;
|
||||
flex-direction: row;
|
||||
}
|
||||
.mapboxgl-popup-anchor-right {
|
||||
-webkit-flex-direction: row-reverse;
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
.mapboxgl-popup-tip {
|
||||
width: 0;
|
||||
height: 0;
|
||||
border: 10px solid transparent;
|
||||
z-index: 1;
|
||||
}
|
||||
.mapboxgl-popup-anchor-top .mapboxgl-popup-tip {
|
||||
-webkit-align-self: center;
|
||||
align-self: center;
|
||||
border-top: none;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip {
|
||||
-webkit-align-self: flex-start;
|
||||
align-self: flex-start;
|
||||
border-top: none;
|
||||
border-left: none;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip {
|
||||
-webkit-align-self: flex-end;
|
||||
align-self: flex-end;
|
||||
border-top: none;
|
||||
border-right: none;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip {
|
||||
-webkit-align-self: center;
|
||||
align-self: center;
|
||||
border-bottom: none;
|
||||
border-top-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip {
|
||||
-webkit-align-self: flex-start;
|
||||
align-self: flex-start;
|
||||
border-bottom: none;
|
||||
border-left: none;
|
||||
border-top-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip {
|
||||
-webkit-align-self: flex-end;
|
||||
align-self: flex-end;
|
||||
border-bottom: none;
|
||||
border-right: none;
|
||||
border-top-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-left .mapboxgl-popup-tip {
|
||||
-webkit-align-self: center;
|
||||
align-self: center;
|
||||
border-left: none;
|
||||
border-right-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-anchor-right .mapboxgl-popup-tip {
|
||||
-webkit-align-self: center;
|
||||
align-self: center;
|
||||
border-right: none;
|
||||
border-left-color: #fff;
|
||||
}
|
||||
.mapboxgl-popup-close-button {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
border: none;
|
||||
border-radius: 0 3px 0 0;
|
||||
cursor: pointer;
|
||||
background-color: rgba(0,0,0,0);
|
||||
}
|
||||
.mapboxgl-popup-close-button:hover {
|
||||
background-color: rgba(0,0,0,0.05);
|
||||
}
|
||||
.mapboxgl-popup-content {
|
||||
position: relative;
|
||||
background: #fff;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.10);
|
||||
padding: 10px 10px 15px;
|
||||
pointer-events: auto;
|
||||
}
|
||||
.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content {
|
||||
border-top-left-radius: 0;
|
||||
}
|
||||
.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content {
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content {
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content {
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.mapboxgl-marker {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.mapboxgl-crosshair,
|
||||
.mapboxgl-crosshair .mapboxgl-interactive,
|
||||
.mapboxgl-crosshair .mapboxgl-interactive:active {
|
||||
cursor: crosshair;
|
||||
}
|
||||
.mapboxgl-boxzoom {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
background: #fff;
|
||||
border: 2px dotted #202020;
|
||||
opacity: 0.5;
|
||||
}
|
||||
@media print {
|
||||
.mapbox-improve-map {
|
||||
display:none;
|
||||
}
|
||||
}
|
2846
public/assets/js/commons.js
Normal file
2846
public/assets/js/commons.js
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,2 +0,0 @@
|
|||
function getKeys(){for(var e=[],t=document.querySelectorAll("input[type=text], textarea"),r=0;r<t.length;r++){var o=getFormElement(t[r]);if(o!==!1){var n=o.id+"~"+t[r].id;e.push(n)}}return e}function getFormElement(e){if("body"!==e.nodeName.toLowerCase()){var t=e.parentNode;return"form"===t.nodeName.toLowerCase()?t:getFormElement(t)}return!1}var feature={addEventListener:!!window.addEventListener,querySelectorAll:!!document.querySelectorAll};if(feature.addEventListener&&feature.querySelectorAll)for(var keys=getKeys(),i=0;i<keys.length;i++)if(store.get(keys[i])){var formId=keys[i].split("~")[1];document.getElementById(formId).value=store.get(keys[i])}for(var timerId=window.setInterval(function(){for(var e=!1,t=document.querySelectorAll("input[type=text], textarea"),r=0;r<t.length;r++){var o=getFormElement(t[r]).id+"~"+t[r].id;store.get(o)!==t[r].value&&""!==t[r].value&&(store.set(o,t[r].value),e=!0)}e===!0&&(alertify.logPosition("top right"),alertify.success("Auto saved text"))},5e3),forms=document.querySelectorAll("form"),f=0;f<forms.length;f++){var form=forms[f];form.addEventListener("submit",function(){window.clearInterval(timerId);for(var e=form.id,t=store.keys(),r=0;r<t.length;r++)t[r].indexOf(e)>-1&&store.remove(t[r])})}
|
||||
//# sourceMappingURL=public/assets/js/form-save.js.map
|
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
{"version":3,"sources":["resources/assets/js/form-save.js"],"names":["getKeys","keys","formFields","document","querySelectorAll","f","length","parent","getFormElement","key","id","push","elem","nodeName","toLowerCase","parentNode","feature","addEventListener","window","i","store","get","formId","split","getElementById","value","timerId","setInterval","saved","inputs","set","alertify","logPosition","success","forms","form","clearInterval","storedKeys","indexOf","remove"],"mappings":"AA6CA,QAASA,WAGL,IAAK,GAFDC,MACAC,EAAaC,SAASC,iBAAiB,8BAClCC,EAAI,EAAGA,EAAIH,EAAWI,OAAQD,IAAK,CACxC,GAAIE,GAASC,eAAeN,EAAWG,GACvC,IAAIE,KAAW,EAAO,CAClB,GAAIE,GAAMF,EAAOG,GAAK,IAAMR,EAAWG,GAAGK,EAC1CT,GAAKU,KAAKF,IAGlB,MAAOR,GAEX,QAASO,gBAAeI,GACpB,GAAoC,SAAhCA,EAAKC,SAASC,cAA0B,CACxC,GAAIP,GAASK,EAAKG,UAClB,OAAsC,SAAlCR,EAAOM,SAASC,cACTP,EAEAC,eAAeD,GAG1B,OAAO,EAjEf,GAAIS,UACAC,mBAAqBC,OAAOD,iBAC5Bb,mBAAqBD,SAASC,iBAGlC,IAAIY,QAAQC,kBAAoBD,QAAQZ,iBAEpC,IAAK,GADDH,MAAOD,UACFmB,EAAI,EAAGA,EAAIlB,KAAKK,OAAQa,IAC7B,GAAIC,MAAMC,IAAIpB,KAAKkB,IAAK,CACpB,GAAIG,QAASrB,KAAKkB,GAAGI,MAAM,KAAK,EAChCpB,UAASqB,eAAeF,QAAQG,MAAQL,MAAMC,IAAIpB,KAAKkB,IAqBnE,IAAK,GAhBDO,SAAUR,OAAOS,YAAY,WAG7B,IAAK,GAFDC,IAAQ,EACRC,EAAS1B,SAASC,iBAAiB,8BAC9Be,EAAI,EAAGA,EAAIU,EAAOvB,OAAQa,IAAK,CACpC,GAAIV,GAAMD,eAAeqB,EAAOV,IAAIT,GAAK,IAAMmB,EAAOV,GAAGT,EACrDU,OAAMC,IAAIZ,KAASoB,EAAOV,GAAGM,OAA6B,KAApBI,EAAOV,GAAGM,QAChDL,MAAMU,IAAIrB,EAAKoB,EAAOV,GAAGM,OACzBG,GAAQ,GAGZA,KAAU,IACVG,SAASC,YAAY,aACrBD,SAASE,QAAQ,qBAEtB,KACCC,MAAQ/B,SAASC,iBAAiB,QAC7BC,EAAI,EAAGA,EAAI6B,MAAM5B,OAAQD,IAAK,CACnC,GAAI8B,MAAOD,MAAM7B,EACjB8B,MAAKlB,iBAAiB,SAAU,WAC5BC,OAAOkB,cAAcV,QAGrB,KAAK,GAFDJ,GAASa,KAAKzB,GACd2B,EAAajB,MAAMnB,OACdkB,EAAI,EAAGA,EAAIkB,EAAW/B,OAAQa,IAC/BkB,EAAWlB,GAAGmB,QAAQhB,IAAU,GAChCF,MAAMmB,OAAOF,EAAWlB","file":"public/assets/js/form-save.js"}
|
|
@ -1,2 +0,0 @@
|
|||
for(var autolinker=new Autolinker,ytidregex=/watch\?v=([A-Za-z0-9\-_]+)/,spotifyregex=/https\:\/\/play\.spotify\.com\/(.*)\b/,notes=document.querySelectorAll(".e-content"),i=0;i<notes.length;i++){var ytid=notes[i].textContent.match(ytidregex);if(null!==ytid){var yid=ytid[1],yiframe=document.createElement("iframe");yiframe.classList.add("youtube"),yiframe.setAttribute("src","//www.youtube.com/embed/"+yid),yiframe.setAttribute("frameborder",0),yiframe.setAttribute("allowfullscreen","true"),notes[i].appendChild(yiframe)}var spotifyid=notes[i].textContent.match(spotifyregex);if(null!==spotifyid){var sid=spotifyid[1].replace("/",":"),siframe=document.createElement("iframe");siframe.classList.add("spotify"),siframe.setAttribute("src","https://embed.spotify.com/?uri=spotify:"+sid),siframe.setAttribute("frameborder",0),siframe.setAttribute("allowtransparency","true"),notes[i].appendChild(siframe)}var orig=notes[i].innerHTML,linked=autolinker.link(orig);notes[i].innerHTML=linked}
|
||||
//# sourceMappingURL=public/assets/js/links.js.map
|
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
{"version":3,"sources":["resources/assets/js/links.js"],"names":["autolinker","Autolinker","ytidregex","spotifyregex","notes","document","querySelectorAll","i","length","ytid","textContent","match","yid","yiframe","createElement","classList","add","setAttribute","appendChild","spotifyid","sid","replace","siframe","orig","innerHTML","linked","link"],"mappings":"AAWA,IAAK,GATDA,YAAa,GAAIC,YAGjBC,UAAY,6BAEZC,aAAe,wCAGfC,MAAQC,SAASC,iBAAiB,cAC7BC,EAAI,EAAGA,EAAIH,MAAMI,OAAQD,IAAK,CAEnC,GAAIE,MAAOL,MAAMG,GAAGG,YAAYC,MAAMT,UACtC,IAAa,OAATO,KAAe,CACf,GAAIG,KAAMH,KAAK,GACXI,QAAUR,SAASS,cAAc,SACrCD,SAAQE,UAAUC,IAAI,WACtBH,QAAQI,aAAa,MAAO,2BAA6BL,KACzDC,QAAQI,aAAa,cAAe,GACpCJ,QAAQI,aAAa,kBAAmB,QACxCb,MAAMG,GAAGW,YAAYL,SAGzB,GAAIM,WAAYf,MAAMG,GAAGG,YAAYC,MAAMR,aAC3C,IAAkB,OAAdgB,UAAoB,CACpB,GAAIC,KAAMD,UAAU,GAAGE,QAAQ,IAAK,KAChCC,QAAUjB,SAASS,cAAc,SACrCQ,SAAQP,UAAUC,IAAI,WACtBM,QAAQL,aAAa,MAAO,0CAA4CG,KACxEE,QAAQL,aAAa,cAAe,GACpCK,QAAQL,aAAa,oBAAqB,QAC1Cb,MAAMG,GAAGW,YAAYI,SAGzB,GAAIC,MAAOnB,MAAMG,GAAGiB,UAChBC,OAASzB,WAAW0B,KAAKH,KAC7BnB,OAAMG,GAAGiB,UAAYC","file":"public/assets/js/links.js"}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
{"version":3,"sources":["resources/assets/js/maps.js"],"names":["mapDivs","document","querySelectorAll","mapboxgl","accessToken","i","length","mapDiv","latitude","dataset","longitude","el","createElement","classList","add","mapMenu","streetsInput","setAttribute","addEventListener","map","setStyle","streetsLabel","appendChild","createTextNode","satelliteInput","satelliteLabel","Map","container","style","center","zoom","scrollZoom","addControl","NavigationControl","Marker","offset","setLngLat","addTo"],"mappings":"AAEA,GAAIA,SAAUC,SAASC,iBAAiB,OACxCC,UAASC,YAAc,gGACvB,KAAK,GAAIC,GAAI,EAAGA,EAAIL,QAAQM,OAAQD,IAAK,CACrC,GAAIE,QAASP,QAAQK,GACjBG,SAAWD,OAAOE,QAAQD,SAC1BE,UAAaH,OAAOE,QAAQC,UAC5BC,GAAKV,SAASW,cAAc,MAChCD,IAAGE,UAAUC,IAAI,SACjB,IAAIC,SAAUd,SAASW,cAAc,MACrCG,SAAQF,UAAUC,IAAI,WACtB,IAAIE,cAAef,SAASW,cAAc,QAC1CI,cAAaC,aAAa,KAAM,WAChCD,aAAaC,aAAa,OAAQ,SAClCD,aAAaC,aAAa,OAAQ,UAClCD,aAAaC,aAAa,QAAS,WACnCD,aAAaC,aAAa,UAAW,WACrCD,aAAaE,iBAAiB,QAAS,WACnCC,IAAIC,SAAS,sCAEjB,IAAIC,cAAepB,SAASW,cAAc,QAC1CS,cAAaJ,aAAa,MAAO,WACjCI,aAAaC,YAAYrB,SAASsB,eAAe,WACjD,IAAIC,gBAAiBvB,SAASW,cAAc,QAC5CY,gBAAeP,aAAa,KAAM,aAClCO,eAAeP,aAAa,OAAQ,SACpCO,eAAeP,aAAa,OAAQ,UACpCO,eAAeP,aAAa,QAAS,WACrCO,eAAeN,iBAAiB,QAAS,WACrCC,IAAIC,SAAS,wCAEjB,IAAIK,gBAAiBxB,SAASW,cAAc,QAC5Ca,gBAAeR,aAAa,MAAO,aACnCQ,eAAeH,YAAYrB,SAASsB,eAAe,cACnDR,QAAQO,YAAYN,cACpBD,QAAQO,YAAYD,cACpBN,QAAQO,YAAYE,gBACpBT,QAAQO,YAAYG,eACpB,IAAIN,KAAM,GAAIhB,UAASuB,KACnBC,UAAWpB,OACXqB,MAAO,oCACPC,QAASnB,UAAWF,UACpBsB,KAAM,GACNC,YAAY,GAEhBZ,KAAIa,WAAW,GAAI7B,UAAS8B,mBAC5B,GAAI9B,UAAS+B,OAAOvB,IAAKwB,SAAS,IAAK,MAAOC,WAAW1B,UAAWF,WAAW6B,MAAMlB,KACrFZ,OAAOe,YAAYP","file":"public/assets/js/maps.js"}
|
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -1,2 +0,0 @@
|
|||
function getLocation(){"geolocation"in navigator&&navigator.geolocation.getCurrentPosition(function(t){updateForm(t.coords.latitude,t.coords.longitude),addMap(t.coords.latitude,t.coords.longitude)})}function updateForm(t,e){var o=document.querySelector("#latitude"),n=document.querySelector("#longitude");o.value=t,n.value=e}function addMap(t,e){var o=document.querySelector("form"),n=document.createElement("div");n.setAttribute("id","map"),o.appendChild(n),L.mapbox.accessToken="pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiVlpndW1EYyJ9.aP9fxAqLKh7lj0LpFh5k1w";var a=L.mapbox.map("map","jonnybarnes.gnoihnim").setView([t,e],15).addLayer(L.mapbox.tileLayer("jonnybarnes.gnoihnim",{detectRetina:!0})),i=L.marker([t,e],{draggable:!0}).addTo(a);i.on("dragend",function(){var t=i.getLatLng();updateForm(t.lat,t.lng)})}var button=document.querySelector("#locate");button.addEventListener?button.addEventListener("click",getLocation):button.attachEvent("onclick",getLocation);
|
||||
//# sourceMappingURL=public/assets/js/newplace.js.map
|
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
{"version":3,"sources":["resources/assets/js/newplace.js"],"names":["getLocation","navigator","geolocation","getCurrentPosition","position","updateForm","coords","latitude","longitude","addMap","inputLatitude","document","querySelector","inputLongitude","value","form","div","createElement","setAttribute","appendChild","L","mapbox","accessToken","map","setView","addLayer","tileLayer","detectRetina","marker","draggable","addTo","on","markerLocation","getLatLng","lat","lng","button","addEventListener","attachEvent"],"mappings":"AASA,QAASA,eACD,eAAiBC,YACjBA,UAAUC,YAAYC,mBAAmB,SAASC,GAC9CC,WAAWD,EAASE,OAAOC,SAAUH,EAASE,OAAOE,WACrDC,OAAOL,EAASE,OAAOC,SAAUH,EAASE,OAAOE,aAK7D,QAASH,YAAWE,EAAUC,GAC1B,GAAIE,GAAgBC,SAASC,cAAc,aACvCC,EAAiBF,SAASC,cAAc,aAC5CF,GAAcI,MAAQP,EACtBM,EAAeC,MAAQN,EAG3B,QAASC,QAAOF,EAAUC,GACtB,GAAIO,GAAOJ,SAASC,cAAc,QAC9BI,EAAML,SAASM,cAAc,MACjCD,GAAIE,aAAa,KAAM,OACvBH,EAAKI,YAAYH,GACjBI,EAAEC,OAAOC,YAAc,wEACvB,IAAIC,GAAMH,EAAEC,OAAOE,IAAI,MAAO,wBACzBC,SAASjB,EAAUC,GAAY,IAC/BiB,SAASL,EAAEC,OAAOK,UAAU,wBACzBC,cAAc,KAElBC,EAASR,EAAEQ,QAAQrB,EAAUC,IAC7BqB,WAAW,IACZC,MAAMP,EACTK,GAAOG,GAAG,UAAW,WACjB,GAAIC,GAAiBJ,EAAOK,WAC5B5B,YAAW2B,EAAeE,IAAKF,EAAeG,OAxCtD,GAAIC,QAASzB,SAASC,cAAc,UAEhCwB,QAAOC,iBACPD,OAAOC,iBAAiB,QAASrC,aAEjCoC,OAAOE,YAAY,UAAWtC","file":"public/assets/js/newplace.js"}
|
|
@ -37,7 +37,7 @@ $ php artisan migrate
|
|||
```
|
||||
|
||||
Now we need to edit some config values. In `config/app.php` edit `name`, and in
|
||||
`config/syndication.php` edit it to the appropriate values or set targets to `null`.
|
||||
`config/syndication.php` edit it to the appropriate values or set targets to `[]`.
|
||||
|
||||
Some other things that should be changed. Go to `resources/views/master.blade.php`,
|
||||
you may not want to link to a projects page. Also in the `<head>` the two last links
|
||||
|
|
141
resources/assets/es6/mapbox-utils.js
Normal file
141
resources/assets/es6/mapbox-utils.js
Normal file
|
@ -0,0 +1,141 @@
|
|||
//mapbox-utils.js
|
||||
import mapboxgl from 'mapbox-gl/dist/mapbox-gl.js';
|
||||
import parseLocation from './parse-location';
|
||||
import selectPlaceInForm from './select-place';
|
||||
|
||||
mapboxgl.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiY2l2cDhjYW04MDAwcjJ0cG1uZnhqcm82ayJ9.qA2zeVA-nsoMh9IFrd5KQw';
|
||||
|
||||
//define some functions to be used in the default function.
|
||||
const titlecase = (string) => {
|
||||
return string.split('-').map(([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase()).join(' ')
|
||||
};
|
||||
|
||||
const addMapTypeOption = (map, menu, option, checked = false) => {
|
||||
let input = document.createElement('input');
|
||||
input.setAttribute('id', option);
|
||||
input.setAttribute('type', 'radio');
|
||||
input.setAttribute('name', 'toggle');
|
||||
input.setAttribute('value', option);
|
||||
if (checked == true) {
|
||||
input.setAttribute('checked', 'checked');
|
||||
}
|
||||
input.addEventListener('click', function () {
|
||||
map.setStyle('mapbox://styles/mapbox/' + option + '-v9');
|
||||
});
|
||||
let label = document.createElement('label');
|
||||
label.setAttribute('for', option);
|
||||
label.appendChild(document.createTextNode(titlecase(option)));
|
||||
menu.appendChild(input);
|
||||
menu.appendChild(label);
|
||||
}
|
||||
|
||||
const makeMapMenu = (map) => {
|
||||
let mapMenu = document.createElement('div');
|
||||
mapMenu.classList.add('map-menu');
|
||||
addMapTypeOption(map, mapMenu, 'streets', true);
|
||||
addMapTypeOption(map, mapMenu, 'satellite-streets');
|
||||
return mapMenu;
|
||||
}
|
||||
|
||||
//the main function
|
||||
export default function addMap(position = null, places = null) {
|
||||
//console.log(position);
|
||||
//console.log(places);
|
||||
let mapDivs = document.querySelectorAll('.map');
|
||||
for (let div of mapDivs) {
|
||||
let dataLatitude = div.dataset.latitude;
|
||||
let dataLongitude = div.dataset.longitude;
|
||||
let dataId = div.dataset.id;
|
||||
let data = window['geojson'+dataId];
|
||||
if (data == null) {
|
||||
data = {
|
||||
"type": "FeatureCollection",
|
||||
"features": [{
|
||||
"type": "Feature",
|
||||
"geometry": {
|
||||
"type": "Point",
|
||||
"coordinates": [dataLongitude, dataLatitude]
|
||||
},
|
||||
"properties": {
|
||||
"title": "Current Location",
|
||||
"icon": "circle-stroked",
|
||||
"uri": "current-location"
|
||||
}
|
||||
}]
|
||||
};
|
||||
}
|
||||
if (places != null) {
|
||||
for (let place of places) {
|
||||
let placeLongitude = parseLocation(place.location).longitude;
|
||||
let placeLatitude = parseLocation(place.location).latitude;
|
||||
data.features.push({
|
||||
"type": "Feature",
|
||||
"geometry": {
|
||||
"type": "Point",
|
||||
"coordinates": [placeLongitude, placeLatitude]
|
||||
},
|
||||
"properties": {
|
||||
"title": place.name,
|
||||
"icon": "circle",
|
||||
"uri": place.slug
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (! dataLongitude) {
|
||||
let dataLongitude = position.coords.longitude;
|
||||
}
|
||||
if (! dataLatitude) {
|
||||
let dataLatitude = position.coords.latitude;
|
||||
}
|
||||
let map = new mapboxgl.Map({
|
||||
container: div,
|
||||
style: 'mapbox://styles/mapbox/streets-v9',
|
||||
center: [dataLongitude, dataLatitude],
|
||||
zoom: 15
|
||||
});
|
||||
if (position == null) {
|
||||
map.scrollZoom.disable();
|
||||
}
|
||||
map.addControl(new mapboxgl.NavigationControl());
|
||||
div.appendChild(makeMapMenu(map));
|
||||
map.on('load', function () {
|
||||
map.addSource('points', {
|
||||
"type": "geojson",
|
||||
"data": data
|
||||
});
|
||||
map.addLayer({
|
||||
"id": "points",
|
||||
"interactive": true,
|
||||
"type": "symbol",
|
||||
"source": "points",
|
||||
"layout": {
|
||||
"icon-image": "{icon}-15",
|
||||
"text-field": "{title}",
|
||||
"text-offset": [0, 1]
|
||||
}
|
||||
});
|
||||
});
|
||||
map.on('click', function (e) {
|
||||
let features = map.queryRenderedFeatures(e.point, {
|
||||
layer: ['points']
|
||||
});
|
||||
// if there are features within the given radius of the click event,
|
||||
// fly to the location of the click event
|
||||
if (features.length) {
|
||||
// Get coordinates from the symbol and center the map on those coordinates
|
||||
map.flyTo({center: features[0].geometry.coordinates});
|
||||
selectPlaceInForm(features[0].properties.uri);
|
||||
}
|
||||
});
|
||||
if (data.features && data.features.length > 1) {
|
||||
let bounds = new mapboxgl.LngLatBounds();
|
||||
for (let feature of data.features) {
|
||||
bounds.extend(feature.geometry.coordinates);
|
||||
}
|
||||
map.fitBounds(bounds, { padding: 65});
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
8
resources/assets/es6/maps.js
Normal file
8
resources/assets/es6/maps.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
//maps.js
|
||||
import addMapTo from './mapbox-utils';
|
||||
|
||||
let mapDivs = document.querySelectorAll('.map');
|
||||
|
||||
for (var div of mapDivs) {
|
||||
addMapTo(div);
|
||||
}
|
80
resources/assets/es6/nearby-places.js
Normal file
80
resources/assets/es6/nearby-places.js
Normal file
|
@ -0,0 +1,80 @@
|
|||
//nearby-places.js
|
||||
|
||||
import alertify from 'alertify.js';
|
||||
import addMap from './mapbox-utils';
|
||||
import parseLocation from './parse-location';
|
||||
import makeNewPlaceForm from './newplace-micropub';
|
||||
|
||||
const makeOptionsForForm = (map, position, places = null) => {
|
||||
//create the <select> element and give it a no location default
|
||||
let selectElement = document.createElement('select');
|
||||
selectElement.setAttribute('name', 'location');
|
||||
let noLocationOption = document.createElement('option');
|
||||
noLocationOption.setAttribute('selected', 'selected');
|
||||
noLocationOption.setAttribute('value', 'no-location');
|
||||
noLocationOption.appendChild(document.createTextNode('Don’t send location'));
|
||||
selectElement.appendChild(noLocationOption);
|
||||
let geoLocationOption = document.createElement('option');
|
||||
geoLocationOption.setAttribute('id', 'option-coords');
|
||||
geoLocationOption.setAttribute('value', 'geo:' + position.coords.latitude + ',' + position.coords.longitude);
|
||||
geoLocationOption.dataset.latitude = position.coords.latitude;
|
||||
geoLocationOption.dataset.longitude = position.coords.longitude;
|
||||
geoLocationOption.appendChild(document.createTextNode('Send co-ordinates'));
|
||||
selectElement.appendChild(geoLocationOption);
|
||||
if (places != null) {
|
||||
for (let place of places) {
|
||||
let parsedCoords = parseLocation(place.location);
|
||||
let option = document.createElement('option');
|
||||
option.setAttribute('value', place.slug);
|
||||
option.dataset.latitude = parsedCoords.latitude;
|
||||
option.dataset.longitude = parsedCoords.longitude;
|
||||
option.appendChild(document.createTextNode(place.name));
|
||||
selectElement.appendChild(option);
|
||||
}
|
||||
}
|
||||
//add an event listener
|
||||
selectElement.addEventListener('change', function () {
|
||||
if (selectElement.value !== 'no-location') {
|
||||
let optionLatitude = selectElement[selectElement.selectedIndex].dataset.latitude;
|
||||
let optionLongitude = selectElement[selectElement.selectedIndex].dataset.longitude;
|
||||
map.flyTo({center: [optionLongitude, optionLatitude]});
|
||||
}
|
||||
});
|
||||
|
||||
return selectElement
|
||||
}
|
||||
|
||||
//position is output of navigator.geolocation call
|
||||
export default function addMapWithPlaces(position) {
|
||||
fetch('/places/near/' + position.coords.latitude + '/' + position.coords.longitude + '?u=' + position.coords.accuracy, {
|
||||
credentials: 'same-origin',
|
||||
method: 'get'
|
||||
}).then(function (response) {
|
||||
if (response.ok) {
|
||||
return response.json();
|
||||
} else {
|
||||
alertify.reset();
|
||||
alertify.error('Non OK response');
|
||||
}
|
||||
}).then(function (json) {
|
||||
if (json.error == true) {
|
||||
alertify.reset();
|
||||
alertify.error(json.error_description);
|
||||
}
|
||||
let places = null;
|
||||
if (json.places.length > 0) {
|
||||
places = json.places;
|
||||
}
|
||||
let map = addMap(position, places);
|
||||
//create a containting div for flexbox styling purposes
|
||||
let flexboxDiv = document.createElement('div');
|
||||
let options = makeOptionsForForm(map, position, places);
|
||||
flexboxDiv.appendChild(options);
|
||||
let newPlaceForm = makeNewPlaceForm(map);
|
||||
flexboxDiv.appendChild(newPlaceForm);
|
||||
let form = document.querySelector('fieldset');
|
||||
form.insertBefore(flexboxDiv, document.querySelector('.map'));
|
||||
}).catch(function (error) {
|
||||
console.error(error);
|
||||
});
|
||||
}
|
14
resources/assets/es6/newnote-button.js
Normal file
14
resources/assets/es6/newnote-button.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
//newnote-button.js
|
||||
|
||||
import getLocation from './newnote-getlocation';
|
||||
|
||||
export default function enableLocateButton(button) {
|
||||
if ('geolocation' in navigator) {
|
||||
if (button.addEventListener) {
|
||||
//if we have javascript, event listeners and geolocation
|
||||
//make the locate button clickable and add event
|
||||
button.disabled = false;
|
||||
button.addEventListener('click', getLocation);
|
||||
}
|
||||
}
|
||||
}
|
16
resources/assets/es6/newnote-getlocation.js
Normal file
16
resources/assets/es6/newnote-getlocation.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
//newnote-getlocation.js
|
||||
|
||||
import addMapWithPlaces from './nearby-places';
|
||||
|
||||
export default function getLocation() {
|
||||
let container = document.querySelector('fieldset');
|
||||
let mapDiv = document.createElement('div');
|
||||
mapDiv.classList.add('map');
|
||||
container.appendChild(mapDiv);
|
||||
navigator.geolocation.getCurrentPosition(function (position) {
|
||||
mapDiv.dataset.latitude = position.coords.latitude;
|
||||
mapDiv.dataset.longitude = position.coords.longitude;
|
||||
mapDiv.dataset.accuracy = position.coords.accuracy;
|
||||
addMapWithPlaces(position);
|
||||
});
|
||||
}
|
8
resources/assets/es6/newnote.js
Normal file
8
resources/assets/es6/newnote.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
//newnote.js
|
||||
|
||||
import enableLocateButton from './newnote-button';
|
||||
import persistFormData from './persist-form';
|
||||
|
||||
let button = document.querySelector('#locate');
|
||||
enableLocateButton(button);
|
||||
persistFormData();
|
134
resources/assets/es6/newplace-micropub.js
Normal file
134
resources/assets/es6/newplace-micropub.js
Normal file
|
@ -0,0 +1,134 @@
|
|||
//newplace-micropub.js
|
||||
|
||||
import submitNewPlace from './submit-place';
|
||||
|
||||
export default function makeNewPlaceForm(map) {
|
||||
//add a button to add a new place
|
||||
let newLocationButton = document.createElement('button');
|
||||
newLocationButton.setAttribute('type', 'button');
|
||||
newLocationButton.setAttribute('id', 'create-new-place');
|
||||
newLocationButton.appendChild(document.createTextNode('Create New Place?'));
|
||||
//the event listener
|
||||
newLocationButton.addEventListener('click', function() {
|
||||
//add the form elements
|
||||
let newPlaceNameDiv = document.createElement('div');
|
||||
let newPlaceNameLabel = document.createElement('label');
|
||||
newPlaceNameLabel.setAttribute('for', 'place-name');
|
||||
newPlaceNameLabel.classList.add('place-label');
|
||||
newPlaceNameLabel.appendChild(document.createTextNode('Name:'));
|
||||
let newPlaceNameInput = document.createElement('input');
|
||||
newPlaceNameInput.setAttribute('placeholder', 'Name');
|
||||
newPlaceNameInput.setAttribute('name', 'place-name');
|
||||
newPlaceNameInput.setAttribute('id', 'place-name');
|
||||
newPlaceNameInput.setAttribute('type', 'text');
|
||||
newPlaceNameDiv.appendChild(newPlaceNameLabel);
|
||||
newPlaceNameDiv.appendChild(newPlaceNameInput);
|
||||
let newPlaceDescDiv = document.createElement('div');
|
||||
let newPlaceDescLabel = document.createElement('label');
|
||||
newPlaceDescLabel.setAttribute('for', 'place-description');
|
||||
newPlaceDescLabel.classList.add('place-label');
|
||||
newPlaceDescLabel.appendChild(document.createTextNode('Description:'));
|
||||
let newPlaceDescInput = document.createElement('input');
|
||||
newPlaceDescInput.setAttribute('placeholder', 'Description');
|
||||
newPlaceDescInput.setAttribute('name', 'place-description');
|
||||
newPlaceDescInput.setAttribute('id', 'place-description');
|
||||
newPlaceDescInput.setAttribute('type', 'text');
|
||||
newPlaceDescDiv.appendChild(newPlaceDescLabel);
|
||||
newPlaceDescDiv.appendChild(newPlaceDescInput);
|
||||
let newPlaceLatitudeDiv = document.createElement('div');
|
||||
var newPlaceLatitudeLabel = document.createElement('label');
|
||||
newPlaceLatitudeLabel.setAttribute('for', 'place-latitude');
|
||||
newPlaceLatitudeLabel.classList.add('place-label');
|
||||
newPlaceLatitudeLabel.appendChild(document.createTextNode('Latitude:'));
|
||||
let newPlaceLatitudeInput = document.createElement('input');
|
||||
newPlaceLatitudeInput.setAttribute('name', 'place-latitude');
|
||||
newPlaceLatitudeInput.setAttribute('id', 'place-latitude');
|
||||
newPlaceLatitudeInput.setAttribute('type', 'text');
|
||||
newPlaceLatitudeInput.value = map.getCenter().lat;
|
||||
newPlaceLatitudeDiv.appendChild(newPlaceLatitudeLabel);
|
||||
newPlaceLatitudeDiv.appendChild(newPlaceLatitudeInput);
|
||||
let newPlaceLongitudeDiv = document.createElement('div');
|
||||
let newPlaceLongitudeLabel = document.createElement('label');
|
||||
newPlaceLongitudeLabel.setAttribute('for', 'place-longitude');
|
||||
newPlaceLongitudeLabel.classList.add('place-label');
|
||||
newPlaceLongitudeLabel.appendChild(document.createTextNode('Longitude:'));
|
||||
let newPlaceLongitudeInput = document.createElement('input');
|
||||
newPlaceLongitudeInput.setAttribute('name', 'place-longitude');
|
||||
newPlaceLongitudeInput.setAttribute('id', 'place-longitude');
|
||||
newPlaceLongitudeInput.setAttribute('type', 'text');
|
||||
newPlaceLongitudeInput.value = map.getCenter().lng;
|
||||
newPlaceLongitudeDiv.appendChild(newPlaceLongitudeLabel);
|
||||
newPlaceLongitudeDiv.appendChild(newPlaceLongitudeInput);
|
||||
let newPlaceSubmit = document.createElement('button');
|
||||
newPlaceSubmit.setAttribute('id', 'place-submit');
|
||||
newPlaceSubmit.setAttribute('name', 'place-submit');
|
||||
newPlaceSubmit.setAttribute('type', 'button');
|
||||
newPlaceSubmit.appendChild(document.createTextNode('Submit New Place'));
|
||||
newPlaceSubmit.addEventListener('click', function () {
|
||||
submitNewPlace(map);
|
||||
});
|
||||
let form = document.querySelector('fieldset');
|
||||
form.appendChild(newPlaceNameDiv);
|
||||
form.appendChild(newPlaceDescDiv);
|
||||
form.appendChild(newPlaceLatitudeDiv);
|
||||
form.appendChild(newPlaceLongitudeDiv);
|
||||
form.appendChild(newPlaceSubmit);
|
||||
//the event listener for the new place form
|
||||
/*placeSubmit.addEventListener('click', function () {
|
||||
//create the form data to send
|
||||
var formData = new FormData();
|
||||
formData.append('place-name', document.querySelector('#place-name').value);
|
||||
formData.append('place-description', document.querySelector('#place-description').value);
|
||||
formData.append('place-latitude', document.querySelector('#place-latitude').value);
|
||||
formData.append('place-longitude', document.querySelector('#place-longitude').value);
|
||||
//post the new place
|
||||
fetch('/places/new', {
|
||||
//send cookies with the request
|
||||
credentials: 'same-origin',
|
||||
method: 'post',
|
||||
body: formData
|
||||
})
|
||||
.then(function (response) {
|
||||
return response.json();
|
||||
})
|
||||
.then(function (placeJson) {
|
||||
if (placeJson.error === true) {
|
||||
throw new Error(placeJson.error_description);
|
||||
}
|
||||
//remove un-needed form elements
|
||||
//iterate through labels and remove parent div elements
|
||||
var labels = document.querySelectorAll('.place-label');
|
||||
for (var i = 0; i < labels.length; ++i) {
|
||||
form.removeChild(labels[i].parentNode);
|
||||
}
|
||||
form.removeChild(document.querySelector('#place-submit'));
|
||||
var newPlaceButton = document.querySelector('#create-new-place');
|
||||
//in order to remove a DOM Node, you need to run removeChild on the parent Node
|
||||
newPlaceButton.parentNode.removeChild(newPlaceButton);
|
||||
//add place marker
|
||||
var newOption = document.createElement('option');
|
||||
newOption.setAttribute('value', placeJson.uri);
|
||||
newOption.appendChild(document.createTextNode(placeJson.name));
|
||||
newOption.dataset.latitude = placeJson.latitude;
|
||||
newOption.dataset.longitude = placeJson.longitude;
|
||||
selectEl.appendChild(newOption);
|
||||
var newPlaceMarkerIcon = document.createElement('div');
|
||||
newPlaceMarkerIcon.classList.add('marker');
|
||||
new mapboxgl.Marker(newPlaceMarkerIcon, {offset: [-10, -20]}).setLngLat([placeJson.longitude, placeJson.latitude]).addTo(map);
|
||||
map.flyTo({center: [placeJson.longitude, placeJson.latitude]});
|
||||
|
||||
newPlaceMarkerIcon.addEventListener('click', function () {
|
||||
map.flyTo({center: [placeJson.longitude, placeJson.latitude]});
|
||||
selectPlace(placeJson.uri);
|
||||
});
|
||||
//make selected
|
||||
selectPlace(placeJson.uri);
|
||||
}).catch(function (placeError) {
|
||||
alertify.reset();
|
||||
alertify.error(placeError);
|
||||
});
|
||||
});*/
|
||||
});
|
||||
|
||||
return newLocationButton;
|
||||
}
|
10
resources/assets/es6/parse-location.js
Normal file
10
resources/assets/es6/parse-location.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
//parse-location.js
|
||||
|
||||
//text = `POINT(lon lat)`
|
||||
export default function parseLocation(text) {
|
||||
let coords = /POINT\((.*)\)/.exec(text);
|
||||
let parsedLongitude = coords[1].split(' ')[0];
|
||||
let parsedLatitude = coords[1].split(' ')[1];
|
||||
|
||||
return {'latitude': parsedLatitude, 'longitude': parsedLongitude};
|
||||
}
|
32
resources/assets/es6/persist-form.js
Normal file
32
resources/assets/es6/persist-form.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
//persist-form.js
|
||||
|
||||
import webStorage from 'webStorage';
|
||||
import alertify from 'alertify.js';
|
||||
|
||||
const loadData = () => {
|
||||
let replyTo = document.querySelector('#in-reply-to');
|
||||
replyTo.value = webStorage.getItem('replyTo');
|
||||
let content = document.querySelector('#content');
|
||||
content.value = webStorage.getItem('content');
|
||||
}
|
||||
|
||||
const saveData = () => {
|
||||
let replyTo = document.querySelector('#in-reply-to');
|
||||
let content = document.querySelector('#content');
|
||||
webStorage.setItem('replyTo', replyTo.value);
|
||||
webStorage.setItem('content', content.value);
|
||||
alertify.success('Auto-saved data');
|
||||
}
|
||||
|
||||
const clearData = () => {
|
||||
webStorage.removeItem('replyTo');
|
||||
webStorage.removeItem('content');
|
||||
}
|
||||
|
||||
export default function persistFormData()
|
||||
{
|
||||
let form = document.querySelector('form[name="micropub"]');
|
||||
form.addEventListener('change', saveData);
|
||||
form.addEventListener('submit', clearData);
|
||||
loadData();
|
||||
}
|
11
resources/assets/es6/select-place.js
Normal file
11
resources/assets/es6/select-place.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
//select-place.js
|
||||
|
||||
export default function selectPlaceInForm(uri) {
|
||||
if (document.querySelector('select')) {
|
||||
if (uri == 'current-location') {
|
||||
document.querySelector('select [id="option-coords"]').selected = true
|
||||
} else {
|
||||
document.querySelector('select [value="' + uri + '"]').selected = true
|
||||
}
|
||||
}
|
||||
}
|
71
resources/assets/es6/submit-place.js
Normal file
71
resources/assets/es6/submit-place.js
Normal file
|
@ -0,0 +1,71 @@
|
|||
//submit-place.js
|
||||
|
||||
import alertify from 'alertify.js';
|
||||
|
||||
export default function submitNewPlace(map) {
|
||||
//create the form data to send
|
||||
let formData = new FormData();
|
||||
formData.append('place-name', document.querySelector('#place-name').value);
|
||||
formData.append('place-description', document.querySelector('#place-description').value);
|
||||
formData.append('place-latitude', document.querySelector('#place-latitude').value);
|
||||
formData.append('place-longitude', document.querySelector('#place-longitude').value);
|
||||
//post the new place
|
||||
fetch('/places/new', {
|
||||
//send cookies with the request
|
||||
credentials: 'same-origin',
|
||||
method: 'post',
|
||||
body: formData
|
||||
}).then(function (response) {
|
||||
return response.json();
|
||||
}).then(function (placeJson) {
|
||||
if (placeJson.error === true) {
|
||||
throw new Error(placeJson.error_description);
|
||||
}
|
||||
//remove un-needed form elements
|
||||
let form = document.querySelector('fieldset');
|
||||
//iterate through labels and remove parent div elements
|
||||
let labels = document.querySelectorAll('.place-label');
|
||||
for (let label of labels) {
|
||||
form.removeChild(label.parentNode);
|
||||
}
|
||||
form.removeChild(document.querySelector('#place-submit'));
|
||||
let newPlaceButton = document.querySelector('#create-new-place');
|
||||
//in order to remove a DOM Node, you need to run removeChild on the parent Node
|
||||
newPlaceButton.parentNode.removeChild(newPlaceButton);
|
||||
//remove current location from map
|
||||
let source = map.getSource('points');
|
||||
let newFeatures = source._data.features.filter(function (item) {
|
||||
return item.properties.title != 'Current Location';
|
||||
});
|
||||
//add new place to map
|
||||
newFeatures.push({
|
||||
"type": "Feature",
|
||||
"geometry": {
|
||||
"type": "Point",
|
||||
"coordinates": [placeJson.longitude, placeJson.latitude]
|
||||
},
|
||||
"properties": {
|
||||
"title": placeJson.name,
|
||||
"icon": "circle",
|
||||
"uri": placeJson.uri
|
||||
}
|
||||
});
|
||||
let newSource = {
|
||||
"type": "FeatureCollection",
|
||||
"features": newFeatures
|
||||
}
|
||||
map.getSource('points').setData(newSource);
|
||||
//add new place to select menu
|
||||
let selectElement = document.querySelector('select');
|
||||
let newlyCreatedPlaceOption = document.createElement('option');
|
||||
newlyCreatedPlaceOption.setAttribute('value', placeJson.uri);
|
||||
newlyCreatedPlaceOption.appendChild(document.createTextNode(placeJson.name));
|
||||
newlyCreatedPlaceOption.dataset.latitude = placeJson.latitude;
|
||||
newlyCreatedPlaceOption.dataset.longitude = placeJson.longitude;
|
||||
selectElement.appendChild(newlyCreatedPlaceOption);
|
||||
document.querySelector('select [value="' + placeJson.uri + '"]').selected = true;
|
||||
}).catch(function (placeError) {
|
||||
alertify.reset();
|
||||
alertify.error(placeError);
|
||||
});
|
||||
}
|
|
@ -24,7 +24,7 @@ function addPlacesMap(latitude, longitude, uncertainty) {
|
|||
}).then(function (response) {
|
||||
return response.json();
|
||||
}).then(function (j) {
|
||||
if (j.error == true) {
|
||||
if (j.error === true) {
|
||||
alertify.reset();
|
||||
alertify.error(j.error_description);
|
||||
}
|
||||
|
@ -247,7 +247,7 @@ function addMap(latitude, longitude, places) {
|
|||
return response.json();
|
||||
})
|
||||
.then(function (placeJson) {
|
||||
if (placeJson.error == true) {
|
||||
if (placeJson.error === true) {
|
||||
throw new Error(placeJson.error_description);
|
||||
}
|
||||
//remove un-needed form elements
|
||||
|
@ -269,7 +269,7 @@ function addMap(latitude, longitude, places) {
|
|||
selectEl.appendChild(newOption);
|
||||
var newPlaceMarkerIcon = document.createElement('div');
|
||||
newPlaceMarkerIcon.classList.add('marker');
|
||||
var newPlaceMarker = new mapboxgl.Marker(newPlaceMarkerIcon, {offset: [-10, -20]}).setLngLat([placeJson.longitude, placeJson.latitude]).addTo(map);
|
||||
new mapboxgl.Marker(newPlaceMarkerIcon, {offset: [-10, -20]}).setLngLat([placeJson.longitude, placeJson.latitude]).addTo(map);
|
||||
map.flyTo({center: [placeJson.longitude, placeJson.latitude]});
|
||||
|
||||
newPlaceMarkerIcon.addEventListener('click', function () {
|
||||
|
|
2
resources/assets/sass/contacts.scss
vendored
2
resources/assets/sass/contacts.scss
vendored
|
@ -10,5 +10,5 @@
|
|||
.contact img {
|
||||
margin-right: 0.2rem;
|
||||
width: 100px;
|
||||
height:100px;
|
||||
height: 100px;
|
||||
}
|
||||
|
|
5
resources/assets/sass/layout.scss
vendored
5
resources/assets/sass/layout.scss
vendored
|
@ -55,11 +55,6 @@ footer button {
|
|||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.algolia-image {
|
||||
display: inline;
|
||||
height: 2em;
|
||||
}
|
||||
|
||||
.u-comment {
|
||||
margin-top: 1em;
|
||||
padding: 0 1em;
|
||||
|
|
14
resources/assets/sass/styles.scss
vendored
14
resources/assets/sass/styles.scss
vendored
|
@ -2,9 +2,17 @@
|
|||
|
||||
body {
|
||||
// from smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide
|
||||
font-family: -apple-system, BlinkMacSystemFont,
|
||||
"Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell",
|
||||
"Fira Sans", "Droid Sans", "Helvetica Neue",
|
||||
font-family:
|
||||
-apple-system,
|
||||
BlinkMacSystemFont,
|
||||
"Segoe UI",
|
||||
"Roboto",
|
||||
"Oxygen",
|
||||
"Ubuntu",
|
||||
"Cantarell",
|
||||
"Fira Sans",
|
||||
"Droid Sans",
|
||||
"Helvetica Neue",
|
||||
sans-serif;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,11 +19,11 @@ Notes «
|
|||
@stop
|
||||
|
||||
@section('scripts')
|
||||
@include('templates.mapbox-links')
|
||||
|
||||
<script src="/assets/frontend/Autolinker.min.js"></script>
|
||||
<script src="/assets/js/links.js"></script>
|
||||
<script src="/assets/js/maps.js"></script>
|
||||
<!--<script src="/assets/frontend/Autolinker.min.js"></script>
|
||||
<script src="/assets/js/links.js"></script>-->
|
||||
<link rel="stylesheet" href="/assets/frontend/mapbox-gl.css">
|
||||
<script defer src="/assets/js/maps.js"></script>
|
||||
|
||||
<script src="/assets/prism/prism.js"></script>
|
||||
<link rel="stylesheet" href="/assets/prism/prism.css">
|
||||
|
|
|
@ -26,19 +26,19 @@ New Note «
|
|||
@endif
|
||||
@include('templates.new-note-form', [
|
||||
'micropub' => true,
|
||||
'action' => '/notes/new',
|
||||
'id' => 'newnote'
|
||||
'action' => '/notes/new'
|
||||
])
|
||||
@stop
|
||||
|
||||
@section('scripts')
|
||||
@include('templates.mapbox-links')
|
||||
|
||||
<script src="/assets/frontend/fetch.js"></script>
|
||||
<script src="/assets/frontend/store2.min.js"></script>
|
||||
<script src="/assets/frontend/alertify.js"></script>
|
||||
<script src="/assets/js/form-save.js"></script>
|
||||
<script src="/assets/js/newnote.js"></script>
|
||||
<script>
|
||||
window.Promise || document.write('<script src="https://unpkg.com/promise-polyfill/promise.min.js"><\/script>');
|
||||
window.fetch || document.write('<script src="https://unpkg.com/whatwg-fetch/fetch.js"><\/script>');
|
||||
</script>
|
||||
<!--<script src="/assets/frontend/store2.min.js"></script>
|
||||
<script src="/assets/js/form-save.js"></script>-->
|
||||
<script defer src="/assets/js/newnote.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="/assets/frontend/alertify.css">
|
||||
<link rel="stylesheet" href="/assets/frontend/mapbox-gl.css">
|
||||
@stop
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
<link rel="stylesheet" href="https://api.mapbox.com/mapbox-gl-js/v0.28.0/mapbox-gl.css" integrity="sha384-dCW/5IRoXPf5hkwrejBih/Unwf0nefL7NDk8hFitylhgPyk1YB4K9nwT5thMO2lV" crossorigin="anonymous">
|
||||
<script src="https://api.mapbox.com/mapbox-gl-js/v0.28.0/mapbox-gl.js" integrity="sha384-Q8pgRmod5Yo3TQg5NSTfk4lNXS6Seqm160e2XA+RXpgGqdGOzX5c+UU6IoohcdWZ" crossorigin="anonymous"></script>
|
||||
<link rel="stylesheet" href="https://api.mapbox.com/mapbox-gl-js/v0.29.0/mapbox-gl.css">
|
||||
<script src="https://api.mapbox.com/mapbox-gl-js/v0.29.0/mapbox-gl.js" ></script>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<form action="{{ $action }}" method="post" enctype="multipart/form-data" accept-charset="utf-8" id="{{ $id }}">
|
||||
<form action="{{ $action }}" method="post" enctype="multipart/form-data" accept-charset="utf-8"@if($micropub) name="micropub"@endif>
|
||||
<input type="hidden" name="_token" value="{{ csrf_token() }}">
|
||||
<fieldset class="note-ui">
|
||||
<legend>New Note</legend>
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
</div>
|
||||
</div>
|
||||
@if ($note->placeLink)
|
||||
<div class="map" data-latitude="{{ $note->latitude }}" data-longitude="{{ $note->longitude }}"></div>
|
||||
<div class="map" data-latitude="{{ $note->latitude }}" data-longitude="{{ $note->longitude }}" data-id="{{ $note->nb60id }}"></div>
|
||||
<script>var geojson{{ $note->nb60id }} = {!! $note->geoJson !!};</script>
|
||||
@endif
|
||||
</div>
|
||||
|
|
34
webpack.config.js
Normal file
34
webpack.config.js
Normal file
|
@ -0,0 +1,34 @@
|
|||
const webpack = require('webpack');
|
||||
|
||||
const config = {
|
||||
context: __dirname + '/resources/assets/es6',
|
||||
entry: {
|
||||
//app: './app.js',
|
||||
maps: './maps.js',
|
||||
newnote: './newnote.js'
|
||||
},
|
||||
output: {
|
||||
path: __dirname + '/public/assets/js',
|
||||
filename: '[name].js'
|
||||
},
|
||||
module: {
|
||||
loaders: [
|
||||
{
|
||||
test: /\.js$/,
|
||||
exclude: __dirname + '/node_modules/',
|
||||
loader: 'babel-loader'
|
||||
}
|
||||
]
|
||||
},
|
||||
plugins: [
|
||||
new webpack.optimize.UglifyJsPlugin({
|
||||
compress: true,
|
||||
mangle: {
|
||||
except: ['fetch', 'map'],
|
||||
screw_ie8: true
|
||||
}
|
||||
})
|
||||
]
|
||||
};
|
||||
|
||||
module.exports = config;
|
Loading…
Add table
Add a link
Reference in a new issue