aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/en/user/android.rst20
-rw-r--r--docs/en/user/faq.rst29
-rw-r--r--docs/en/user/installation.rst66
-rw-r--r--docs/img/user/android_configuration_connection_test.en.pngbin0 -> 80965 bytes
-rw-r--r--docs/img/user/android_configuration_connection_test_success.en.pngbin0 -> 82290 bytes
-rw-r--r--docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.pngbin0 -> 106816 bytes
-rw-r--r--docs/img/user/android_configuration_filled_in.en.pngbin0 -> 98558 bytes
-rw-r--r--docs/img/user/android_configuration_get_feed_credentials.en.pngbin0 -> 81325 bytes
-rw-r--r--docs/img/user/android_configuration_saved_feed_update.en.pngbin0 -> 53196 bytes
-rw-r--r--docs/img/user/android_configuration_screen.en.pngbin0 -> 93709 bytes
-rw-r--r--docs/img/user/android_configuration_scroll_bottom.en.pngbin0 -> 98160 bytes
-rw-r--r--docs/img/user/android_unread_feed_synced.en.pngbin0 -> 89415 bytes
-rw-r--r--docs/img/user/android_welcome_screen.en.pngbin0 -> 51580 bytes
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php17
-rw-r--r--src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php7
-rw-r--r--src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php8
-rw-r--r--src/Wallabag/CoreBundle/Entity/Entry.php19
-rw-r--r--src/Wallabag/CoreBundle/Entity/Tag.php23
-rw-r--r--src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php12
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.da.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.de.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.en.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.es.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml46
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.it.yml1
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig5
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig5
-rw-r--r--src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php52
33 files changed, 259 insertions, 69 deletions
diff --git a/docs/en/user/android.rst b/docs/en/user/android.rst
index c13cf031..4271f037 100644
--- a/docs/en/user/android.rst
+++ b/docs/en/user/android.rst
@@ -13,61 +13,61 @@ Steps to configure your app
13 13
14When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first. 14When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first.
15 15
16.. image:: ../../img/user/android_welcome_screen.de.png 16.. image:: ../../img/user/android_welcome_screen.en.png
17 :alt: Welcome screen 17 :alt: Welcome screen
18 :align: center 18 :align: center
19 19
20Just confirm that message and you get redirected to the settings screen. 20Just confirm that message and you get redirected to the settings screen.
21 21
22.. image:: ../../img/user/android_configuration_screen.de.png 22.. image:: ../../img/user/android_configuration_screen.en.png
23 :alt: Settings screen 23 :alt: Settings screen
24 :align: center 24 :align: center
25 25
26Fill in your wallabag data. You need to enter your wallabag address. It is important that this URL does not end with a slash. Also add your wallabag credentials to the user name and password field. 26Fill in your wallabag data. You need to enter your wallabag address. It is important that this URL does not end with a slash. Also add your wallabag credentials to the user name and password field.
27 27
28.. image:: ../../img/user/android_configuration_filled_in.de.png 28.. image:: ../../img/user/android_configuration_filled_in.en.png
29 :alt: Filled in settings 29 :alt: Filled in settings
30 :align: center 30 :align: center
31 31
32After you have filled in your data, push the button Connection test and wait for the test to finish. 32After you have filled in your data, push the button Connection test and wait for the test to finish.
33 33
34.. image:: ../../img/user/android_configuration_connection_test.de.png 34.. image:: ../../img/user/android_configuration_connection_test.en.png
35 :alt: Connection test with your wallabag data 35 :alt: Connection test with your wallabag data
36 :align: center 36 :align: center
37 37
38The connection test shall finish with success. If not, you need to fix this first until you proceed. 38The connection test shall finish with success. If not, you need to fix this first until you proceed.
39 39
40.. image:: ../../img/user/android_configuration_connection_test_success.de.png 40.. image:: ../../img/user/android_configuration_connection_test_success.en.png
41 :alt: Connection test successful 41 :alt: Connection test successful
42 :align: center 42 :align: center
43 43
44After the connection test was successful, you can push the button to get your feed credentials. The app now tries to login to your wallabag instance and get the user id and the corresponding token for the feeds. 44After the connection test was successful, you can push the button to get your feed credentials. The app now tries to login to your wallabag instance and get the user id and the corresponding token for the feeds.
45 45
46.. image:: ../../img/user/android_configuration_get_feed_credentials.de.png 46.. image:: ../../img/user/android_configuration_get_feed_credentials.en.png
47 :alt: Getting the feed credentials 47 :alt: Getting the feed credentials
48 :align: center 48 :align: center
49 49
50When the process of getting your feed credentials finishes with success you see a toast message that the user id and the token were automatically filled in to the form. 50When the process of getting your feed credentials finishes with success you see a toast message that the user id and the token were automatically filled in to the form.
51 51
52.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.de.png 52.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
53 :alt: Getting feed credentials successful 53 :alt: Getting feed credentials successful
54 :align: center 54 :align: center
55 55
56Now you need to scroll to the bottom of the settings menu. Of course you can adjust the given settings to your needs. Finish the configuration of your app with pushing the save button. 56Now you need to scroll to the bottom of the settings menu. Of course you can adjust the given settings to your needs. Finish the configuration of your app with pushing the save button.
57 57
58.. image:: ../../img/user/android_configuration_scroll_bottom.de.png 58.. image:: ../../img/user/android_configuration_scroll_bottom.en.png
59 :alt: Bottom of the settings screen 59 :alt: Bottom of the settings screen
60 :align: center 60 :align: center
61 61
62After hitting the save button, you get the following screen. The app proposes to initiate a syncronisation process to update your feeds of articles. It is recommended to acknowledge this action and press Yes. 62After hitting the save button, you get the following screen. The app proposes to initiate a syncronisation process to update your feeds of articles. It is recommended to acknowledge this action and press Yes.
63 63
64.. image:: ../../img/user/android_configuration_saved_feed_update.de.png 64.. image:: ../../img/user/android_configuration_saved_feed_update.en.png
65 :alt: Settings saved the first time 65 :alt: Settings saved the first time
66 :align: center 66 :align: center
67 67
68Finally after the syncronisation finished successfully, you are presented the list of unread articles. 68Finally after the syncronisation finished successfully, you are presented the list of unread articles.
69 69
70.. image:: ../../img/user/android_unread_feed_synced.de.png 70.. image:: ../../img/user/android_unread_feed_synced.en.png
71 :alt: Filled article list cause feeds successfully syncronized 71 :alt: Filled article list cause feeds successfully syncronized
72 :align: center 72 :align: center
73 73
diff --git a/docs/en/user/faq.rst b/docs/en/user/faq.rst
index 1e36dc26..61303604 100644
--- a/docs/en/user/faq.rst
+++ b/docs/en/user/faq.rst
@@ -1,26 +1,39 @@
1Frequently Asked Questions 1Frequently Asked Questions
2========================== 2==========================
3 3
4During the installation, I've got this error ``Error Output: sh: 1: @post-cmd: not found`` 4During the installation, I got the error ``Error Output: sh: 1: @post-cmd: not found``
5------------------------------------------------------------------------------------------ 5--------------------------------------------------------------------------------------
6 6
7It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it. 7It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it.
8 8
9`Read the documentation about composer to know how to install it 9`Read the documentation about composer to know how to install it
10<https://getcomposer.org/doc/00-intro.md>`__. 10<https://getcomposer.org/doc/00-intro.md>`__.
11 11
12I can't valid the registration form 12I can't validate the registration form
13----------------------------------- 13--------------------------------------
14 14
15Make sure that all fields are well filled: 15Ensure that all fields are properly filled:
16 16
17* valid email address 17* valid email address
18* same passwords in two fields 18* same passwords in two fields
19 19
20I don't receive my activation email 20I'm not receiving my activation email
21----------------------------------- 21-------------------------------------
22 22
23Are you sure your email address was correct? Did you check your spams folder? 23Are you sure your email address was correct? Did you check your spam folder?
24
25If you still don't see the activation email, please ensure that you have
26installed and properly configured a mail transfer agent. Be sure to include a
27firewall rule for SMTP. E.g., if using firewalld:
28
29::
30
31 firewall-cmd --permanent --add-service=smtp
32 firewall-cmd --reload
33
34Lastly, if you have SELinux enabled, set the following rule:
35
36``setsebool -P httpd_can_sendmail 1``
24 37
25When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``. 38When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
26---------------------------------------------------------------------------------------------------------------------------------- 39----------------------------------------------------------------------------------------------------------------------------------
diff --git a/docs/en/user/installation.rst b/docs/en/user/installation.rst
index 94ee05d4..2c6a2f5f 100644
--- a/docs/en/user/installation.rst
+++ b/docs/en/user/installation.rst
@@ -23,13 +23,13 @@ You'll need the following extensions for wallabag to work. Some of these may alr
23- php-gettext 23- php-gettext
24- php-tokenizer 24- php-tokenizer
25 25
26wallabag uses PDO to connect to database, so you'll need one of: 26wallabag uses PDO to connect to the database, so you'll need one of the following:
27 27
28- pdo_mysql 28- pdo_mysql
29- pdo_sqlite 29- pdo_sqlite
30- pdo_pgsql 30- pdo_pgsql
31 31
32and it's corresponding database server. 32and its corresponding database server.
33 33
34Installation 34Installation
35------------ 35------------
@@ -37,7 +37,7 @@ Installation
37On a dedicated web server (recommended way) 37On a dedicated web server (recommended way)
38~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 39
40wallabag uses a big number of libraries in order to function. These libraries must be installed with a tool called Composer. You need to install it if you don't already have. 40wallabag uses a large number of libraries in order to function. These libraries must be installed with a tool called Composer. You need to install it if you have not already done so.
41 41
42Install Composer: 42Install Composer:
43 43
@@ -47,7 +47,7 @@ Install Composer:
47 47
48You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__: 48You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__:
49 49
50To install wallabag itself, you must run these two commands: 50To install wallabag itself, you must run the following commands:
51 51
52:: 52::
53 53
@@ -67,17 +67,17 @@ And access wallabag at http://yourserverip:8000
67 67
68.. tip:: 68.. tip::
69 69
70 To define parameters with environment variables, you have to set these variables with ``SYMFONY__`` prefix. For example, ``SYMFONY__DATABASE_DRIVER``. You can have a look to the `Symfony documentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__. 70 To define parameters with environment variables, you have to set these variables with ``SYMFONY__`` prefix. For example, ``SYMFONY__DATABASE_DRIVER``. You can have a look at `Symfony documentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__.
71 71
72On a shared hosting 72On a shared hosting
73~~~~~~~~~~~~~~~~~~~ 73~~~~~~~~~~~~~~~~~~~
74 74
75We provide you a package with all dependancies inside. 75We provide a package with all dependencies inside.
76The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``. 76The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``.
77 77
78We already created a user: login and password are ``wallabag``. 78We already created a user: login and password are ``wallabag``.
79 79
80.. caution:: With this package, wallabag don't check mandatory extensions used in the application (theses checks are made during ``composer install`` when you have a dedicated web server, see above). 80.. caution:: With this package, wallabag doesn't check for mandatory extensions used in the application (theses checks are made during ``composer install`` when you have a dedicated web server, see above).
81 81
82Execute this command to download and extract the latest package: 82Execute this command to download and extract the latest package:
83 83
@@ -85,7 +85,7 @@ Execute this command to download and extract the latest package:
85 85
86 wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package 86 wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
87 87
88Now, read the following documentation to create your virtual host, then access to your wallabag. 88Now, read the following documentation to create your virtual host, then access your wallabag.
89If you changed the database configuration to use MySQL or PostgreSQL, you need to create a user via this command ``php bin/console wallabag:install --env=prod``. 89If you changed the database configuration to use MySQL or PostgreSQL, you need to create a user via this command ``php bin/console wallabag:install --env=prod``.
90 90
91Installation with Docker 91Installation with Docker
@@ -151,7 +151,7 @@ After reloading or restarting Apache, you should now be able to access wallabag
151Configuration on Nginx 151Configuration on Nginx
152~~~~~~~~~~~~~~~~~~~~~~ 152~~~~~~~~~~~~~~~~~~~~~~
153 153
154Assuming you install wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag : 154Assuming you installed wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag :
155 155
156:: 156::
157 157
@@ -269,10 +269,56 @@ by entering
269 chown -R www-data:www-data /var/www/wallabag/vendor 269 chown -R www-data:www-data /var/www/wallabag/vendor
270 chown -R www-data:www-data /var/www/wallabag/data/ 270 chown -R www-data:www-data /var/www/wallabag/data/
271 271
272otherwise, sooner or later you will meet this error messages 272otherwise, sooner or later you will see these error messages:
273 273
274.. code-block:: bash 274.. code-block:: bash
275 275
276 Unable to write to the "bin" directory. 276 Unable to write to the "bin" directory.
277 file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied 277 file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied
278 file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied 278 file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied
279
280Additional rules for SELinux
281~~~~~~~~~~~~~~~~~~~~~~~~~~~~
282
283If SELinux is enabled on your system, you will need to configure additional contexts in order for wallabag to function properly. To check if SELinux is enabled, simply enter the following:
284
285``getenforce``
286
287This will return ``Enforcing`` if SELinux is enabled. Creating a new context involves the following syntax:
288
289``semanage fcontext -a -t <context type> <full path>``
290
291For example:
292
293``semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"``
294
295This will recursively apply the httpd_sys_content_t context to the wallabag directory and all underlying files and folders. The following rules are needed:
296
297+-----------------------------------+----------------------------+
298| Full path | Context |
299+===================================+============================+
300| /var/www/wallabag(/.*)? | ``httpd_sys_content_t`` |
301+-----------------------------------+----------------------------+
302| /var/www/wallabag/data(/.*)? | ``httpd_sys_rw_content_t`` |
303+-----------------------------------+----------------------------+
304| /var/www/wallabag/var/logs(/.*)? | ``httpd_log_t`` |
305+-----------------------------------+----------------------------+
306| /var/www/wallabag/var/cache(/.*)? | ``httpd_cache_t`` |
307+-----------------------------------+----------------------------+
308
309After creating these contexts, enter the following in order to apply your rules:
310
311``restorecon -R -v /var/www/wallabag``
312
313You can check contexts in a directory by typing ``ls -lZ`` and you can see all of your current rules with ``semanage fcontext -l -C``.
314
315If you're installing the preconfigured latest-v2-package, then an additional rule is needed during the initial setup:
316
317``semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wallabag/var"``
318
319After you successfully access your wallabag and complete the initial setup, this context can be removed:
320
321::
322
323 semanage fcontext -d -t httpd_sys_rw_content_t "/var/www/wallabag/var"
324 retorecon -R -v /var/www/wallabag/var
diff --git a/docs/img/user/android_configuration_connection_test.en.png b/docs/img/user/android_configuration_connection_test.en.png
new file mode 100644
index 00000000..479cd09a
--- /dev/null
+++ b/docs/img/user/android_configuration_connection_test.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_connection_test_success.en.png b/docs/img/user/android_configuration_connection_test_success.en.png
new file mode 100644
index 00000000..840f00cd
--- /dev/null
+++ b/docs/img/user/android_configuration_connection_test_success.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png b/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
new file mode 100644
index 00000000..df071b8b
--- /dev/null
+++ b/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_filled_in.en.png b/docs/img/user/android_configuration_filled_in.en.png
new file mode 100644
index 00000000..368ac515
--- /dev/null
+++ b/docs/img/user/android_configuration_filled_in.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_get_feed_credentials.en.png b/docs/img/user/android_configuration_get_feed_credentials.en.png
new file mode 100644
index 00000000..2a8958ff
--- /dev/null
+++ b/docs/img/user/android_configuration_get_feed_credentials.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_saved_feed_update.en.png b/docs/img/user/android_configuration_saved_feed_update.en.png
new file mode 100644
index 00000000..f1c06f17
--- /dev/null
+++ b/docs/img/user/android_configuration_saved_feed_update.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_screen.en.png b/docs/img/user/android_configuration_screen.en.png
new file mode 100644
index 00000000..945fd7c8
--- /dev/null
+++ b/docs/img/user/android_configuration_screen.en.png
Binary files differ
diff --git a/docs/img/user/android_configuration_scroll_bottom.en.png b/docs/img/user/android_configuration_scroll_bottom.en.png
new file mode 100644
index 00000000..11a6fc5a
--- /dev/null
+++ b/docs/img/user/android_configuration_scroll_bottom.en.png
Binary files differ
diff --git a/docs/img/user/android_unread_feed_synced.en.png b/docs/img/user/android_unread_feed_synced.en.png
new file mode 100644
index 00000000..8451557e
--- /dev/null
+++ b/docs/img/user/android_unread_feed_synced.en.png
Binary files differ
diff --git a/docs/img/user/android_welcome_screen.en.png b/docs/img/user/android_welcome_screen.en.png
new file mode 100644
index 00000000..a3741d50
--- /dev/null
+++ b/docs/img/user/android_welcome_screen.en.png
Binary files differ
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index 69dfd4b1..33b5e2ad 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -23,10 +23,16 @@ class EntryController extends Controller
23 { 23 {
24 try { 24 try {
25 $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); 25 $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
26
26 $em = $this->getDoctrine()->getManager(); 27 $em = $this->getDoctrine()->getManager();
27 $em->persist($entry); 28 $em->persist($entry);
28 $em->flush(); 29 $em->flush();
29 } catch (\Exception $e) { 30 } catch (\Exception $e) {
31 $this->get('logger')->error('Error while saving an entry', [
32 'exception' => $e,
33 'entry' => $entry,
34 ]);
35
30 return false; 36 return false;
31 } 37 }
32 38
@@ -60,11 +66,12 @@ class EntryController extends Controller
60 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()])); 66 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()]));
61 } 67 }
62 68
63 $this->updateEntry($entry); 69 $message = 'flashes.entry.notice.entry_saved';
64 $this->get('session')->getFlashBag()->add( 70 if (false === $this->updateEntry($entry)) {
65 'notice', 71 $message = 'flashes.entry.notice.entry_saved_failed';
66 'flashes.entry.notice.entry_saved' 72 }
67 ); 73
74 $this->get('session')->getFlashBag()->add('notice', $message);
68 75
69 return $this->redirect($this->generateUrl('homepage')); 76 return $this->redirect($this->generateUrl('homepage'));
70 } 77 }
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
index 5a376453..03be9667 100644
--- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
+++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
@@ -6,7 +6,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture;
6use Doctrine\Common\DataFixtures\OrderedFixtureInterface; 6use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
7use Doctrine\Common\Persistence\ObjectManager; 7use Doctrine\Common\Persistence\ObjectManager;
8use Wallabag\CoreBundle\Entity\Config; 8use Wallabag\CoreBundle\Entity\Config;
9use Wallabag\CoreBundle\Entity\TaggingRule;
10 9
11class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface 10class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
12{ 11{
@@ -16,12 +15,6 @@ class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
16 public function load(ObjectManager $manager) 15 public function load(ObjectManager $manager)
17 { 16 {
18 $adminConfig = new Config($this->getReference('admin-user')); 17 $adminConfig = new Config($this->getReference('admin-user'));
19 $taggingRule = new TaggingRule();
20
21 $taggingRule->setConfig($adminConfig);
22 $taggingRule->setRule('title matches "wallabag"');
23 $taggingRule->setTags(['wallabag']);
24 $manager->persist($taggingRule);
25 18
26 $adminConfig->setTheme('material'); 19 $adminConfig->setTheme('material');
27 $adminConfig->setItemsPerPage(30); 20 $adminConfig->setItemsPerPage(30);
diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
index 2e1cc270..7efe6356 100644
--- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
+++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
@@ -28,6 +28,14 @@ class LoadTaggingRuleData extends AbstractFixture implements OrderedFixtureInter
28 28
29 $manager->persist($tr2); 29 $manager->persist($tr2);
30 30
31 $tr3 = new TaggingRule();
32
33 $tr3->setRule('title matches "wallabag"');
34 $tr3->setTags(['wallabag']);
35 $tr3->setConfig($this->getReference('admin-config'));
36
37 $manager->persist($tr3);
38
31 $manager->flush(); 39 $manager->flush();
32 } 40 }
33 41
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php
index 1271f1f5..ceae78b0 100644
--- a/src/Wallabag/CoreBundle/Entity/Entry.php
+++ b/src/Wallabag/CoreBundle/Entity/Entry.php
@@ -177,8 +177,16 @@ class Entry
177 private $user; 177 private $user;
178 178
179 /** 179 /**
180 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist", "remove"}) 180 * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"})
181 * @ORM\JoinTable 181 * @ORM\JoinTable(
182 * name="entry_tag",
183 * joinColumns={
184 * @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
185 * },
186 * inverseJoinColumns={
187 * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
188 * }
189 * )
182 * 190 *
183 * @Groups({"entries_for_user", "export_all"}) 191 * @Groups({"entries_for_user", "export_all"})
184 */ 192 */
@@ -526,13 +534,18 @@ class Entry
526 } 534 }
527 } 535 }
528 536
529 $this->tags[] = $tag; 537 $this->tags->add($tag);
530 $tag->addEntry($this); 538 $tag->addEntry($this);
531 } 539 }
532 540
533 public function removeTag(Tag $tag) 541 public function removeTag(Tag $tag)
534 { 542 {
543 if (!$this->tags->contains($tag)) {
544 return;
545 }
546
535 $this->tags->removeElement($tag); 547 $this->tags->removeElement($tag);
548 $tag->removeEntry($this);
536 } 549 }
537 550
538 /** 551 /**
diff --git a/src/Wallabag/CoreBundle/Entity/Tag.php b/src/Wallabag/CoreBundle/Entity/Tag.php
index b4adbbd3..4b480ff1 100644
--- a/src/Wallabag/CoreBundle/Entity/Tag.php
+++ b/src/Wallabag/CoreBundle/Entity/Tag.php
@@ -98,9 +98,30 @@ class Tag
98 return $this->slug; 98 return $this->slug;
99 } 99 }
100 100
101 /**
102 * @param Entry $entry
103 */
101 public function addEntry(Entry $entry) 104 public function addEntry(Entry $entry)
102 { 105 {
103 $this->entries[] = $entry; 106 if ($this->entries->contains($entry)) {
107 return;
108 }
109
110 $this->entries->add($entry);
111 $entry->addTag($this);
112 }
113
114 /**
115 * @param Entry $entry
116 */
117 public function removeEntry(Entry $entry)
118 {
119 if (!$this->entries->contains($entry)) {
120 return;
121 }
122
123 $this->entries->removeElement($entry);
124 $entry->removeTag($this);
104 } 125 }
105 126
106 public function hasEntry($entry) 127 public function hasEntry($entry)
diff --git a/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php b/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
index cd4d3490..f3f848e9 100644
--- a/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
+++ b/src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
@@ -87,6 +87,18 @@ class EntryFilterType extends AbstractType
87 ->add('isStarred', CheckboxFilterType::class, [ 87 ->add('isStarred', CheckboxFilterType::class, [
88 'label' => 'entry.filters.starred_label', 88 'label' => 'entry.filters.starred_label',
89 ]) 89 ])
90 ->add('isUnread', CheckboxFilterType::class, [
91 'label' => 'entry.filters.unread_label',
92 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
93 if (false === $values['value']) {
94 return;
95 }
96
97 $expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
98
99 return $filterQuery->createCondition($expression);
100 },
101 ])
90 ->add('previewPicture', CheckboxFilterType::class, [ 102 ->add('previewPicture', CheckboxFilterType::class, [
91 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { 103 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
92 if (false === $values['value']) { 104 if (false === $values['value']) {
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
index 8d392063..213d5790 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Status' 154 status_label: 'Status'
155 archived_label: 'Arkiveret' 155 archived_label: 'Arkiveret'
156 starred_label: 'Favorit' 156 starred_label: 'Favorit'
157 unread_label: 'Ulæst'
157 preview_picture_label: 'Har et vist billede' 158 preview_picture_label: 'Har et vist billede'
158 preview_picture_help: 'Forhåndsvis billede' 159 preview_picture_help: 'Forhåndsvis billede'
159 language_label: 'Sprog' 160 language_label: 'Sprog'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 # entry_already_saved: 'Entry already saved on %date%' 398 # entry_already_saved: 'Entry already saved on %date%'
398 # entry_saved: 'Entry saved' 399 # entry_saved: 'Entry saved'
400 # entry_saved_failed: 'Failed to save entry'
399 # entry_updated: 'Entry updated' 401 # entry_updated: 'Entry updated'
400 # entry_reloaded: 'Entry reloaded' 402 # entry_reloaded: 'Entry reloaded'
401 # entry_reload_failed: 'Failed to reload entry' 403 # entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
index c7a89492..89cbbbf8 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Status' 154 status_label: 'Status'
155 archived_label: 'Archiviert' 155 archived_label: 'Archiviert'
156 starred_label: 'Favorisiert' 156 starred_label: 'Favorisiert'
157 unread_label: 'Ungelesene'
157 preview_picture_label: 'Vorschaubild vorhanden' 158 preview_picture_label: 'Vorschaubild vorhanden'
158 preview_picture_help: 'Vorschaubild' 159 preview_picture_help: 'Vorschaubild'
159 language_label: 'Sprache' 160 language_label: 'Sprache'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Eintrag bereits am %date% gespeichert' 398 entry_already_saved: 'Eintrag bereits am %date% gespeichert'
398 entry_saved: 'Eintag gespeichert' 399 entry_saved: 'Eintag gespeichert'
400 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Eintrag aktualisiert' 401 entry_updated: 'Eintrag aktualisiert'
400 entry_reloaded: 'Eintrag neugeladen' 402 entry_reloaded: 'Eintrag neugeladen'
401 entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen' 403 entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
index 876e7900..b65e4522 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Status' 154 status_label: 'Status'
155 archived_label: 'Archived' 155 archived_label: 'Archived'
156 starred_label: 'Starred' 156 starred_label: 'Starred'
157 unread_label: 'Unread'
157 preview_picture_label: 'Has a preview picture' 158 preview_picture_label: 'Has a preview picture'
158 preview_picture_help: 'Preview picture' 159 preview_picture_help: 'Preview picture'
159 language_label: 'Language' 160 language_label: 'Language'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Entry already saved on %date%' 398 entry_already_saved: 'Entry already saved on %date%'
398 entry_saved: 'Entry saved' 399 entry_saved: 'Entry saved'
400 entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Entry updated' 401 entry_updated: 'Entry updated'
400 entry_reloaded: 'Entry reloaded' 402 entry_reloaded: 'Entry reloaded'
401 entry_reload_failed: 'Failed to reload entry' 403 entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
index e8461247..8351bcf4 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Estatus' 154 status_label: 'Estatus'
155 archived_label: 'Archivado' 155 archived_label: 'Archivado'
156 starred_label: 'Favorito' 156 starred_label: 'Favorito'
157 unread_label: 'Sin leer'
157 preview_picture_label: 'Hay una foto' 158 preview_picture_label: 'Hay una foto'
158 preview_picture_help: 'Foto de preview' 159 preview_picture_help: 'Foto de preview'
159 language_label: 'Idioma' 160 language_label: 'Idioma'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Entrada ya guardada por %fecha%' 398 entry_already_saved: 'Entrada ya guardada por %fecha%'
398 entry_saved: 'Entrada guardada' 399 entry_saved: 'Entrada guardada'
400 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Entrada actualizada' 401 entry_updated: 'Entrada actualizada'
400 entry_reloaded: 'Entrada recargada' 402 entry_reloaded: 'Entrada recargada'
401 entry_reload_failed: 'Entrada recargada reprobada' 403 entry_reload_failed: 'Entrada recargada reprobada'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
index d34ff8ff..db6e5960 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
@@ -96,8 +96,8 @@ config:
96 rule_label: 'قانون' 96 rule_label: 'قانون'
97 tags_label: 'برچسب‌ها' 97 tags_label: 'برچسب‌ها'
98 faq: 98 faq:
99 title: 'پرسش‌های متداول' 99 title: 'پرسش‌های متداول'
100 tagging_rules_definition_title: 'برچسب‌گذاری خودکار یعنی چه؟' 100 tagging_rules_definition_title: 'برچسب‌گذاری خودکار یعنی چه؟'
101 # tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.' 101 # tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.'
102 # how_to_use_them_title: 'How do I use them?' 102 # how_to_use_them_title: 'How do I use them?'
103 # how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »' 103 # how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »'
@@ -154,6 +154,7 @@ entry:
154 status_label: 'وضعیت' 154 status_label: 'وضعیت'
155 archived_label: 'بایگانی‌شده' 155 archived_label: 'بایگانی‌شده'
156 starred_label: 'برگزیده' 156 starred_label: 'برگزیده'
157 unread_label: 'خوانده‌نشده'
157 preview_picture_label: 'دارای عکس پیش‌نمایش' 158 preview_picture_label: 'دارای عکس پیش‌نمایش'
158 preview_picture_help: 'پیش‌نمایش عکس' 159 preview_picture_help: 'پیش‌نمایش عکس'
159 language_label: 'زبان' 160 language_label: 'زبان'
@@ -383,30 +384,31 @@ developer:
383flashes: 384flashes:
384 config: 385 config:
385 notice: 386 notice:
386 config_saved: 'پیکربندی ذخیره شد. برخی از تنظیمات پس از این که قطع شدید اعمال می‌شود.' 387 config_saved: 'پیکربندی ذخیره شد. برخی از تنظیمات پس از این که قطع شدید اعمال می‌شود.'
387 password_updated: 'رمز به‌روز شد' 388 password_updated: 'رمز به‌روز شد'
388 password_not_updated_demo: "در حالت نمایشی نمی‌توانید رمز کاربر را عوض کنید." 389 password_not_updated_demo: "در حالت نمایشی نمی‌توانید رمز کاربر را عوض کنید."
389 user_updated: 'اطلاعات به‌روز شد' 390 user_updated: 'اطلاعات به‌روز شد'
390 rss_updated: 'اطلاعات آر-اس-اس به‌روز شد' 391 rss_updated: 'اطلاعات آر-اس-اس به‌روز شد'
391 tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد' 392 tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد'
392 tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد' 393 tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد'
393 user_added: 'کابر "%username%" افزوده شد' 394 user_added: 'کابر "%username%" افزوده شد'
394 rss_token_updated: 'کد آر-اس-اس به‌روز شد' 395 rss_token_updated: 'کد آر-اس-اس به‌روز شد'
395 entry: 396 entry:
396 notice: 397 notice:
397 entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود' 398 entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود'
398 entry_saved: 'مقاله ذخیره شد' 399 entry_saved: 'مقاله ذخیره شد'
399 entry_updated: 'مقاله به‌روز شد' 400 # entry_saved_failed: 'Failed to save entry'
400 entry_reloaded: 'مقاله به‌روز شد' 401 entry_updated: 'مقاله به‌روز شد'
401 entry_reload_failed: 'به‌روزرسانی مقاله شکست خورد' 402 entry_reloaded: 'مقاله به‌روز شد'
402 entry_archived: 'مقاله بایگانی شد' 403 entry_reload_failed: 'به‌روزرسانی مقاله شکست خورد'
403 entry_unarchived: 'مقاله از بایگانی درآمد' 404 entry_archived: 'مقاله بایگانی شد'
404 entry_starred: 'مقاله برگزیده شد' 405 entry_unarchived: 'مقاله از بایگانی درآمد'
405 entry_unstarred: 'مقاله نابرگزیده شد' 406 entry_starred: 'مقاله برگزیده شد'
406 entry_deleted: 'مقاله پاک شد' 407 entry_unstarred: 'مقاله نابرگزیده شد'
408 entry_deleted: 'مقاله پاک شد'
407 tag: 409 tag:
408 notice: 410 notice:
409 tag_added: 'برچسب افزوده شد' 411 tag_added: 'برچسب افزوده شد'
410 import: 412 import:
411 notice: 413 notice:
412 failed: 'درون‌ریزی شکست خورد. لطفاً دوباره تلاش کنید.' 414 failed: 'درون‌ریزی شکست خورد. لطفاً دوباره تلاش کنید.'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index 80ba0546..9fc8ca2a 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Status' 154 status_label: 'Status'
155 archived_label: 'Lus' 155 archived_label: 'Lus'
156 starred_label: 'Favoris' 156 starred_label: 'Favoris'
157 unread_label: 'Non lus'
157 preview_picture_label: 'A une photo' 158 preview_picture_label: 'A une photo'
158 preview_picture_help: 'Photo' 159 preview_picture_help: 'Photo'
159 language_label: 'Langue' 160 language_label: 'Langue'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Article déjà sauvergardé le %date%' 398 entry_already_saved: 'Article déjà sauvergardé le %date%'
398 entry_saved: 'Article enregistré' 399 entry_saved: 'Article enregistré'
400 entry_saved_failed: "L'enregistrement a échoué"
399 entry_updated: 'Article mis à jour' 401 entry_updated: 'Article mis à jour'
400 entry_reloaded: 'Article rechargé' 402 entry_reloaded: 'Article rechargé'
401 entry_reload_failed: "Le rechargement de l'article a échoué" 403 entry_reload_failed: "Le rechargement de l'article a échoué"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
index 4f3ac090..00ed9c98 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
@@ -396,6 +396,7 @@ flashes:
396 notice: 396 notice:
397 entry_already_saved: 'Contenuto già salvato in data %date%' 397 entry_already_saved: 'Contenuto già salvato in data %date%'
398 entry_saved: 'Contenuto salvato' 398 entry_saved: 'Contenuto salvato'
399 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Contenuto aggiornato' 400 entry_updated: 'Contenuto aggiornato'
400 entry_reloaded: 'Contenuto ricaricato' 401 entry_reloaded: 'Contenuto ricaricato'
401 entry_reload_failed: 'Errore nel ricaricamento del contenuto' 402 entry_reload_failed: 'Errore nel ricaricamento del contenuto'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
index 46f58bbf..c81c852b 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Estatus' 154 status_label: 'Estatus'
155 archived_label: 'Legits' 155 archived_label: 'Legits'
156 starred_label: 'Favorits' 156 starred_label: 'Favorits'
157 unread_label: 'Pas legits'
157 preview_picture_label: 'A una fotò' 158 preview_picture_label: 'A una fotò'
158 preview_picture_help: 'Fotò' 159 preview_picture_help: 'Fotò'
159 language_label: 'Lenga' 160 language_label: 'Lenga'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Article ja salvargardat lo %date%' 398 entry_already_saved: 'Article ja salvargardat lo %date%'
398 entry_saved: 'Article enregistrat' 399 entry_saved: 'Article enregistrat'
400 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Article mes a jorn' 401 entry_updated: 'Article mes a jorn'
400 entry_reloaded: 'Article recargat' 402 entry_reloaded: 'Article recargat'
401 entry_reload_failed: "Fracàs de l'actualizacion de l'article" 403 entry_reload_failed: "Fracàs de l'actualizacion de l'article"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
index 292749ed..3707a857 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Status' 154 status_label: 'Status'
155 archived_label: 'Zarchiwizowane' 155 archived_label: 'Zarchiwizowane'
156 starred_label: 'Oznaczone gwiazdką' 156 starred_label: 'Oznaczone gwiazdką'
157 unread_label: 'Nieprzeczytane'
157 preview_picture_label: 'Posiada podgląd obrazu' 158 preview_picture_label: 'Posiada podgląd obrazu'
158 preview_picture_help: 'Podgląd obrazu' 159 preview_picture_help: 'Podgląd obrazu'
159 language_label: 'Język' 160 language_label: 'Język'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Wpis już został dodany %date%' 398 entry_already_saved: 'Wpis już został dodany %date%'
398 entry_saved: 'Wpis zapisany' 399 entry_saved: 'Wpis zapisany'
400 # entry_saved_failed: 'Failed to save entry'
399 entry_updated: 'Wpis zaktualizowany' 401 entry_updated: 'Wpis zaktualizowany'
400 entry_reloaded: 'Wpis ponownie załadowany' 402 entry_reloaded: 'Wpis ponownie załadowany'
401 entry_reload_failed: 'Błąd ponownego załadowania' 403 entry_reload_failed: 'Błąd ponownego załadowania'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
index 45040f35..27be1edc 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Status' 154 status_label: 'Status'
155 archived_label: 'Arhivat' 155 archived_label: 'Arhivat'
156 starred_label: 'Steluțe' 156 starred_label: 'Steluțe'
157 unread_label: 'Necitite'
157 preview_picture_label: 'Are o imagine de previzualizare' 158 preview_picture_label: 'Are o imagine de previzualizare'
158 preview_picture_help: 'Previzualizare imagine' 159 preview_picture_help: 'Previzualizare imagine'
159 language_label: 'Limbă' 160 language_label: 'Limbă'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 # entry_already_saved: 'Entry already saved on %date%' 398 # entry_already_saved: 'Entry already saved on %date%'
398 # entry_saved: 'Entry saved' 399 # entry_saved: 'Entry saved'
400 # entry_saved_failed: 'Failed to save entry'
399 # entry_updated: 'Entry updated' 401 # entry_updated: 'Entry updated'
400 # entry_reloaded: 'Entry reloaded' 402 # entry_reloaded: 'Entry reloaded'
401 # entry_reload_failed: 'Failed to reload entry' 403 # entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
index 8a095a5b..85ee7316 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
@@ -154,6 +154,7 @@ entry:
154 status_label: 'Durum' 154 status_label: 'Durum'
155 archived_label: 'Arşiv' 155 archived_label: 'Arşiv'
156 starred_label: 'Favori' 156 starred_label: 'Favori'
157 unread_label: 'Okunmayan'
157 preview_picture_label: 'Resim önizlemesi varsa' 158 preview_picture_label: 'Resim önizlemesi varsa'
158 preview_picture_help: 'Resim önizlemesi' 159 preview_picture_help: 'Resim önizlemesi'
159 language_label: 'Dil' 160 language_label: 'Dil'
@@ -396,6 +397,7 @@ flashes:
396 notice: 397 notice:
397 entry_already_saved: 'Entry already saved on %date%' 398 entry_already_saved: 'Entry already saved on %date%'
398 entry_saved: 'Makale kaydedildi' 399 entry_saved: 'Makale kaydedildi'
400 # entry_saved_failed: 'Failed to save entry'
399 # entry_updated: 'Entry updated' 401 # entry_updated: 'Entry updated'
400 entry_reloaded: 'Makale içeriği yenilendi' 402 entry_reloaded: 'Makale içeriği yenilendi'
401 # entry_reload_failed: 'Failed to reload entry' 403 # entry_reload_failed: 'Failed to reload entry'
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
index a2caaebf..778625ae 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
@@ -54,6 +54,11 @@
54 </div> 54 </div>
55 55
56 <div class="input-field"> 56 <div class="input-field">
57 {{ form_widget(form.isUnread) }}
58 {{ form_label(form.isUnread) }}
59 </div>
60
61 <div class="input-field">
57 {{ form_widget(form.previewPicture) }} 62 {{ form_widget(form.previewPicture) }}
58 {{ form_label(form.previewPicture) }} 63 {{ form_label(form.previewPicture) }}
59 </div> 64 </div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
index 1d569226..920fa933 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
@@ -126,6 +126,11 @@
126 {{ form_label(form.isStarred) }} 126 {{ form_label(form.isStarred) }}
127 </div> 127 </div>
128 128
129 <div class="input-field col s6 with-checkbox">
130 {{ form_widget(form.isUnread) }}
131 {{ form_label(form.isUnread) }}
132 </div>
133
129 <div class="col s12"> 134 <div class="col s12">
130 <label>{{ 'entry.filters.preview_picture_help'|trans }}</label> 135 <label>{{ 'entry.filters.preview_picture_help'|trans }}</label>
131 </div> 136 </div>
diff --git a/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php
index df4c34cd..5ce893c1 100644
--- a/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php
+++ b/src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php
@@ -163,7 +163,7 @@ class EntryControllerTest extends WallabagCoreTestCase
163 /** 163 /**
164 * This test will require an internet connection. 164 * This test will require an internet connection.
165 */ 165 */
166 public function testPostNewThatWillBeTaggued() 166 public function testPostNewThatWillBeTagged()
167 { 167 {
168 $this->logInAs('admin'); 168 $this->logInAs('admin');
169 $client = $this->getClient(); 169 $client = $this->getClient();
@@ -181,8 +181,7 @@ class EntryControllerTest extends WallabagCoreTestCase
181 $client->submit($form, $data); 181 $client->submit($form, $data);
182 182
183 $this->assertEquals(302, $client->getResponse()->getStatusCode()); 183 $this->assertEquals(302, $client->getResponse()->getStatusCode());
184 184 $this->assertContains('/', $client->getResponse()->getTargetUrl());
185 $client->followRedirect();
186 185
187 $em = $client->getContainer() 186 $em = $client->getContainer()
188 ->get('doctrine.orm.entity_manager'); 187 ->get('doctrine.orm.entity_manager');
@@ -196,6 +195,35 @@ class EntryControllerTest extends WallabagCoreTestCase
196 195
197 $em->remove($entry); 196 $em->remove($entry);
198 $em->flush(); 197 $em->flush();
198
199 // and now re-submit it to test the cascade persistence for tags after entry removal
200 // related https://github.com/wallabag/wallabag/issues/2121
201 $crawler = $client->request('GET', '/new');
202
203 $this->assertEquals(200, $client->getResponse()->getStatusCode());
204
205 $form = $crawler->filter('form[name=entry]')->form();
206
207 $data = [
208 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
209 ];
210
211 $client->submit($form, $data);
212
213 $this->assertEquals(302, $client->getResponse()->getStatusCode());
214 $this->assertContains('/', $client->getResponse()->getTargetUrl());
215
216 $entry = $em
217 ->getRepository('WallabagCoreBundle:Entry')
218 ->findOneByUrl($url);
219
220 $tags = $entry->getTags();
221
222 $this->assertCount(1, $tags);
223 $this->assertEquals('wallabag', $tags[0]->getLabel());
224
225 $em->remove($entry);
226 $em->flush();
199 } 227 }
200 228
201 public function testArchive() 229 public function testArchive()
@@ -471,6 +499,24 @@ class EntryControllerTest extends WallabagCoreTestCase
471 $this->assertCount(1, $crawler->filter('div[class=entry]')); 499 $this->assertCount(1, $crawler->filter('div[class=entry]'));
472 } 500 }
473 501
502 public function testFilterOnUnreadStatus()
503 {
504 $this->logInAs('admin');
505 $client = $this->getClient();
506
507 $crawler = $client->request('GET', '/all/list');
508
509 $form = $crawler->filter('button[id=submit-filter]')->form();
510
511 $data = [
512 'entry_filter[isUnread]' => true,
513 ];
514
515 $crawler = $client->submit($form, $data);
516
517 $this->assertCount(4, $crawler->filter('div[class=entry]'));
518 }
519
474 public function testFilterOnCreationDate() 520 public function testFilterOnCreationDate()
475 { 521 {
476 $this->logInAs('admin'); 522 $this->logInAs('admin');