diff options
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 | ||
14 | When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first. | 14 | When 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 | ||
20 | Just confirm that message and you get redirected to the settings screen. | 20 | Just 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 | ||
26 | Fill 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. | 26 | Fill 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 | ||
32 | After you have filled in your data, push the button Connection test and wait for the test to finish. | 32 | After 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 | ||
38 | The connection test shall finish with success. If not, you need to fix this first until you proceed. | 38 | The 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 | ||
44 | After 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. | 44 | After 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 | ||
50 | When 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. | 50 | When 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 | ||
56 | Now 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. | 56 | Now 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 | ||
62 | After 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. | 62 | After 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 | ||
68 | Finally after the syncronisation finished successfully, you are presented the list of unread articles. | 68 | Finally 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 @@ | |||
1 | Frequently Asked Questions | 1 | Frequently Asked Questions |
2 | ========================== | 2 | ========================== |
3 | 3 | ||
4 | During the installation, I've got this error ``Error Output: sh: 1: @post-cmd: not found`` | 4 | During the installation, I got the error ``Error Output: sh: 1: @post-cmd: not found`` |
5 | ------------------------------------------------------------------------------------------ | 5 | -------------------------------------------------------------------------------------- |
6 | 6 | ||
7 | It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it. | 7 | It 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 | ||
12 | I can't valid the registration form | 12 | I can't validate the registration form |
13 | ----------------------------------- | 13 | -------------------------------------- |
14 | 14 | ||
15 | Make sure that all fields are well filled: | 15 | Ensure 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 | ||
20 | I don't receive my activation email | 20 | I'm not receiving my activation email |
21 | ----------------------------------- | 21 | ------------------------------------- |
22 | 22 | ||
23 | Are you sure your email address was correct? Did you check your spams folder? | 23 | Are you sure your email address was correct? Did you check your spam folder? |
24 | |||
25 | If you still don't see the activation email, please ensure that you have | ||
26 | installed and properly configured a mail transfer agent. Be sure to include a | ||
27 | firewall rule for SMTP. E.g., if using firewalld: | ||
28 | |||
29 | :: | ||
30 | |||
31 | firewall-cmd --permanent --add-service=smtp | ||
32 | firewall-cmd --reload | ||
33 | |||
34 | Lastly, if you have SELinux enabled, set the following rule: | ||
35 | |||
36 | ``setsebool -P httpd_can_sendmail 1`` | ||
24 | 37 | ||
25 | When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``. | 38 | When 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 | ||
26 | wallabag uses PDO to connect to database, so you'll need one of: | 26 | wallabag 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 | ||
32 | and it's corresponding database server. | 32 | and its corresponding database server. |
33 | 33 | ||
34 | Installation | 34 | Installation |
35 | ------------ | 35 | ------------ |
@@ -37,7 +37,7 @@ Installation | |||
37 | On a dedicated web server (recommended way) | 37 | On a dedicated web server (recommended way) |
38 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 38 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
39 | 39 | ||
40 | wallabag 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. | 40 | wallabag 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 | ||
42 | Install Composer: | 42 | Install Composer: |
43 | 43 | ||
@@ -47,7 +47,7 @@ Install Composer: | |||
47 | 47 | ||
48 | You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__: | 48 | You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__: |
49 | 49 | ||
50 | To install wallabag itself, you must run these two commands: | 50 | To 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 | ||
72 | On a shared hosting | 72 | On a shared hosting |
73 | ~~~~~~~~~~~~~~~~~~~ | 73 | ~~~~~~~~~~~~~~~~~~~ |
74 | 74 | ||
75 | We provide you a package with all dependancies inside. | 75 | We provide a package with all dependencies inside. |
76 | The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``. | 76 | The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``. |
77 | 77 | ||
78 | We already created a user: login and password are ``wallabag``. | 78 | We 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 | ||
82 | Execute this command to download and extract the latest package: | 82 | Execute 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 | ||
88 | Now, read the following documentation to create your virtual host, then access to your wallabag. | 88 | Now, read the following documentation to create your virtual host, then access your wallabag. |
89 | If 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``. | 89 | If 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 | ||
91 | Installation with Docker | 91 | Installation with Docker |
@@ -151,7 +151,7 @@ After reloading or restarting Apache, you should now be able to access wallabag | |||
151 | Configuration on Nginx | 151 | Configuration on Nginx |
152 | ~~~~~~~~~~~~~~~~~~~~~~ | 152 | ~~~~~~~~~~~~~~~~~~~~~~ |
153 | 153 | ||
154 | Assuming you install wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag : | 154 | Assuming 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 | ||
272 | otherwise, sooner or later you will meet this error messages | 272 | otherwise, 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 | |||
280 | Additional rules for SELinux | ||
281 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
282 | |||
283 | If 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 | |||
287 | This 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 | |||
291 | For example: | ||
292 | |||
293 | ``semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"`` | ||
294 | |||
295 | This 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 | |||
309 | After creating these contexts, enter the following in order to apply your rules: | ||
310 | |||
311 | ``restorecon -R -v /var/www/wallabag`` | ||
312 | |||
313 | You 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 | |||
315 | If 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 | |||
319 | After 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; | |||
6 | use Doctrine\Common\DataFixtures\OrderedFixtureInterface; | 6 | use Doctrine\Common\DataFixtures\OrderedFixtureInterface; |
7 | use Doctrine\Common\Persistence\ObjectManager; | 7 | use Doctrine\Common\Persistence\ObjectManager; |
8 | use Wallabag\CoreBundle\Entity\Config; | 8 | use Wallabag\CoreBundle\Entity\Config; |
9 | use Wallabag\CoreBundle\Entity\TaggingRule; | ||
10 | 9 | ||
11 | class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface | 10 | class 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 <= 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 >= 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 <= 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 >= 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: | |||
383 | flashes: | 384 | flashes: |
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'); |