mirror of
https://github.com/wallabag/wallabag.git
synced 2024-11-26 11:01:04 +00:00
Added list view
This commit is contained in:
parent
34ea7be622
commit
9f01d0fde0
12 changed files with 139 additions and 17 deletions
49
app/DoctrineMigrations/Version20161128084725.php
Normal file
49
app/DoctrineMigrations/Version20161128084725.php
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
BIN
app/Resources/static/themes/_global/img/list.png
Executable file
BIN
app/Resources/static/themes/_global/img/list.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 201 B |
BIN
app/Resources/static/themes/_global/img/table.png
Executable file
BIN
app/Resources/static/themes/_global/img/table.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 229 B |
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -352,9 +348,9 @@ footer a {
|
||||||
letter-spacing: -5px;
|
letter-spacing: -5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.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 > * {
|
||||||
|
|
|
@ -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
|
||||||
========================================================================== */
|
========================================================================== */
|
||||||
|
|
|
@ -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'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 }}…</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% include "@WallabagCore/themes/material/Entry/_card_actions.html.twig" with {'entry': entry} only %}
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -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
Loading…
Reference in a new issue