Added list view

This commit is contained in:
Nicolas Lœuillet 2016-11-28 11:02:10 +01:00
parent 34ea7be622
commit 9f01d0fde0
12 changed files with 139 additions and 17 deletions

View file

@ -0,0 +1,49 @@
<?php
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Added view_mode in user config.
*/
class Version20161128084725 extends AbstractMigration implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
private $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
private function getTable($tableName)
{
return $this->container->getParameter('database_table_prefix').$tableName;
}
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
$configTable = $schema->getTable($this->getTable('config'));
$this->skipIf($configTable->hasColumn('view_mode'), 'It seems that you already played this migration.');
$configTable->addColumn('view_mode', 'integer');
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
$configTable = $schema->getTable($this->getTable('config'));
$configTable->dropColumn('view_mode');
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

View file

@ -297,18 +297,14 @@ h2::after {
text-decoration: none; text-decoration: none;
} }
#listmode a:hover {
opacity: 1;
}
#listmode.tablemode { #listmode.tablemode {
background-image: url("../img/baggy/table.png"); background-image: url("../../_global/img/table.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: bottom; background-position: bottom;
} }
#listmode.listmode { #listmode.listmode {
background-image: url("../img/baggy/list.png"); background-image: url("../../_global/img/list.png");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: bottom; background-position: bottom;
} }
@ -353,8 +349,8 @@ footer a {
} }
.listmode.entry { .listmode.entry {
width: 100% !important; width: 100%;
margin-left: 0 !important; height: inherit;
} }
.card-entry-labels { .card-entry-labels {
@ -588,6 +584,7 @@ div.pagination ul {
text-align: left; text-align: left;
font-style: italic; font-style: italic;
color: #999; color: #999;
display: inline-flex;
} }
div.pagination ul > * { div.pagination ul > * {

View file

@ -194,7 +194,6 @@ main,
.results { .results {
height: 1em; height: 1em;
line-height: 30px;
} }
.results .nb-results, .results .nb-results,
@ -203,6 +202,14 @@ main,
margin-bottom: 0; margin-bottom: 0;
} }
.results .nb-results {
display: inline-flex;
}
.results a {
color: #444;
}
.pagination { .pagination {
float: right; float: right;
} }
@ -593,6 +600,7 @@ a.original {
background-position: 50%; background-position: 50%;
} }
/* ========================================================================== /* ==========================================================================
5 = Article 5 = Article
========================================================================== */ ========================================================================== */

View file

@ -363,4 +363,25 @@ class ConfigController extends Controller
return $this->redirect($this->generateUrl('fos_user_security_login')); return $this->redirect($this->generateUrl('fos_user_security_login'));
} }
/**
* Switch view mode for current user.
*
* @Route("/config/view-mode", name="switch_view_mode")
*
* @param Request $request
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
*/
public function changeViewModeAction(Request $request)
{
$user = $this->getUser();
$user->getConfig()->setViewMode(!$user->getConfig()->getViewMode());
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->redirect($request->headers->get('referer'));
}
} }

View file

@ -97,6 +97,13 @@ class Config
*/ */
private $actionMarkAsRead; private $actionMarkAsRead;
/**
* @var int
*
* @ORM\Column(name="view_mode", type="integer", nullable=true)
*/
private $viewMode;
/** /**
* @ORM\OneToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="config") * @ORM\OneToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="config")
*/ */
@ -339,6 +346,26 @@ class Config
return $this; return $this;
} }
/**
* @return int
*/
public function getViewMode()
{
return $this->viewMode;
}
/**
* @param int $viewMode
*
* @return Config
*/
public function setViewMode($viewMode)
{
$this->viewMode = $viewMode;
return $this;
}
/** /**
* @param TaggingRule $rule * @param TaggingRule $rule
* *

View file

@ -13,9 +13,11 @@
{% block content %} {% block content %}
{% set viewMode = app.user.config.viewMode %}
<div class="results"> <div class="results">
<div class="nb-results">{{ 'entry.list.number_on_the_page'|transchoice(entries.count) }}</div> <div class="nb-results">{{ 'entry.list.number_on_the_page'|transchoice(entries.count) }}</div>
<div class="pagination"> <div class="pagination">
<a href="{{ path('switch_view_mode') }}"><i class="viewmode-btn material-icons md-36">{% if viewMode == 0 %}list{% else %}view_module{% endif %}</i></a>
<i class="btn-clickable download-btn material-icons md-36">file_download</i> <i class="btn-clickable download-btn material-icons md-36">file_download</i>
<i class="btn-clickable filter-btn material-icons md-36">filter_list</i> <i class="btn-clickable filter-btn material-icons md-36">filter_list</i>
{% if entries.getNbPages > 1 %} {% if entries.getNbPages > 1 %}
@ -25,7 +27,7 @@
</div> </div>
{% for entry in entries %} {% for entry in entries %}
<div id="entry-{{ entry.id|e }}" class="entry"> <div id="entry-{{ entry.id|e }}" class="{% if viewMode == 0 %}entry{% else %}listmode entry{% endif %}">
<h2><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|raw }}">{{ entry.title|raw }}</a></h2> <h2><a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title|raw }}">{{ entry.title|raw }}</a></h2>
{% set readingTime = entry.readingTime / app.user.config.readingSpeed %} {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
@ -50,7 +52,7 @@
<li><a title="{{ 'entry.list.delete'|trans }}" class="tool delete icon-trash icon" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.list.delete'|trans }}</span></a></li> <li><a title="{{ 'entry.list.delete'|trans }}" class="tool delete icon-trash icon" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.list.delete'|trans }}</span></a></li>
<li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.list.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon-link icon"><span>{{ entry.domainName|removeWww }}</span></a></li> <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.list.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon-link icon"><span>{{ entry.domainName|removeWww }}</span></a></li>
</ul> </ul>
{% if entry.previewPicture is null %} {% if (entry.previewPicture is null or viewMode == 1) %}
<ul class="card-entry-tags"> <ul class="card-entry-tags">
{% for tag in entry.tags %} {% for tag in entry.tags %}
<li><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{ tag.label }}</a></li> <li><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{ tag.label }}</a></li>

View file

@ -0,0 +1,14 @@
<div class="card">
<div class="card-stacked">
<div class="card-content">
<span class="card-title dot-ellipsis dot-resize-update">
<a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title | raw | striptags }}">
{{ entry.title| striptags | truncate(120, true, '…') | raw }}
</a>
</span>
<p>{{ entry.content|striptags|slice(0, 500)|raw }}&hellip;</p>
</div>
{% include "@WallabagCore/themes/material/Entry/_card_actions.html.twig" with {'entry': entry} only %}
</div>
</div>

View file

@ -12,9 +12,11 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% set viewMode = app.user.config.viewMode %}
<div class="results clearfix"> <div class="results clearfix">
<div class="nb-results left"> <div class="nb-results left">
{{ 'entry.list.number_on_the_page'|transchoice(entries.count) }} {{ 'entry.list.number_on_the_page'|transchoice(entries.count) }}
<a href="{{ path('switch_view_mode') }}"><i class="material-icons">{% if viewMode == 0 %}view_list{% else %}view_module{% endif %}</i></a>
</div> </div>
{% if entries.getNbPages > 1 %} {% if entries.getNbPages > 1 %}
{{ pagerfanta(entries, 'twitter_bootstrap_translated', {'proximity': 1}) }} {{ pagerfanta(entries, 'twitter_bootstrap_translated', {'proximity': 1}) }}
@ -24,8 +26,10 @@
<br /> <br />
<ul class="row data"> <ul class="row data">
{% for entry in entries %} {% for entry in entries %}
<li id="entry-{{ entry.id|e }}" class="col l3 m6 s12"> <li id="entry-{{ entry.id|e }}" class="col {% if viewMode == 0 %}l3 m6{% endif %} s12">
{% if entry.previewPicture is null %} {% if viewMode == 1 %}
{% include "@WallabagCore/themes/material/Entry/_card_list.html.twig" with {'entry': entry} only %}
{% elseif entry.previewPicture is null %}
{% include "@WallabagCore/themes/material/Entry/_card_no_preview.html.twig" with {'entry': entry} only %} {% include "@WallabagCore/themes/material/Entry/_card_no_preview.html.twig" with {'entry': entry} only %}
{% elseif not entry.previewPicture is null and entry.mimetype starts with 'image/' %} {% elseif not entry.previewPicture is null and entry.mimetype starts with 'image/' %}
{% include "@WallabagCore/themes/material/Entry/_card_full_image.html.twig" with {'entry': entry} only %} {% include "@WallabagCore/themes/material/Entry/_card_full_image.html.twig" with {'entry': entry} only %}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long