@@ -13,6 +13,7 @@ use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; | |||
use Symfony\Component\Security\Core\Security; | |||
use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator; | |||
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge; | |||
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge; | |||
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; | |||
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials; | |||
use Symfony\Component\Security\Http\Authenticator\Passport\Passport; | |||
@@ -58,7 +59,10 @@ class LoginFormAuthenticator extends AbstractLoginFormAuthenticator | |||
return $this->userStore->getOneByEmail($userIdentifier); | |||
}), | |||
new PasswordCredentials($password), | |||
[new CsrfTokenBadge('authenticate', $csrfToken)] | |||
[ | |||
new CsrfTokenBadge('authenticate', $csrfToken), | |||
new RememberMeBadge() | |||
] | |||
); | |||
} | |||
@@ -34,6 +34,9 @@ class FileComponent | |||
$path = substr($path, 1); | |||
} | |||
// gestion des accents et des espaces | |||
$path = urldecode($path); | |||
if ($path) { | |||
$fileManagerFolder = substr($this->getFileManagerFolder(), 1); |
@@ -2,6 +2,7 @@ | |||
namespace Lc\SovBundle\Container; | |||
use Lc\SovBundle\Component\ArrayComponent; | |||
use Lc\SovBundle\Component\CitiesComponent; | |||
use Lc\SovBundle\Component\CookieComponent; | |||
use Lc\SovBundle\Component\DateComponent; |
@@ -19,6 +19,7 @@ use Lc\SovBundle\Container\Ticket\TicketMessageContainer; | |||
use Lc\SovBundle\Container\User\GroupUserContainer; | |||
use Lc\SovBundle\Container\User\UserContainer; | |||
use Lc\SovBundle\Field\Filter\FilterManager; | |||
use Lc\SovBundle\Generator\PdfGenerator; | |||
use Lc\SovBundle\Repository\EntityRepository; | |||
use Lc\SovBundle\Solver\Setting\SettingSolver; | |||
use Lc\SovBundle\Translation\FlashBagTranslator; | |||
@@ -32,6 +33,7 @@ use Symfony\Component\HttpFoundation\RequestStack; | |||
use Symfony\Component\HttpFoundation\Session\SessionInterface; | |||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |||
use Symfony\Component\Security\Core\Security; | |||
use Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices; | |||
use Symfony\Contracts\Translation\TranslatorInterface; | |||
use Twig\Environment; | |||
@@ -53,6 +55,7 @@ trait ControllerTrait | |||
LoggerInterface::class => LoggerInterface::class, | |||
ParameterBagInterface::class => ParameterBagInterface::class, | |||
TranslatorInterface::class => TranslatorInterface::class, | |||
PdfGenerator::class => PdfGenerator::class, | |||
TranslatorAdmin::class => TranslatorAdmin::class, | |||
FilterManager::class => FilterManager::class, | |||
FlashBagTranslator::class => FlashBagTranslator::class, | |||
@@ -177,6 +180,11 @@ trait ControllerTrait | |||
return $this->get(TranslatorInterface::class); | |||
} | |||
public function getPdfGenerator(): PdfGenerator | |||
{ | |||
return $this->get(PdfGenerator::class); | |||
} | |||
public function getTranslatorAdmin(): TranslatorAdmin | |||
{ | |||
return $this->get(TranslatorAdmin::class); | |||
@@ -267,4 +275,10 @@ trait ControllerTrait | |||
return $this->get(SiteSettingContainer::class); | |||
} | |||
public function setNoMemoryAndTimeLimit(): void | |||
{ | |||
ini_set('memory_limit', '-1'); | |||
set_time_limit(0); | |||
} | |||
} |
@@ -18,7 +18,7 @@ class PageFieldDefinition extends AbstractFieldDefinition | |||
]; | |||
} | |||
public function configurePanelMain(): array | |||
public function configurePanelGeneral(): array | |||
{ | |||
return [ | |||
'title', | |||
@@ -29,7 +29,7 @@ class PageFieldDefinition extends AbstractFieldDefinition | |||
public function configurePanels(): array | |||
{ | |||
return ['main', 'seo', 'conf']; | |||
return ['general', 'seo', 'conf']; | |||
} | |||
public function configureFields(): array |
@@ -9,26 +9,31 @@ use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; | |||
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; | |||
class LcSovExtension extends Extension implements PrependExtensionInterface | |||
class LcSovExtension extends Extension implements PrependExtensionInterface | |||
{ | |||
public function load(array $configs, ContainerBuilder $container) | |||
{ | |||
$configuration = new Configuration(); | |||
$config = $this->processConfiguration($configuration, $configs); | |||
public function load(array $configs, ContainerBuilder $container) | |||
{ | |||
$configuration = new Configuration(); | |||
$config = $this->processConfiguration($configuration, $configs); | |||
foreach ($config as $parameter => $value) | |||
$container->setParameter(sprintf('lc_sov.%s', $parameter), $value); | |||
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); | |||
$loader->load('services.yaml'); | |||
foreach ($config as $parameter => $value) { | |||
$container->setParameter(sprintf('lc_sov.%s', $parameter), $value); | |||
} | |||
public function prepend(ContainerBuilder $container) | |||
{ | |||
/*$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config/easy_admin')); | |||
$loader->load('base.yaml'); | |||
$loader->load('entities/merchant.yaml');*/ | |||
} | |||
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); | |||
$loader->load('services.yaml'); | |||
} | |||
public function prepend(ContainerBuilder $container) | |||
{ | |||
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config/packages')); | |||
$loader->load('ch_cookie_consent.yaml'); | |||
/*$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config/easy_admin')); | |||
$loader->load('base.yaml'); | |||
$loader->load('entities/merchant.yaml');*/ | |||
} | |||
} |
@@ -0,0 +1,70 @@ | |||
<?php | |||
namespace Lc\SovBundle\Form\Common; | |||
use ConnectHolland\CookieConsentBundle\Cookie\CookieChecker; | |||
use Symfony\Component\Form\AbstractTypeExtension; | |||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; | |||
use Symfony\Component\Form\FormBuilderInterface; | |||
use ConnectHolland\CookieConsentBundle\Form\CookieConsentType as BaseCookieConsentType; | |||
class CookieConsentTypeExtension extends AbstractTypeExtension | |||
{ | |||
/** | |||
* @var CookieChecker | |||
*/ | |||
protected $cookieChecker; | |||
/** | |||
* @var array | |||
*/ | |||
protected $cookieCategories; | |||
/** | |||
* @var bool | |||
*/ | |||
protected $cookieConsentSimplified; | |||
public function __construct( | |||
CookieChecker $cookieChecker, | |||
array $cookieCategories = [], | |||
bool $cookieConsentSimplified = null | |||
) { | |||
$this->cookieChecker = $cookieChecker; | |||
$this->cookieCategories = $cookieCategories; | |||
$this->cookieConsentSimplified = $cookieConsentSimplified; | |||
} | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
foreach ($this->cookieCategories as $category) { | |||
$builder->remove($category); | |||
$data = 'true'; | |||
if ($this->cookieChecker->isCookieConsentSavedByUser() && !$this->cookieChecker->isCategoryAllowedByUser( | |||
$category | |||
)) { | |||
$data = 'false'; | |||
} | |||
$builder->add( | |||
$category, | |||
ChoiceType::class, | |||
[ | |||
'expanded' => true, | |||
'multiple' => false, | |||
'data' => $data, | |||
'choices' => [ | |||
['ch_cookie_consent.yes' => 'true'], | |||
['ch_cookie_consent.no' => 'false'], | |||
], | |||
] | |||
); | |||
} | |||
} | |||
public static function getExtendedTypes(): iterable | |||
{ | |||
return [BaseCookieConsentType::class]; | |||
} | |||
} |
@@ -22,7 +22,6 @@ class FileManagerType extends AbstractType implements DataTransformerInterface | |||
$this->em = $entityManager; | |||
} | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
$builder->add('path', HiddenType::class, array( |
@@ -0,0 +1,258 @@ | |||
<?php | |||
namespace Lc\SovBundle\Form\Common; | |||
use EasyCorp\Bundle\EasyAdminBundle\Form\DataTransformer\StringToFileTransformer; | |||
use EasyCorp\Bundle\EasyAdminBundle\Form\Type\Model\FileUploadState; | |||
use Lc\SovBundle\Model\File\FileInterface; | |||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; | |||
use Symfony\Component\Form\DataMapperInterface; | |||
use Symfony\Component\Form\DataTransformerInterface; | |||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; | |||
use Symfony\Component\Form\FormInterface; | |||
use Symfony\Component\HttpFoundation\File\File; | |||
use Lc\SovBundle\Doctrine\EntityManager; | |||
use Symfony\Component\Form\AbstractType; | |||
use Symfony\Component\Form\Extension\Core\Type\FileType; | |||
use Symfony\Component\Form\Extension\Core\Type\TextType; | |||
use Symfony\Component\Form\FormBuilderInterface; | |||
use Symfony\Component\HttpFoundation\File\UploadedFile; | |||
use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException; | |||
use Symfony\Component\OptionsResolver\Options; | |||
use Symfony\Component\OptionsResolver\OptionsResolver; | |||
use Symfony\Component\String\Slugger\AsciiSlugger; | |||
use Symfony\Component\Uid\Ulid; | |||
use Symfony\Component\Uid\Uuid; | |||
class FileUploadType extends AbstractType implements DataMapperInterface, DataTransformerInterface | |||
{ | |||
protected string $projectDir; | |||
protected EntityManager $entityManager; | |||
public function __construct(EntityManager $entityManager, ParameterBagInterface $parameterBag) | |||
{ | |||
$this->projectDir = $parameterBag->get('kernel.project_dir'); | |||
$this->entityManager = $entityManager; | |||
} | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
$uploadDir = $options['upload_dir']; | |||
$uploadFilename = $options['upload_filename']; | |||
$uploadValidate = $options['upload_validate']; | |||
$allowAdd = $options['allow_add']; | |||
unset($options['upload_dir'], $options['upload_new'], $options['upload_delete'], $options['upload_filename'], $options['upload_validate'], $options['download_path'], $options['allow_add'], $options['allow_delete'], $options['compound']); | |||
$builder->add('path', FileType::class, $options); | |||
$builder->add('legend', TextType::class, array( | |||
'attr' => [ | |||
"placeholder" => 'Légende' | |||
], | |||
'label' => false | |||
)); | |||
$builder->add('delete', CheckboxType::class, ['required' => false, 'mapped' => false]); | |||
$builder->setDataMapper($this); | |||
$builder->setAttribute('state', new FileUploadState($allowAdd)); | |||
$builder->addModelTransformer(new StringToFileTransformer($uploadDir, $uploadFilename, $uploadValidate, $options['multiple'])); | |||
/* | |||
$builder->add('path', FileType::class, array( | |||
'block_prefix' => 'file_manager_image', | |||
'label' => false | |||
)); | |||
$builder->add('legend', TextType::class, array( | |||
'block_prefix' => 'file_upload_legend', | |||
'attr' => array( | |||
"placeholder" => 'Légende' | |||
), | |||
'label' => false | |||
)); | |||
$builder->add('position', HiddenType::class, array( | |||
'block_prefix' => 'file_upload_position', | |||
'empty_data' => 0, | |||
'required' => true, | |||
'attr' => array( | |||
'class' => 'field-position' | |||
), | |||
'label' => false | |||
)); | |||
*/ | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function configureOptions(OptionsResolver $resolver): void | |||
{ | |||
$uploadNew = static function (UploadedFile $file, string $uploadDir, string $fileName) { | |||
$file->move($uploadDir, $fileName); | |||
}; | |||
$uploadDelete = static function (File $file) { | |||
unlink($file->getPathname()); | |||
}; | |||
$uploadFilename = static function (UploadedFile $file): string { | |||
return $file->getClientOriginalName(); | |||
}; | |||
$uploadValidate = static function (string $filename): string { | |||
if (!file_exists($filename)) { | |||
return $filename; | |||
} | |||
$index = 1; | |||
$pathInfo = pathinfo($filename); | |||
while (file_exists($filename = sprintf('%s/%s_%d.%s', $pathInfo['dirname'], $pathInfo['filename'], $index, $pathInfo['extension']))) { | |||
++$index; | |||
} | |||
return $filename; | |||
}; | |||
$downloadPath = function (Options $options) { | |||
return mb_substr($options['upload_dir'], mb_strlen($this->projectDir.'/public/')); | |||
}; | |||
$allowAdd = static function (Options $options) { | |||
return $options['multiple']; | |||
}; | |||
$dataClass = static function (Options $options) { | |||
return $options['multiple'] ? null : File::class; | |||
}; | |||
$emptyData = static function (Options $options) { | |||
return $options['multiple'] ? [] : null; | |||
}; | |||
$resolver->setDefaults([ | |||
'upload_dir' => $this->projectDir.'/public/uploads/files/', | |||
'upload_new' => $uploadNew, | |||
'upload_delete' => $uploadDelete, | |||
'upload_filename' => $uploadFilename, | |||
'upload_validate' => $uploadValidate, | |||
'download_path' => $downloadPath, | |||
'allow_add' => $allowAdd, | |||
'allow_delete' => true, | |||
//'data_class' => $dataClass, | |||
'data_class' => $this->entityManager->getEntityName(FileInterface::class), | |||
'empty_data' => $emptyData, | |||
'multiple' => false, | |||
'required' => false, | |||
'error_bubbling' => false, | |||
'allow_file_upload' => true, | |||
]); | |||
$resolver->setAllowedTypes('upload_dir', 'string'); | |||
$resolver->setAllowedTypes('upload_new', 'callable'); | |||
$resolver->setAllowedTypes('upload_delete', 'callable'); | |||
$resolver->setAllowedTypes('upload_filename', ['string', 'callable']); | |||
$resolver->setAllowedTypes('upload_validate', 'callable'); | |||
$resolver->setAllowedTypes('download_path', ['null', 'string']); | |||
$resolver->setAllowedTypes('allow_add', 'bool'); | |||
$resolver->setAllowedTypes('allow_delete', 'bool'); | |||
$resolver->setNormalizer('upload_dir', function (Options $options, string $value): string { | |||
if (\DIRECTORY_SEPARATOR !== mb_substr($value, -1)) { | |||
$value .= \DIRECTORY_SEPARATOR; | |||
} | |||
if (0 !== mb_strpos($value, $this->projectDir)) { | |||
$value = $this->projectDir.'/'.$value; | |||
} | |||
if ('' !== $value && (!is_dir($value) || !is_writable($value))) { | |||
throw new InvalidArgumentException(sprintf('Invalid upload directory "%s" it does not exist or is not writable.', $value)); | |||
} | |||
return $value; | |||
}); | |||
$resolver->setNormalizer('upload_filename', static function (Options $options, $fileNamePatternOrCallable) { | |||
if (\is_callable($fileNamePatternOrCallable)) { | |||
return $fileNamePatternOrCallable; | |||
} | |||
return static function (UploadedFile $file) use ($fileNamePatternOrCallable) { | |||
return strtr($fileNamePatternOrCallable, [ | |||
'[contenthash]' => sha1_file($file->getRealPath()), | |||
'[day]' => date('d'), | |||
'[extension]' => $file->guessClientExtension(), | |||
'[month]' => date('m'), | |||
'[name]' => pathinfo($file->getClientOriginalName(), \PATHINFO_FILENAME), | |||
'[randomhash]' => bin2hex(random_bytes(20)), | |||
'[slug]' => (new AsciiSlugger()) | |||
->slug(pathinfo($file->getClientOriginalName(), \PATHINFO_FILENAME)) | |||
->lower() | |||
->toString(), | |||
'[timestamp]' => time(), | |||
'[uuid]' => Uuid::v4()->toRfc4122(), | |||
'[ulid]' => new Ulid(), | |||
'[year]' => date('Y'), | |||
]); | |||
}; | |||
}); | |||
$resolver->setNormalizer('allow_add', static function (Options $options, string $value): bool { | |||
if ($value && !$options['multiple']) { | |||
throw new InvalidArgumentException('Setting "allow_add" option to "true" when "multiple" option is "false" is not supported.'); | |||
} | |||
return $value; | |||
}); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function mapDataToForms($currentFiles, $forms): void | |||
{ | |||
/** @var FormInterface $fileForm */ | |||
$fileForm = current(iterator_to_array($forms)); | |||
$fileForm->setData($currentFiles); | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function mapFormsToData($forms, &$currentFiles): void | |||
{ | |||
/** @var FormInterface[] $children */ | |||
$children = iterator_to_array($forms); | |||
$uploadedFiles = $children['path']->getData(); | |||
/** @var FileUploadState $state */ | |||
$state = $children['path']->getParent()->getConfig()->getAttribute('state'); | |||
$state->setCurrentFiles($currentFiles); | |||
$state->setUploadedFiles($uploadedFiles); | |||
$state->setDelete($children['delete']->getData()); | |||
if (!$state->isModified()) { | |||
return; | |||
} | |||
if ($state->isAddAllowed() && !$state->isDelete()) { | |||
$currentFiles = array_merge($currentFiles, $uploadedFiles); | |||
} else { | |||
$currentFiles = $uploadedFiles; | |||
} | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function transform($data) | |||
{ | |||
return $data; | |||
} | |||
/** | |||
* {@inheritdoc} | |||
*/ | |||
public function reverseTransform($data) | |||
{ | |||
return null === $data ? '' : $data; | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
<?php | |||
namespace Lc\SovBundle\Generator; | |||
use Dompdf\Dompdf; | |||
use Dompdf\Options; | |||
use Twig\Environment; | |||
class PdfGenerator | |||
{ | |||
protected Environment $templating; | |||
public function __construct(Environment $templating) | |||
{ | |||
$this->templating = $templating; | |||
} | |||
public function render($filename, $view, $viewParams) | |||
{ | |||
$pdfOptions = new Options(); | |||
$pdfOptions->set('defaultFont', 'Arial'); | |||
$dompdf = new Dompdf($pdfOptions); | |||
$html = $this->templating->render($view, $viewParams); | |||
$dompdf->loadHtml($html); | |||
$dompdf->setPaper('A4', 'portrait'); | |||
$dompdf->render(); | |||
$dompdf->stream($filename, [ | |||
"Attachment" => true | |||
]); | |||
die(); | |||
} | |||
} |
@@ -8,8 +8,8 @@ use Symfony\Component\HttpKernel\Bundle\Bundle; | |||
class LcSovBundle extends Bundle | |||
{ | |||
public function getContainerExtension() | |||
{ | |||
return new LcSovExtension(); | |||
} | |||
public function getContainerExtension() | |||
{ | |||
return new LcSovExtension(); | |||
} | |||
} |
@@ -222,5 +222,19 @@ abstract class AbstractRepositoryQuery implements RepositoryQueryInterface | |||
{ | |||
return $this->andWhere('.status >= 0'); | |||
} | |||
/* | |||
* POSITION | |||
*/ | |||
public function filterByPositionBiggerThan(int $position) | |||
{ | |||
return $this->andWhere('.position > :position')->setParameter('position', $position); | |||
} | |||
public function filterByPositionSmallerThan(int $position) | |||
{ | |||
return $this->andWhere('.position < :position')->setParameter('position', $position); | |||
} | |||
} | |||
@@ -16,11 +16,10 @@ class GroupUserRepositoryQuery extends AbstractRepositoryQuery implements GroupU | |||
public function joinUsers(): self | |||
{ | |||
if (!$this->isJoinUsers) { | |||
$this->isJoinUsers = true; | |||
return $this | |||
->innerJoin('.users', 'users'); | |||
->leftJoin('.users', 'users'); | |||
} | |||
return $this; | |||
} |
@@ -8,14 +8,17 @@ namespace Lc\SovBundle\Resolver; | |||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; | |||
use Symfony\Component\HttpFoundation\RequestStack; | |||
class UrlResolver | |||
{ | |||
protected ParameterBagInterface $parameterBag; | |||
protected RequestStack $requestStack; | |||
public function __construct(ParameterBagInterface $parameterBag) | |||
public function __construct(ParameterBagInterface $parameterBag, RequestStack $requestStack) | |||
{ | |||
$this->parameterBag = $parameterBag; | |||
$this->requestStack = $requestStack; | |||
} | |||
public function isServerLocalhost(): bool | |||
@@ -35,4 +38,45 @@ class UrlResolver | |||
} | |||
} | |||
public function isRouteAdmin(): bool | |||
{ | |||
return $this->testRoute(['admin_', 'file_manager']); | |||
} | |||
public function isRouteLogin(): bool | |||
{ | |||
return $this->testRoute(['sov_login', 'sov_logout', 'frontend_security_login']) ; | |||
} | |||
public function testRoute($mixed, $route = null): bool | |||
{ | |||
if(is_null($route)) { | |||
$route = $this->getRouteCurrentRequest(); | |||
} | |||
if(!$route) { | |||
return false; | |||
} | |||
if(is_array($mixed)) { | |||
foreach($mixed as $testRoute) { | |||
if($this->testRoute($testRoute, $route)) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
return strpos($route, $mixed) !== false; | |||
} | |||
public function getRouteCurrentRequest(): ?string | |||
{ | |||
$requestAttributes = $this->requestStack->getCurrentRequest()->attributes->all(); | |||
$route = isset($requestAttributes['_route']) ? $requestAttributes['_route'] : null; | |||
return $route; | |||
} | |||
} |
@@ -1,8 +1,9 @@ | |||
window.addEventListener('load', (event) => { | |||
$(document).on('select2:open', () => { | |||
// @TODO : cela met le focus sur le premier select2 du document | |||
/*$(document).on('select2:open', () => { | |||
document.querySelector('.select2-search__field').focus(); | |||
}); | |||
});*/ | |||
SovNotification.init(); | |||
@@ -1,3 +1,7 @@ | |||
.logo-admin { | |||
max-width: 100%; | |||
} | |||
nav.main-header { | |||
ul.navbar-nav { | |||
li.nav-item-user-menu { |
@@ -18,9 +18,13 @@ export class SovWidgets { | |||
if ($select.data('width')) { | |||
options.width = 'auto' | |||
} | |||
if ($select.find('option[value=""]')) { | |||
// @TODO : génère une erreur | |||
/*if ($select.find('option[value=""]')) { | |||
options.placeholder = $select.find('option[value=""]').html() | |||
} | |||
}*/ | |||
options.placeholder = ""; | |||
var myselect = $select.select2(options); | |||
@@ -28,11 +32,11 @@ export class SovWidgets { | |||
var event = new Event('change'); | |||
e.target.dispatchEvent(event); | |||
}); | |||
myselect.on('select2:unselect', function (e) { | |||
var event = new Event('change'); | |||
e.target.dispatchEvent(event); | |||
}); | |||
SovTools.log(myselect); | |||
myselect.off('select2:open') | |||
@@ -0,0 +1,7 @@ | |||
ch_cookie_consent: | |||
theme: 'light' # light, dark | |||
categories: # Below are the default supported categories | |||
- 'piwik' | |||
use_logger: true # Logs user actions to database | |||
position: 'bottom' # top, bottom | |||
simplified: false # When set to true the user can only deny or accept all cookies at once |
@@ -8,4 +8,7 @@ artgris_bundle_file_manager: | |||
lc_sov_bundle: | |||
resource: "@LcSovBundle/Controller" | |||
type: annotation | |||
type: annotation | |||
ch_cookie_consent: | |||
resource: "@CHCookieConsentBundle/Resources/config/routing.yaml" |
@@ -1,3 +1,9 @@ | |||
parameters: | |||
app.admin.logo: 'laclic.png' | |||
app.admin.logo_sidebar: 'laclic.png' | |||
app.site_name: 'laclic-sov' | |||
app.mail_debug: '' | |||
services: | |||
_defaults: | |||
autowire: true # Automatically injects dependencies in your services. | |||
@@ -40,7 +46,12 @@ services: | |||
tags: | |||
- { name: kernel.event_listener, event: kernel.exception } | |||
parameters: | |||
app.admin.logo: 'laclic.png' | |||
app.site_name: 'laclic-sov' | |||
app.mail_debug: '' | |||
#Form par défaut du cookie consent | |||
app.form.extension.type.cookie_consent: | |||
class: Lc\SovBundle\Form\Common\CookieConsentTypeExtension | |||
tags: | |||
- { name: form.type_extension, extended_type: ConnectHolland\CookieConsentBundle\Form\CookieConsentType } | |||
arguments: | |||
- '@ConnectHolland\CookieConsentBundle\Cookie\CookieChecker' | |||
- '%ch_cookie_consent.categories%' | |||
- '%ch_cookie_consent.simplified%' |
@@ -10,6 +10,7 @@ menu: | |||
account_password: Mot de passe | |||
tickets: Tickets <span class="float-right badge badge-info">%total_ticket_open%</span> | |||
setting_global: Global | |||
blocs: Blocs | |||
title: | |||
dashboard: Tableau de bord | |||
@@ -106,6 +107,9 @@ entity: | |||
ProductFamily: | |||
label: Produit | |||
label_plurial: Produits | |||
Block: | |||
label: Bloc | |||
label_plurial: Blocs | |||
default: | |||
fields: | |||
id: Id | |||
@@ -113,12 +117,15 @@ entity: | |||
user: Utilisateur | |||
firstname: Prénom | |||
lastname: Nom | |||
page: Page | |||
translations: Traductions | |||
roles: Roles | |||
title: Titre | |||
subtitle: Sous-titre | |||
position: Position | |||
description: Description | |||
file: Fichier | |||
status: Statut | |||
status: En ligne | |||
email: Email | |||
value: Valeur | |||
metaTitle: "Meta : titre" | |||
@@ -148,6 +155,7 @@ entity: | |||
panels: | |||
general: Général | |||
configuration: Configuration | |||
conf: Configuration | |||
gallery: Galerie | |||
seo: Référencement | |||
opengraph: Opengraph |
@@ -195,7 +195,6 @@ | |||
{{ form_widget(form) }} | |||
{% endblock file_manager_position_row %} | |||
{% block file_manager_widget %} | |||
{% if form.vars.ea_crud_form.ea_field is not null %} | |||
{% set managerDir = form.vars.ea_crud_form.ea_field.customOptions.get('managerDir') %} |
@@ -26,7 +26,6 @@ | |||
{% for css_asset in ea.assets.cssFiles ?? [] %} | |||
<link rel="stylesheet" href="{{ asset(css_asset) }}"> | |||
{% endfor %} | |||
{% for webpack_encore_entry in ea.assets.webpackEncoreAssets ?? [] %} | |||
{{ ea_call_function_if_exists('encore_entry_link_tags', webpack_encore_entry) }} | |||
{% endfor %} |
@@ -0,0 +1,23 @@ | |||
{% if chcookieconsent_isCookieConsentSavedByUser() == false %} | |||
{{ render_esi(path('ch_cookie_consent.show')) }} | |||
{% endif %} | |||
{% if chcookieconsent_isCategoryAllowedByUser('piwik') == true %} | |||
<!-- Matomo --> | |||
<script> | |||
var _paq = window._paq = window._paq || []; | |||
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */ | |||
_paq.push(['trackPageView']); | |||
_paq.push(['enableLinkTracking']); | |||
(function () { | |||
var u = "//statistiques.laclic.fr/"; | |||
_paq.push(['setTrackerUrl', u + 'matomo.php']); | |||
_paq.push(['setSiteId', '5']); | |||
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0]; | |||
g.async = true; | |||
g.src = u + 'matomo.js'; | |||
s.parentNode.insertBefore(g, s); | |||
})(); | |||
</script> | |||
<!-- End Matomo Code --> | |||
{% endif %} |
@@ -99,6 +99,7 @@ class TwigExtension extends AbstractExtension | |||
new TwigFunction('ea_url_short', [$this, 'generateEaUrl']), | |||
new TwigFunction('is_instance_of', [$this, 'isInstanceOf']), | |||
new TwigFunction('logo_admin', [$this, 'getLogoAdmin']), | |||
new TwigFunction('asset_url', [$this, 'getAssetUrl']), | |||
]; | |||
} | |||
@@ -119,6 +120,15 @@ class TwigExtension extends AbstractExtension | |||
]; | |||
} | |||
public function getAssetUrl($path) | |||
{ | |||
$context = $this->router->getContext(); | |||
$host = $context->getScheme().'://'.$context->getHost().'/'; | |||
return $host.$path; | |||
} | |||
public function rot13(string $string): string | |||
{ | |||
return str_rot13($string); | |||
@@ -240,6 +250,11 @@ class TwigExtension extends AbstractExtension | |||
public function getLogoAdmin(): string | |||
{ | |||
return '<img class="logo-admin" src="assets/img/' . $this->getParameter('app.admin.logo') . '" >'; | |||
$image = $this->getParameter('app.admin.logo_sidebar'); | |||
if(!$image) { | |||
$image = $this->getParameter('app.admin.logo'); | |||
} | |||
return '<img class="logo-admin" src="assets/img/' . $image . '" >'; | |||
} | |||
} |
@@ -1,8 +0,0 @@ | |||
{ | |||
"devDependencies": { | |||
"@symfony/webpack-encore": "^1.3.0", | |||
"sass": "^1.32.12", | |||
"sass-loader": "^11.0.0", | |||
"webpack-notifier": "^1.6.0" | |||
} | |||
} |
@@ -1,74 +0,0 @@ | |||
const Encore = require('@symfony/webpack-encore'); | |||
// Manually configure the runtime environment if not already configured yet by the "encore" command. | |||
// It's useful when you use tools that rely on webpack.config.js file. | |||
if (!Encore.isRuntimeEnvironmentConfigured()) { | |||
Encore.configureRuntimeEnvironment(process.env.NODE_ENV || 'dev'); | |||
} | |||
Encore | |||
// directory where compiled assets will be stored | |||
.setOutputPath('Resources/public/build/') | |||
// public path used by the web server to access the output path | |||
.setPublicPath('/build') | |||
// only needed for CDN's or sub-directory deploy | |||
//.setManifestKeyPrefix('build/') | |||
.enableSassLoader() | |||
/* | |||
* ENTRY CONFIG | |||
* | |||
* Add 1 entry for each "page" of your app | |||
* (including one that's included on every page - e.g. "app") | |||
* | |||
* Each entry will result in one JavaScript file (e.g. app.js) | |||
* and one CSS file (e.g. app.css) if your JavaScript imports CSS. | |||
*/ | |||
.addEntry('backend-common', './Resources/assets/apps/backend/common/app.common.js') | |||
//.addEntry('page1', './assets/page1.js') | |||
//.addEntry('page2', './assets/page2.js') | |||
// When enabled, Webpack "splits" your files into smaller pieces for greater optimization. | |||
.splitEntryChunks() | |||
// will require an extra script tag for runtime.js | |||
// but, you probably want this, unless you're building a single-page app | |||
.enableSingleRuntimeChunk() | |||
/* | |||
* FEATURE CONFIG | |||
* | |||
* Enable & configure other features below. For a full | |||
* list of features, see: | |||
* https://symfony.com/doc/current/frontend.html#adding-more-features | |||
*/ | |||
.cleanupOutputBeforeBuild() | |||
.enableBuildNotifications() | |||
.enableSourceMaps(!Encore.isProduction()) | |||
// enables hashed filenames (e.g. app.abc123.css) | |||
.enableVersioning(Encore.isProduction()) | |||
// enables @babel/preset-env polyfills | |||
.configureBabelPresetEnv((config) => { | |||
config.useBuiltIns = 'usage'; | |||
config.corejs = 3; | |||
}) | |||
// enables Sass/SCSS support | |||
//.enableSassLoader() | |||
// uncomment if you use TypeScript | |||
//.enableTypeScriptLoader() | |||
// uncomment to get integrity="..." attributes on your script & link tags | |||
// requires WebpackEncoreBundle 1.4 or higher | |||
//.enableIntegrityHashes(Encore.isProduction()) | |||
// uncomment if you're having problems with a jQuery plugin | |||
//.autoProvidejQuery() | |||
// uncomment if you use API Platform Admin (composer require api-admin) | |||
//.enableReactPreset() | |||
//.addEntry('admin', './assets/admin.js') | |||
; | |||
module.exports = Encore.getWebpackConfig(); |