]> git.immae.eu Git - github/shaarli/Shaarli.git/commitdiff
Merge pull request #1276 from ArthurHoaro/feature/bulk-visibility
authorArthurHoaro <arthur@hoa.ro>
Mon, 22 Apr 2019 10:31:09 +0000 (12:31 +0200)
committerGitHub <noreply@github.com>
Mon, 22 Apr 2019 10:31:09 +0000 (12:31 +0200)
Bulk action: set visibility

1  2 
index.php
tpl/default/page.header.html

diff --combined index.php
index 5447823713d3f658b786e87803a2fe11630ba6c3,322c360c650a9ce5ecbcdfebaea71bb553546535..68e0364cbdba182af47337f52d4767e9f7e982a2
+++ b/index.php
@@@ -312,7 -312,9 +312,7 @@@ function showDailyRSS($conf, $loginMana
      $LINKSDB = new LinkDB(
          $conf->get('resource.datastore'),
          $loginManager->isLoggedIn(),
 -        $conf->get('privacy.hide_public_links'),
 -        $conf->get('redirector.url'),
 -        $conf->get('redirector.encode_url')
 +        $conf->get('privacy.hide_public_links')
      );
  
      /* Some Shaarlies may have very few links, so we need to look
  
          // We pre-format some fields for proper output.
          foreach ($links as &$link) {
 -            $link['formatedDescription'] = format_description(
 -                $link['description'],
 -                $conf->get('redirector.url'),
 -                $conf->get('redirector.encode_url')
 -            );
 +            $link['formatedDescription'] = format_description($link['description']);
              $link['timestamp'] = $link['created']->getTimestamp();
 -            if (startsWith($link['url'], '?')) {
 +            if (is_note($link['url'])) {
                  $link['url'] = index_url($_SERVER) . $link['url'];  // make permalink URL absolute
              }
          }
@@@ -427,7 -433,11 +427,7 @@@ function showDaily($pageBuilder, $LINKS
          $taglist = explode(' ', $link['tags']);
          uasort($taglist, 'strcasecmp');
          $linksToDisplay[$key]['taglist']=$taglist;
 -        $linksToDisplay[$key]['formatedDescription'] = format_description(
 -            $link['description'],
 -            $conf->get('redirector.url'),
 -            $conf->get('redirector.encode_url')
 -        );
 +        $linksToDisplay[$key]['formatedDescription'] = format_description($link['description']);
          $linksToDisplay[$key]['timestamp'] =  $link['created']->getTimestamp();
      }
  
@@@ -1064,6 -1074,7 +1064,6 @@@ function renderPage($conf, $pluginManag
              $PAGE->assign('api_enabled', $conf->get('api.enabled', true));
              $PAGE->assign('api_secret', $conf->get('api.secret'));
              $PAGE->assign('languages', Languages::getAvailableLanguages());
 -            $PAGE->assign('language', $conf->get('translation.language'));
              $PAGE->assign('gd_enabled', extension_loaded('gd'));
              $PAGE->assign('thumbnails_mode', $conf->get('thumbnails.mode', Thumbnailer::MODE_NONE));
              $PAGE->assign('pagetitle', t('Configure') .' - '. $conf->get('general.title', 'Shaarli'));
              $link['title'] = $link['url'];
          }
  
 -        if ($conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE) {
 +        if ($conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) !== Thumbnailer::MODE_NONE
 +            && ! is_note($link['url'])
 +        ) {
              $thumbnailer = new Thumbnailer($conf);
              $link['thumbnail'] = $thumbnailer->get($url);
          }
  
 +        $link['sticky'] = isset($link['sticky']) ? $link['sticky'] : false;
 +
          $pluginManager->executeHooks('save_link', $link);
  
          $LINKSDB[$id] = $link;
          }
  
          header('Location: ' . $location); // After deleting the link, redirect to appropriate location
+         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;
      }
  
          $ids = [];
          foreach ($LINKSDB as $link) {
              // A note or not HTTP(S)
 -            if ($link['url'][0] === '?' || ! startsWith(strtolower($link['url']), 'http')) {
 +            if (is_note($link['url']) || ! startsWith(strtolower($link['url']), 'http')) {
                  continue;
              }
              $ids[] = $link['id'];
@@@ -1655,7 -1707,11 +1700,7 @@@ function buildLinkList($PAGE, $LINKSDB
      $linkDisp = array();
      while ($i<$end && $i<count($keys)) {
          $link = $linksToDisplay[$keys[$i]];
 -        $link['description'] = format_description(
 -            $link['description'],
 -            $conf->get('redirector.url'),
 -            $conf->get('redirector.encode_url')
 -        );
 +        $link['description'] = format_description($link['description']);
          $classLi =  ($i % 2) != 0 ? '' : 'publicLinkHightLight';
          $link['class'] = $link['private'] == 0 ? $classLi : 'private';
          $link['timestamp'] = $link['created']->getTimestamp();
          'search_term' => $searchterm,
          'search_tags' => $searchtags,
          'visibility' => ! empty($_SESSION['visibility']) ? $_SESSION['visibility'] : '',
 -        'redirector' => $conf->get('redirector.url'),  // Optional redirector URL.
          'links' => $linkDisp,
      );
  
@@@ -1865,7 -1922,9 +1910,7 @@@ try 
  $linkDb = new LinkDB(
      $conf->get('resource.datastore'),
      $loginManager->isLoggedIn(),
 -    $conf->get('privacy.hide_public_links'),
 -    $conf->get('redirector.url'),
 -    $conf->get('redirector.encode_url')
 +    $conf->get('privacy.hide_public_links')
  );
  
  $container = new \Slim\Container();
@@@ -1888,7 -1947,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 5f1e4d66a59b519d46d3d03ff407f7b8cb41f17f,4b66502349d7a78e34fcad2c95817813c87eea3f..2832ebbb49601c761274978bd777a7d88f1734f2
@@@ -20,7 -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>