diff --git a/app/Note.php b/app/Note.php index dc932019..ef94e327 100644 --- a/app/Note.php +++ b/app/Note.php @@ -462,7 +462,7 @@ class Note extends Model $name = str_replace('#', '', $name); $replacements[$name] = ''; diff --git a/app/Observers/NoteObserver.php b/app/Observers/NoteObserver.php new file mode 100644 index 00000000..4b9dc1dd --- /dev/null +++ b/app/Observers/NoteObserver.php @@ -0,0 +1,76 @@ +getTagsFromNote($note->getAttributes()['note']); + + if (count($tags) === 0) { + return; + } + + $tags->transform(function ($tag) { + return Tag::firstOrCreate(['tag' => $tag]); + }); + + $note->tags()->attach($tags->map(function ($tag) { + return $tag->id; + })); + } + + /** + * Listen to the Note updated event. + * + * @param \App\Note $Note + * @return void + */ + public function updated(Note $note) + { + $tags = $this->getTagsFromNote($note->getAttributes()['note']); + if (count($tags) === 0) { + return; + } + + $tags->transform(function ($tag) { + return Tag::firstOrCreate(['tag' => $tag]); + }); + + $note->tags()->sync($tags->map(function ($tag) { + return $tag->id; + })); + } + + /** + * Listen to the Note deleting event. + * + * @param \App\Note $note + * @return void + */ + public function deleting(Note $note) + { + $note->tags()->detach(); + } + + public function getTagsFromNote($note) + { + preg_match_all('/#([^\s<>]+)\b/', $note, $tags); + if (array_get($tags, '1') === null) { + return []; + } + + return collect($tags[1])->map(function ($tag) { + return Tag::normalize($tag); + })->unique(); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0a3ffb87..2fe35bbd 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,10 +2,9 @@ namespace App\Providers; -use App\Tag; use App\Note; -use Validator; use Illuminate\Http\Request; +use App\Observers\NoteObserver; use Laravel\Dusk\DuskServiceProvider; use Illuminate\Support\ServiceProvider; @@ -18,35 +17,7 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // Validate photos for a maximum filesize - Validator::extend('photosize', function ($attribute, $value, $parameters, $validator) { - if ($value[0] !== null) { - foreach ($value as $file) { - if ($file->getSize() > 5000000) { - return false; - } - } - } - - return true; - }); - - //Add tags for notes - Note::created(function ($note) { - $tagsToAdd = []; - preg_match_all('/#([^\s<>]+)\b/', $note->note, $tags); - foreach ($tags[1] as $tag) { - $tag = Tag::normalizeTag($tag); - } - $tags = array_unique($tags[1]); - foreach ($tags as $tag) { - $tag = Tag::firstOrCreate(['tag' => $tag]); - $tagsToAdd[] = $tag->id; - } - if (count($tagsToAdd) > 0) { - $note->tags()->attach($tagsToAdd); - } - }); + Note::observe(NoteObserver::class); // Request AS macro Request::macro('wantsActivityStream', function () { diff --git a/app/Tag.php b/app/Tag.php index 0e7b6e3e..8b876d2e 100644 --- a/app/Tag.php +++ b/app/Tag.php @@ -6,13 +6,6 @@ use Illuminate\Database\Eloquent\Model; class Tag extends Model { - /** - * The database table used by the model. - * - * @var string - */ - protected $table = 'tags'; - /** * Define the relationship with tags. * @@ -31,13 +24,6 @@ class Tag extends Model return $this->belongsToMany('App\Bookmark'); } - /** - * The attributes excluded from the model's JSON form. - * - * @var array - */ - protected $hidden = ['deleted']; - /** * We shall set a blacklist of non-modifiable model attributes. * @@ -52,7 +38,7 @@ class Tag extends Model */ public function setTagAttribute($value) { - $this->attributes['tag'] = $this->normalizeTag($value); + $this->attributes['tag'] = $this->normalize($value); } /** @@ -61,7 +47,7 @@ class Tag extends Model * * @param string */ - public static function normalizeTag($tag) + public static function normalize($tag) { return mb_strtolower( preg_replace( diff --git a/changelog.md b/changelog.md index 394482ab..4f2825d9 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,10 @@ # Changelog +## Version 0.12.5 (2017-11-09) + - Fix style of tags on bookmarks page that had been visited + - Fix style of notes listed on `/notes/tagged/tag` + - Move code manging tagging of notes to NoteObserver + ## Version 0.12.4 (2017-11-07) - Pull in newer version of my linkify extension to fix errors diff --git a/public/assets/css/app.css b/public/assets/css/app.css index 5b52b597..565aec45 100644 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -1,2 +1,2 @@ -html{-webkit-box-sizing:border-box;box-sizing:border-box}*,*::before,*::after{-webkit-box-sizing:inherit;box-sizing:inherit}html{font-size:10px;font-family:"filson-soft"}a.u-syndication{text-decoration:none}#topheader{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;min-height:5rem}#topheader h1{font-size:2rem;padding:0 2rem}#topheader nav{font-size:2rem}main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:512px;margin:0 auto;padding:0 0.5rem}.h-entry{font-size:2rem}.top-space{padding-top:2rem}.mini-h-card{position:relative}.mini-h-card .p-name{position:relative}.mini-h-card:hover .p-name{z-index:100}.mini-h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex}.hovercard{position:absolute;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;background:white;width:30rem;left:-10px;top:-10px;z-index:50;padding:2rem 1rem 1rem;border-radius:2px;-webkit-box-shadow:3px 3px 2px 1px #101314;box-shadow:3px 3px 2px 1px #101314;display:none}.mini-h-card .social-icon{width:auto;height:2rem}.mini-h-card .u-photo{height:10rem}.note{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:2rem}.note img{max-width:100%;max-height:80vh}.note-metadata{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.icon{width:auto;height:1em}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly;font-size:2rem;list-style-type:none}main .contact{font-size:2rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-top:2rem}.contact .u-photo{width:auto;height:8rem}#projects{font-size:2rem}body>div.h-card{max-width:512px;margin:0 auto;font-size:1.5rem}footer{max-width:512px;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.p-bridgy-twitter-content,.p-bridgy-facebook-content{display:none}span[role=img][aria-label],span[role=img][aria-label]{position:relative}span[role=img][aria-label]:focus::after,span[role=img][aria-label]:hover::after{position:absolute;display:block;z-index:1;bottom:1.5em;left:0;max-width:5em;padding:0.5em 0.75em;border:0.05em solid #fff;border-radius:0.2em;-webkit-box-shadow:0.15em 0.15em 0.5em #000;box-shadow:0.15em 0.15em 0.5em #000;content:attr(aria-label);background-color:rgba(0,0,0,0.85);color:#fff;font-size:80%;-webkit-animation:TOOLTIP 0.1s ease-out 1;animation:TOOLTIP 0.1s ease-out 1}@-webkit-keyframes TOOLTIP{from{bottom:0.5em;background-color:transparent;border:0.05em solid rgba(255,255,255,0);color:rgba(255,255,255,0);-webkit-box-shadow:0 0 0 #000;box-shadow:0 0 0 #000}to{bottom:1.5em;background-color:rgba(0,0,0,0.85);border:0.05em solid #fff;color:#fff;-webkit-box-shadow:0.15em 0.15em 0.5em #000;box-shadow:0.15em 0.15em 0.5em #000}}@keyframes TOOLTIP{from{bottom:0.5em;background-color:transparent;border:0.05em solid rgba(255,255,255,0);color:rgba(255,255,255,0);-webkit-box-shadow:0 0 0 #000;box-shadow:0 0 0 #000}to{bottom:1.5em;background-color:rgba(0,0,0,0.85);border:0.05em solid #fff;color:#fff;-webkit-box-shadow:0.15em 0.15em 0.5em #000;box-shadow:0.15em 0.15em 0.5em #000}}@media print{span[role=img][aria-label]::after{content:" (" attr(aria-label) ") "}}.map{height:200px}.mapboxgl-ctrl-logo{border-bottom:none}.marker{background-image:url(data:image/png;base64,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);background-size:contain;width:20px;height:20px}.map-menu{position:absolute;top:0;left:0;background:white;padding:0.4rem}.map-menu label{margin-left:3px;margin-right:3px}body{background-color:var(--brwhite);color:var(--black)}#topheader{background-color:var(--black);color:var(--white)}a,a:visited{color:var(--blue)}#topheader a{text-decoration:none}h1 a{text-decoration:none}.tags{margin:0;overflow:hidden;padding:0}.tags li{float:left;list-style-type:none}.tag{background:var(--white);border-radius:3px 0 0 3px;color:var(--black);display:inline-block;height:2.6rem;line-height:2.6rem;padding:0 2rem 0 1rem;position:relative;margin:0 1rem 1rem 0;text-decoration:none;-webkit-transition:color 0.2s;transition:color 0.2s}.tag::after{background:var(--brwhite);border-bottom:1.3rem solid transparent;border-left:1rem solid var(--white);border-top:1.3rem solid transparent;content:'';position:absolute;right:0;top:0}.tag:hover{background-color:var(--red);color:var(--black)}.tag:hover::after{border-left-color:var(--red)} +html{-webkit-box-sizing:border-box;box-sizing:border-box}*,*::before,*::after{-webkit-box-sizing:inherit;box-sizing:inherit}html{font-size:10px;font-family:"filson-soft"}a.u-syndication{text-decoration:none}#topheader{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;min-height:5rem}#topheader h1{font-size:2rem;padding:0 2rem}#topheader nav{font-size:2rem}main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:512px;margin:0 auto;padding:0 0.5rem}.h-entry{font-size:2rem}.top-space{padding-top:2rem}.mini-h-card{position:relative}.mini-h-card .p-name{position:relative}.mini-h-card:hover .p-name{z-index:100}.mini-h-card:hover .hovercard{display:-webkit-box;display:-ms-flexbox;display:flex}.hovercard{position:absolute;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;background:white;width:30rem;left:-10px;top:-10px;z-index:50;padding:2rem 1rem 1rem;border-radius:2px;-webkit-box-shadow:3px 3px 2px 1px #101314;box-shadow:3px 3px 2px 1px #101314;display:none}.mini-h-card .social-icon{width:auto;height:2rem}.mini-h-card .u-photo{height:10rem}.note{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:2rem}.note img{max-width:100%;max-height:80vh}.note-metadata{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.icon{width:auto;height:1em}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly;font-size:2rem;list-style-type:none}main .contact{font-size:2rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-top:2rem}.contact .u-photo{width:auto;height:8rem}#projects{font-size:2rem}body>div.h-card{max-width:512px;margin:0 auto;font-size:1.5rem}footer{max-width:512px;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.p-bridgy-twitter-content,.p-bridgy-facebook-content{display:none}span[role=img][aria-label],span[role=img][aria-label]{position:relative}span[role=img][aria-label]:focus::after,span[role=img][aria-label]:hover::after{position:absolute;display:block;z-index:1;bottom:1.5em;left:0;max-width:5em;padding:0.5em 0.75em;border:0.05em solid #fff;border-radius:0.2em;-webkit-box-shadow:0.15em 0.15em 0.5em #000;box-shadow:0.15em 0.15em 0.5em #000;content:attr(aria-label);background-color:rgba(0,0,0,0.85);color:#fff;font-size:80%;-webkit-animation:TOOLTIP 0.1s ease-out 1;animation:TOOLTIP 0.1s ease-out 1}@-webkit-keyframes TOOLTIP{from{bottom:0.5em;background-color:transparent;border:0.05em solid rgba(255,255,255,0);color:rgba(255,255,255,0);-webkit-box-shadow:0 0 0 #000;box-shadow:0 0 0 #000}to{bottom:1.5em;background-color:rgba(0,0,0,0.85);border:0.05em solid #fff;color:#fff;-webkit-box-shadow:0.15em 0.15em 0.5em #000;box-shadow:0.15em 0.15em 0.5em #000}}@keyframes TOOLTIP{from{bottom:0.5em;background-color:transparent;border:0.05em solid rgba(255,255,255,0);color:rgba(255,255,255,0);-webkit-box-shadow:0 0 0 #000;box-shadow:0 0 0 #000}to{bottom:1.5em;background-color:rgba(0,0,0,0.85);border:0.05em solid #fff;color:#fff;-webkit-box-shadow:0.15em 0.15em 0.5em #000;box-shadow:0.15em 0.15em 0.5em #000}}@media print{span[role=img][aria-label]::after{content:" (" attr(aria-label) ") "}}.map{height:200px}.mapboxgl-ctrl-logo{border-bottom:none}.marker{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsTAAALEwEAmpwYAAACxFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMyaeDAAAA63RSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ozw9Pj9AQUJERUZHSElKS05PUlNVVldYWVpbXF1fYGFiY2RmZ2hpa2xtbm9wcXJzdHV2d3h5ent8fX+AgYKDhIWGh4iJiouMjo+QkZOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqutrq+xsrO0tbe4ubq7vL2+v8DBwsPExcbHyMnKy8zP0NHS09TV1tfY2drb3N3f4OHi4+Tl5ujp6uvs7e7v8PHy8/T19vf4+fr7/P3+xn8cLwAAB2BJREFUGBntwYtjlWUdB/Dvuwtjo23CGPcxtlGAFhgWFCINSZciCYGKwLSbMwuQi4lgbkSTgYOAiYEI5a0JmQhRAYKBgmzJbSwgGTDYxs45nO8/0d0Mzu897+V53kv1+QD/9z8jd9T9ize/tfdw04VY+9mjf9hV/1xFWXEKQiV11Nytp5nIlfdq781HOBRWvHaBZuLvPVuWhoDLmbkjTgvOVN+CABu/qZ2WHZrTA4Fk3L2X9lxa2geBkzLlIO3rqBmIYBl/mM5ElmUjOPpuonPNkxEQqRUX6cqbn0EQFL1Dtzor4L9JF6jAK93hr4zlVOP4aPhpwH6qEvkO/DPsJBWqhF++9BGVqkuDL8raqNgvs+CDSVEqtysLniu9Qg3q0+Cxz7dSixcMeKrkNDVZCi/1PEptHoV3jDeoT3QMPDOXtnTEaEdTHjwyJkpLLm+rmjGm4IY0ILPXsImz1zXQmnoDnshrogVHnhiTjmv0v2/LFVowG554iUldXjEaid1Qvo9JRYfDAxOYzPlFeTAxYSeT+a0B7TIaaS72k1wkcfsRJjEd2i2gud+PQHJd5rXT1Nnu0KyonWauPpECS246TFPPQbMNNHN6PKzKep5mrg6BViUxmmgohA3zaaYOWv2UJvblw5ZZMcqihdBoQCdl+7Nh09Q4ZSuh0bOUNebDtgrKrvSFNjltFJ0ZBAeWUrYE2syg6OoEOJG6k6ITBnTZQdFiONPvLEWl0KQwTsm+VDg0kaJ10GQBJVe/AMdeo6Q1E3ocoWQlnBvUTskUaDGIkkt5cOFpStZDixmULIUb+W0UnIQWGyjo6ANXqikZDB2aKaiDO4VxCsqhwRBKSuHSDgpeggYzKThhwKWZFDRDgx9TUAW3cqIU5EC91ym4A67tpuCLUK+RiUW6wbUlFNwH5dKjTOx3cO92Cp6CckMpqIV7vSnYAuXupOBRKHCeib0D5e6loAwK7GFiR6DcTAo+CwW2MLFmKFdBQSEUWMvEWqHcQgp6QIFqJhY3oFolBRlQYDEFn4Jq1RRkQ4GlFORBtSUU9IMCtRRkQLW5FAyBAhuZWATKPUzBGCiwjYn9GcrdRcGDUOA4E9sP5YZS8Azcy4wzsc1QLiPOxF6FeyMo+BHUO8bEzhpw7VsUTId6L1PwObj2CwqGQ735FDwCt4xzTKwjDeqVUbAdbo2lYC806ElBfCBcWkNBDXQ4RME8uNP1AgVfhw4rKTiaClemU9IbOkymZBrcSGmg4ANo0YeS9w24MJmSWuhxgJKpcC79MCX3QI9nKPlTDhybTUkkG3qMo6gaThVcpuRtaJJ2kZLYWDhjbKPoB9Dl5xSd6glH5lN2E3SZRtkbKXBgXIyiRmiTG6GsBvYNO0dZJfTZShMLYdeAkzQxGvqU08xjsKfgA5poNqBPrxjNVBmw4cYmmqmBTr+mqZ9lwrLSFpq6FTrNormDQ2FNyg+v0tRJAzp176S5y+UGLCjaziSqoNfrTGb3zUgmY2E7kxkJvb7BpGJrSmAm7YE/MqkGaJbVyuRiG0dCkv3NY7RgAXRbR0ven1OA66Xf+WI7rYgXQrdxtKqxdvKwdHwsf+zcX7XRorehnXGMNkQb33x5fc3qTfV7WmjHg9BvEfVry4Z+xXFq9wK88Ba1uw1emErdGuCJri3UbA68sZx6RXvDG8Op1yvwyh5qdQe8Mp06HTXglcwWajQH3qmmPp358M5Q6rMJXtpObW6DlyZRlwPwVFoTNSmHtxZQj/NZ8FavTmqxDF7bQB3iJfDaKOpQD+/tpgZfhfemUL1D8EHaKSr3EPzwOFVryYIf8tqpWCX8sYpqRQvgj6FxKvUi/FJPpW6BX8ZTpZ3wz7tU6G74536q02jAP+mnqMzD8NP3qcqZrvBTzkUqshD+qqIabXnwV/8IlVgOv9VRhVgR/HZjnApsgv9epQI3w39fpntbEQS/oWulCIK76NZeBMMBunQPgmEq3TlsIBhSP6QrDyAoyunG8TQERZdmuvBtBMf36NyZTARHt4/o2OMIkoV0qiUHQZJ7gQ49iWBZQmdaeyBYel6mI5UImmV0or0XgqZvBx2oRvDU0L4r/RA8Azpp2woE0Sra1VmAICqM0KZVCKa1tCc6CMFUEqUtaxFUdbQjWoSgGhyjDWsRXM/TumgxgmtwjJatQ5Ctp1XREgTZ4BgtWodgq6M10WIEW3GUlqxB0K2lFZFBCLqiCC1YjeBbzeQ6ByL4BnYyqRUIg5VMpqM/wqB/B5OoRjhU01xbH4RD7zaaqkJYVNJMax7CIq+VJp5CeCyirCUX4ZF7jqJ5CJO5lJzphjDJOk1BBcLlESbWlIFwyTjJhB5C2MxiIh+mI2zSGpjANITPFF7vYArCx3iX15mIMPoar7UH4bSL1/gKwulW/qdtCKt6flJ8JMJqRJyfsBnhtZH/Fv00wqs4wo/VIsyW81/a+iHMel3iPz2NcHuS/3AuF+GWfZZ/9xjC7rv8mxMZCLsuR/lX0xF+U0geTEH4GfvIMvw3KOV2aPcXaWsyKghlwmgAAAAASUVORK5CYII=);background-size:contain;width:20px;height:20px}.map-menu{position:absolute;top:0;left:0;background:white;padding:0.4rem}.map-menu label{margin-left:3px;margin-right:3px}body{background-color:var(--brwhite);color:var(--black)}#topheader{background-color:var(--black);color:var(--white)}a,a:visited{color:var(--blue)}#topheader a{text-decoration:none}h1 a{text-decoration:none}.tags{margin:0;overflow:hidden;padding:0}.tags li{float:left;list-style-type:none}.tag,.tag:visited{background:var(--white);border-radius:3px 0 0 3px;color:var(--black);display:inline-block;height:2.6rem;line-height:2.6rem;padding:0 2rem 0 1rem;position:relative;margin:0 1rem 1rem 0;text-decoration:none;-webkit-transition:color 0.2s;transition:color 0.2s}.tag::after{background:var(--brwhite);border-bottom:1.3rem solid transparent;border-left:1rem solid var(--white);border-top:1.3rem solid transparent;content:'';position:absolute;right:0;top:0}.tag:hover{background-color:var(--red);color:var(--black)}.tag:hover::after{border-left-color:var(--red)} /*# sourceMappingURL=app.css.map */ \ No newline at end of file diff --git a/public/assets/css/app.css.br b/public/assets/css/app.css.br index 5cc0e47f..846d2bfe 100644 Binary files a/public/assets/css/app.css.br and b/public/assets/css/app.css.br differ diff --git a/public/assets/css/app.css.gz b/public/assets/css/app.css.gz index 98685647..bd0c798f 100644 Binary files a/public/assets/css/app.css.gz and b/public/assets/css/app.css.gz differ diff --git a/public/assets/css/app.css.map b/public/assets/css/app.css.map index 9ec13e15..987335b4 100644 --- a/public/assets/css/app.css.map +++ b/public/assets/css/app.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../../resources/assets/sass/_border-box.scss","../../../resources/assets/sass/_base-font.scss","../../../resources/assets/sass/_header.scss","../../../resources/assets/sass/_variables.scss","../../../resources/assets/sass/_main.scss","../../../resources/assets/sass/_hovercard.scss","../../../resources/assets/sass/_notes.scss","../../../resources/assets/sass/_pagination.scss","../../../resources/assets/sass/_contacts-page.scss","../../../resources/assets/sass/_projects.scss","../../../resources/assets/sass/_footer.scss","../../../resources/assets/sass/_bridgy-links.scss","../../../resources/assets/sass/_emoji.scss","../../../resources/assets/sass/_mapbox.scss","../../../resources/assets/sass/_colors.scss","../../../resources/assets/sass/_styles.scss","../../../resources/assets/sass/_tags.scss"],"names":[],"mappings":"AAKA,KACI,8BAAsB,AAAtB,qBAAsB,CACzB,qBAKG,2BAAmB,AAAnB,kBAAmB,CACtB,KCVG,eACA,yBAA0B,CAC7B,gBAGG,oBAAqB,CACxB,WCNG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,kBACA,AADA,cACA,yBACA,AADA,sBACA,AADA,mBACA,WACA,eCJgB,CDKnB,cAGG,eACA,cAAe,CAClB,eAGG,cAAe,CAClB,KEdG,oBACA,AADA,oBACA,AADA,aACA,4BACA,AADA,6BACA,AADA,0BACA,AADA,sBACA,0BACA,AADA,uBACA,AADA,oBACA,gBACA,cACA,gBAAiB,CACpB,SAGG,cAAe,CAClB,WAIG,gBAAiB,CACpB,aCfG,iBAAkB,CACrB,qBAGG,iBAAkB,CACrB,2BAGG,WAAY,CACf,8BAGG,oBAAa,AAAb,oBAAa,AAAb,YAAa,CAChB,WAGG,kBACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBACA,AADA,sBACA,AADA,8BACA,sBACA,AADA,mBACA,AADA,qBACA,iBACA,YACA,WACA,UACA,WACA,uBACA,kBACA,2CACA,AADA,mCACA,YAAa,CAChB,0BAGG,WACA,WAAY,CACf,sBAGG,YAAa,CCnCjB,MACI,oBACA,AADA,oBACA,AADA,aACA,4BACA,AADA,6BACA,AADA,0BACA,AADA,sBACA,cAAe,CAClB,UAGG,eACA,eAAgB,CACnB,eAGG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBAA8B,AAA9B,sBAA8B,AAA9B,6BAA8B,CACjC,MAGG,WACA,UAAW,CACd,YCtBG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,8BACA,AADA,2BACA,AADA,6BACA,eACA,oBAAqB,CACxB,cCLG,eACA,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,8BACA,AADA,+BACA,AADA,2BACA,yBACA,AADA,sBACA,AADA,8BACA,eAAgB,CACnB,kBAGG,WACA,WAAY,CACf,UCVG,cAAe,CAClB,gBCDG,gBACA,cACA,gBAAiB,CACpB,OAGG,gBACA,cACA,oBACA,AADA,oBACA,AADA,aACA,4BACA,AADA,6BACA,AADA,0BACA,AADA,sBACA,yBAAmB,AAAnB,sBAAmB,AAAnB,kBAAmB,CACtB,qDCVG,YAAa,CAChB,sDCCG,iBAAkB,CACrB,gFAIG,kBACA,cACA,UACA,aACA,OACA,cACA,qBACA,yBACA,oBACA,4CACA,AADA,oCACA,yBACA,kCACA,WACA,cACA,0CAAkC,AAAlC,iCAAkC,CACrC,2BAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,AApBC,mBAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,aACI,kCACI,kCAAmC,CACtC,CC/CL,KACI,YAAa,CAChB,oBAGG,kBAAmB,CACtB,QAGG,y4HACA,wBACA,WACA,WAAY,CACf,UAGG,kBACA,MACA,OACA,iBACA,cAAe,CAClB,gBAGG,gBACA,gBAAiB,CACpB,KCzBG,gCACA,kBAAmB,CACtB,WAGG,8BACA,kBAAmB,CACtB,YAIG,iBAAkB,CACrB,aCZG,oBAAqB,CACxB,KAGG,oBAAqB,CACxB,MCHG,SACA,gBACA,SAAU,CACb,SAGG,WACA,oBAAqB,CACxB,KAGG,wBACA,0BACA,mBACA,qBACA,cACA,mBACA,sBACA,kBACA,qBACA,qBACA,8BAAsB,AAAtB,qBAAsB,CACzB,YAGG,0BACA,uCACA,oCACA,oCACA,WACA,kBACA,QACA,KAAM,CACT,WAGG,4BACA,kBAAmB,CACtB,kBAGG,4BAA6B,CAChC","file":"app.css"} \ No newline at end of file +{"version":3,"sources":["../../../resources/assets/sass/_border-box.scss","../../../resources/assets/sass/_base-font.scss","../../../resources/assets/sass/_header.scss","../../../resources/assets/sass/_variables.scss","../../../resources/assets/sass/_main.scss","../../../resources/assets/sass/_hovercard.scss","../../../resources/assets/sass/_notes.scss","../../../resources/assets/sass/_pagination.scss","../../../resources/assets/sass/_contacts-page.scss","../../../resources/assets/sass/_projects.scss","../../../resources/assets/sass/_footer.scss","../../../resources/assets/sass/_bridgy-links.scss","../../../resources/assets/sass/_emoji.scss","../../../resources/assets/sass/_mapbox.scss","../../../resources/assets/sass/_colors.scss","../../../resources/assets/sass/_styles.scss","../../../resources/assets/sass/_tags.scss"],"names":[],"mappings":"AAKA,KACI,8BAAsB,AAAtB,qBAAsB,CACzB,qBAKG,2BAAmB,AAAnB,kBAAmB,CACtB,KCVG,eACA,yBAA0B,CAC7B,gBAGG,oBAAqB,CACxB,WCNG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,kBACA,AADA,cACA,yBACA,AADA,sBACA,AADA,mBACA,WACA,eCJgB,CDKnB,cAGG,eACA,cAAe,CAClB,eAGG,cAAe,CAClB,KEdG,oBACA,AADA,oBACA,AADA,aACA,4BACA,AADA,6BACA,AADA,0BACA,AADA,sBACA,0BACA,AADA,uBACA,AADA,oBACA,gBACA,cACA,gBAAiB,CACpB,SAGG,cAAe,CAClB,WAIG,gBAAiB,CACpB,aCfG,iBAAkB,CACrB,qBAGG,iBAAkB,CACrB,2BAGG,WAAY,CACf,8BAGG,oBAAa,AAAb,oBAAa,AAAb,YAAa,CAChB,WAGG,kBACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBACA,AADA,sBACA,AADA,8BACA,sBACA,AADA,mBACA,AADA,qBACA,iBACA,YACA,WACA,UACA,WACA,uBACA,kBACA,2CACA,AADA,mCACA,YAAa,CAChB,0BAGG,WACA,WAAY,CACf,sBAGG,YAAa,CCnCjB,MACI,oBACA,AADA,oBACA,AADA,aACA,4BACA,AADA,6BACA,AADA,0BACA,AADA,sBACA,cAAe,CAClB,UAGG,eACA,eAAgB,CACnB,eAGG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,yBAA8B,AAA9B,sBAA8B,AAA9B,6BAA8B,CACjC,MAGG,WACA,UAAW,CACd,YCtBG,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,6BACA,AADA,uBACA,AADA,mBACA,8BACA,AADA,2BACA,AADA,6BACA,eACA,oBAAqB,CACxB,cCLG,eACA,oBACA,AADA,oBACA,AADA,aACA,8BACA,AADA,8BACA,AADA,+BACA,AADA,2BACA,yBACA,AADA,sBACA,AADA,8BACA,eAAgB,CACnB,kBAGG,WACA,WAAY,CACf,UCVG,cAAe,CAClB,gBCDG,gBACA,cACA,gBAAiB,CACpB,OAGG,gBACA,cACA,oBACA,AADA,oBACA,AADA,aACA,4BACA,AADA,6BACA,AADA,0BACA,AADA,sBACA,yBAAmB,AAAnB,sBAAmB,AAAnB,kBAAmB,CACtB,qDCVG,YAAa,CAChB,sDCCG,iBAAkB,CACrB,gFAIG,kBACA,cACA,UACA,aACA,OACA,cACA,qBACA,yBACA,oBACA,4CACA,AADA,oCACA,yBACA,kCACA,WACA,cACA,0CAAkC,AAAlC,iCAAkC,CACrC,2BAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,AApBC,mBAGG,KACI,aACA,6BACA,wCACA,0BACA,8BAAkC,AAAlC,qBAAkC,CAGtC,GACI,aACA,kCACA,yBACA,WACA,4CAAgD,AAAhD,mCAAgD,CAAA,CAIxD,aACI,kCACI,kCAAmC,CACtC,CC/CL,KACI,YAAa,CAChB,oBAGG,kBAAmB,CACtB,QAGG,y4HACA,wBACA,WACA,WAAY,CACf,UAGG,kBACA,MACA,OACA,iBACA,cAAe,CAClB,gBAGG,gBACA,gBAAiB,CACpB,KCzBG,gCACA,kBAAmB,CACtB,WAGG,8BACA,kBAAmB,CACtB,YAIG,iBAAkB,CACrB,aCZG,oBAAqB,CACxB,KAGG,oBAAqB,CACxB,MCHG,SACA,gBACA,SAAU,CACb,SAGG,WACA,oBAAqB,CACxB,kBAIG,wBACA,0BACA,mBACA,qBACA,cACA,mBACA,sBACA,kBACA,qBACA,qBACA,8BAAsB,AAAtB,qBAAsB,CACzB,YAGG,0BACA,uCACA,oCACA,oCACA,WACA,kBACA,QACA,KAAM,CACT,WAGG,4BACA,kBAAmB,CACtB,kBAGG,4BAA6B,CAChC","file":"app.css"} \ No newline at end of file diff --git a/resources/assets/js/form-save.js b/resources/assets/js/form-save.js deleted file mode 100644 index 20d8f0a7..00000000 --- a/resources/assets/js/form-save.js +++ /dev/null @@ -1,69 +0,0 @@ -/* global alertify, store */ -var feature = { - addEventListener : !!window.addEventListener, - querySelectorAll : !!document.querySelectorAll -}; - -if (feature.addEventListener && feature.querySelectorAll) { - var keys = getKeys(); - for (var 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]); - } - } -} - -var timerId = window.setInterval(function() { - var saved = false; - var inputs = document.querySelectorAll('input[type=text], textarea'); - for (var i = 0; i < inputs.length; i++) { - var key = getFormElement(inputs[i]).id + '~' + inputs[i].id; - if (store.get(key) !== inputs[i].value && inputs[i].value !== '') { - store.set(key, inputs[i].value); - saved = true; - } - } - if (saved === true) { - alertify.logPosition('top right'); - alertify.success('Auto saved text'); - } -}, 5000); -var forms = document.querySelectorAll('form'); -for (var f = 0; f < forms.length; f++) { - var form = forms[f]; - form.addEventListener('submit', function() { - window.clearInterval(timerId); - var formId = form.id; - var storedKeys = store.keys(); - for (var i = 0; i < storedKeys.length; i++) { - if (storedKeys[i].indexOf(formId) > -1) { - store.remove(storedKeys[i]); - } - } - }); -} -function getKeys() { - var keys = []; - var formFields = document.querySelectorAll('input[type=text], textarea'); - for (var f = 0; f < formFields.length; f++) { - var parent = getFormElement(formFields[f]); - if (parent !== false) { - var key = parent.id + '~' + formFields[f].id; - keys.push(key); - } - } - return keys; -} -function getFormElement(elem) { - if (elem.nodeName.toLowerCase() !== 'body') { - var parent = elem.parentNode; - if (parent.nodeName.toLowerCase() === 'form') { - return parent; - } else { - return getFormElement(parent); - } - } else { - return false; - } -} diff --git a/resources/assets/js/links.js b/resources/assets/js/links.js deleted file mode 100644 index 26403569..00000000 --- a/resources/assets/js/links.js +++ /dev/null @@ -1,39 +0,0 @@ -/* global Autolinker */ -//the autlinker object -var autolinker = new Autolinker(); - -//the youtube regex -var ytidregex = /watch\?v=([A-Za-z0-9\-_]+)/; - -var spotifyregex = /https\:\/\/play\.spotify\.com\/(.*)\b/; - -//grab the notes and loop through them -var notes = document.querySelectorAll('.e-content'); -for (var i = 0; i < notes.length; i++) { - //get Youtube ID - var ytid = notes[i].textContent.match(ytidregex); - if (ytid !== null) { - var yid = ytid[1]; - var 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); - } - //get Spotify ID - var spotifyid = notes[i].textContent.match(spotifyregex); - if (spotifyid !== null) { - var sid = spotifyid[1].replace('/', ':'); - var 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); - } - //now linkify everything - var orig = notes[i].innerHTML; - var linked = autolinker.link(orig); - notes[i].innerHTML = linked; -} diff --git a/resources/assets/js/maps.js b/resources/assets/js/maps.js deleted file mode 100644 index 6d85beea..00000000 --- a/resources/assets/js/maps.js +++ /dev/null @@ -1,50 +0,0 @@ -/* global mapboxgl */ -//This code runs on page load and looks for
, then adds map -var mapDivs = document.querySelectorAll('.map'); -mapboxgl.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiY2l2cDhjYW04MDAwcjJ0cG1uZnhqcm82ayJ9.qA2zeVA-nsoMh9IFrd5KQw'; -for (var i = 0; i < mapDivs.length; i++) { - var mapDiv = mapDivs[i]; - var latitude = mapDiv.dataset.latitude; - var longitude = mapDiv.dataset.longitude; - var el = document.createElement('div'); - el.classList.add('marker'); - var mapMenu = document.createElement('div'); - mapMenu.classList.add('map-menu'); - var streetsInput = document.createElement('input'); - streetsInput.setAttribute('id', 'streets'); - streetsInput.setAttribute('type', 'radio'); - streetsInput.setAttribute('name', 'toggle'); - streetsInput.setAttribute('value', 'streets'); - streetsInput.setAttribute('checked', 'checked'); - streetsInput.addEventListener('click', function () { - map.setStyle('mapbox://styles/mapbox/streets-v9'); - }); - var streetsLabel = document.createElement('label'); - streetsLabel.setAttribute('for', 'streets'); - streetsLabel.appendChild(document.createTextNode('Streets')); - var satelliteInput = document.createElement('input'); - satelliteInput.setAttribute('id', 'satellite'); - satelliteInput.setAttribute('type', 'radio'); - satelliteInput.setAttribute('name', 'toggle'); - satelliteInput.setAttribute('value', 'streets'); - satelliteInput.addEventListener('click', function () { - map.setStyle('mapbox://styles/mapbox/satellite-v9'); - }); - var satelliteLabel = document.createElement('label'); - satelliteLabel.setAttribute('for', 'satellite'); - satelliteLabel.appendChild(document.createTextNode('Satellite')); - mapMenu.appendChild(streetsInput); - mapMenu.appendChild(streetsLabel); - mapMenu.appendChild(satelliteInput); - mapMenu.appendChild(satelliteLabel); - var map = new mapboxgl.Map({ - container: mapDiv, - style: 'mapbox://styles/mapbox/streets-v9', - center: [longitude, latitude], - zoom: 15, - scrollZoom: false - }); - map.addControl(new mapboxgl.NavigationControl()); - new mapboxgl.Marker(el, {offset: [-10, -20]}).setLngLat([longitude, latitude]).addTo(map); - mapDiv.appendChild(mapMenu); -} diff --git a/resources/assets/js/newnote.js b/resources/assets/js/newnote.js deleted file mode 100644 index 384f3721..00000000 --- a/resources/assets/js/newnote.js +++ /dev/null @@ -1,314 +0,0 @@ -/* global mapboxgl, alertify */ -if ('geolocation' in navigator) { - var button = document.querySelector('#locate'); - 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); - } -} - -function getLocation() { - navigator.geolocation.getCurrentPosition(function (position) { - //the locate button has been clicked so add the places/map - addPlacesMap(position.coords.latitude, position.coords.longitude, position.coords.accuracy); - }); -} - -function addPlacesMap(latitude, longitude, uncertainty) { - //get the nearby places - fetch('/places/near/' + latitude + '/' + longitude + '?u=' + uncertainty, { - credentials: 'same-origin', - method: 'get' - }).then(function (response) { - return response.json(); - }).then(function (j) { - if (j.error === true) { - alertify.reset(); - alertify.error(j.error_description); - } - if (j.places.length > 0) { - var i; - var places = []; - for (i = 0; i < j.places.length; ++i) { - var latlng = parseLocation(j.places[i].location); - var name = j.places[i].name; - var uri = j.places[i].uri; - places.push([name, uri, latlng[0], latlng[1]]); - } - //add a map with the nearby places - addMap(latitude, longitude, places); - } else { - //add a map with just current location - addMap(latitude, longitude); - } - }).catch(function (err) { - console.error(err); - }); -} - -function addMap(latitude, longitude, places) { - //make places null if not supplied - if (arguments.length == 2) { - places = null; - } - // the form has a fieldset element that we are actually targetting - var form = document.querySelector('.note-ui'); - var mapDiv = document.createElement('div'); - mapDiv.classList.add('map'); - //add the map div - form.appendChild(mapDiv); - //set up the mapbox gl map - mapboxgl.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiY2l2cDhjYW04MDAwcjJ0cG1uZnhqcm82ayJ9.qA2zeVA-nsoMh9IFrd5KQw'; - var map = new mapboxgl.Map({ - container: mapDiv, - style: 'mapbox://styles/mapbox/streets-v9', - center: [longitude, latitude], - zoom: 15 - }); - map.addControl(new mapboxgl.NavigationControl()); - //create the current location marker - var el = document.createElement('div'); - el.classList.add('marker'); - //create the map style menu - var mapMenu = document.createElement('div'); - mapMenu.classList.add('map-menu'); - var streetsInput = document.createElement('input'); - streetsInput.setAttribute('id', 'streets'); - streetsInput.setAttribute('type', 'radio'); - streetsInput.setAttribute('name', 'toggle'); - streetsInput.setAttribute('value', 'streets'); - streetsInput.setAttribute('checked', 'checked'); - streetsInput.addEventListener('click', function () { - map.setStyle('mapbox://styles/mapbox/streets-v9'); - }); - var streetsLabel = document.createElement('label'); - streetsLabel.setAttribute('for', 'streets'); - streetsLabel.appendChild(document.createTextNode('Streets')); - var satelliteInput = document.createElement('input'); - satelliteInput.setAttribute('id', 'satellite'); - satelliteInput.setAttribute('type', 'radio'); - satelliteInput.setAttribute('name', 'toggle'); - satelliteInput.setAttribute('value', 'streets'); - satelliteInput.addEventListener('click', function () { - map.setStyle('mapbox://styles/mapbox/satellite-v9'); - }); - var satelliteLabel = document.createElement('label'); - satelliteLabel.setAttribute('for', 'satellite'); - satelliteLabel.appendChild(document.createTextNode('Satellite')); - mapMenu.appendChild(streetsInput); - mapMenu.appendChild(streetsLabel); - mapMenu.appendChild(satelliteInput); - mapMenu.appendChild(satelliteLabel); - //add the map menu - mapDiv.appendChild(mapMenu); - //add a marker for the current location - new mapboxgl.Marker(el, {offset: [-10, -20]}).setLngLat([longitude, latitude]).addTo(map); - //create containing div for flexbox - var containingDiv = document.createElement('div'); - //create the - places.forEach(function (item) { - var option = document.createElement('option'); - option.setAttribute('value', item[1]); - var text = document.createTextNode(item[0]); - option.appendChild(text); - option.dataset.latitude = item[2]; - option.dataset.longitude = item[3]; - selectEl.appendChild(option); - var placeMarkerIcon = document.createElement('div'); - placeMarkerIcon.classList.add('marker'); - new mapboxgl.Marker(placeMarkerIcon, {offset: [-10, -20]}).setLngLat([item[3], item[2]]).addTo(map); - placeMarkerIcon.addEventListener('click', function () { - map.flyTo({ - center: [ - item[3], - item[2] - ] - }); - selectPlace(item[1]); - }); - }); - //add an event listener - selectEl.addEventListener('change', function () { - if (selectEl.value !== 'no-location') { - var placeLat = selectEl[selectEl.selectedIndex].dataset.latitude; - var placeLon = selectEl[selectEl.selectedIndex].dataset.longitude; - map.flyTo({ - center: [ - placeLon, - placeLat - ] - }); - } - }); - } - //add a button to add a new place - var newLocButton = document.createElement('button'); - newLocButton.setAttribute('type', 'button'); - newLocButton.setAttribute('id', 'create-new-place'); - newLocButton.appendChild(document.createTextNode('Create New Place?')); - //the event listener - newLocButton.addEventListener('click', function() { - //add the form elements - var nameDiv = document.createElement('div'); - var nameLabel = document.createElement('label'); - nameLabel.setAttribute('for', 'place-name'); - nameLabel.classList.add('place-label'); - nameLabel.appendChild(document.createTextNode('Place Name:')); - var nameEl = document.createElement('input'); - nameEl.setAttribute('placeholder', 'Name'); - nameEl.setAttribute('name', 'place-name'); - nameEl.setAttribute('id', 'place-name'); - nameEl.setAttribute('type', 'text'); - nameDiv.appendChild(nameLabel); - nameDiv.appendChild(nameEl); - var descDiv = document.createElement('div'); - var descLabel = document.createElement('label'); - descLabel.setAttribute('for', 'place-description'); - descLabel.classList.add('place-label'); - descLabel.appendChild(document.createTextNode('Place Description:')); - var descEl = document.createElement('input'); - descEl.setAttribute('placeholder', 'Description'); - descEl.setAttribute('name', 'place-description'); - descEl.setAttribute('id', 'place-description'); - descEl.setAttribute('type', 'text'); - descDiv.appendChild(descLabel); - descDiv.appendChild(descEl); - var latDiv = document.createElement('div'); - var latLabel = document.createElement('label'); - latLabel.setAttribute('for', 'place-latitude'); - latLabel.classList.add('place-label'); - latLabel.appendChild(document.createTextNode('Place Latitude:')); - var latEl = document.createElement('input'); - latEl.setAttribute('name', 'place-latitude'); - latEl.setAttribute('id', 'place-latitude'); - latEl.setAttribute('type', 'text'); - latEl.value = getLatitudeFromMapbox(map.getCenter()); - latDiv.appendChild(latLabel); - latDiv.appendChild(latEl); - var lonDiv = document.createElement('div'); - var lonLabel = document.createElement('label'); - lonLabel.setAttribute('for', 'place-longitude'); - lonLabel.classList.add('place-label'); - lonLabel.appendChild(document.createTextNode('Place Longitude:')); - var lonEl = document.createElement('input'); - lonEl.setAttribute('name', 'place-longitude'); - lonEl.setAttribute('id', 'place-longitude'); - lonEl.setAttribute('type', 'text'); - lonEl.value = getLongitudeFromMapbox(map.getCenter()); - lonDiv.appendChild(lonLabel); - lonDiv.appendChild(lonEl); - var placeSubmit = document.createElement('button'); - placeSubmit.setAttribute('id', 'place-submit'); - placeSubmit.setAttribute('value', 'Submit New Place'); - placeSubmit.setAttribute('name', 'place-submit'); - placeSubmit.setAttribute('type', 'button'); - placeSubmit.appendChild(document.createTextNode('Submit New Place')); - form.appendChild(nameDiv); - form.appendChild(descDiv); - form.appendChild(latDiv); - form.appendChild(lonDiv); - form.appendChild(placeSubmit); - //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); - }); - }); - }); - containingDiv.appendChild(newLocButton); -} - -function parseLocation(point) { - var re = /\((.*)\)/; - var resultArray = re.exec(point); - var location = resultArray[1].split(' '); - - return [location[1], location[0]]; -} - -function selectPlace(uri) { - document.querySelector('select [value="' + uri + '"]').selected = true; -} - -function getLatitudeFromMapbox(lnglat) { - var resultArray = /\((.*)\)/.exec(lnglat); - var location = resultArray[1].split(' '); - - return location[1]; -} - -function getLongitudeFromMapbox(lnglat) { - var resultArray = /\((.*)\)/.exec(lnglat); - var location = resultArray[1].split(' '); - - return location[0].replace(',', ''); -} diff --git a/resources/assets/js/newplace.js b/resources/assets/js/newplace.js deleted file mode 100644 index 548b5fff..00000000 --- a/resources/assets/js/newplace.js +++ /dev/null @@ -1,44 +0,0 @@ -/* global L */ -var button = document.querySelector('#locate'); - -if (button.addEventListener) { - button.addEventListener('click', getLocation); -} else { - button.attachEvent('onclick', getLocation); -} - -function getLocation() { - if ('geolocation' in navigator) { - navigator.geolocation.getCurrentPosition(function(position) { - updateForm(position.coords.latitude, position.coords.longitude); - addMap(position.coords.latitude, position.coords.longitude); - }); - } -} - -function updateForm(latitude, longitude) { - var inputLatitude = document.querySelector('#latitude'); - var inputLongitude = document.querySelector('#longitude'); - inputLatitude.value = latitude; - inputLongitude.value = longitude; -} - -function addMap(latitude, longitude) { - var form = document.querySelector('form'); - var div = document.createElement('div'); - div.setAttribute('id', 'map'); - form.appendChild(div); - L.mapbox.accessToken = 'pk.eyJ1Ijoiam9ubnliYXJuZXMiLCJhIjoiVlpndW1EYyJ9.aP9fxAqLKh7lj0LpFh5k1w'; - var map = L.mapbox.map('map', 'jonnybarnes.gnoihnim') - .setView([latitude, longitude], 15) - .addLayer(L.mapbox.tileLayer('jonnybarnes.gnoihnim', { - detectRetina: true - })); - var marker = L.marker([latitude, longitude], { - draggable: true - }).addTo(map); - marker.on('dragend', function () { - var markerLocation = marker.getLatLng(); - updateForm(markerLocation.lat, markerLocation.lng); - }); -} diff --git a/resources/assets/sass/_tags.scss b/resources/assets/sass/_tags.scss index 0baa01e6..c568687b 100644 --- a/resources/assets/sass/_tags.scss +++ b/resources/assets/sass/_tags.scss @@ -13,7 +13,8 @@ list-style-type: none; } -.tag { +.tag, +.tag:visited { background: var(--white); border-radius: 3px 0 0 3px; color: var(--black); diff --git a/resources/views/notes/tagged.blade.php b/resources/views/notes/tagged.blade.php index 98d349e9..2c1d8b2f 100644 --- a/resources/views/notes/tagged.blade.php +++ b/resources/views/notes/tagged.blade.php @@ -5,7 +5,7 @@ @section('content')

Notes tagged with {{ $tag }}

@foreach ($notes as $note) -
+
{!! $note->note !!} {{ $note->humandiff }}