diff --git a/VERSION b/VERSION index 276cbf9e2858c779297bb9f73b34170302949ec4..197c4d5c2d7c724b4cd0048f4e3574bb3fa5c8db 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.3.0 +2.4.0 diff --git a/lib/PZ/Controller/Shortcut.pm b/lib/PZ/Controller/Shortcut.pm index 6787f93116e061357012cab29b34ab687e1d0cfc..2e7b354497ef3c55d81e3f4f0598b2a51f1db669 100644 --- a/lib/PZ/Controller/Shortcut.pm +++ b/lib/PZ/Controller/Shortcut.pm @@ -3,6 +3,7 @@ use Mojo::Base 'Mojolicious::Controller', -signatures; use Data::Validate::URI qw(is_uri); use Image::PNG::QRCode 'qrpng'; +use Mojo::UserAgent; use constant SHORTCUT => qr/^[a-z\d\-]{1,8}$/; @@ -49,7 +50,7 @@ sub create ($c) { $c->openapi->valid_input or return; my $args = $c->req->json; - my $url = $args->{url}; + my $url = $c->sanitize_url($args->{url}); return $c->error(400, 'Chybná URL adresa!') if ! is_uri($url); my $custom = lc($args->{shortcut}); @@ -65,8 +66,16 @@ sub create ($c) { return $c->error(400, "Zkratka $custom už je použitá") if $exists; } + my $title = ''; + my $ua = Mojo::UserAgent->new; + + eval { + $title = $ua->get($url)->result->dom->at('title')->text; + }; + my $shortcut = $c->user->add_to_shortcuts({ - url => $c->sanitize_url($url), + url => $url, + title => $title, shortcut => ($custom || $c->schema->resultset('Shortcut')->generate()) }); @@ -85,8 +94,9 @@ sub update ($c) { my $shortcut = $c->shortcut() || return; return $c->error(400, 'Chybná URL adresa!') if ! is_uri($c->req->json->{url}); $shortcut->update({ - code => $c->req->json->{code}, - url => $c->req->json->{url}, + code => $c->req->json->{code}, + url => $c->req->json->{url}, + title => $c->req->json->{title}, }); $c->render(status => 204, text => '' ); } diff --git a/openapi.yaml b/openapi.yaml index cc8b71bd9a760339fb1180ccec5d208cf8e4f336..578a1e964be305236fca973796a0bc920444a044 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -37,6 +37,10 @@ components: type: string description: URL pro přesměrování maxLength: 1024 + title: + type: string + description: Titulek stránky + maxLength: 4096 code: type: integer description: Kód přesměrování diff --git a/templates/shortcuts.html.ep b/templates/shortcuts.html.ep index 8c580ca0e4faa36132140c4616dde4b86a951e76..f2fc2967d0c1e309adca8dbd30d96fd8a238926e 100644 --- a/templates/shortcuts.html.ep +++ b/templates/shortcuts.html.ep @@ -41,11 +41,11 @@ </thead> <tbody> <tr v-for="shortcut in shortcuts" > - <td class="text-bold w-32" @click="showEdit(shortcut)" >{{shortcut.shortcut}}</td> - <td class="text-bold w-32" @click="showEdit(shortcut)" >{{ formatTimestamp(shortcut.created) }}</td> - <td v-bind:title="shortcut.url" @click="showEdit(shortcut)" >{{ stripURL(shortcut.url) }}</td> - <td class="w-24" @click="showEdit(shortcut)">{{ shortcut.code == 301 ? '301 trvalé' : '302 dočasné'}}</td> - <td class="w-16 text-right" @click="showEdit(shortcut)">{{shortcut.counter}}</td> + <td v-bind:title="shortcut.title" class="text-bold w-32" @click="showInfo(shortcut)" >{{shortcut.shortcut}}</td> + <td class="text-bold w-32" @click="showInfo(shortcut)" >{{ formatTimestamp(shortcut.created) }}</td> + <td v-bind:title="shortcut.url" @click="showInfo(shortcut)" >{{ stripURL(shortcut.url) }}</td> + <td class="w-24" @click="showInfo(shortcut)">{{ shortcut.code == 301 ? '301 trvalé' : '302 dočasné'}}</td> + <td class="w-16 text-right" @click="showInfo(shortcut)">{{shortcut.counter}}</td> <td class="w-40"> <i class="ico--link cursor-pointer mx-1" @click="showInfo(shortcut)" title="Zkopirovat odkaz"></i> <i class="ico--calendar cursor-pointer mx-1" @click="window.location.href ='/shortcut/' + shortcut.id" title="Statistika"></i> @@ -65,7 +65,7 @@ <div class="card__body w-80 text-center"> <p class="card-body-text">Zkratka byla zkopírovana do schránky. Pro její sdílení můžete používat i QR kód</p> <img v-bind:src="'/' + selectedShortcut.shortcut + '/qr.png'" class="mx-auto my-8"> - <b>{{ selectedShortcut.full_url }}</b> + <b><a v-bind:href="selectedShortcut.full_url">{{ selectedShortcut.full_url }}</a></b> </div> </div> </div> @@ -111,7 +111,7 @@ <form class="my-4"> - <div class="form-field form-field--error form-field--required mb-4"> + <div class="form-field form-field--required mb-4"> <label class="form-field__label" for="url">URL</label> <div class="form-field__wrapper form-field__wrapper--shadowed"> <input type="text" class="text-input form-field__control form-field--required" value="" v-model="selectedShortcut.url" id="url" /> @@ -119,7 +119,7 @@ <div class="form-field__error" v-if="selectedShortcut.url === ''"></div> </div> - <div class="form-field form-field--error form-field--required mb-4"> + <div class="form-field form-field--required mb-4"> <label class="form-field__label" for="code">Typ přesměrování</label> <div class="form-field__wrapper form-field__wrapper--shadowed select"> <select v-model="selectedShortcut.code" class="select__control form-field__control "> @@ -127,7 +127,13 @@ <option value="302">302 dočasné</option> </select> </div> - <div class="form-field__error" v-if="shortcut.url === ''"></div> + </div> + + <div class="form-field mb-4"> + <label class="form-field__label" for="code">Titulek</label> + <div class="form-field__wrapper form-field__wrapper--shadowed"> + <textarea class="text-input form-field__control" v-model="selectedShortcut.title" rows="5" cols="40" placeholder="Titulek stránky"></textarea> + </div> </div> <button class="btn btn--grey-500 btn--hoveractive" @click.prevent="updateShortcut">