Added an system for showing flash messages to user.

This commit is contained in:
Jan Böhmer 2019-03-13 14:53:12 +01:00
parent cc1badb853
commit 2d18014b35
6 changed files with 146 additions and 6 deletions

View file

@ -134,7 +134,15 @@ body {
line-height: 1.1; line-height: 1.1;
} }
/********************************
* Toasts
********************************/
.toast-container {
position: fixed;
top: auto;
z-index: 1;
right: 25px;
}
/********************************** /**********************************
* Helper classes * Helper classes

View file

@ -0,0 +1,58 @@
<?php
/**
*
* part-db version 0.1
* Copyright (C) 2005 Christoph Lechner
* http://www.cl-projects.de/
*
* part-db version 0.2+
* Copyright (C) 2009 K. Jacobs and others (see authors.php)
* http://code.google.com/p/part-db/
*
* Part-DB Version 0.4+
* Copyright (C) 2016 - 2019 Jan Böhmer
* https://github.com/jbtronics
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class DebugController
* @package App\Controller
*/
class DebugController extends AbstractController
{
/**
* @Route("/debug/flash_test")
*/
public function flashTest()
{
$this->addFlash('success', 'Success Flash Message!');
$this->addFlash('error', 'Error Flash Message!');
$this->addFlash('warning', 'Warning Flash Message!');
$this->addFlash('notice', 'Notice Flash Message!');
$this->addFlash('info', 'Info Flash Message! <b>Test</b>');
$this->addFlash('testkjfd', 'Blabla. This message type should be not know to template!');
return $this->render("base.html.twig");
}
}

View file

@ -42,6 +42,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class PartController extends AbstractController class PartController extends AbstractController
{ {
@ -89,14 +90,12 @@ class PartController extends AbstractController
* *
* @return \Symfony\Component\HttpFoundation\Response * @return \Symfony\Component\HttpFoundation\Response
*/ */
public function new(Request $request, EntityManagerInterface $em) public function new(Request $request, EntityManagerInterface $em, TranslatorInterface $translator)
{ {
$new_part = new Part(); $new_part = new Part();
$category = $em->find(Category::class, 1); $category = $em->find(Category::class, 1);
$new_part->setCategory($category); $new_part->setCategory($category);
$this->addFlash('success', 'Article Created!');
$form = $this->createForm(PartType::class, $new_part); $form = $this->createForm(PartType::class, $new_part);
$form->handleRequest($request); $form->handleRequest($request);
@ -106,7 +105,7 @@ class PartController extends AbstractController
//$part = $form->getData(); //$part = $form->getData();
$em->persist($new_part); $em->persist($new_part);
$em->flush(); $em->flush();
$this->addFlash('success', 'Article Created! Knowledge is power!'); $this->addFlash('success', $translator->trans('part.created_flash'));
return $this->redirectToRoute('part_edit',['id' => $new_part->getID()]); return $this->redirectToRoute('part_edit',['id' => $new_part->getID()]);
} }

View file

@ -101,11 +101,42 @@
</ul> </ul>
</div> </div>
</nav> </nav>
<div class="toast-container ">
{% for label, messages in app.flashes() %}
{% for message in messages %}
{% set flash_title = label|replace({'success': 'flash.success', 'error': 'flash.error'
, 'warning': 'flash.warning', 'notice': 'flash.notice', 'info': 'flash.info'}) %}
{% set flash_symbol = label|replace({'success': 'fa-check-circle', 'error': 'fa-exclamation-triangle'
, 'warning': 'fa-exclamation-circle', 'notice': 'fa-flag', 'info': 'fa-flag'}) %}
{% set flash_bg = label|replace({'success': 'bg-success text-white',
'error': 'bg-danger text-white', 'warning': 'bg-warning text-white',
'notice': 'bg-info text-white', 'info': 'bg'})%}
<div class="toast " role="alert" aria-live="assertive" aria-atomic="true" data-delay="2000">
<div class="toast-header {{ flash_bg }}">
{# <img src="..." class="rounded mr-2" alt="...">#}
<i class="fas fa-fw {{ flash_symbol }} mr-2"></i>
<strong class="mr-auto">{{ flash_title|trans }}</strong>
{#<small class="text-muted">11 mins ago</small> #}
<button type="button" class="ml-2 mb-1 close" data-dismiss="toast" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="toast-body {{ flash_bg }}">
{{ message}}
</div>
</div>
{% endfor %}
{% endfor %}
</div>
</header> </header>
<main> <main>
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="collapse d-md-block bg-light" id="sidebar-container"> <div class="collapse d-md-block bg-light" id="sidebar-container">
<nav class="fixed-sidebar col-md-3 col-lg-2 " id="fixed-sidebar"> <nav class="fixed-sidebar col-md-3 col-lg-2 " id="fixed-sidebar">
@ -258,6 +289,10 @@
<script src="{{ asset('helper/datatables.js') }}"></script> <script src="{{ asset('helper/datatables.js') }}"></script>
<script>
$(".toast").toast('show');
</script>
{% endblock %} {% endblock %}
{% block scripts %} {% block scripts %}

View file

@ -285,6 +285,26 @@
<source>part_list.loading.message</source> <source>part_list.loading.message</source>
<target state="translated">Dies kann einen Moment dauern. Wenn diese Nachricht längere Zeit bestehen bleibt, versuchen sie die Seite erneut zu laden.</target> <target state="translated">Dies kann einen Moment dauern. Wenn diese Nachricht längere Zeit bestehen bleibt, versuchen sie die Seite erneut zu laden.</target>
</trans-unit> </trans-unit>
<trans-unit resname="flash.success" id="flash.success">
<source>flash.success</source>
<target state="translated">Erfolg</target>
</trans-unit>
<trans-unit resname="flash.error" id="flash.error">
<source>flash.error</source>
<target state="translated">Fehler</target>
</trans-unit>
<trans-unit resname="flash.warning" id="flash.warning">
<source>flash.warning</source>
<target state="translated">Warnung</target>
</trans-unit>
<trans-unit resname="flash.notice" id="flash.notice">
<source>flash.notice</source>
<target state="translated">Hinweis</target>
</trans-unit>
<trans-unit resname="flash.info" id="flash.info">
<source>flash.info</source>
<target state="translated">Info</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View file

@ -301,6 +301,26 @@
<source>part_list.loading.message</source> <source>part_list.loading.message</source>
<target state="translated">This can take a moment. If this message do not disappear, try to reload the page.</target> <target state="translated">This can take a moment. If this message do not disappear, try to reload the page.</target>
</trans-unit> </trans-unit>
<trans-unit resname="flash.success" id="flash.success">
<source>flash.success</source>
<target state="translated">Success</target>
</trans-unit>
<trans-unit resname="flash.error" id="flash.error">
<source>flash.error</source>
<target state="translated">Error</target>
</trans-unit>
<trans-unit resname="flash.warning" id="flash.warning">
<source>flash.warning</source>
<target state="translated">Warning</target>
</trans-unit>
<trans-unit resname="flash.notice" id="flash.notice">
<source>flash.notice</source>
<target state="translated">Notice</target>
</trans-unit>
<trans-unit resname="flash.info" id="flash.info">
<source>flash.info</source>
<target state="translated">Info</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>