From 60e157ff712d120e4339cb8af044a75aa5f8efa5 Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Sun, 4 Oct 2015 19:44:51 +0200 Subject: [PATCH] Fix #3 --- lib/Lufi/Controller/Files.pm | 31 ++++++++--- lib/Lufi/I18N/en.po | 49 +++++++++-------- lib/Lufi/I18N/fr.po | 55 +++++++++++-------- public/css/fontello-codes.css | 3 +- public/css/fontello-embedded.css | 15 +++--- public/css/fontello-ie7-codes.css | 3 +- public/css/fontello-ie7.css | 3 +- public/css/fontello.css | 15 +++--- public/font/README.txt | 75 ++++++++++++++++++++++++++ public/font/fontello.eot | Bin 6168 -> 6276 bytes public/font/fontello.svg | 1 + public/font/fontello.ttf | Bin 6000 -> 6108 bytes public/font/fontello.woff | Bin 3584 -> 3648 bytes public/fontello-config.json | 6 +++ public/js/lufi-down.js | 1 + public/js/lufi-files.js | 84 ++++++++++++++++++++++++++++++ templates/files.html.ep | 74 ++++---------------------- templates/mail.html.ep | 1 - 18 files changed, 282 insertions(+), 134 deletions(-) create mode 100644 public/font/README.txt create mode 100644 public/js/lufi-files.js diff --git a/lib/Lufi/Controller/Files.pm b/lib/Lufi/Controller/Files.pm index f8bd473..aba246a 100644 --- a/lib/Lufi/Controller/Files.pm +++ b/lib/Lufi/Controller/Files.pm @@ -217,19 +217,34 @@ sub get_counter { my $short = $c->param('short'); my $token = $c->param('token'); - my @records = LufiDB::Files->select('WHERE short = ? AND mod_token = ?', ($short, $token)); + my @records = LufiDB::Files->select('WHERE short = ?', $short); if (scalar(@records)) { - return $c->render( - json => { - success => true, - counter => $records[0]->counter - } - ); + if ($records[0]->mod_token eq $token) { + return $c->render( + json => { + success => true, + short => $short, + counter => $records[0]->counter, + deleted => ($records[0]->deleted) ? true : false + } + ); + } else { + return $c->render( + json => { + success => false, + missing => false, + short => $short, + msg => $c->l('Unable to get counter for %1. The token is unvalid.', $short) + } + ); + } } else { return $c->render( json => { success => false, - msg => $c->l('Unable to get counter for %1. The file does not exists.', $short) + missing => true, + short => $short, + msg => $c->l('Unable to get counter for %1. The file does not exists. It will be removed from your localStorage.', $short) } ); } diff --git a/lib/Lufi/I18N/en.po b/lib/Lufi/I18N/en.po index 5dbf180..a401c67 100644 --- a/lib/Lufi/I18N/en.po +++ b/lib/Lufi/I18N/en.po @@ -29,14 +29,10 @@ msgstr "" msgid "24 hours" msgstr "" -#: templates/mail.html.ep:70 +#: templates/mail.html.ep:69 msgid ":" msgstr "" -#: templates/files.html.ep:84 -msgid ": Error while trying to get the counter." -msgstr "" - #: templates/layouts/default.html.ep:41 msgid "About" msgstr "" @@ -57,7 +53,7 @@ msgstr "" msgid "Copy to clipboard" msgstr "" -#: lib/Lufi/Controller/Files.pm:267 +#: lib/Lufi/Controller/Files.pm:282 msgid "Could not find the file. Are you sure of the URL and the token?" msgstr "" @@ -65,15 +61,15 @@ msgstr "" msgid "Could not find the file. Are you sure of the URL?" msgstr "" -#: templates/files.html.ep:15 +#: templates/files.html.ep:16 msgid "Counter" msgstr "" -#: templates/files.html.ep:16 templates/index.html.ep:52 +#: templates/files.html.ep:17 templates/index.html.ep:52 msgid "Delete at first download?" msgstr "" -#: templates/files.html.ep:19 templates/index.html.ep:79 +#: templates/files.html.ep:20 templates/index.html.ep:79 msgid "Deletion link" msgstr "" @@ -85,7 +81,7 @@ msgstr "" msgid "Download" msgstr "" -#: templates/files.html.ep:14 templates/index.html.ep:80 +#: templates/files.html.ep:15 templates/index.html.ep:80 msgid "Download link" msgstr "" @@ -121,19 +117,19 @@ msgstr "" msgid "Expiration:" msgstr "" -#: templates/files.html.ep:18 +#: templates/files.html.ep:19 msgid "Expires at" msgstr "" -#: lib/Lufi/Controller/Files.pm:251 +#: lib/Lufi/Controller/Files.pm:266 msgid "File deleted" msgstr "" -#: templates/files.html.ep:13 +#: templates/files.html.ep:14 msgid "File name" msgstr "" -#: templates/mail.html.ep:65 +#: templates/mail.html.ep:64 msgid "Hello,\\n\\nHere's some files I want to share with you:\\n" msgstr "" @@ -178,11 +174,11 @@ msgstr "" msgid "No enough space available on the server for this file (size: %1)." msgstr "" -#: templates/files.html.ep:34 templates/index.html.ep:86 +#: templates/index.html.ep:86 msgid "No expiration delay" msgstr "" -#: templates/files.html.ep:6 +#: templates/files.html.ep:7 msgid "Only the files sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you'll loose this informations." msgstr "" @@ -190,6 +186,10 @@ msgstr "" msgid "Please wait while we are getting your file" msgstr "" +#: templates/files.html.ep:6 +msgid "Purge expired files from localStorage" +msgstr "" + #: templates/index.html.ep:85 msgid "Send all links by email" msgstr "" @@ -203,7 +203,7 @@ msgid "Send with your own mail software" msgstr "" #. (url_for('/') -#: templates/mail.html.ep:78 +#: templates/mail.html.ep:77 msgid "Share your files in total privacy on %1" msgstr "" @@ -223,7 +223,7 @@ msgstr "" msgid "The email subject can't be empty." msgstr "" -#: lib/Lufi/Controller/Files.pm:248 +#: lib/Lufi/Controller/Files.pm:263 msgid "The file has already been deleted" msgstr "" @@ -241,15 +241,20 @@ msgid "This server sets limitations according to the file size. The expiration d msgstr "" #. ($short) -#: lib/Lufi/Controller/Files.pm:232 -msgid "Unable to get counter for %1. The file does not exists." +#: lib/Lufi/Controller/Files.pm:247 +msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage." +msgstr "" + +#. ($short) +#: lib/Lufi/Controller/Files.pm:237 +msgid "Unable to get counter for %1. The token is unvalid." msgstr "" #: templates/layouts/default.html.ep:39 msgid "Upload files" msgstr "" -#: templates/files.html.ep:17 +#: templates/files.html.ep:18 msgid "Uploaded at" msgstr "" @@ -288,7 +293,7 @@ msgstr "" msgid "between %1 and %2, the file will be kept forever." msgstr "" -#: templates/mail.html.ep:72 +#: templates/mail.html.ep:71 msgid "deadline: " msgstr "" diff --git a/lib/Lufi/I18N/fr.po b/lib/Lufi/I18N/fr.po index 03cd749..285d5d0 100644 --- a/lib/Lufi/I18N/fr.po +++ b/lib/Lufi/I18N/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2015-10-04 16:33+0200\n" +"PO-Revision-Date: 2015-10-04 19:44+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,7 +19,8 @@ msgstr "" #. ($delay) #. (max_delay) -#: templates/index.html.ep:29 templates/index.html.ep:38 templates/index.html.ep:39 +#: templates/index.html.ep:29 templates/index.html.ep:38 +#: templates/index.html.ep:39 msgid "%1 days" msgstr "%1 jours" @@ -31,11 +32,10 @@ msgstr "1 an" msgid "24 hours" msgstr "24 heures" -#: templates/mail.html.ep:70 +#: templates/mail.html.ep:69 msgid ":" msgstr " :" -#: templates/files.html.ep:84 msgid ": Error while trying to get the counter." msgstr " : erreur en essayant de récupérer le compteur" @@ -59,7 +59,7 @@ msgstr "Copier tous les liens dans le presse-papier" msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" -#: lib/Lufi/Controller/Files.pm:267 +#: lib/Lufi/Controller/Files.pm:282 msgid "Could not find the file. Are you sure of the URL and the token?" msgstr "Impossible de retrouver le fichier. Êtes-vous sûr de l’URL et du jeton ?" @@ -67,15 +67,15 @@ msgstr "Impossible de retrouver le fichier. Êtes-vous sûr de l’URL et du jet msgid "Could not find the file. Are you sure of the URL?" msgstr "Impossible de retrouver le fichier. Êtes-vous sûr de l’URL ?" -#: templates/files.html.ep:15 +#: templates/files.html.ep:16 msgid "Counter" msgstr "Compteur" -#: templates/files.html.ep:16 templates/index.html.ep:52 +#: templates/files.html.ep:17 templates/index.html.ep:52 msgid "Delete at first download?" msgstr "Supprimer après le premier téléchargement ?" -#: templates/files.html.ep:19 templates/index.html.ep:79 +#: templates/files.html.ep:20 templates/index.html.ep:79 msgid "Deletion link" msgstr "Lien de suppression" @@ -87,7 +87,7 @@ msgstr "Ne vous inquiétez pas : si un utilisateur commence à télécharger le msgid "Download" msgstr "Télécharger" -#: templates/files.html.ep:14 templates/index.html.ep:80 +#: templates/files.html.ep:15 templates/index.html.ep:80 msgid "Download link" msgstr "Lien de téléchargement" @@ -123,19 +123,19 @@ msgstr "Erreur : impossible de retrouver le fichier. Êtes-vous sûr de l’URL msgid "Expiration:" msgstr "Expiration :" -#: templates/files.html.ep:18 +#: templates/files.html.ep:19 msgid "Expires at" msgstr "Expire le" -#: lib/Lufi/Controller/Files.pm:251 +#: lib/Lufi/Controller/Files.pm:266 msgid "File deleted" msgstr "Fichier supprimé" -#: templates/files.html.ep:13 +#: templates/files.html.ep:14 msgid "File name" msgstr "Nom du fichier" -#: templates/mail.html.ep:65 +#: templates/mail.html.ep:64 msgid "Hello,\\n\\nHere's some files I want to share with you:\\n" msgstr "Bonjour,\\n\\nVoici quelques fichiers que je souhaite partager avec toi:\\n" @@ -180,15 +180,14 @@ msgstr "Mes fichiers" msgid "No enough space available on the server for this file (size: %1)." msgstr "Espace disque insuffisant sur le serveur pour ce fichier (taille du fichier: %1)." -#: templates/files.html.ep:34 templates/index.html.ep:86 +#: templates/index.html.ep:86 msgid "No expiration delay" msgstr "Pas de délai d’expiration" -#: msgid "No limit" msgstr "Aucune limite" -#: templates/files.html.ep:6 +#: templates/files.html.ep:7 msgid "Only the files sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you'll loose this informations." msgstr "Seuls les fichiers envoyés depuis ce navigateur sont listés ici. Les informations sont stockées en localStorage : si vous supprimez vos données localStorage, vous perdrez ces informations." @@ -196,6 +195,10 @@ msgstr "Seuls les fichiers envoyés depuis ce navigateur sont listés ici. Les i msgid "Please wait while we are getting your file" msgstr "Veuillez patienter pendant la récupération de votre fichier" +#: templates/files.html.ep:6 +msgid "Purge expired files from localStorage" +msgstr "Supprimer du localStorage les fichiers expirés" + #: templates/index.html.ep:85 msgid "Send all links by email" msgstr "Envoyer tous les liens par mail" @@ -209,7 +212,7 @@ msgid "Send with your own mail software" msgstr "Envoyer avec votre propre logiciel de mail" #. (url_for('/') -#: templates/mail.html.ep:78 +#: templates/mail.html.ep:77 msgid "Share your files in total privacy on %1" msgstr "Partagez vos fichiers en toute confidentialité sur %1" @@ -229,7 +232,7 @@ msgstr "Le corps du mail ne peut être vide." msgid "The email subject can't be empty." msgstr "Le sujet du mail ne peut être vide." -#: lib/Lufi/Controller/Files.pm:248 +#: lib/Lufi/Controller/Files.pm:263 msgid "The file has already been deleted" msgstr "Le fichier a déjà été supprimé" @@ -246,16 +249,24 @@ msgstr "Le mail a été envoyé." msgid "This server sets limitations according to the file size. The expiration delay of your file will be the minimum between what you choose and the following limitations:" msgstr "Ce serveur impose des limitations selon la taille des fichiers. Le délai d’expiration de votre fichier sera le minimum entre ce que vous avez choisi et les limites suivantes :" -#. ($short) -#: lib/Lufi/Controller/Files.pm:232 msgid "Unable to get counter for %1. The file does not exists." msgstr "Impossible de récupérer le compteur de %1. Le fichier n’existe pas." +#. ($short) +#: lib/Lufi/Controller/Files.pm:247 +msgid "Unable to get counter for %1. The file does not exists. It will be removed from your localStorage." +msgstr "Impossible de récupérer le compteur pour %1. Le fichier n'existe pas. Il va être supprimé de votre localStorage." + +#. ($short) +#: lib/Lufi/Controller/Files.pm:237 +msgid "Unable to get counter for %1. The token is unvalid." +msgstr "Impossible de récupérer le compteur pour %1. Le jeton est invalide." + #: templates/layouts/default.html.ep:39 msgid "Upload files" msgstr "Envoyer des fichiers" -#: templates/files.html.ep:17 +#: templates/files.html.ep:18 msgid "Uploaded at" msgstr "Envoyé le" @@ -294,7 +305,7 @@ msgstr "entre %1 et %2, le fichier sera conservé %3 jour(s) ;" msgid "between %1 and %2, the file will be kept forever." msgstr "entre %1 et %2, le fichier sera conservé indéfiniment ;" -#: templates/mail.html.ep:72 +#: templates/mail.html.ep:71 msgid "deadline: " msgstr "dernier délai pour télécharger : " diff --git a/public/css/fontello-codes.css b/public/css/fontello-codes.css index 890e7e8..e71bdea 100644 --- a/public/css/fontello-codes.css +++ b/public/css/fontello-codes.css @@ -4,4 +4,5 @@ .icon-trash:before { content: '\e802'; } /* '' */ .icon-mail:before { content: '\e803'; } /* '' */ .icon-help-circled:before { content: '\e804'; } /* '' */ -.icon-cancel:before { content: '\e805'; } /* '' */ \ No newline at end of file +.icon-cancel:before { content: '\e805'; } /* '' */ +.icon-ok:before { content: '\e806'; } /* '' */ \ No newline at end of file diff --git a/public/css/fontello-embedded.css b/public/css/fontello-embedded.css index 05a53de..43a2295 100644 --- a/public/css/fontello-embedded.css +++ b/public/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?54520977'); - src: url('../font/fontello.eot?54520977#iefix') format('embedded-opentype'), - url('../font/fontello.svg?54520977#fontello') format('svg'); + src: url('../font/fontello.eot?66569401'); + src: url('../font/fontello.eot?66569401#iefix') format('embedded-opentype'), + url('../font/fontello.svg?66569401#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?54520977#fontello') format('svg'); + src: url('../font/fontello.svg?66569401#fontello') format('svg'); } } */ @@ -57,4 +57,5 @@ .icon-trash:before { content: '\e802'; } /* '' */ .icon-mail:before { content: '\e803'; } /* '' */ .icon-help-circled:before { content: '\e804'; } /* '' */ -.icon-cancel:before { content: '\e805'; } /* '' */ \ No newline at end of file +.icon-cancel:before { content: '\e805'; } /* '' */ +.icon-ok:before { content: '\e806'; } /* '' */ \ No newline at end of file diff --git a/public/css/fontello-ie7-codes.css b/public/css/fontello-ie7-codes.css index 5dbd0c7..239cc03 100644 --- a/public/css/fontello-ie7-codes.css +++ b/public/css/fontello-ie7-codes.css @@ -4,4 +4,5 @@ .icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/public/css/fontello-ie7.css b/public/css/fontello-ie7.css index c12b2e6..8f7fb53 100644 --- a/public/css/fontello-ie7.css +++ b/public/css/fontello-ie7.css @@ -15,4 +15,5 @@ .icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-help-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/public/css/fontello.css b/public/css/fontello.css index 59bb34a..76a21db 100644 --- a/public/css/fontello.css +++ b/public/css/fontello.css @@ -1,10 +1,10 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?5451170'); - src: url('../font/fontello.eot?5451170#iefix') format('embedded-opentype'), - url('../font/fontello.woff?5451170') format('woff'), - url('../font/fontello.ttf?5451170') format('truetype'), - url('../font/fontello.svg?5451170#fontello') format('svg'); + src: url('../font/fontello.eot?88898605'); + src: url('../font/fontello.eot?88898605#iefix') format('embedded-opentype'), + url('../font/fontello.woff?88898605') format('woff'), + url('../font/fontello.ttf?88898605') format('truetype'), + url('../font/fontello.svg?88898605#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -14,7 +14,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?5451170#fontello') format('svg'); + src: url('../font/fontello.svg?88898605#fontello') format('svg'); } } */ @@ -59,4 +59,5 @@ .icon-trash:before { content: '\e802'; } /* '' */ .icon-mail:before { content: '\e803'; } /* '' */ .icon-help-circled:before { content: '\e804'; } /* '' */ -.icon-cancel:before { content: '\e805'; } /* '' */ \ No newline at end of file +.icon-cancel:before { content: '\e805'; } /* '' */ +.icon-ok:before { content: '\e806'; } /* '' */ \ No newline at end of file diff --git a/public/font/README.txt b/public/font/README.txt new file mode 100644 index 0000000..a91438a --- /dev/null +++ b/public/font/README.txt @@ -0,0 +1,75 @@ +This webfont is generated by http://fontello.com open source project. + + +================================================================================ +Please, note, that you should obey original font licences, used to make this +webfont pack. Details available in LICENSE.txt file. + +- Usually, it's enough to publish content of LICENSE.txt file somewhere on your + site in "About" section. + +- If your project is open-source, usually, it will be ok to make LICENSE.txt + file publically available in your repository. + +- Fonts, used in Fontello, don't require a clickable link on your site. + But any kind of additional authors crediting is welcome. +================================================================================ + + +Comments on archive content +--------------------------- + +- /font/* - fonts in different formats + +- /css/* - different kinds of css, for all situations. Should be ok with + twitter bootstrap. Also, you can skip style and assign icon classes + directly to text elements, if you don't mind about IE7. + +- demo.html - demo file, to show your webfont content + +- LICENSE.txt - license info about source fonts, used to build your one. + +- config.json - keeps your settings. You can import it back into fontello + anytime, to continue your work + + +Why so many CSS files ? +----------------------- + +Because we like to fit all your needs :) + +- basic file, .css - is usually enough, it contains @font-face + and character code definitions + +- *-ie7.css - if you need IE7 support, but still don't wish to put char codes + directly into html + +- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face + rules, but still wish to benefit from css generation. That can be very + convenient for automated asset build systems. When you need to update font - + no need to manually edit files, just override old version with archive + content. See fontello source code for examples. + +- *-embedded.css - basic css file, but with embedded WOFF font, to avoid + CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. + We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` + server headers. But if you ok with dirty hack - this file is for you. Note, + that data url moved to separate @font-face to avoid problems with x<~U zwg6ZLK%9++jRpB7aRngLJPbyuz`1Zuqg}-9Q8SrpGG-|S9whO_tdJq2I6)jEt~QO7 z4VOxZc+>624KsXu*w{>bOiS);Yc+YaH|@Beq5hJc2-{C9!VW;~Jn;sgu%FH02uj%k zj-lioY3D(Wt3+6h`3Ic)5r tQFzBwEV6O7#m8fJ9KDiN{sGjyY8?Oo delta 379 zcmZoMoMFH!A;G{7Bj^2+k9o0s5L5gatwBfFOh672`6-J4`N2O$B cvjYQ;iIJI+g^`t!jgft_7mv~ACLSgp0M^1##sB~S diff --git a/public/font/fontello.svg b/public/font/fontello.svg index 2f3ef0e..cbd3fbc 100644 --- a/public/font/fontello.svg +++ b/public/font/fontello.svg @@ -12,6 +12,7 @@ + \ No newline at end of file diff --git a/public/font/fontello.ttf b/public/font/fontello.ttf index 0b7e246c5baf6f9c6a8b592c14f8d1205d1a997f..81154fed927a534aea993270f1e37c61ac4666dd 100644 GIT binary patch delta 484 zcmeyMcSpaTfsuiMfsdhqftew}KUm+$PQz0PDDnn~!;*6o3oeLDZf9U%bOBv?*35A^e|zgPVHK0ta2V;+$7;b#&P6ZogV z&(A0Z;tB{XWy}`<(m;#A!3+%Q8~1;mkLS1f%D~P10wjFNTxSJ@W~%uA_kY&pJ?zGe z9Fsq=%g8|#03|aRUNJ6Xyu;+e)WozN$Opw3$7UrCZe~FaAdiWWnURH&m645+9jMcW R+lY-RKO3lIa~?Mn4*+%5XpsN_ delta 371 zcmcbk|3R;wfsuiMfsdhqftew}KUm+$PQz0KDDnn~!;*6o3oeLBZf9U%bOB>q%HOiq4sB1;gf2hc1Y zAYULiv7&%s2lqc9Uk1om$V<#kJu_EY7Ra{&T5`4^zqsVh@!5ZX4gjf7DJV)UxSP$~ z%D^D@1<0>vU}UamoWQ`!z`<0-vzjg%MsP=PrJ|S^?rR`&*%F*-{-$iJYImuMY!490|>x{u?Cne zl^f5*X=8T>g!s_`fRbUy3|6NBxlE5^?9Tv*or7>~Gz!Tt5C9Yrel~_N5uXlwLV-=# z%ZB@1FzQI8NE;=D83}uQxL4f*4^ITs0=DKx;a+A7aY)QD#4i#)hg#U0`N2cf_fWqO z5&)8t@c9S;5PiM*21?3wS~wE`bOJo&4s*URLeJ0kSL_ZNsM&P2iz;5f zFOm4@S1a!$6e&kpy)?N5ttKgp;_cT6?I>B*(P{O9wM2qz^Jl2I^POpFQRvnFZ()l| zH)CR3rUSUDflIW|d>{3F#ayj<={oI3LRa?9nTPFO?CPlzj-ItrE)or?78K+HS|YG)&f&3@*>zi{`jjm&e{6QzU&^VB{@+C+`%H1(vhT zbNfNp0!^%XFD{|LOg)?Ga+)V!Mf&5JSzmf!g|15Q;aC3hlwgCHR{P5g&qWD&lA`4) zal#54xudS&;C#mTz5_0STs4A%#?BmdH<`l5?)~%Jpp@ah!fdJ)E07@BJip=9vFq7v zePWH4zhbhfx8YEtyN7ZU&S=PKK>x0kUR5n9D+rdCHno4p5sR+M)^43(ZG7IC_%8L5 z{djnpiDVjY$n;zCSCg|&loyZ+83!NzZkf(r`f%=SQx$cSJVv>vo1d3m>OeS+b^hj) z9v<>K^{A1fBZHphhE;nR?_-a~d+dRtwowlsJ-3H;P4*w%r>s{il{CG_ao-nmX5IQ# ztW2gyCj50ZT!x2=(Bw0@DQM%mDC8*Bd)9e$$y(=;>)z$F!G~#N=1Y2WZH1Y_a90*P zrq}whVv(Dz4hi!$&7nSn?_e9Tuj+}5al#2L9eVhuxZf}{4m}~!zL}ePj*5*F_=UGU z1HSJy!+f3_NwkJO&^bBSJ{RO3HtPL=$&Uu=f*DMt)q-`NAxk2amCA&O4vso^5}>Lk-+~r~zoSLYo1|UZUZ*n} z2A}VjEU(Iv+aA5K_8@L!`o`6-D@zff7i%M>34){-ciwAr2VB%A1}~A*O0L&b?zttK zBpau0)w15ddR=>L&0i1=nl{#(kzK&B{)Gq81j?_2TsriyWlEXdYM%`<=FpN+f^K#sA$=>SDhc<4Vi=4}8BE<1T z{405tiOn^AzNw?Fg6D3ZEY6}zi^PqoE>$65Sc_%LMk>2Ljm47QkmDen zA3w0B0dd68`>Sx%>Z%6!kbL($A`y{-0Ku-3ci`OlfAPPtk$Eau7MfoZO)Y|BHPS}( z1pp#*Fhy{ZwZTdSK=c%>TkL>=-+mMY{0)^s;|M#%rR|7&um!;&8}6gBAh%X@ys9J+ z?6eu=r`ir@iTam{x}JHR=#?fj<8)nU|1< delta 1451 zcmV;c1yuUL9Dp1YcTYw}00961000gE01f~E000+okrXQv6k}~+Z~y=ShyVZpIsgCx zO3)UOQb~Wo000F9p3ob!Xk}q!000Xx0000q0000s2jPT000Z10000G0000G1X2Y^ZDDwD000ZH z0000W0000W0JsbOZeeX@000Zn0004Z0008b%$+eC9dK`RbN~PiNB{r;PXGV_WbDVA z{BUw*Z~y=em;e9(WdHyGd);dTg?OA}U}UamlS=_86=e?kpT!Wx9Lz8cD9i|w0|4tK z3%Zkt0U{Xw{|{2|f&oNJFhbP>0V5m3hz9^^SO&AR!U3-Ze`p+46u#%qI=h+7|IXam zO*T6_`!kcc$!cb2W;bn|-C}HG4T5R02%1_fN)2eyO4|BIK%@^s@Wnof1k#5-N>HIl zUm8@jj|HFmCPMKg54vPGo=J$3w!^vK+_~R5cjkO&&Lt^AcK_klxkZv88u3VnNL`^l zImQ%`=TcMke_GH0z6de2a3TZ4iD~d@r|f!R5H%f(`5kb4#xVu>@>AfpqN9LJtLd|} z+4SkJMv+mytbS>fbjk|3<0ZE9n^lAo1MUUqWoH36R{CDhdqPp@X+wgw#^g1b!CLOT zV$j@3jvC6r5k(4THh)ku#9xmgwQc-4-GI9#atQguhVDO@Aq%p|6Qxm=?LiR;2Svi@Yp4KL8V5HeZ^ht z?({gmf4g&e)wZwfTd9Qh`qH_HS$brmJ+aik#0jNxsXjUVeZ1>o^ym)f{__3Lw;g<6mVXCf$F<41z78caP;vrzI zHG{8Uy+f_+wwy3VQ5?t&%6laDG0dSvQX^fG@e2cilYA4n(+~Y%{o!AY6yG zf4$G^ht~%e4nGr$x^Jakp?_m1jgriF`K-**sd}gdEnq&5B;llWve-Djh5h1Dxa+;^ z!Ce|ucg|FUjwEt7MQJcCRmB4REF%m8580ui{zo+*0=kn*4W>nr5W?;DcfaM%a>-xb zB6CFe;n>l7c9`R^Wl?*Sl^+9xq0CVhe>=BQPV+Xfrr(Ma;qfzMz~b)lLDYemvkV!^ z4T^LTU|Yy6XM{aii(j3-c4A06nc|0@DAw9fveC*c>`^(rAQTPp_xFDKYWEkte@8zj zRl;ww6ks04{*jX2J6D1ZcnL(l4Xp$i(iWrllm&HC-Pk}_P?Nj*|FfcOY$z95GP!X> zdDKy9Bo6-qR7&=X0001ZoMT{QU|;}Z0i`gJcz&C&4BX5wfFcZ+%uKr=G3 && xhr.status==200) { + var data = JSON.parse(xhr.responseText); + if (data.success) { + if (data.deleted) { + document.getElementById('count-'+data.short).parentNode.remove(); + delItem(data.short); + } + } + } + }; + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.send('short='+element.short+'&token='+element.token); + }); +} + +function populateFilesTable() { + var files = JSON.parse(localStorage.getItem('files')); + files.reverse(); + files.forEach(function(element, index, array) { + var del_view = (element.del_at_first_view) ? '' : ''; + var dlink = baseURL+'d/'+element.short+'/'+element.token; + var limit = (element.delay === 0) ? i18n.noExpiration : moment.unix(element.delay * 86400 + element.created_at).locale(window.navigator.language).format('LLLL'); + var created_at = moment.unix(element.created_at).locale(window.navigator.language).format('LLLL'); + + var tr = document.createElement('tr'); + tr.innerHTML = '' + +element.name + +'' + +''+element.url+'' + +'' + +'' + +del_view + +'' + +created_at + +'' + +limit + +'' + +''+dlink+'' + +''; + document.getElementById('myfiles').appendChild(tr); + + var xhr = new XMLHttpRequest(); + xhr.open('POST', counterURL); + xhr.onreadystatechange = function() { + if (xhr.readyState>3 && xhr.status==200) { + var data = JSON.parse(xhr.responseText); + if (data.success) { + document.getElementById('count-'+data.short).innerHTML = data.counter; + } else { + alert(data.msg); + document.getElementById('count-'+data.short).parentNode.remove(); + if (data.missing) { + delItem(data.short); + } + } + } + }; + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.send('short='+element.short+'&token='+element.token); + }); +} diff --git a/templates/files.html.ep b/templates/files.html.ep index 111107e..f367afb 100644 --- a/templates/files.html.ep +++ b/templates/files.html.ep @@ -3,6 +3,7 @@

+ <%= l('Purge expired files from localStorage') %> <%= l('Only the files sent with this browser will be listed here. The informations are stored in localStorage: if you delete your localStorage data, you\'ll loose this informations.') %>

@@ -25,69 +26,14 @@ %= javascript begin - function populateFilesTable() { - var files = JSON.parse(localStorage.getItem('files')); - files.reverse(); - files.forEach(function(element, index, array) { - var del_view = (element.del_at_first_view) ? '' : ''; - var dlink = '<%== url_for('/')->to_abs() %>d/'+element.short+'/'+element.token; - var limit = (element.delay === 0) ? '<%= l('No expiration delay') %>' : moment.unix(element.delay * 86400 + element.created_at).locale(window.navigator.language).format('LLLL'); - var created_at = moment.unix(element.created_at).locale(window.navigator.language).format('LLLL'); - - var tr = document.createElement('tr'); - tr.innerHTML = '' - +element.name - +'' - +''+element.url+'' - +'' - +'' - +del_view - +'' - +created_at - +'' - +limit - +'' - +''+dlink+'' - +''; - document.getElementById('myfiles').appendChild(tr); - - var xhr = new XMLHttpRequest(); - xhr.open('POST', '<%== url_for('counter') %>'); - xhr.onreadystatechange = function() { - if (xhr.readyState>3 && xhr.status==200) { - var data = JSON.parse(xhr.responseText); - if (data.success) { - document.getElementById('count-'+element.short).innerHTML = data.counter; - } else { - alert(data.msg); - } - } - }; - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.send('short='+element.short+'&token='+element.token); - - /*$.ajax({ - url : '<%== url_for('counter') %>', - type : 'POST', - data : { - 'short': element.short, - 'token': element.token - }, - success: function(data) { - if (data.success) { - $('#count-'+element.id).text(data.counter); - } else { - alert(data.msg); - } - }, - error: function() { - alert(element.filename+'<%= l(': Error while trying to get the counter.') %>'); - } - });*/ - }); - } - document.addEventListener('DOMContentLoaded', function() { - populateFilesTable(); - }); +var baseURL = '<%== url_for('/')->to_abs() %>'; +var counterURL = '<%== url_for('counter') %>'; +var i18n = { + noExpiration: '<%== url_for('counter') %>', +}; +document.addEventListener('DOMContentLoaded', function() { + populateFilesTable(); +}); % end +%= javascript '/js/lufi-files.js' %= javascript '/js/moment-with-locales.min.js' diff --git a/templates/mail.html.ep b/templates/mail.html.ep index 36ea4d3..a47c71d 100644 --- a/templates/mail.html.ep +++ b/templates/mail.html.ep @@ -44,7 +44,6 @@ } else { files = JSON.parse(files); } - var r = null; var i; for (i = 0; i < files.length; i++) { if (files[i].short === name) {