From 3e61b9de48b7285b172d406cd3cb8f75e086e83a Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Thu, 14 Nov 2019 17:47:06 +0100 Subject: Copy share text to clipboard if sharing API is unavailable Closes #24 --- public/service-worker.js | 26 +++++++++++++------------- public/static/css/material-icons.css | 8 ++++---- public/static/js/travelynx-actions.js | 17 ++++++++++++++--- public/static/js/travelynx-actions.min.js | 2 +- public/static/manifest.json | 12 ++++++------ public/static/v27 | 1 - public/static/v29 | 1 + templates/layouts/default.html.ep | 2 +- 8 files changed, 40 insertions(+), 29 deletions(-) delete mode 120000 public/static/v27 create mode 120000 public/static/v29 diff --git a/public/service-worker.js b/public/service-worker.js index 2c7a29e..8dfaa8b 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,19 +1,19 @@ -const CACHE_NAME = 'static-cache-v28'; +const CACHE_NAME = 'static-cache-v29'; const FILES_TO_CACHE = [ '/favicon.ico', '/offline.html', - '/static/v28/css/light.min.css', - '/static/v28/css/dark.min.css', - '/static/v28/css/material-icons.css', - '/static/v28/css/local.css', - '/static/v28/fonts/MaterialIcons-Regular.woff2', - '/static/v28/fonts/MaterialIcons-Regular.woff', - '/static/v28/fonts/MaterialIcons-Regular.ttf', - '/static/v28/js/jquery-3.4.1.min.js', - '/static/v28/js/materialize.min.js', - '/static/v28/js/travelynx-actions.min.js', - '/static/v28/js/autocomplete.min.js', - '/static/v28/js/geolocation.min.js', + '/static/v29/css/light.min.css', + '/static/v29/css/dark.min.css', + '/static/v29/css/material-icons.css', + '/static/v29/css/local.css', + '/static/v29/fonts/MaterialIcons-Regular.woff2', + '/static/v29/fonts/MaterialIcons-Regular.woff', + '/static/v29/fonts/MaterialIcons-Regular.ttf', + '/static/v29/js/jquery-3.4.1.min.js', + '/static/v29/js/materialize.min.js', + '/static/v29/js/travelynx-actions.min.js', + '/static/v29/js/autocomplete.min.js', + '/static/v29/js/geolocation.min.js', ]; self.addEventListener('install', (evt) => { diff --git a/public/static/css/material-icons.css b/public/static/css/material-icons.css index 2dcc948..cb51353 100644 --- a/public/static/css/material-icons.css +++ b/public/static/css/material-icons.css @@ -2,12 +2,12 @@ font-family: 'Material Icons'; font-style: normal; font-weight: 400; - src: url(/static/v28/fonts/MaterialIcons-Regular.eot); /* For IE6-8 */ + src: url(/static/v29/fonts/MaterialIcons-Regular.eot); /* For IE6-8 */ src: local('Material Icons'), local('MaterialIcons-Regular'), - url(/static/v28/fonts/MaterialIcons-Regular.woff2) format('woff2'), - url(/static/v28/fonts/MaterialIcons-Regular.woff) format('woff'), - url(/static/v28/fonts/MaterialIcons-Regular.ttf) format('truetype'); + url(/static/v29/fonts/MaterialIcons-Regular.woff2) format('woff2'), + url(/static/v29/fonts/MaterialIcons-Regular.woff) format('woff'), + url(/static/v29/fonts/MaterialIcons-Regular.ttf) format('truetype'); } .material-icons { diff --git a/public/static/js/travelynx-actions.js b/public/static/js/travelynx-actions.js index 92a0a58..d6ceb87 100644 --- a/public/static/js/travelynx-actions.js +++ b/public/static/js/travelynx-actions.js @@ -202,16 +202,27 @@ function tvly_reg_handlers() { } }); $('.action-share').click(function() { + var text = $(this).data('text'); if (navigator.share) { shareObj = { - text: $(this).data('text') + text: text }; if ($(this).data('url')) { shareObj['url'] = $(this).data('url'); } navigator.share(shareObj); - } else if ($(this).data('url')) { - location.href = $(this).data('url'); + } else { + var el = document.createElement('textarea'); + el.value = text; + el.setAttribute('readonly', ''); + el.style.position = 'absolute'; + el.style.left = '-9999px'; + document.body.appendChild(el); + el.select(); + el.setSelectionRange(0, 99999); + document.execCommand('copy'); + document.body.removeChild(el); + M.toast({html: 'Text kopiert: „' + text + '“'}); } }); if ($('.action-share').length && !navigator.share && !$('.action-share').data('url')) { diff --git a/public/static/js/travelynx-actions.min.js b/public/static/js/travelynx-actions.min.js index fdfeab8..c955a06 100644 --- a/public/static/js/travelynx-actions.min.js +++ b/public/static/js/travelynx-actions.min.js @@ -1 +1 @@ -function upd_journey_data(){$(".countdown").each(function(){var t=$(this).data("journey");t&&(t=t.split(";"),j_departure=parseInt(t[0]),j_arrival=parseInt(t[1]),j_duration=j_arrival-j_departure);var a=$(this).data("dest");a&&(j_dest=a);var e=$(this).data("route");if(e){e=e.split("|"),j_stops=[];for(var n in e){for(var r=e[n].split(";"),o=1;o<5;o++)r[o]=parseInt(r[o]);j_stops.push(r)}}})}function upd_countdown(){var t=Date.now()/1e3;j_departure>t?$(".countdown").text("Abfahrt in "+Math.round((j_departure-t)/60)+" Minuten"):j_arrival>0&&(j_arrival>t?$(".countdown").text("Ankunft in "+Math.round((j_arrival-t)/60)+" Minuten"):$(".countdown").text("Ziel erreicht"))}function hhmm(t){var a=new Date(1e3*t),e=a.getHours(),n=a.getMinutes();return(e<10?"0"+e:e)+":"+(n<10?"0"+n:n)}function odelay(t,a){return t
');t.hide(),t.after(r),$.post("/action",a,function(a){a.success?$(location).attr("href",a.redirect_to):(M.toast({html:n+" "+a.error}),r.remove(),e&&e(),t.append(" "+n),t.show())})}function tvly_update(){$.get("/ajax/status_card.html",function(t){$(".statuscol").html(t),tvly_reg_handlers(),upd_journey_data(),setTimeout(tvly_update,4e4)}).fail(function(){$(".sync-failed-marker").css("display","block"),upd_countdown(),setTimeout(tvly_update,5e3)})}function tvly_update_public(){var t;$(".publicstatuscol").each(function(){t=$(this).data("user")}),$.get("/ajax/status/"+t+".html",function(t){$(".publicstatuscol").html(t),upd_journey_data(),setTimeout(tvly_update_public,4e4)}).fail(function(){$(".sync-failed-marker").css("display","block"),upd_countdown(),setTimeout(tvly_update_public,5e3)})}function tvly_journey_progress(){var t=Date.now()/1e3,a=0;if(j_duration>0){a=1-(j_arrival-t)/j_duration,a<0&&(a=0),a>1&&(a=1),$(".progress .determinate").css("width",100*a+"%");for(stop in j_stops){var e=j_stops[stop][0],n=j_stops[stop][1],r=j_stops[stop][2],o=j_stops[stop][3],i=j_stops[stop][4];if(e==j_dest){$(".next-stop").html("");break}if(0!=r&&r-t>0){$(".next-stop").html(e+"
"+hhmm(r)+odelay(n,r));break}if(0!=i&&i-t>0){$(".next-stop").html(e+"
"+hhmm(r)+" → "+hhmm(i)+odelay(o,i));break}}setTimeout(tvly_journey_progress,5e3)}}function tvly_reg_handlers(){$(".action-checkin").click(function(){var t=$(this);tvly_run(t,{action:"checkin",station:t.data("station"),train:t.data("train"),dest:t.data("dest")})}),$(".action-checkout").click(function(){var t=$(this),a={action:"checkout",station:t.data("station"),force:t.data("force")};tvly_run(t,a,function(){t.append(" – Ohne Echtzeitdaten auschecken?"),t.data("force",!0)})}),$(".action-undo").click(function(){var t=$(this);tvly_run(t,{action:"undo",undo_id:t.data("id")})}),$(".action-cancelled-from").click(function(){var t=$(this);tvly_run(t,{action:"cancelled_from",station:t.data("station"),train:t.data("train")})}),$(".action-cancelled-to").click(function(){var t=$(this);tvly_run(t,{action:"cancelled_to",station:t.data("station"),force:!0})}),$(".action-delete").click(function(){var t=$(this),a={action:"delete",id:t.data("id"),checkin:t.data("checkin"),checkout:t.data("checkout")};really_delete=confirm("Diese Zugfahrt wirklich löschen? Der Eintrag wird sofort aus der Datenbank entfernt und kann nicht wiederhergestellt werden."),really_delete&&tvly_run(t,a)}),$(".action-share").click(function(){navigator.share?(shareObj={text:$(this).data("text")},$(this).data("url")&&(shareObj.url=$(this).data("url")),navigator.share(shareObj)):$(this).data("url")&&(location.href=$(this).data("url"))}),!$(".action-share").length||navigator.share||$(".action-share").data("url")||$(".action-share").css("display","none")}var j_departure=0,j_duration=0,j_arrival=0,j_dest="",j_stops=[];$(document).ready(function(){tvly_reg_handlers(),$(".statuscol .autorefresh").length&&(upd_journey_data(),setTimeout(tvly_update,4e4),setTimeout(tvly_journey_progress,5e3)),$(".publicstatuscol .autorefresh").length&&(upd_journey_data(),setTimeout(tvly_update_public,4e4),setTimeout(tvly_journey_progress,5e3)),$("a[href]").click(function(){$("nav .preloader-wrapper").addClass("active")})}); +var j_departure=0,j_duration=0,j_arrival=0,j_dest="",j_stops=[];function upd_journey_data(){$(".countdown").each(function(){var t=$(this).data("journey");t&&(t=t.split(";"),j_departure=parseInt(t[0]),j_arrival=parseInt(t[1]),j_duration=j_arrival-j_departure);var e=$(this).data("dest");e&&(j_dest=e);var a=$(this).data("route");if(a)for(var n in a=a.split("|"),j_stops=[],a){for(var o=a[n].split(";"),r=1;r<5;r++)o[r]=parseInt(o[r]);j_stops.push(o)}})}function upd_countdown(){var t=Date.now()/1e3;t
');e.hide(),e.after(o),$.post("/action",t,function(t){t.success?$(location).attr("href",t.redirect_to):(M.toast({html:n+" "+t.error}),o.remove(),a&&a(),e.append(" "+n),e.show())})}function tvly_update(){$.get("/ajax/status_card.html",function(t){$(".statuscol").html(t),tvly_reg_handlers(),upd_journey_data(),setTimeout(tvly_update,4e4)}).fail(function(){$(".sync-failed-marker").css("display","block"),upd_countdown(),setTimeout(tvly_update,5e3)})}function tvly_update_public(){var t;$(".publicstatuscol").each(function(){t=$(this).data("user")}),$.get("/ajax/status/"+t+".html",function(t){$(".publicstatuscol").html(t),upd_journey_data(),setTimeout(tvly_update_public,4e4)}).fail(function(){$(".sync-failed-marker").css("display","block"),upd_countdown(),setTimeout(tvly_update_public,5e3)})}function tvly_journey_progress(){var t=Date.now()/1e3,e=0;if(0"+hhmm(o)+odelay(n,o));break}if(0!=i&&0"+hhmm(o)+" → "+hhmm(i)+odelay(r,i));break}}setTimeout(tvly_journey_progress,5e3)}}function tvly_reg_handlers(){$(".action-checkin").click(function(){var t=$(this),e={action:"checkin",station:t.data("station"),train:t.data("train"),dest:t.data("dest")};tvly_run(t,e)}),$(".action-checkout").click(function(){var t=$(this),e={action:"checkout",station:t.data("station"),force:t.data("force")};tvly_run(t,e,function(){t.append(" – Ohne Echtzeitdaten auschecken?"),t.data("force",!0)})}),$(".action-undo").click(function(){var t=$(this),e={action:"undo",undo_id:t.data("id")};tvly_run(t,e)}),$(".action-cancelled-from").click(function(){var t=$(this),e={action:"cancelled_from",station:t.data("station"),train:t.data("train")};tvly_run(t,e)}),$(".action-cancelled-to").click(function(){var t=$(this),e={action:"cancelled_to",station:t.data("station"),force:!0};tvly_run(t,e)}),$(".action-delete").click(function(){var t=$(this),e={action:"delete",id:t.data("id"),checkin:t.data("checkin"),checkout:t.data("checkout")};really_delete=confirm("Diese Zugfahrt wirklich löschen? Der Eintrag wird sofort aus der Datenbank entfernt und kann nicht wiederhergestellt werden."),really_delete&&tvly_run(t,e)}),$(".action-share").click(function(){var t=$(this).data("text");if(navigator.share)shareObj={text:t},$(this).data("url")&&(shareObj.url=$(this).data("url")),navigator.share(shareObj);else{var e=document.createElement("textarea");e.value=t,e.setAttribute("readonly",""),e.style.position="absolute",e.style.left="-9999px",document.body.appendChild(e),e.select(),e.setSelectionRange(0,99999),document.execCommand("copy"),document.body.removeChild(e),M.toast({html:"Text kopiert: „"+t+"“"})}}),!$(".action-share").length||navigator.share||$(".action-share").data("url")||$(".action-share").css("display","none")}$(document).ready(function(){tvly_reg_handlers(),$(".statuscol .autorefresh").length&&(upd_journey_data(),setTimeout(tvly_update,4e4),setTimeout(tvly_journey_progress,5e3)),$(".publicstatuscol .autorefresh").length&&(upd_journey_data(),setTimeout(tvly_update_public,4e4),setTimeout(tvly_journey_progress,5e3)),$("a[href]").click(function(){$("nav .preloader-wrapper").addClass("active")})}); diff --git a/public/static/manifest.json b/public/static/manifest.json index 7f65a92..d3bdd2e 100644 --- a/public/static/manifest.json +++ b/public/static/manifest.json @@ -3,27 +3,27 @@ "short_name": "Travelynx", "scope": "/", "icons": [{ - "src": "/static/v28/icons/icon-128x128.png", + "src": "/static/v29/icons/icon-128x128.png", "sizes": "128x128", "type": "image/png" }, { - "src": "/static/v28/icons/icon-144x144.png", + "src": "/static/v29/icons/icon-144x144.png", "sizes": "144x144", "type": "image/png" }, { - "src": "/static/v28/icons/icon-152x152.png", + "src": "/static/v29/icons/icon-152x152.png", "sizes": "152x152", "type": "image/png" }, { - "src": "/static/v28/icons/icon-192x192.png", + "src": "/static/v29/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/static/v28/icons/icon-256x256.png", + "src": "/static/v29/icons/icon-256x256.png", "sizes": "256x256", "type": "image/png" }, { - "src": "/static/v28/icons/icon-512x512.png", + "src": "/static/v29/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png" }], diff --git a/public/static/v27 b/public/static/v27 deleted file mode 120000 index 945c9b4..0000000 --- a/public/static/v27 +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file diff --git a/public/static/v29 b/public/static/v29 new file mode 120000 index 0000000..945c9b4 --- /dev/null +++ b/public/static/v29 @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep index 59885b6..e4e55ff 100644 --- a/templates/layouts/default.html.ep +++ b/templates/layouts/default.html.ep @@ -10,7 +10,7 @@ % while (my ($key, $value) = each %{stash('twitter') // {}}) { % } - % my $av = 'v28'; # asset version + % my $av = 'v29'; # asset version -- cgit v1.2.3