diff --git a/app/Resources/static/themes/material/css/entries.scss b/app/Resources/static/themes/material/css/entries.scss index 5c55caa85..e22178a52 100644 --- a/app/Resources/static/themes/material/css/entries.scss +++ b/app/Resources/static/themes/material/css/entries.scss @@ -2,6 +2,42 @@ * Entries * ========================================================================== */ +.mass-buttons { + margin: 5px; + + #selectAll { + position: relative; + opacity: initial; + left: 0; + } + + span { + padding: 3px; + } + + button { + i { + font-size: 12px; + } + + height: 24px; + line-height: 24px; + padding: 0 0.5rem; + } +} + +.card-stacked { + input[type=checkbox] { + position: relative; + opacity: initial; + left: 0; + } + + .entry-checkbox { + margin-right: 10px; + } +} + .collection { margin: 15px 15px 0; diff --git a/app/Resources/static/themes/material/index.js b/app/Resources/static/themes/material/index.js index da055e80a..1c28401d9 100755 --- a/app/Resources/static/themes/material/index.js +++ b/app/Resources/static/themes/material/index.js @@ -105,4 +105,17 @@ $(document).ready(() => { $('.nav-panels').css('background', 'transparent'); return false; }); + + const mainCheckboxes = document.querySelectorAll('[data-js="checkboxes-toggle"]'); + if (mainCheckboxes.length) { + [...mainCheckboxes].forEach((el) => { + el.addEventListener('click', () => { + const checkboxes = document.querySelectorAll(el.dataset.toggle); + [...checkboxes].forEach((checkbox) => { + const checkboxClone = checkbox; + checkboxClone.checked = el.checked; + }); + }); + }); + } }); diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index ba5bfbe29..9b2954e7d 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php @@ -20,6 +20,48 @@ use Wallabag\CoreBundle\Form\Type\SearchEntryType; class EntryController extends Controller { + /** + * @Route("/mass", name="mass_action") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function massAction(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $values = $request->request->all(); + + $action = 'toggle-read'; + if (isset($values['toggle-star'])) { + $action = 'toggle-star'; + } elseif (isset($values['delete'])) { + $action = 'delete'; + } + + if (isset($values['entry-checkbox'])) { + foreach ($values['entry-checkbox'] as $id) { + /** @var Entry * */ + $entry = $this->get('wallabag_core.entry_repository')->findById((int) $id)[0]; + + $this->checkUserAction($entry); + + if ('toggle-read' === $action) { + $entry->toggleArchive(); + } elseif ('toggle-star' === $action) { + $entry->toggleStar(); + } elseif ('delete' === $action) { + $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry)); + $em->remove($entry); + } + } + + $em->flush(); + } + + $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer')); + + return $this->redirect($redirectUrl); + } + /** * @param int $page * diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_mass_checkbox.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_mass_checkbox.html.twig new file mode 100644 index 000000000..d35d8db13 --- /dev/null +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_mass_checkbox.html.twig @@ -0,0 +1,3 @@ +