diff --git a/application/LinkDB.php b/application/LinkDB.php index cd0f2967..cdd68cfb 100644 --- a/application/LinkDB.php +++ b/application/LinkDB.php @@ -537,6 +537,9 @@ public function reorder($order = 'DESC') $order = $order === 'ASC' ? -1 : 1; // Reorder array by dates. usort($this->links, function($a, $b) use ($order) { + if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) { + return $a['sticky'] ? -1 : 1; + } return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; }); diff --git a/application/Router.php b/application/Router.php index bf86b884..beb3165b 100644 --- a/application/Router.php +++ b/application/Router.php @@ -37,6 +37,8 @@ class Router public static $PAGE_DELETELINK = 'delete_link'; + public static $PAGE_PINLINK = 'pin'; + public static $PAGE_EXPORT = 'export'; public static $PAGE_IMPORT = 'import'; @@ -146,6 +148,10 @@ public static function findPage($query, $get, $loggedIn) return self::$PAGE_DELETELINK; } + if (startsWith($query, 'do='. self::$PAGE_PINLINK)) { + return self::$PAGE_PINLINK; + } + if (startsWith($query, 'do='. self::$PAGE_EXPORT)) { return self::$PAGE_EXPORT; } diff --git a/application/Updater.php b/application/Updater.php index 480bff82..5dde47cb 100644 --- a/application/Updater.php +++ b/application/Updater.php @@ -517,6 +517,26 @@ public function updateMethodWebThumbnailer() return true; } + + /** + * Set sticky = false on all links + * + * @return bool true if the update is successful, false otherwise. + */ + public function updateMethodSetSticky() + { + foreach ($this->linkDB as $key => $link) { + if (isset($link['sticky'])) { + return true; + } + $link['sticky'] = false; + $this->linkDB[$key] = $link; + } + + $this->linkDB->save($this->conf->get('resource.page_cache')); + + return true; + } } /** diff --git a/assets/default/scss/shaarli.scss b/assets/default/scss/shaarli.scss index b8578ea6..55f9f0a1 100644 --- a/assets/default/scss/shaarli.scss +++ b/assets/default/scss/shaarli.scss @@ -755,6 +755,14 @@ body, font-size: 1.3em; } +.pin-link { + font-size: 1.3em; +} + +.pinned-link { + color: $blue !important; +} + .linklist-item-description { position: relative; padding: 0 10px; @@ -848,6 +856,10 @@ body, margin: 0 7px; } +.ctrl-delete { + margin: 0 7px 0 0; +} + // 64em -> lg @media screen and (max-width: 64em) { .linklist-item-infos-url { diff --git a/inc/languages/fr/LC_MESSAGES/shaarli.po b/inc/languages/fr/LC_MESSAGES/shaarli.po index 5fd0f775..102c80da 100644 --- a/inc/languages/fr/LC_MESSAGES/shaarli.po +++ b/inc/languages/fr/LC_MESSAGES/shaarli.po @@ -1,15 +1,15 @@ msgid "" msgstr "" "Project-Id-Version: Shaarli\n" -"POT-Creation-Date: 2018-07-17 13:04+0200\n" -"PO-Revision-Date: 2018-07-17 13:07+0200\n" +"POT-Creation-Date: 2018-10-06 13:08+0200\n" +"PO-Revision-Date: 2018-10-06 13:08+0200\n" "Last-Translator: \n" "Language-Team: Shaarli\n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.9\n" +"X-Generator: Poedit 2.1.1\n" "X-Poedit-Basepath: ../../../..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: UTF-8\n" @@ -101,8 +101,6 @@ msgid "Array offset and link ID must be equal." msgstr "La clé du tableau et l'ID du lien doivent être identiques." #: application/LinkDB.php:251 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 msgid "" @@ -125,8 +123,8 @@ msgstr "" "Bienvenue sur Shaarli ! Ceci est votre premier marque-page public. Pour me " "modifier ou me supprimer, vous devez d'abord vous connecter.\n" "\n" -"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » " -"en bas de page.\n" +"Pour apprendre à utiliser Shaarli, consultez le lien « Documentation » en " +"bas de page.\n" "\n" "Vous utilisez la version supportée par la communauté du projet original " "Shaarli de Sébastien Sauvage." @@ -185,14 +183,14 @@ msgid "" "php-gd extension must be loaded to use thumbnails. Thumbnails are now " "disabled. Please reload the page." msgstr "" -"l'extension php-gd doit être chargée pour utiliser les miniatures. Les miniatures sont désormais " -"désactivées. Rechargez la page." +"l'extension php-gd doit être chargée pour utiliser les miniatures. Les " +"miniatures sont désormais désactivées. Rechargez la page." #: application/Updater.php:86 msgid "Couldn't retrieve Updater class methods." msgstr "Impossible de récupérer les méthodes de la classe Updater." -#: application/Updater.php:514 index.php:1023 +#: application/Updater.php:514 index.php:1022 msgid "" "You have enabled or changed thumbnails mode. Please synchronize them." @@ -200,17 +198,17 @@ msgstr "" "Vous avez activé ou changé le mode de miniatures. Merci de les synchroniser." -#: application/Updater.php:566 +#: application/Updater.php:586 msgid "An error occurred while running the update " msgstr "Une erreur s'est produite lors de l'exécution de la mise à jour " -#: application/Updater.php:606 +#: application/Updater.php:626 msgid "Updates file path is not set, can't write updates." msgstr "" "Le chemin vers le fichier de mise à jour n'est pas défini, impossible " "d'écrire les mises à jour." -#: application/Updater.php:611 +#: application/Updater.php:631 msgid "Unable to write updates in " msgstr "Impossible d'écrire les mises à jour dans " @@ -288,72 +286,64 @@ msgstr "NON. Vous êtes banni pour le moment. Revenez plus tard." msgid "Wrong login/password." msgstr "Nom d'utilisateur ou mot de passe incorrect(s)." -#: index.php:483 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46 +#: index.php:482 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:46 msgid "Daily" msgstr "Quotidien" -#: index.php:589 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 +#: index.php:588 tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:28 #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:75 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:99 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:75 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:99 msgid "Login" msgstr "Connexion" -#: index.php:606 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41 +#: index.php:605 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:41 msgid "Picture wall" msgstr "Mur d'images" -#: index.php:683 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36 +#: index.php:682 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:36 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 msgid "Tag cloud" msgstr "Nuage de tags" -#: index.php:716 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 +#: index.php:715 tmp/tag.list.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 msgid "Tag list" msgstr "Liste des tags" -#: index.php:941 tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31 +#: index.php:940 tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:31 msgid "Tools" msgstr "Outils" -#: index.php:950 +#: index.php:949 msgid "You are not supposed to change a password on an Open Shaarli." msgstr "" "Vous n'êtes pas censé modifier le mot de passe d'un Shaarli en mode ouvert." -#: index.php:955 index.php:997 index.php:1085 index.php:1116 index.php:1221 +#: index.php:954 index.php:996 index.php:1084 index.php:1116 index.php:1221 msgid "Wrong token." msgstr "Jeton invalide." -#: index.php:960 +#: index.php:959 msgid "The old password is not correct." msgstr "L'ancien mot de passe est incorrect." -#: index.php:980 +#: index.php:979 msgid "Your password has been changed" msgstr "Votre mot de passe a été modifié" -#: index.php:985 -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 +#: index.php:984 tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 msgid "Change password" msgstr "Modifier le mot de passe" -#: index.php:1043 +#: index.php:1042 msgid "Configuration was saved." msgstr "La configuration a été sauvegardée." -#: index.php:1068 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 +#: index.php:1067 tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 msgid "Configure" msgstr "Configurer" -#: index.php:1079 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 +#: index.php:1078 tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:13 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 msgid "Manage tags" msgstr "Gérer les tags" @@ -381,7 +371,6 @@ msgid "Edit" msgstr "Modifier" #: index.php:1281 index.php:1351 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:26 msgid "Shaare" msgstr "Shaare" @@ -390,15 +379,19 @@ msgstr "Shaare" msgid "Note: " msgstr "Note : " -#: index.php:1360 tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65 +#: index.php:1359 +msgid "Invalid link ID provided" +msgstr "" + +#: index.php:1379 msgid "Export" msgstr "Exporter" -#: index.php:1422 tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:83 +#: index.php:1441 msgid "Import" msgstr "Importer" -#: index.php:1432 +#: index.php:1451 #, php-format msgid "" "The file you are trying to upload is probably bigger than what this " @@ -408,20 +401,20 @@ msgstr "" "le serveur web peut accepter (%s). Merci de l'envoyer en parties plus " "légères." -#: index.php:1471 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 +#: index.php:1490 tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:26 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22 msgid "Plugin administration" msgstr "Administration des plugins" -#: index.php:1523 tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 +#: index.php:1542 tmp/thumbnails.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 msgid "Thumbnails update" msgstr "Mise à jour des miniatures" -#: index.php:1695 +#: index.php:1714 msgid "Search: " msgstr "Recherche : " -#: index.php:1735 +#: index.php:1754 #, php-format msgid "" "
Sessions do not seem to work correctly on your server.
Make sure the " @@ -431,16 +424,16 @@ msgid "" "custom hostname without a dot causes cookie storage to fail. We recommend " "accessing your server via it's IP address or Fully Qualified Domain Name.
" msgstr "" -"
Les sesssions ne semblent pas fonctionner sur ce serveur.
Assurez vous " -"que la variable « session.save_path » est correctement définie dans votre " -"fichier de configuration PHP, et que vous avez les droits d'écriture dessus." -"
Ce paramètre pointe actuellement sur %s.
Sur certains navigateurs, " -"accéder à votre serveur depuis un nom d'hôte comme « localhost » ou autre " -"nom personnalisé sans point '.' entraine l'échec de la sauvegarde des " -"cookies. Nous vous recommandons d'accéder à votre serveur depuis son adresse " -"IP ou un Fully Qualified Domain Name.
" +"
Les sesssions ne semblent pas fonctionner sur ce serveur.
Assurez " +"vous que la variable « session.save_path » est correctement définie dans " +"votre fichier de configuration PHP, et que vous avez les droits d'écriture " +"dessus.
Ce paramètre pointe actuellement sur %s.
Sur certains " +"navigateurs, accéder à votre serveur depuis un nom d'hôte comme « localhost " +"» ou autre nom personnalisé sans point '.' entraine l'échec de la sauvegarde " +"des cookies. Nous vous recommandons d'accéder à votre serveur depuis son " +"adresse IP ou un Fully Qualified Domain Name.
" -#: index.php:1745 +#: index.php:1764 msgid "Click to try again." msgstr "Cliquer ici pour réessayer." @@ -481,12 +474,13 @@ msgstr "" "Erreur de l'extension Isso : Merci de définir le paramètre « ISSO_SERVER » " "dans la page d'administration des extensions." -#: plugins/isso/isso.php:63 +#: plugins/isso/isso.php:90 msgid "Let visitor comment your shaares on permalinks with Isso." msgstr "" -"Permettre aux visiteurs de commenter vos shaares sur les permaliens avec Isso." +"Permettre aux visiteurs de commenter vos shaares sur les permaliens avec " +"Isso." -#: plugins/isso/isso.php:64 +#: plugins/isso/isso.php:91 msgid "Isso server URL (without 'http://')" msgstr "URL du serveur Isso (sans 'http://')" @@ -603,35 +597,17 @@ msgstr "Version de l'API Wallabag (1 ou 2)" #: tests/LanguagesTest.php:214 tests/LanguagesTest.php:227 #: tests/languages/fr/LanguagesFrTest.php:160 #: tests/languages/fr/LanguagesFrTest.php:173 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:85 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:85 msgid "Search" msgid_plural "Search" msgstr[0] "Rechercher" msgstr[1] "Rechercher" -#: tmp/404.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12 -msgid "Sorry, nothing to see here." -msgstr "Désolé, il y a rien à voir ici." - #: tmp/addlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 msgid "URL or leave empty to post a note" msgstr "URL ou laisser vide pour créer une note" -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -msgid "Current password" -msgstr "Mot de passe actuel" - -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:19 -msgid "New password" -msgstr "Nouveau mot de passe" - -#: tmp/changepassword.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23 -msgid "Change" -msgstr "Changer" - #: tmp/changetag.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:77 msgid "Tag" msgstr "Tag" @@ -661,6 +637,34 @@ msgstr "Vous pouvez aussi modifier les tags dans la" msgid "tag list" msgstr "liste des tags" +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:143 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:296 +msgid "All" +msgstr "Tous" + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:147 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:300 +msgid "Only common media hosts" +msgstr "Seulement les hébergeurs de média connus" + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:151 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:304 +msgid "None" +msgstr "Aucune" + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:158 +#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281 +msgid "You need to enable the extension php-gd to use thumbnails." +msgstr "" +"Vous devez activer l'extension php-gd pour utiliser les " +"miniatures." + +#: tmp/configure.90100d2eaf5d3705e14b9b4f78ecddc9.rtpl.php:162 +#, fuzzy +#| msgid "Enable thumbnails" +msgid "Synchonize thumbnails" +msgstr "Activer les miniatures" + #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 msgid "title" msgstr "titre" @@ -678,22 +682,18 @@ msgid "Theme" msgstr "Thème" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:87 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:78 msgid "Language" msgstr "Langue" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:116 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:102 msgid "Timezone" msgstr "Fuseau horaire" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103 msgid "Continent" msgstr "Continent" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:117 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:103 msgid "City" msgstr "Ville" @@ -734,22 +734,18 @@ msgid "Do not show any links if the user is not logged in" msgstr "N'afficher aucun lien sans être connecté" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:231 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:150 msgid "Check updates" msgstr "Vérifier les mises à jour" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:232 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152 msgid "Notify me when a new release is ready" msgstr "Me notifier lorsqu'une nouvelle version est disponible" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:247 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169 msgid "Enable REST API" msgstr "Activer l'API REST" #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:248 -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:170 msgid "Allow third party software to use Shaarli such as mobile application" msgstr "" "Permet aux applications tierces d'utiliser Shaarli, par exemple les " @@ -763,30 +759,11 @@ msgstr "Clé d'API secrète" msgid "Enable thumbnails" msgstr "Activer les miniatures" -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:281 -msgid "You need to enable the extension php-gd to use thumbnails." -msgstr "" -"Vous devez activer l'extension php-gd pour utiliser les " -"miniatures." - #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:285 #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:56 msgid "Synchronize thumbnails" msgstr "Synchroniser les miniatures" -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:296 -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:31 -msgid "All" -msgstr "Tous" - -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:300 -msgid "Only common media hosts" -msgstr "Seulement les hébergeurs de média connus" - -#: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:304 -msgid "None" -msgstr "Aucune" - #: tmp/configure.b91ef64efc3688266305ea9b42e5017e.rtpl.php:312 #: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 #: tmp/pluginsadmin.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 @@ -847,7 +824,6 @@ msgid "Tags" msgstr "Tags" #: tmp/editlink.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57 -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:167 msgid "Private" msgstr "Privé" @@ -856,99 +832,6 @@ msgstr "Privé" msgid "Apply Changes" msgstr "Appliquer les changements" -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -msgid "Export Database" -msgstr "Exporter les données" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 -msgid "Selection" -msgstr "Choisir" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -msgid "Public" -msgstr "Publics" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:52 -msgid "Prepend note permalinks with this Shaarli instance's URL" -msgstr "Préfixer les liens de note avec l'URL de l'instance de Shaarli" - -#: tmp/export.b91ef64efc3688266305ea9b42e5017e.rtpl.php:53 -msgid "Useful to import bookmarks in a web browser" -msgstr "Utile pour importer les marques-pages dans un navigateur" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:16 -msgid "Import Database" -msgstr "Importer des données" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:23 -msgid "Maximum size allowed:" -msgstr "Taille maximum autorisée :" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:29 -msgid "Visibility" -msgstr "Visibilité" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 -msgid "Use values from the imported file, default to public" -msgstr "" -"Utiliser les valeurs présentes dans le fichier d'import, public par défaut" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -msgid "Import all bookmarks as private" -msgstr "Importer tous les liens comme privés" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 -msgid "Import all bookmarks as public" -msgstr "Importer tous les liens comme publics" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:57 -msgid "Overwrite existing bookmarks" -msgstr "Remplacer les liens existants" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:58 -msgid "Duplicates based on URL" -msgstr "Les doublons s'appuient sur les URL" - -#: tmp/import.b91ef64efc3688266305ea9b42e5017e.rtpl.php:72 -msgid "Add default tags" -msgstr "Ajouter des tags par défaut" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:22 -msgid "Install Shaarli" -msgstr "Installation de Shaarli" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:25 -msgid "It looks like it's the first time you run Shaarli. Please configure it." -msgstr "" -"Il semblerait que ça soit la première fois que vous lancez Shaarli. Merci de " -"le configurer." - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:33 -#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:151 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151 -msgid "Username" -msgstr "Nom d'utilisateur" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 -#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:152 -#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152 -msgid "Password" -msgstr "Mot de passe" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:63 -msgid "Shaarli title" -msgstr "Titre du Shaarli" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69 -msgid "My links" -msgstr "Mes liens" - -#: tmp/install.b91ef64efc3688266305ea9b42e5017e.rtpl.php:182 -msgid "Install" -msgstr "Installer" - #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:79 msgid "shaare" @@ -964,13 +847,11 @@ msgstr[0] "lien privé" msgstr[1] "liens privés" #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:121 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:121 msgid "Search text" msgstr "Recherche texte" #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:37 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:128 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:128 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:36 #: tmp/tag.cloud.b91ef64efc3688266305ea9b42e5017e.rtpl.php:64 @@ -1011,7 +892,6 @@ msgid "without any tag" msgstr "sans tag" #: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:42 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:42 msgid "Fold" msgstr "Replier" @@ -1028,36 +908,36 @@ msgstr "permalien" msgid "Add tag" msgstr "Ajouter un tag" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7 +#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:183 +msgid "Toggle sticky" +msgstr "Changer statut épinglé" + +#: tmp/linklist.b91ef64efc3688266305ea9b42e5017e.rtpl.php:185 +msgid "Sticky" +msgstr "Épinglé" + #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:7 msgid "Filters" msgstr "Filtres" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:12 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:12 msgid "Only display private links" msgstr "Afficher uniquement les liens privés" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:15 msgid "Only display public links" msgstr "Afficher uniquement les liens publics" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:20 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:20 msgid "Filter untagged links" msgstr "Filtrer par liens privés" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:24 -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:76 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:24 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:76 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:43 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:43 msgid "Fold all" msgstr "Replier tout" -#: tmp/linklist.paging.b91ef64efc3688266305ea9b42e5017e.rtpl.php:69 #: tmp/linklist.paging.cedf684561d925457130839629000a81.rtpl.php:69 msgid "Links per page" msgstr "Liens par page" @@ -1069,59 +949,56 @@ msgstr "" "Vous avez été banni après trop d'échecs d'authentification. Merci de " "réessayer plus tard." +#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:30 +#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:151 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:34 +#: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:152 +msgid "Password" +msgstr "Mot de passe" + #: tmp/loginform.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:155 msgid "Remember me" msgstr "Rester connecté" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:14 -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:48 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:14 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:48 msgid "by the Shaarli community" msgstr "par la communauté Shaarli" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:15 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:15 msgid "Documentation" msgstr "Documentation" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:44 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:44 msgid "Expand" msgstr "Déplier" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:45 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:45 msgid "Expand all" msgstr "Déplier tout" -#: tmp/page.footer.b91ef64efc3688266305ea9b42e5017e.rtpl.php:46 #: tmp/page.footer.cedf684561d925457130839629000a81.rtpl.php:46 msgid "Are you sure you want to delete this link?" msgstr "Êtes-vous sûr de vouloir supprimer ce lien ?" -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:65 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:90 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:65 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:90 msgid "RSS Feed" msgstr "Flux RSS" -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:70 -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:106 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:70 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:106 msgid "Logout" msgstr "Déconnexion" -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:173 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:173 msgid "is available" msgstr "est disponible" -#: tmp/page.header.b91ef64efc3688266305ea9b42e5017e.rtpl.php:180 #: tmp/page.header.cedf684561d925457130839629000a81.rtpl.php:180 msgid "Error" msgstr "Erreur" @@ -1221,22 +1098,18 @@ msgstr "tags" msgid "List all links with those tags" msgstr "Lister tous les liens avec ces tags" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:3 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:3 msgid "Sort by:" msgstr "Trier par :" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:5 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:5 msgid "Cloud" msgstr "Nuage" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:6 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:6 msgid "Most used" msgstr "Plus utilisés" -#: tmp/tag.sort.b91ef64efc3688266305ea9b42e5017e.rtpl.php:7 #: tmp/tag.sort.cedf684561d925457130839629000a81.rtpl.php:7 msgid "Alphabetical" msgstr "Alphabétique" @@ -1266,9 +1139,13 @@ msgid "Rename or delete a tag in all links" msgstr "Renommer ou supprimer un tag dans tous les liens" #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:41 +#, fuzzy +#| msgid "" +#| "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, " +#| "delicious…)" msgid "" "Import Netscape HTML bookmarks (as exported from Firefox, Chrome, Opera, " -"delicious…)" +"delicious...)" msgstr "" "Importer des marques pages au format Netscape HTML (comme exportés depuis " "Firefox, Chrome, Opera, delicious…)" @@ -1278,9 +1155,13 @@ msgid "Import links" msgstr "Importer des liens" #: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:47 +#, fuzzy +#| msgid "" +#| "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, " +#| "Opera, delicious…)" msgid "" "Export Netscape HTML bookmarks (which can be imported in Firefox, Chrome, " -"Opera, delicious…)" +"Opera, delicious...)" msgstr "" "Exporter les marques pages au format Netscape HTML (comme exportés depuis " "Firefox, Chrome, Opera, delicious…)" @@ -1339,33 +1220,16 @@ msgstr "" msgid "Add Note" msgstr "Ajouter une Note" -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 -msgid "" -"You need to browse your Shaarli over HTTPS to use this " -"functionality." -msgstr "" -"Vous devez utiliser Shaarli en HTTPS pour utiliser cette " -"fonctionalité." - -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144 -msgid "Add to" -msgstr "Ajouter à" - -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:155 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:136 msgid "3rd party" msgstr "Applications tierces" -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:157 -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:163 -msgid "Plugin" -msgstr "Extension" - -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:158 -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:164 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:139 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:144 msgid "plugin" msgstr "extension" -#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:191 +#: tmp/tools.b91ef64efc3688266305ea9b42e5017e.rtpl.php:169 msgid "" "Drag this link to your bookmarks toolbar, or right-click it and choose " "Bookmark This Link" @@ -1373,10 +1237,91 @@ msgstr "" "Glisser ce lien dans votre barre de favoris ou cliquer droit dessus et « " "Ajouter aux favoris »" -#, fuzzy -#~| msgid "Enable thumbnails" -#~ msgid "Synchonize thumbnails" -#~ msgstr "Activer les miniatures" +#~ msgid "Sorry, nothing to see here." +#~ msgstr "Désolé, il y a rien à voir ici." + +#~ msgid "Current password" +#~ msgstr "Mot de passe actuel" + +#~ msgid "New password" +#~ msgstr "Nouveau mot de passe" + +#~ msgid "Change" +#~ msgstr "Changer" + +#~ msgid "Export Database" +#~ msgstr "Exporter les données" + +#~ msgid "Selection" +#~ msgstr "Choisir" + +#~ msgid "Public" +#~ msgstr "Publics" + +#~ msgid "Prepend note permalinks with this Shaarli instance's URL" +#~ msgstr "Préfixer les liens de note avec l'URL de l'instance de Shaarli" + +#~ msgid "Useful to import bookmarks in a web browser" +#~ msgstr "Utile pour importer les marques-pages dans un navigateur" + +#~ msgid "Import Database" +#~ msgstr "Importer des données" + +#~ msgid "Maximum size allowed:" +#~ msgstr "Taille maximum autorisée :" + +#~ msgid "Visibility" +#~ msgstr "Visibilité" + +#~ msgid "Use values from the imported file, default to public" +#~ msgstr "" +#~ "Utiliser les valeurs présentes dans le fichier d'import, public par défaut" + +#~ msgid "Import all bookmarks as private" +#~ msgstr "Importer tous les liens comme privés" + +#~ msgid "Import all bookmarks as public" +#~ msgstr "Importer tous les liens comme publics" + +#~ msgid "Overwrite existing bookmarks" +#~ msgstr "Remplacer les liens existants" + +#~ msgid "Duplicates based on URL" +#~ msgstr "Les doublons s'appuient sur les URL" + +#~ msgid "Add default tags" +#~ msgstr "Ajouter des tags par défaut" + +#~ msgid "Install Shaarli" +#~ msgstr "Installation de Shaarli" + +#~ msgid "" +#~ "It looks like it's the first time you run Shaarli. Please configure it." +#~ msgstr "" +#~ "Il semblerait que ça soit la première fois que vous lancez Shaarli. Merci " +#~ "de le configurer." + +#~ msgid "Shaarli title" +#~ msgstr "Titre du Shaarli" + +#~ msgid "My links" +#~ msgstr "Mes liens" + +#~ msgid "Install" +#~ msgstr "Installer" + +#~ msgid "" +#~ "You need to browse your Shaarli over HTTPS to use this " +#~ "functionality." +#~ msgstr "" +#~ "Vous devez utiliser Shaarli en HTTPS pour utiliser cette " +#~ "fonctionalité." + +#~ msgid "Add to" +#~ msgstr "Ajouter à" + +#~ msgid "Plugin" +#~ msgstr "Extension" #~ msgid "Warning: " #~ msgstr "Attention : " @@ -1450,7 +1395,8 @@ msgstr "" #~ "\n" #~ msgid "Sessions do not seem to work correctly on your server." -#~ msgstr "Les sessions ne semblent pas fonctionner correctement sur votre serveur." +#~ msgstr "" +#~ "Les sessions ne semblent pas fonctionner correctement sur votre serveur." #~ msgid "Tag was renamed in " #~ msgstr "Le tag a été renommé dans " diff --git a/index.php b/index.php index 0ef33633..b702bd13 100644 --- a/index.php +++ b/index.php @@ -1353,6 +1353,25 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager, exit; } + if ($targetPage == Router::$PAGE_PINLINK) { + if (! isset($_GET['id']) || empty($LINKSDB[$_GET['id']])) { + // FIXME! Use a proper error system. + $msg = t('Invalid link ID provided'); + echo ''; + exit; + } + if (! $sessionManager->checkToken($_GET['token'])) { + die('Wrong token.'); + } + + $link = $LINKSDB[$_GET['id']]; + $link['sticky'] = ! $link['sticky']; + $LINKSDB[(int) $_GET['id']] = $link; + $LINKSDB->save($conf->get('resource.page_cache')); + header('Location: '.index_url($_SERVER)); + exit; + } + if ($targetPage == Router::$PAGE_EXPORT) { // Export links as a Netscape Bookmarks file diff --git a/tests/FeedBuilderTest.php b/tests/FeedBuilderTest.php index a590306d..4ca58e5a 100644 --- a/tests/FeedBuilderTest.php +++ b/tests/FeedBuilderTest.php @@ -82,8 +82,8 @@ public function testRSSBuildData() $this->assertFalse($data['usepermalinks']); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); - // Test first link (note link) - $link = reset($data['links']); + // Test first not pinned link (note link) + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals(41, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); @@ -119,7 +119,7 @@ public function testAtomBuildData() $data = $feedBuilder->buildData(); $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['last_update']); - $link = reset($data['links']); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertRegExp('/2015-03-10T11:46:51\+\d{2}:\d{2}/', $link['pub_iso_date']); $this->assertRegExp('/2016-08-03T09:30:33\+\d{2}:\d{2}/', $data['links'][8]['up_iso_date']); } @@ -148,13 +148,13 @@ public function testBuildDataFiltered() public function testBuildDataCount() { $criteria = array( - 'nb' => '1', + 'nb' => '3', ); $feedBuilder = new FeedBuilder(self::$linkDB, FeedBuilder::$FEED_ATOM, self::$serverInfo, $criteria, false); $feedBuilder->setLocale(self::$LOCALE); $data = $feedBuilder->buildData(); - $this->assertEquals(1, count($data['links'])); - $link = array_shift($data['links']); + $this->assertEquals(3, count($data['links'])); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals(41, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); } @@ -171,7 +171,7 @@ public function testBuildDataPermalinks() $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data['links'])); $this->assertTrue($data['usepermalinks']); // First link is a permalink - $link = array_shift($data['links']); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals(41, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114651'), $link['created']); $this->assertEquals('http://host.tld/?WDWyig', $link['guid']); @@ -179,7 +179,7 @@ public function testBuildDataPermalinks() $this->assertContains('Direct link', $link['description']); $this->assertContains('http://host.tld/?WDWyig', $link['description']); // Second link is a direct link - $link = array_shift($data['links']); + $link = $data['links'][array_keys($data['links'])[3]]; $this->assertEquals(8, $link['id']); $this->assertEquals(DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20150310_114633'), $link['created']); $this->assertEquals('http://host.tld/?RttfEw', $link['guid']); @@ -237,7 +237,7 @@ public function testBuildDataServerSubdir() ); // Test first link (note link) - $link = array_shift($data['links']); + $link = $data['links'][array_keys($data['links'])[2]]; $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['guid']); $this->assertEquals('http://host.tld:8080/~user/shaarli/?WDWyig', $link['url']); $this->assertContains('http://host.tld:8080/~user/shaarli/?addtag=hashtag', $link['description']); diff --git a/tests/LinkDBTest.php b/tests/LinkDBTest.php index 3b980878..fcab76f6 100644 --- a/tests/LinkDBTest.php +++ b/tests/LinkDBTest.php @@ -239,12 +239,12 @@ public function testCountHiddenPublic() public function testDays() { $this->assertEquals( - array('20100310', '20121206', '20130614', '20150310'), + array('20100309', '20100310', '20121206', '20121207', '20130614', '20150310'), self::$publicLinkDB->days() ); $this->assertEquals( - array('20100310', '20121206', '20130614', '20141125', '20150310'), + array('20100309', '20100310', '20121206', '20121207', '20130614', '20141125', '20150310'), self::$privateLinkDB->days() ); } @@ -475,13 +475,15 @@ public function testFilterHashInValid() public function testReorderLinksDesc() { self::$privateLinkDB->reorder('ASC'); - $linkIds = array(42, 4, 9, 1, 0, 7, 6, 8, 41); + $stickyIds = [11, 10]; + $standardIds = [42, 4, 9, 1, 0, 7, 6, 8, 41]; + $linkIds = array_merge($stickyIds, $standardIds); $cpt = 0; foreach (self::$privateLinkDB as $key => $value) { $this->assertEquals($linkIds[$cpt++], $key); } self::$privateLinkDB->reorder('DESC'); - $linkIds = array_reverse($linkIds); + $linkIds = array_merge(array_reverse($stickyIds), array_reverse($standardIds)); $cpt = 0; foreach (self::$privateLinkDB as $key => $value) { $this->assertEquals($linkIds[$cpt++], $key); diff --git a/tests/NetscapeBookmarkUtils/BookmarkExportTest.php b/tests/NetscapeBookmarkUtils/BookmarkExportTest.php index 6a47bbb9..77fbd5f3 100644 --- a/tests/NetscapeBookmarkUtils/BookmarkExportTest.php +++ b/tests/NetscapeBookmarkUtils/BookmarkExportTest.php @@ -110,7 +110,7 @@ public function testFilterAndFormatDoNotPrependNoteUrl() $links = NetscapeBookmarkUtils::filterAndFormat(self::$linkDb, 'public', false, ''); $this->assertEquals( '?WDWyig', - $links[0]['url'] + $links[2]['url'] ); } @@ -128,7 +128,7 @@ public function testFilterAndFormatPrependNoteUrl() ); $this->assertEquals( $indexUrl . '?WDWyig', - $links[0]['url'] + $links[2]['url'] ); } } diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php index cacee2d2..870f169a 100644 --- a/tests/Updater/UpdaterTest.php +++ b/tests/Updater/UpdaterTest.php @@ -688,6 +688,7 @@ public function testUpdateMethodDownloadSizeAndTimeoutConfOnlyTimeout() } /** +<<<<<<< HEAD * Test updateMethodWebThumbnailer with thumbnails enabled. */ public function testUpdateMethodWebThumbnailerEnabled() @@ -732,4 +733,64 @@ public function testUpdateMethodWebThumbnailerNothingToDo() $this->assertEquals(53, $this->conf->get('thumbnails.height')); $this->assertTrue(empty($_SESSION['warnings'])); } + + /** + * Test updateMethodSetSticky(). + */ + public function testUpdateStickyValid() + { + $blank = [ + 'id' => 1, + 'url' => 'z', + 'title' => '', + 'description' => '', + 'tags' => '', + 'created' => new DateTime(), + ]; + $links = [ + 1 => ['id' => 1] + $blank, + 2 => ['id' => 2] + $blank, + ]; + $refDB = new ReferenceLinkDB(); + $refDB->setLinks($links); + $refDB->write(self::$testDatastore); + $linkDB = new LinkDB(self::$testDatastore, true, false); + + $updater = new Updater(array(), $linkDB, $this->conf, true); + $this->assertTrue($updater->updateMethodSetSticky()); + + $linkDB = new LinkDB(self::$testDatastore, true, false); + foreach ($linkDB as $link) { + $this->assertFalse($link['sticky']); + } + } + + /** + * Test updateMethodSetSticky(). + */ + public function testUpdateStickyNothingToDo() + { + $blank = [ + 'id' => 1, + 'url' => 'z', + 'title' => '', + 'description' => '', + 'tags' => '', + 'created' => new DateTime(), + ]; + $links = [ + 1 => ['id' => 1, 'sticky' => true] + $blank, + 2 => ['id' => 2] + $blank, + ]; + $refDB = new ReferenceLinkDB(); + $refDB->setLinks($links); + $refDB->write(self::$testDatastore); + $linkDB = new LinkDB(self::$testDatastore, true, false); + + $updater = new Updater(array(), $linkDB, $this->conf, true); + $this->assertTrue($updater->updateMethodSetSticky()); + + $linkDB = new LinkDB(self::$testDatastore, true, false); + $this->assertTrue($linkDB[1]['sticky']); + } } diff --git a/tests/api/controllers/links/GetLinksTest.php b/tests/api/controllers/links/GetLinksTest.php index d22ed3bf..64f02774 100644 --- a/tests/api/controllers/links/GetLinksTest.php +++ b/tests/api/controllers/links/GetLinksTest.php @@ -95,7 +95,7 @@ public function testGetLinks() $this->assertEquals($this->refDB->countLinks(), count($data)); // Check order - $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; + $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42]; $cpt = 0; foreach ($data as $link) { $this->assertEquals(self::NB_FIELDS_LINK, count($link)); @@ -103,7 +103,7 @@ public function testGetLinks() } // Check first element fields - $first = $data[0]; + $first = $data[2]; $this->assertEquals('http://domain.tld/?WDWyig', $first['url']); $this->assertEquals('WDWyig', $first['shorturl']); $this->assertEquals('Link title: @website', $first['title']); @@ -120,7 +120,7 @@ public function testGetLinks() $this->assertEmpty($first['updated']); // Multi tags - $link = $data[1]; + $link = $data[3]; $this->assertEquals(7, count($link['tags'])); // Update date @@ -138,7 +138,7 @@ public function testGetLinksOffsetLimit() { $env = Environment::mock([ 'REQUEST_METHOD' => 'GET', - 'QUERY_STRING' => 'offset=1&limit=1' + 'QUERY_STRING' => 'offset=3&limit=1' ]); $request = Request::createFromEnvironment($env); $response = $this->controller->getLinks($request, new Response()); @@ -164,7 +164,7 @@ public function testGetLinksLimitAll() $data = json_decode((string) $response->getBody(), true); $this->assertEquals($this->refDB->countLinks(), count($data)); // Check order - $order = [41, 8, 6, 7, 0, 1, 9, 4, 42]; + $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42]; $cpt = 0; foreach ($data as $link) { $this->assertEquals(self::NB_FIELDS_LINK, count($link)); @@ -205,7 +205,8 @@ public function testGetLinksVisibilityAll() $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string)$response->getBody(), true); $this->assertEquals($this->refDB->countLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(10, $data[0]['id']); + $this->assertEquals(41, $data[2]['id']); $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); } @@ -243,7 +244,8 @@ public function testGetLinksVisibilityPublic() $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string)$response->getBody(), true); $this->assertEquals($this->refDB->countPublicLinks(), count($data)); - $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(10, $data[0]['id']); + $this->assertEquals(41, $data[2]['id']); $this->assertEquals(self::NB_FIELDS_LINK, count($data[0])); } @@ -413,8 +415,9 @@ public function testGetLinksSearchTags() $response = $this->controller->getLinks($request, new Response()); $this->assertEquals(200, $response->getStatusCode()); $data = json_decode((string) $response->getBody(), true); - $this->assertEquals(9, count($data)); - $this->assertEquals(41, $data[0]['id']); + $this->assertEquals(\ReferenceLinkDB::$NB_LINKS_TOTAL, count($data)); + $this->assertEquals(10, $data[0]['id']); + $this->assertEquals(41, $data[2]['id']); // wildcard: optional ('*' does not need to expand) $env = Environment::mock([ diff --git a/tests/utils/ReferenceLinkDB.php b/tests/utils/ReferenceLinkDB.php index e887aa78..7426ad07 100644 --- a/tests/utils/ReferenceLinkDB.php +++ b/tests/utils/ReferenceLinkDB.php @@ -4,7 +4,7 @@ */ class ReferenceLinkDB { - public static $NB_LINKS_TOTAL = 9; + public static $NB_LINKS_TOTAL = 11; private $_links = array(); private $_publicCount = 0; @@ -15,6 +15,32 @@ class ReferenceLinkDB */ public function __construct() { + $this->addLink( + 11, + 'Pined older', + '?PCRizQ', + 'This is an older pinned link', + 0, + DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20100309_101010'), + '', + null, + 'PCRizQ', + true + ); + + $this->addLink( + 10, + 'Pined', + '?0gCTjQ', + 'This is a pinned link', + 0, + DateTime::createFromFormat(LinkDB::LINK_DATE_FORMAT, '20121207_152312'), + '', + null, + '0gCTjQ', + true + ); + $this->addLink( 41, 'Link title: @website', @@ -114,7 +140,17 @@ public function __construct() /** * Adds a new link */ - protected function addLink($id, $title, $url, $description, $private, $date, $tags, $updated = '', $shorturl = '') + protected function addLink( + $id, + $title, + $url, + $description, + $private, + $date, + $tags, + $updated = '', + $shorturl = '', + $pinned = false) { $link = array( 'id' => $id, @@ -126,6 +162,7 @@ protected function addLink($id, $title, $url, $description, $private, $date, $ta 'created' => $date, 'updated' => $updated, 'shorturl' => $shorturl ? $shorturl : smallHash($date->format(LinkDB::LINK_DATE_FORMAT) . $id), + 'sticky' => $pinned ); $this->_links[$id] = $link; @@ -165,6 +202,10 @@ public function reorder($order = 'DESC') $order = $order === 'ASC' ? -1 : 1; // Reorder array by dates. usort($this->_links, function($a, $b) use ($order) { + if (isset($a['sticky']) && isset($b['sticky']) && $a['sticky'] !== $b['sticky']) { + return $a['sticky'] ? -1 : 1; + } + return $a['created'] < $b['created'] ? 1 * $order : -1 * $order; }); } diff --git a/tpl/default/linklist.html b/tpl/default/linklist.html index 8ea2ce66..c04f4786 100644 --- a/tpl/default/linklist.html +++ b/tpl/default/linklist.html @@ -125,6 +125,8 @@ {$strPermalink=t('Permalink')} {$strPermalinkLc=t('permalink')} {$strAddTag=t('Add tag')} + {$strToggleSticky=t('Toggle sticky')} + {$strSticky=t('Sticky')} {ignore}End of translations{/ignore} {loop="links"}
@@ -201,7 +203,23 @@

+ + + + + + {else} + {if="$value.sticky"} + + {/if} {/if} {if="!$hide_timestamps || $is_logged_in"}