]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Merge pull request #1295 from ArthurHoaro/feature/visited-link-color
authorArthurHoaro <arthur@hoa.ro>
Wed, 8 May 2019 09:00:58 +0000 (11:00 +0200)
committerGitHub <noreply@github.com>
Wed, 8 May 2019 09:00:58 +0000 (11:00 +0200)
Slightly lighten visited link color

15 files changed:
.readthedocs.yml [new file with mode: 0644]
AUTHORS
CHANGELOG.md
README.md
application/Router.php
assets/default/js/base.js
assets/default/scss/shaarli.scss
doc/md/Download-and-Installation.md
inc/languages/fr/LC_MESSAGES/shaarli.po
index.php
tpl/default/linklist.html
tpl/default/linklist.paging.html
tpl/default/page.footer.html
tpl/default/page.header.html
tpl/default/tag.sort.html

diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644 (file)
index 0000000..09e5a6a
--- /dev/null
@@ -0,0 +1,15 @@
+# .readthedocs.yml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Build documentation with MkDocs
+mkdocs:
+  configuration: mkdocs.yml
+
+# Optionally set the version of Python and requirements required to build your docs
+# https://github.com/rtfd/readthedocs.org/issues/5250
+python:
+  version: 3.5
\ No newline at end of file
diff --git a/AUTHORS b/AUTHORS
index db23ad322f18ea1bbf5728cf5b24a365571410f7..7fa2734ac65ecb24b9e04e092b005c8970c20b26 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,13 +1,15 @@
-   687 ArthurHoaro <arthur@hoa.ro>
-   355 VirtualTam <virtualtam@flibidi.net>
-   195 nodiscc <nodiscc@gmail.com>
+   734 ArthurHoaro <arthur@hoa.ro>
+   400 VirtualTam <virtualtam@flibidi.net>
+   215 nodiscc <nodiscc@gmail.com>
     56 Sébastien Sauvage <sebsauvage@sebsauvage.net>
     15 Florian Eula <eula.florian@gmail.com>
     13 Emilien Klein <emilien@klein.st>
     12 Nicolas Danelon <hi@nicolasmd.com.ar>
      9 Willi Eggeling <thewilli@gmail.com>
      8 Christophe HENRY <christophe.henry@sbgodin.fr>
+     7 Luce Carević <lcarevic@access42.net>
      6 B. van Berkum <dev@dotmpe.com>
+     6 llune <llune@users.noreply.github.com>
      5 Lucas Cimon <lucas.cimon@gmail.com>
      5 Mark Schmitz <kramred@gmail.com>
      5 kalvn <kalvnthereal@gmail.com>
@@ -15,7 +17,7 @@
      4 David Sferruzza <david.sferruzza@gmail.com>
      4 Immánuel Fodor <immanuelfactor+github@gmail.com>
      3 Teromene <teromene@teromene.fr>
-     3 llune <llune@users.noreply.github.com>
+     2 Alexandre G.-Raymond <alex@ndre.gr>
      2 Chris Kuethe <chris.kuethe@gmail.com>
      2 Felix Bartels <felix@host-consultants.de>
      2 Knah Tsaeb <Knah-Tsaeb@knah-tsaeb.org>
      2 julienCXX <software@chmodplusx.eu>
      2 philipp-r <philipp-r@users.noreply.github.com>
      2 pips <pips@e5150.fr>
+     2 trailjeep <trailjeep@gmail.com>
      1 Adrien Oliva <adrien.oliva@yapbreak.fr>
      1 Adrien le Maire <adrien@alemaire.be>
-     1 Alexandre G.-Raymond <alex@ndre.gr>
      1 Alexis J <alexis@effingo.be>
      1 Angristan <angristan@users.noreply.github.com>
+     1 Bish Erbas <42714627+bisherbas@users.noreply.github.com>
      1 BoboTiG <bobotig@gmail.com>
      1 Bronco <bronco@warriordudimanche.net>
      1 Buster One <37770318+buster-one@users.noreply.github.com>
index ada0f1096a7f26fcaf121c6c84bf37362e1ae038..865e037068cd0480eea6c5efad271d078547b4da 100644 (file)
@@ -5,6 +5,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
 and this project adheres to [Semantic Versioning](http://semver.org/).
 
 
+## [v0.10.4](https://github.com/shaarli/Shaarli/releases/tag/v0.10.4) - 2019-04-16
+### Fixed
+- Fix thumbnails disabling if PHP GD is not installed
+- Fix a warning if links sticky status isn't set
+
 ## [v0.10.3](https://github.com/shaarli/Shaarli/releases/tag/v0.10.3) - 2019-02-23
 ### Added
 - Add OpenGraph metadata tags on permalink page
index ea2c8176f27405bf516b4c8ab781903b7a4fdac7..21f2eae75013f7c7ad9551e0f55947ec7eeae09b 100644 (file)
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ _It is designed to be personal (single-user), fast and handy._
 [![](https://img.shields.io/badge/stable-v0.9.7-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.9.7)
 [![](https://img.shields.io/travis/shaarli/Shaarli/stable.svg?label=stable)](https://travis-ci.org/shaarli/Shaarli)
 &bull;
-[![](https://img.shields.io/badge/latest-v0.10.3-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.10.3)
+[![](https://img.shields.io/badge/latest-v0.10.4-blue.svg)](https://github.com/shaarli/Shaarli/releases/tag/v0.10.4)
 [![](https://img.shields.io/travis/shaarli/Shaarli/latest.svg?label=latest)](https://travis-ci.org/shaarli/Shaarli)
 &bull;
 [![](https://img.shields.io/badge/master-v0.11.x-blue.svg)](https://github.com/shaarli/Shaarli)
index 05877acdb6d2bfd88979b16bae18ade4ca737b6e..d7187487e6ff3a736e797623577af7bc9998ebf3 100644 (file)
@@ -38,6 +38,8 @@ class Router
 
     public static $PAGE_DELETELINK = 'delete_link';
 
+    public static $PAGE_CHANGE_VISIBILITY = 'change_visibility';
+
     public static $PAGE_PINLINK = 'pin';
 
     public static $PAGE_EXPORT = 'export';
@@ -149,6 +151,10 @@ class Router
             return self::$PAGE_DELETELINK;
         }
 
+        if (isset($get[self::$PAGE_CHANGE_VISIBILITY])) {
+            return self::$PAGE_CHANGE_VISIBILITY;
+        }
+
         if (startsWith($query, 'do=' . self::$PAGE_PINLINK)) {
             return self::$PAGE_PINLINK;
         }
index 99e03370a763c0bdd8214ce43a18a6eccaab394c..d5c29c695295ae574ec27ed5d06cf4b71bdd5f7a 100644 (file)
@@ -466,6 +466,28 @@ function init(description) {
     });
   }
 
+  const changeVisibilityButtons = document.querySelectorAll('.actions-change-visibility');
+  if (changeVisibilityButtons != null && token != null) {
+    [...changeVisibilityButtons].forEach((button) => {
+      button.addEventListener('click', (event) => {
+        event.preventDefault();
+        const visibility = event.target.getAttribute('data-visibility');
+
+        const links = [];
+        const linkCheckedCheckboxes = document.querySelectorAll('.link-checkbox:checked');
+        [...linkCheckedCheckboxes].forEach((checkbox) => {
+          links.push({
+            id: checkbox.value,
+            title: document.querySelector(`.linklist-item[data-id="${checkbox.value}"] .linklist-link`).innerHTML,
+          });
+        });
+
+        const ids = links.map(item => item.id);
+        window.location = `?change_visibility&token=${token.value}&newVisibility=${visibility}&ids=${ids.join('+')}`;
+      });
+    });
+  }
+
   /**
    * Select all button
    */
index b14052eda25e421fe4c94a11619bf870be6266f9..a529f01cd42941b99098dd8813bf4751c50f531c 100644 (file)
@@ -716,11 +716,19 @@ body,
     }
   }
 
+  .label {
+    font-family: Arial, sans-serif;
+    font-size: .65em;
+  }
+
   .label-private {
     border: solid 1px $orange;
     color: $orange;
-    font-family: Arial, sans-serif;
-    font-size: .65em;
+  }
+
+  .label-sticky {
+    border: solid 1px $blue;
+    color: $blue;
   }
 }
 
index 1c4ad947a8f85fc84d3cff12bd78ddad41a6e47d..8c9e8a325f123033dbcd988206978a7fba09f9d1 100644 (file)
@@ -24,11 +24,11 @@ Using one of the following methods:
 
 In most cases, you should download the latest Shaarli release from the [releases](https://github.com/shaarli/Shaarli/releases) page. Download our **shaarli-full** archive to include dependencies.
 
-The current latest released version is `v0.10.3`
+The current latest released version is `v0.10.4`
 
 ```bash
-$ wget https://github.com/shaarli/Shaarli/releases/download/v0.10.3/shaarli-v0.10.3-full.zip
-$ unzip shaarli-v0.10.3-full.zip
+$ wget https://github.com/shaarli/Shaarli/releases/download/v0.10.4/shaarli-v0.10.4-full.zip
+$ unzip shaarli-v0.10.4-full.zip
 $ mv Shaarli /path/to/shaarli/
 ```
 
index 102c80da93636a5de87d265c4cbc25100dd739de..649f6dd5506a9a0aa5098d38eeeb5a71eab09237 100644 (file)
@@ -1255,6 +1255,9 @@ msgstr ""
 #~ msgid "Selection"
 #~ msgstr "Choisir"
 
+#~ msgid "Select all"
+#~ msgstr "Tout sélectionner"
+
 #~ msgid "Public"
 #~ msgstr "Publics"
 
index a96c9cfd3b4850757034f5f4d6ab4dd198cab8a3..68e0364cbdba182af47337f52d4767e9f7e982a2 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1266,6 +1266,51 @@ function renderPage($conf, $pluginManager, $LINKSDB, $history, $sessionManager,
         exit;
     }
 
+    // -------- User clicked either "Set public" or "Set private" bulk operation
+    if ($targetPage == Router::$PAGE_CHANGE_VISIBILITY) {
+        if (! $sessionManager->checkToken($_GET['token'])) {
+            die(t('Wrong token.'));
+        }
+
+        $ids = trim($_GET['ids']);
+        if (strpos($ids, ' ') !== false) {
+            // multiple, space-separated ids provided
+            $ids = array_values(array_filter(preg_split('/\s+/', escape($ids))));
+        } else {
+            // only a single id provided
+            $ids = [$ids];
+        }
+
+        // assert at least one id is given
+        if (!count($ids)) {
+            die('no id provided');
+        }
+        // assert that the visibility is valid
+        if (!isset($_GET['newVisibility']) || !in_array($_GET['newVisibility'], ['public', 'private'])) {
+            die('invalid visibility');
+        } else {
+            $private = $_GET['newVisibility'] === 'private';
+        }
+        foreach ($ids as $id) {
+            $id = (int) escape($id);
+            $link = $LINKSDB[$id];
+            $link['private'] = $private;
+            $pluginManager->executeHooks('save_link', $link);
+            $LINKSDB[$id] = $link;
+        }
+        $LINKSDB->save($conf->get('resource.page_cache')); // save to disk
+
+        $location = '?';
+        if (isset($_SERVER['HTTP_REFERER'])) {
+            $location = generateLocation(
+                $_SERVER['HTTP_REFERER'],
+                $_SERVER['HTTP_HOST']
+            );
+        }
+        header('Location: ' . $location); // After deleting the link, redirect to appropriate location
+        exit;
+    }
+
     // -------- User clicked the "EDIT" button on a link: Display link edit form.
     if (isset($_GET['edit_link'])) {
         $id = (int) escape($_GET['edit_link']);
@@ -1888,7 +1933,7 @@ $app->group('/api/v1', function () {
     $this->put('/tags/{tagName:[\w]+}', '\Shaarli\Api\Controllers\Tags:putTag')->setName('putTag');
     $this->delete('/tags/{tagName:[\w]+}', '\Shaarli\Api\Controllers\Tags:deleteTag')->setName('deleteTag');
 
-    $this->get('/history', '\Shaarli\Api\Controllers\History:getHistory')->setName('getHistory');
+    $this->get('/history', '\Shaarli\Api\Controllers\HistoryController:getHistory')->setName('getHistory');
 })->add('\Shaarli\Api\ApiMiddleware');
 
 $response = $app->run(true);
index d7005c21cacefce82aed9430e5f4ba206c749818..a2aaac82cb01e94b2894387d53d3bbbcd8185698 100644 (file)
@@ -94,7 +94,7 @@
           {'tagged'|t}
           {loop="$exploded_tags"}
               <span class="label label-tag" title="{'Remove tag'|t}">
-                <a href="?removetag={function="urlencode($value)"}">{$value}<span class="remove"><i class="fa fa-times"></i></span></a>
+                <a href="?removetag={function="urlencode($value)"}">{$value}<span class="remove"><i class="fa fa-times" aria-hidden="true"></i></span></a>
               </span>
           {/loop}
         {/if}
               </div>
             {/if}
 
-            {if="$is_logged_in"}
-              <div class="linklist-item-editbuttons">
-                {if="$value.private"}
-                  <span class="label label-private">{$strPrivate}</span>
-                {/if}
-              </div>
-            {/if}
+            <div class="linklist-item-editbuttons">
+              {if="$value.sticky"}
+                <span class="label label-sticky">{$strSticky}</span>
+              {/if}
+              {if="$value.private"}
+                <span class="label label-private">{$strPrivate}</span>
+              {/if}
+            </div>
 
             <h2>
               <a href="{$value.real_url}">
                       <input type="checkbox" class="link-checkbox" value="{$value.id}">
                     </span>
                     <span class="linklist-item-infos-controls-item ctrl-edit">
-                      <a href="?edit_link={$value.id}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link"></i></a>
+                      <a href="?edit_link={$value.id}" aria-label="{$strEdit}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link" aria-hidden="true"></i></a>
                     </span>
                     <span class="linklist-item-infos-controls-item ctrl-delete">
-                      <a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}"
+                      <a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}" aria-label="{$strDelete}"
                          title="{$strDelete}" class="delete-link pure-u-0 pure-u-lg-visible confirm-delete">
-                        <i class="fa fa-trash"></i>
+                        <i class="fa fa-trash" aria-hidden="true"></i>
                       </a>
                     </span>
                     <span class="linklist-item-infos-controls-item ctrl-pin">
                       <a href="?do=pin&amp;id={$value.id}&amp;token={$token}"
-                         title="{$strToggleSticky}" class="pin-link {if="$value.sticky"}pinned-link{/if} pure-u-0 pure-u-lg-visible">
-                        <i class="fa fa-thumb-tack"></i>
+                         title="{$strToggleSticky}" aria-label="{$strToggleSticky}" class="pin-link {if="$value.sticky"}pinned-link{/if} pure-u-0 pure-u-lg-visible">
+                        <i class="fa fa-thumb-tack" aria-hidden="true"></i>
                       </a>
                     </span>
                   </div>
                 {ignore}do not add space or line break between these div - Firefox issue{/ignore}
                 class="linklist-item-infos-url pure-u-lg-5-12 pure-u-1">
                 <a href="{$value.real_url}" title="{$value.title}">
-                  <i class="fa fa-link"></i> {$value.url}
+                  <i class="fa fa-link" aria-hidden="true"></i> {$value.url}
                 </a>
                 <div class="linklist-item-buttons pure-u-0 pure-u-lg-visible">
-                  <a href="#" title="{$strFold}" class="fold-button"><i class="fa fa-chevron-up"></i></a>
+                  <a href="#" aria-label="{$strFold}" title="{$strFold}" class="fold-button"><i class="fa fa-chevron-up" aria-hidden="true"></i></a>
                 </div>
               </div>
               <div class="mobile-buttons pure-u-1 pure-u-lg-0">
                 {/if}
                 {if="$is_logged_in"}
                   &middot;
-                  <a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}"
+                  <a href="?delete_link&amp;lf_linkdate={$value.id}&amp;token={$token}" aria-label="{$strDelete}"
                      title="{$strDelete}" class="delete-link confirm-delete">
-                    <i class="fa fa-trash"></i>
+                    <i class="fa fa-trash" aria-hidden="true"></i>
                   </a>
                   &middot;
-                  <a href="?edit_link={$value.id}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link"></i></a>
+                  <a href="?edit_link={$value.id}" aria-label="{$strEdit}" title="{$strEdit}"><i class="fa fa-pencil-square-o edit-link" aria-hidden="true"></i></a>
                 {/if}
               </div>
             </div>
index fe665a840293fa2396ff4b0ea9470ce6a091cc4a..4e50495a75bb801e8e026b25c4a2e152c29ad873 100644 (file)
@@ -6,21 +6,21 @@
           {'Filters'|t}
         </span>
         {if="$is_logged_in"}
-        <a href="?visibility=private" title="{'Only display private links'|t}"
+        <a href="?visibility=private" aria-label="{'Only display private links'|t}" title="{'Only display private links'|t}"
            class="{if="$visibility==='private'"}filter-on{else}filter-off{/if}"
-        ><i class="fa fa-user-secret"></i></a>
-        <a href="?visibility=public" title="{'Only display public links'|t}"
+        ><i class="fa fa-user-secret" aria-hidden="true"></i></a>
+        <a href="?visibility=public" aria-label="{'Only display public links'|t}" title="{'Only display public links'|t}"
            class="{if="$visibility==='public'"}filter-on{else}filter-off{/if}"
-        ><i class="fa fa-globe"></i></a>
+        ><i class="fa fa-globe" aria-hidden="true"></i></a>
         {/if}
-        <a href="?untaggedonly" title="{'Filter untagged links'|t}"
+        <a href="?untaggedonly" aria-label="{'Filter untagged links'|t}" title="{'Filter untagged links'|t}"
            class={if="$untaggedonly"}"filter-on"{else}"filter-off"{/if}
-        ><i class="fa fa-tag"></i></a>
-        <a href="#" title="{'Select all'|t}"
+        ><i class="fa fa-tag" aria-hidden="true"></i></a>
+        <a href="#" aria-label="{'Select all'|t}" title="{'Select all'|t}"
            class="filter-off select-all-button"
-        ><i class="fa fa-check-square-o"></i></a>
-        <a href="#" class="filter-off fold-all pure-u-lg-0" title="{'Fold all'|t}">
-          <i class="fa fa-chevron-up"></i>
+        ><i class="fa fa-check-square-o" aria-hidden="true"></i></a>
+        <a href="#" class="filter-off fold-all pure-u-lg-0" aria-label="{'Fold all'|t}" title="{'Fold all'|t}">
+          <i class="fa fa-chevron-up" aria-hidden="true"></i>
         </a>
         {loop="$action_plugin"}
           {$value.attr.class=isset($value.attr.class) ? $value.attr.class : ''}
@@ -59,8 +59,8 @@
       <form method="GET" class="pure-u-0 pure-u-lg-visible">
         <input type="text" name="linksperpage" placeholder="133">
       </form>
-      <a href="#" class="filter-off fold-all pure-u-0 pure-u-lg-visible" title="{'Fold all'|t}">
-        <i class="fa fa-chevron-up"></i>
+      <a href="#" class="filter-off fold-all pure-u-0 pure-u-lg-visible" aria-label="{'Fold all'|t}" title="{'Fold all'|t}">
+        <i class="fa fa-chevron-up" aria-hidden="true"></i>
       </a>
     </div>
   </div>
index 5af39be7d5d7ec2c6fd5a448b47953d0a0752156..f7ae2b84d403c24e4608a52271d8277bbce04a5f 100644 (file)
@@ -2,7 +2,7 @@
 
 <div class="pure-g">
   <div class="pure-u-2-24"></div>
-  <div id="footer" class="pure-u-20-24 footer-container">
+  <footer id="footer" class="pure-u-20-24 footer-container" role="contentinfo">
     <strong><a href="https://github.com/shaarli/Shaarli">Shaarli</a></strong>
     {if="$is_logged_in===true"}
       {$version}
@@ -13,7 +13,7 @@
       {loop="$plugins_footer.text"}
           {$value}
       {/loop}
-  </div>
+  </footer>
   <div class="pure-u-2-24"></div>
 </div>
 
index 4f6dd4d8f87afa536db31854f99a3f9083c6080f..2832ebbb49601c761274978bd777a7d88f1734f2 100644 (file)
@@ -20,7 +20,7 @@
         {if="$is_logged_in || $openshaarli"}
           <li class="pure-menu-item">
             <a href="?do=addlink" class="pure-menu-link" id="shaarli-menu-shaare">
-              <i class="fa fa-plus" ></i> {'Shaare'|t}
+              <i class="fa fa-plus" aria-hidden="true"></i> {'Shaare'|t}
             </a>
           </li>
           <li class="pure-menu-item" id="shaarli-menu-tools">
           <li class="pure-menu-item" id="shaarli-menu-desktop-search">
             <a href="#" class="pure-menu-link subheader-opener"
                data-open-id="search"
-               id="search-button" title="{'Search'|t}">
-              <i class="fa fa-search"></i>
+               id="search-button" aria-label="{'Search'|t}" title="{'Search'|t}">
+              <i class="fa fa-search" aria-hidden="true"></i>
             </a>
           </li>
           <li class="pure-menu-item" id="shaarli-menu-desktop-rss">
-            <a href="?do={$feed_type}{$searchcrits}" class="pure-menu-link" title="{'RSS Feed'|t}">
-              <i class="fa fa-rss"></i>
+            <a href="?do={$feed_type}{$searchcrits}" class="pure-menu-link" title="{'RSS Feed'|t}" aria-label="{'RSS Feed'|t}">
+              <i class="fa fa-rss" aria-hidden="true"></i>
             </a>
           </li>
           {if="!$is_logged_in"}
             <li class="pure-menu-item" id="shaarli-menu-desktop-login">
               <a href="?do=login" class="pure-menu-link"
                  data-open-id="header-login-form"
-                 id="login-button" title="{'Login'|t}">
-                <i class="fa fa-user"></i>
+                 id="login-button" aria-label="{'Login'|t}" title="{'Login'|t}">
+                <i class="fa fa-user" aria-hidden="true"></i>
               </a>
             </li>
           {else}
             <li class="pure-menu-item" id="shaarli-menu-desktop-logout">
-              <a href="?do=logout" class="pure-menu-link" title="{'Logout'|t}">
-                <i class="fa fa-sign-out"></i>
+              <a href="?do=logout" class="pure-menu-link" aria-label="{'Logout'|t}" title="{'Logout'|t}">
+                <i class="fa fa-sign-out" aria-hidden="true"></i>
               </a>
             </li>
           {/if}
   <div id="actions" class="subheader-form">
     <div class="pure-g">
       <div class="pure-u-1">
-        <a href="" id="actions-delete" class="button">{'Delete'|t}</a>
+        <a href="" id="actions-delete" class="button">
+          <i class="fa fa-trash"></i>
+          {'Delete'|t}
+        </a>&nbsp;
+        <a href="" class="actions-change-visibility button" data-visibility="public">
+          <i class="fa fa-globe"></i>
+          {'Set public'|t}
+        </a>&nbsp;
+        <a href="" class="actions-change-visibility button" data-visibility="private">
+          <i class="fa fa-user-secret"></i>
+          {'Set private'|t}
+        </a>
       </div>
     </div>
   </div>
index 89acda0d56353a77ea7088f93c49a4e4cc1ff118..d24c9f645ae3f9feecc541bb8ff22eeb2c258cbe 100644 (file)
@@ -1,8 +1,8 @@
 <div class="pure-g">
   <div class="pure-u-1 pure-alert pure-alert-success tag-sort">
     {'Sort by:'|t}
-    <a href="?do=tagcloud" title="cloud">{'Cloud'|t}</a> &middot;
-    <a href="?do=taglist&sort=usage" title="cloud">{'Most used'|t}</a> &middot;
-    <a href="?do=taglist&sort=alpha" title="cloud">{'Alphabetical'|t}</a>
+    <a href="?do=tagcloud">{'Cloud'|t}</a> &middot;
+    <a href="?do=taglist&sort=usage">{'Most used'|t}</a> &middot;
+    <a href="?do=taglist&sort=alpha">{'Alphabetical'|t}</a>
   </div>
 </div>
\ No newline at end of file