@@ -2,6 +2,7 @@ | |||
namespace Lc\CaracoleBundle\Controller\Dashboard; | |||
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets; | |||
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; | |||
use Lc\SovBundle\Controller\Dashboard\DashboardController as SovDashboardController ; | |||
@@ -17,4 +18,13 @@ class DashboardAdminController extends SovDashboardController | |||
return $crud ; | |||
} | |||
public function configureAssets(): Assets | |||
{ | |||
$assets = parent::configureAssets(); // TODO: Change the autogenerated stub | |||
$assets->addWebpackEncoreEntry('common-switch-merchant') ; | |||
return $assets ; | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
<?php | |||
namespace Lc\CaracoleBundle\Controller\Merchant; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType; | |||
use Lc\CaracoleBundle\Resolver\MerchantResolver; | |||
use Lc\SovBundle\Doctrine\EntityManager; | |||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||
use Symfony\Component\HttpFoundation\Request; | |||
use Symfony\Component\Security\Core\Security; | |||
class SwitchMerchantController extends AbstractController | |||
{ | |||
public function switchMerchant(Request $request) | |||
{ | |||
$form = $this->createForm(SwitchMerchantFormType::class); | |||
$form->handleRequest($request); | |||
if ($form->isSubmitted() && $form->isValid()) { | |||
$merchant = $form->get('merchant')->getData(); | |||
$context = $form->get('context')->getData(); | |||
if ($merchant) { | |||
$url = $merchant->getMerchantConfig('url'); | |||
if($context == 'admin') { | |||
$url .= 'admin' ; | |||
} | |||
if ($url) { | |||
return $this->redirect($url); | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
<?php | |||
namespace Lc\CaracoleBundle\Controller\Section; | |||
use Doctrine\ORM\EntityManagerInterface; | |||
use Lc\CaracoleBundle\Form\Section\SwitchSectionFormType; | |||
use Lc\CaracoleBundle\Repository\Section\SectionRepository; | |||
use Lc\CaracoleBundle\Resolver\MerchantResolver; | |||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||
use Symfony\Component\HttpFoundation\Request; | |||
class SwitchSectionAdminController extends AbstractController | |||
{ | |||
public function switchSection( | |||
Request $request, | |||
EntityManagerInterface $em, | |||
MerchantResolver $merchantResolver, | |||
SectionRepository $sectionRepository | |||
) { | |||
$form = $this->createForm(SwitchSectionFormType::class); | |||
$form->handleRequest($request); | |||
if ($form->isSubmitted() && $form->isValid()) { | |||
$idSection = $form->get('id_section')->getData(); | |||
$section = $sectionRepository->find($idSection); | |||
$userMerchant = $merchantResolver->getUserMerchant(); | |||
if ($section && $userMerchant) { | |||
$userMerchant->setCurrentAdminSection($section); | |||
$em->update($section); | |||
$em->flush(); | |||
} | |||
$referer = $request->headers->get('referer'); | |||
return $this->redirect($referer); | |||
} | |||
} | |||
} |
@@ -3,35 +3,61 @@ | |||
namespace Lc\CaracoleBundle\Form\Merchant; | |||
use Lc\CaracoleBundle\Model\Merchant\MerchantInterface; | |||
use Lc\SovBundle\DataTransformer\FileManagerTypeToDataTransformer; | |||
use Lc\CaracoleBundle\Resolver\MerchantResolver; | |||
use Lc\SovBundle\Doctrine\EntityManager; | |||
use Lc\SovBundle\Model\User\UserInterface; | |||
use Lc\SovBundle\Translation\TranslatorAdmin; | |||
use Symfony\Bridge\Doctrine\Form\Type\EntityType; | |||
use Symfony\Component\Form\AbstractType; | |||
use Symfony\Component\Form\Extension\Core\Type\HiddenType; | |||
use Symfony\Component\Form\FormBuilderInterface; | |||
use Symfony\Component\OptionsResolver\OptionsResolver; | |||
class SwitchMerchantFormType extends AbstractType | |||
{ | |||
protected $em; | |||
protected $translatorAdmin; | |||
protected $merchantResolver; | |||
public function __construct(EntityManager $em, TranslatorAdmin $translatorAdmin) | |||
public function __construct(EntityManager $em, TranslatorAdmin $translatorAdmin, MerchantResolver $merchantResolver) | |||
{ | |||
$this->em = $em; | |||
$this->translatorAdmin = $translatorAdmin; | |||
$this->merchantResolver = $merchantResolver; | |||
} | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
$entityName = $this->em->getEntityName(MerchantInterface::class); | |||
$builder->add( | |||
'merchants', | |||
'merchant', | |||
EntityType::class, | |||
[ | |||
'class' => $entityName, | |||
'choice_label' => 'title' | |||
'class' => $this->em->getEntityName(MerchantInterface::class), | |||
'choice_label' => 'title', | |||
'data' => $options['current_merchant'] | |||
] | |||
); | |||
$builder->add( | |||
'context', | |||
HiddenType::class, | |||
[ | |||
'data' => $options['context'] | |||
] | |||
); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function configureOptions(OptionsResolver $resolver) | |||
{ | |||
$resolver->setDefaults( | |||
[ | |||
'context' => 'frontend', | |||
'current_merchant' => $this->merchantResolver->getCurrent(), | |||
] | |||
); | |||
} | |||
} |
@@ -0,0 +1,81 @@ | |||
<?php | |||
namespace Lc\CaracoleBundle\Form\Section; | |||
use Lc\CaracoleBundle\Model\Merchant\MerchantInterface; | |||
use Lc\CaracoleBundle\Repository\Section\SectionRepository; | |||
use Lc\CaracoleBundle\Resolver\MerchantResolver; | |||
use Lc\CaracoleBundle\Resolver\SectionResolver; | |||
use Lc\SovBundle\Doctrine\EntityManager; | |||
use Lc\SovBundle\Model\User\UserInterface; | |||
use Lc\SovBundle\Translation\TranslatorAdmin; | |||
use Symfony\Bridge\Doctrine\Form\Type\EntityType; | |||
use Symfony\Component\Form\AbstractType; | |||
use Symfony\Component\Form\Extension\Core\Type\ButtonType; | |||
use Symfony\Component\Form\Extension\Core\Type\HiddenType; | |||
use Symfony\Component\Form\Extension\Core\Type\SubmitType; | |||
use Symfony\Component\Form\FormBuilderInterface; | |||
use Symfony\Component\OptionsResolver\OptionsResolver; | |||
class SwitchSectionFormType extends AbstractType | |||
{ | |||
protected $em; | |||
protected $translatorAdmin; | |||
protected $sectionResolver; | |||
public function __construct( | |||
EntityManager $em, | |||
TranslatorAdmin $translatorAdmin, | |||
SectionResolver $sectionResolver | |||
) { | |||
$this->em = $em; | |||
$this->translatorAdmin = $translatorAdmin; | |||
$this->sectionResolver = $sectionResolver; | |||
} | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
$section = $options['section']; | |||
$currentSection = $this->sectionResolver->getCurrent(); | |||
$builder->add( | |||
'id_section', | |||
HiddenType::class, | |||
[ | |||
'data' => $section ? $section->getId() : null | |||
] | |||
); | |||
$styleButton = ''; | |||
$classButton = 'btn-section'; | |||
if ($section == $currentSection) { | |||
$classButton .= ' btn-section-current'; | |||
$styleButton = 'background-color: ' . $currentSection->getColor() . ';'; | |||
} | |||
$builder->add( | |||
'submit', | |||
SubmitType::class, | |||
[ | |||
'label' => $section ? $section->getTitle() : '', | |||
'attr' => [ | |||
'class' => $classButton, | |||
'style' => $styleButton, | |||
] | |||
] | |||
); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function configureOptions(OptionsResolver $resolver) | |||
{ | |||
$resolver->setDefaults( | |||
[ | |||
'section' => null, | |||
] | |||
); | |||
} | |||
} |
@@ -35,7 +35,7 @@ abstract class UserModel extends SovUserModel | |||
/** | |||
* @ORM\ManyToOne(targetEntity="Lc\CaracoleBundle\Model\Merchant\MerchantInterface") | |||
*/ | |||
protected $merchant; | |||
protected $favoriteMerchant; | |||
/** | |||
* @ORM\OneToMany(targetEntity="Lc\CaracoleBundle\Model\Address\AddressInterface", mappedBy="user", cascade={"persist"}) | |||
@@ -157,14 +157,14 @@ abstract class UserModel extends SovUserModel | |||
return $this; | |||
} | |||
public function getMerchant(): ?MerchantInterface | |||
public function getFavoriteMerchant(): ?MerchantInterface | |||
{ | |||
return $this->merchant; | |||
return $this->favoriteMerchant; | |||
} | |||
public function setMerchant(?MerchantInterface $merchant): self | |||
public function setFavoriteMerchant(?MerchantInterface $merchant): self | |||
{ | |||
$this->merchant = $merchant; | |||
$this->favoriteMerchant = $merchant; | |||
return $this; | |||
} |
@@ -3,7 +3,7 @@ | |||
namespace Lc\CaracoleBundle\Repository\Section; | |||
use Lc\CaracoleBundle\Model\Section\SectionInterface; | |||
use Lc\SovBundle\Repository\AbstractRepository; | |||
use Lc\CaracoleBundle\Repository\AbstractRepository; | |||
/** | |||
* @method SectionInterface|null find($id, $lockMode = null, $lockVersion = null) |
@@ -18,9 +18,9 @@ class SectionResolver | |||
protected $sectionRepository; | |||
protected $merchantResolver; | |||
public function __construct(MerchantResolver $merchantResolver, SectionRepository $sectionRepository) | |||
public function __construct(MerchantResolver $merchantResolver, EntityManagerInterface $em) | |||
{ | |||
$this->sectionRepository = $sectionRepository; | |||
$this->em = $em; | |||
$this->merchantResolver = $merchantResolver; | |||
} | |||
@@ -39,7 +39,6 @@ class SectionResolver | |||
throw new \ErrorException('Aucune section par défaut définie pour ce merchant'); | |||
} | |||
} | |||
return $currentAdminSection; | |||
} | |||
@@ -0,0 +1,2 @@ | |||
import './common.scss' ; |
@@ -0,0 +1,7 @@ | |||
import './switchmerchant.js' ; | |||
import './switchmerchant_admin.scss' ; | |||
@@ -0,0 +1,11 @@ | |||
$(document).ready(function() { | |||
initSwitchMerchant() ; | |||
}) ; | |||
function initSwitchMerchant() { | |||
let $form = $('form.switch-merchant') ; | |||
$form.find('select').change(function() { | |||
$form.submit() ; | |||
}) ; | |||
} |
@@ -0,0 +1,25 @@ | |||
body.admin { | |||
.nav-switch-merchant { | |||
width: 220px ; | |||
text-align: right ; | |||
.fa { | |||
position: relative; | |||
top: -4px; | |||
right: 7px; | |||
} | |||
form.switch-merchant { | |||
display: inline-block ; | |||
width: 180px ; | |||
position: relative ; | |||
top: 7px ; | |||
text-align: left ; | |||
label, .select2-selection__clear { | |||
display: none ; | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,8 @@ | |||
carac_switch_merchant: | |||
path: /switch-merchant | |||
controller: Lc\CaracoleBundle\Controller\Merchant\SwitchMerchantController::switchMerchant | |||
carac_switch_section: | |||
path: /switch-section | |||
controller: Lc\CaracoleBundle\Controller\Section\SwitchSectionAdminController::switchSection | |||
@@ -7,13 +7,19 @@ | |||
<ul class="navbar-nav"> | |||
{% for section in carac_get_sections() %} | |||
<li class="nav-item d-none d-sm-inline-block"> | |||
<a href="#" class="nav-link">{{ section.title }}</a> | |||
{% set form_switch_section = carac_get_form_switch_section(section) %} | |||
{% form_theme form_switch_section '@LcSov/adminlte/crud/form_theme.html.twig' %} | |||
{{ form_start(form_switch_section) }} | |||
{{ form(form_switch_section) }} | |||
{{ form_end(form_switch_section) }} | |||
</li> | |||
{% endfor %} | |||
</ul> | |||
<ul class="navbar-nav ml-auto"> | |||
<li class="nav-item"> | |||
{% set form_switch_merchant = carac_get_form_switch_merchhant() %} | |||
<li class="nav-item nav-switch-merchant"> | |||
<i class="fa fa-store"></i> | |||
{% set form_switch_merchant = carac_get_form_switch_merchant('admin') %} | |||
{% form_theme form_switch_merchant '@LcSov/adminlte/crud/form_theme.html.twig' %} | |||
{{ form_start(form_switch_merchant) }} | |||
{{ form(form_switch_merchant) }} | |||
{{ form_end(form_switch_merchant) }} |
@@ -4,6 +4,7 @@ namespace Lc\CaracoleBundle\Twig; | |||
use Doctrine\ORM\EntityManagerInterface; | |||
use Lc\CaracoleBundle\Form\Merchant\SwitchMerchantFormType; | |||
use Lc\CaracoleBundle\Form\Section\SwitchSectionFormType; | |||
use Lc\CaracoleBundle\Repository\Merchant\MerchantRepository; | |||
use Lc\CaracoleBundle\Repository\Section\SectionRepository; | |||
use Lc\SovBundle\Translation\TranslatorAdmin; | |||
@@ -12,6 +13,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; | |||
use Symfony\Component\Form\FormFactoryInterface; | |||
use Symfony\Component\HttpFoundation\RequestStack; | |||
use Symfony\Component\HttpKernel\KernelInterface; | |||
use Symfony\Component\Routing\Generator\UrlGenerator; | |||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |||
use Symfony\Contracts\Translation\TranslatorInterface; | |||
use Twig\Extension\AbstractExtension; | |||
@@ -19,49 +21,29 @@ use Twig\TwigFunction; | |||
class TwigExtension extends AbstractExtension | |||
{ | |||
protected $em; | |||
protected $kernel; | |||
protected $parameterBag; | |||
protected $cacheManager; | |||
protected $requestStack; | |||
protected $router; | |||
protected $translator; | |||
protected $translatorAdmin; | |||
protected $merchantRepository; | |||
protected $sectionRepository; | |||
protected $formFactory; | |||
protected $urlGenerator; | |||
public function __construct( | |||
KernelInterface $kernel, | |||
ParameterBagInterface $parameterBag, | |||
CacheManager $cacheManager, | |||
EntityManagerInterface $entityManager, | |||
RequestStack $requestStack, | |||
UrlGeneratorInterface $router, | |||
TranslatorInterface $translator, | |||
TranslatorAdmin $translatorAdmin, | |||
MerchantRepository $merchantRepository, | |||
SectionRepository $sectionRepository, | |||
FormFactoryInterface $formFactory | |||
FormFactoryInterface $formFactory, | |||
UrlGeneratorInterface $urlGenerator | |||
) { | |||
$this->kernel = $kernel; | |||
$this->parameterBag = $parameterBag; | |||
$this->cacheManager = $cacheManager; | |||
$this->em = $entityManager; | |||
$this->requestStack = $requestStack; | |||
$this->router = $router; | |||
$this->translator = $translator; | |||
$this->translatorAdmin = $translatorAdmin; | |||
$this->merchantRepository = $merchantRepository; | |||
$this->sectionRepository = $sectionRepository; | |||
$this->formFactory = $formFactory; | |||
$this->urlGenerator = $urlGenerator; | |||
} | |||
public function getFunctions() | |||
{ | |||
return array( | |||
new TwigFunction('carac_get_sections', [$this, 'getSections']), | |||
new TwigFunction('carac_get_form_switch_merchhant', [$this, 'getFormSwitchMerchant']), | |||
new TwigFunction('carac_get_form_switch_merchant', [$this, 'getFormSwitchMerchant']), | |||
new TwigFunction('carac_get_form_switch_section', [$this, 'getFormSwitchSection']), | |||
); | |||
} | |||
@@ -75,9 +57,31 @@ class TwigExtension extends AbstractExtension | |||
return $this->merchantRepository->findAll(); | |||
} | |||
public function getFormSwitchMerchant() | |||
public function getFormSwitchMerchant($context = 'front') | |||
{ | |||
$form = $this->formFactory->create(SwitchMerchantFormType::class, null, ['action' => '#']); | |||
$form = $this->formFactory->create( | |||
SwitchMerchantFormType::class, | |||
null, | |||
[ | |||
'action' => $this->urlGenerator->generate('carac_switch_merchant'), | |||
'attr' => ['class' => 'switch-merchant'], | |||
'context' => $context | |||
] | |||
); | |||
return $form->createView(); | |||
} | |||
public function getFormSwitchSection($section) | |||
{ | |||
$form = $this->formFactory->create( | |||
SwitchSectionFormType::class, | |||
null, | |||
[ | |||
'action' => $this->urlGenerator->generate('carac_switch_section'), | |||
'attr' => ['class' => 'switch-section'], | |||
'section' => $section, | |||
] | |||
); | |||
return $form->createView(); | |||
} | |||
} |