From 143299fad8eabcf63f9d722b72a05c70a987b7c4 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Sat, 18 Jun 2016 16:37:45 +0200 Subject: [PATCH] #4 Account: more features to manage gists --- app/config/routing.yml | 9 ++- app/locales/en.yml | 3 + app/locales/fr.yml | 3 + src/Gist/Controller/MyController.php | 42 ++++++++++++- src/Gist/Form/DeleteGistForm.php | 28 +++++++++ src/Gist/Model/User.php | 8 +++ src/Gist/Resources/views/My/my.html.twig | 78 +++++++++++++++++++++++- web/app/css/app.css | 5 ++ web/app/js/app.js | 8 +++ 9 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 src/Gist/Form/DeleteGistForm.php diff --git a/app/config/routing.yml b/app/config/routing.yml index 1fe48e7..666ca81 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -45,8 +45,13 @@ logout: path: /my/logout my: - path: /my - defaults: {_controller: Gist\Controller\MyController::myAction, _locale: en} + path: /my/{page} + defaults: + _controller: Gist\Controller\MyController::myAction + _locale: en + page: 1 + requirements: + page: \d+ revisions: path: /revs/{gist} diff --git a/app/locales/en.yml b/app/locales/en.yml index c02fc04..5be4648 100644 --- a/app/locales/en.yml +++ b/app/locales/en.yml @@ -33,6 +33,7 @@ gist: download: 'Download' clone: 'Clone' embed: 'Embed:' + add: 'New' date: format: 'Y-m-d h:i:s' @@ -73,6 +74,8 @@ form: yes: 'Yes' no: 'No' submit: 'Send' + success: + gist: 'Gist removed.' type: label: 'Language: %value%' choice: diff --git a/app/locales/fr.yml b/app/locales/fr.yml index d35bf7e..bbfece7 100644 --- a/app/locales/fr.yml +++ b/app/locales/fr.yml @@ -33,6 +33,7 @@ gist: download: 'Télécharger' clone: 'Clôner' embed: 'Insérer : ' + add: 'Ajouter' date: format: 'd/m/Y H\hi s\s' @@ -74,6 +75,8 @@ form: yes: 'Oui' no: 'Non' submit: 'Envoyer' + success: + gist: 'Votre Gist a bien a été supprimé.' type: label: 'Langage : %value%' choice: diff --git a/src/Gist/Controller/MyController.php b/src/Gist/Controller/MyController.php index 73a705e..fb7dbf9 100644 --- a/src/Gist/Controller/MyController.php +++ b/src/Gist/Controller/MyController.php @@ -3,6 +3,8 @@ namespace Gist\Controller; use Symfony\Component\HttpFoundation\Request; +use Gist\Model\GistQuery; +use Gist\Form\DeleteGistForm; /** * Class MyController @@ -10,8 +12,44 @@ use Symfony\Component\HttpFoundation\Request; */ class MyController extends Controller { - public function myAction(Request $request) + public function myAction(Request $request, $page) { - return $this->render('My/my.html.twig'); + $page = (int) $page; + $gists = $this->getUser()->getGistsPager($page); + + $app = $this->getApp(); + $form = new DeleteGistForm($app['form.factory'], $app['translator']); + $form = $form->build()->getForm(); + + if ($request->isMethod('post')) { + $form->submit($request); + + if ($form->isValid()) { + $id = (int) $form->getData()['id']; + + foreach ($gists as $gist) { + if ($gist->getId() === $id) { + $gist->delete(); + $deleted = true; + $gists = $this->getUser()->getGistsPager($page); + } + } + } + } + + $nextPage = min($page + 1, $gists->getLastPage()); + $previousPage = max($page - 1, 1); + + return $this->render( + 'My/my.html.twig', + array( + 'gists' => $gists, + 'page' => $page, + 'form' => $form->createView(), + 'deleted' => !empty($deleted), + 'nextPage' => $nextPage, + 'previousPage' => $previousPage, + ) + ); } } diff --git a/src/Gist/Form/DeleteGistForm.php b/src/Gist/Form/DeleteGistForm.php new file mode 100644 index 0000000..c7c2350 --- /dev/null +++ b/src/Gist/Form/DeleteGistForm.php @@ -0,0 +1,28 @@ + + */ +class DeleteGistForm extends AbstractForm +{ + public function build(array $options = array()) + { + $this->builder->add( + 'id', + 'hidden', + array( + 'required' => true, + 'constraints' => array( + new NotBlank(), + ), + ) + ); + + return $this->builder; + } +} diff --git a/src/Gist/Model/User.php b/src/Gist/Model/User.php index fca1a40..6ce65fb 100644 --- a/src/Gist/Model/User.php +++ b/src/Gist/Model/User.php @@ -27,4 +27,12 @@ class User extends BaseUser implements UserInterface return parent::getGists($criteria, $con); } + + public function getGistsPager($page, $maxPerPage = 10) + { + return GistQuery::create() + ->filterByUser($this) + ->orderByCreatedAt(Criteria::DESC) + ->paginate($page, $maxPerPage); + } } diff --git a/src/Gist/Resources/views/My/my.html.twig b/src/Gist/Resources/views/My/my.html.twig index 237940a..b0bec8e 100644 --- a/src/Gist/Resources/views/My/my.html.twig +++ b/src/Gist/Resources/views/My/my.html.twig @@ -4,19 +4,85 @@ {% block body %}
+ {% if deleted %} +
+
+

{{ 'form.success.gist'|trans }}

+
+
+ {% endif %}
{{ 'my.title'|trans }} +
- {% set gists = user.gists %} +
+ {{ form(form) }} +
- {% if gists|length == 0 %} + {% if gists.nbResults == 0 %} {{ 'my.nothing'|trans }} {% else %} - {% for gist in user.gists %} + {% set pager %} + {% if gists.haveToPaginate %} +
    +
  • + {% set params = app.request.attributes.get('_route_params')|merge({page: 1}) %} + + + +
  • + +
  • + {% set params = app.request.attributes.get('_route_params')|merge({page: previousPage}) %} + + + +
  • + + {% for p in gists.links(10) %} +
  • + {% set params = app.request.attributes.get('_route_params')|merge({page: p}) %} + {{ p }} +
  • + {% endfor %} + +
  • + {% set params = app.request.attributes.get('_route_params')|merge({page: nextPage}) %} + + + +
  • + +
  • + {% set params = app.request.attributes.get('_route_params')|merge({page: 1}) %} + + + +
  • +
+ {% endif %} + {% endset %} + + {{ pager }} + + {% for gist in gists %}

{{ gist.title ? gist.title : 'gist.untitled'|trans }}, @@ -37,9 +103,15 @@ {% endif %} + +

{% endfor %} + + {{ pager }} {% endif %}
diff --git a/web/app/css/app.css b/web/app/css/app.css index 4db1167..bcf679d 100644 --- a/web/app/css/app.css +++ b/web/app/css/app.css @@ -77,3 +77,8 @@ div.diff { #options { margin-bottom: 17px; } + +.btn-delete { + background: #DE3336; + color: #fff; +} diff --git a/web/app/js/app.js b/web/app/js/app.js index 3922dcd..ba95913 100644 --- a/web/app/js/app.js +++ b/web/app/js/app.js @@ -77,6 +77,13 @@ var editorEvents = function() { } } +var myEvents = function() { + $('.btn-delete').click(function() { + $('#form_id').val($(this).data('id')); + $('#form-deletion form').submit(); + }); +} + var mainEditorEvents = function() { $('.cipher-input').change(function() { if ($('.cipher-input:checked').val() === 'yes') { @@ -142,6 +149,7 @@ var viewerEvents = function() { var bootstrap = function() { editorEvents(); viewerEvents(); + myEvents(); mainEditorEvents(); }