fonticon possible sur les pages

This commit is contained in:
afornerot 2020-09-25 13:54:49 +02:00
parent 0c10081907
commit 87604176b2
17 changed files with 58422 additions and 9 deletions

View File

@ -0,0 +1,95 @@
<?php
namespace Cadoles\CoreBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
class IconChoiceType extends AbstractType
{
/**
* Cache for multiple icon fields or sub-requests.
*
* @var array
*/
private $choices;
private $fontawesomeIconsFile;
public function __construct($fontawesomeIconsFile)
{
// Liste des icones FontAwesome au format JSON
// Récupéré depuis le dépôt officiel via la commande "make fetch-fontawesome-icons"
// Voir service.yml
$this->fontawesomeIconsFile = $fontawesomeIconsFile;
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
// Pass this flag is necessary to render the label as raw.
// See below the twig field template for more details.
$view->vars['raw_label'] = true;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'attr' => [
// It's the key of the solution and can be done in many ways.
// Now, the rendered <select> element will have a new font.
'style' => "font-family: 'FontAwesome';",
'class' => 'select2-icon',
],
'choices' => $this->getFontAwesomeIconChoices(),
]);
}
public function getParent()
{
return ChoiceType::class;
}
protected function getFontAwesomeIconChoices()
{
if (null !== $this->choices) {
return $this->choices;
}
$fileContent = file_get_contents($this->fontawesomeIconsFile);
if (!$fileContent) {
throw new \Error('Could not load fontawesome icons file');
}
$icons = json_decode($fileContent, true);
foreach ($icons as $iconName => $iconMetadata) {
foreach ($iconMetadata['free'] as $iconStyle) {
if ('brands' === $iconStyle) {
// On ne propose pas les icônes de marques déposées.
continue;
}
$iconClass = '';
switch ($iconStyle) {
case 'solid':
$iconClass .= ' fas';
break;
case 'regular':
$iconClass .= ' far';
break;
case 'brands':
default:
$iconClass .= ' fa';
break;
}
$iconClass .= ' fa-' . $iconName;
$this->choices[$iconMetadata['label'] . ' (' . $iconStyle . ')'] = trim($iconClass);
}
}
return $this->choices;
}
}

View File

@ -158,6 +158,16 @@ services:
public: true
class: Cadoles\CoreBundle\Service\samlAttributeMapperService
cadoles.form.icon_choice_type:
class: Cadoles\CoreBundle\Form\Type\IconChoiceType
arguments:
# Liste des icones FontAwesome au format JSON
# Récupéré depuis le dépôt officiel via la commande "make fetch-fontawesome-icons"
# Voir Makefile du MSE
- "%kernel.root_dir%/../web/fonts/fontawesome/fontawesome-icons.json"
tags:
- { name: form.type }

File diff suppressed because one or more lines are too long

View File

@ -192,3 +192,5 @@ les plus importants pour y ajouter le class imposée par Bootstrap 3 #}
<input type="{{ type }}" {{ block('widget_attributes') }} />
{% endspaceless %}
{% endblock file_widget %}

View File

@ -91,6 +91,24 @@
<script>
function iformat(icon) {
return $('<span><i class="' + icon.id + '"></i> ' + icon.text + '</span>');
}
$('.select2-icon').select2({
width: "100%",
placeholder: 'choisir un icône',
allowClear: true,
templateSelection: iformat,
templateResult: iformat,
formatResult: iformat,
allowHtml: true,
escapeMarkup: function(m) {
return m;
}
})
function seeUser(id) {
{% if app.user %}
$("#mymodal").find(".modal-title").html("FICHE UTILISATEUR");

View File

@ -46,6 +46,13 @@ class Page
*/
private $maxwidth;
/**
* @var string
*
* @ORM\Column(name="fonticon", type="string", nullable=true)
*/
private $fonticon;
/**
* @var string
*
@ -585,4 +592,28 @@ class Page
{
return $this->templategroups;
}
/**
* Set fonticon
*
* @param string $fonticon
*
* @return Page
*/
public function setFonticon($fonticon)
{
$this->fonticon = $fonticon;
return $this;
}
/**
* Get fonticon
*
* @return string
*/
public function getFonticon()
{
return $this->fonticon;
}
}

View File

@ -10,6 +10,7 @@ use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Cadoles\CoreBundle\Form\Type\IconChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;
@ -56,6 +57,10 @@ class PageSubmitType extends AbstractType
"disabled" => ($options["mode"]=="delete"?true:false),
])
->add('fonticon', IconChoiceType::class, [
'label' => 'Icône',
'required' => false,
])
->add('page',
Select2EntityType::class, array(

View File

@ -12,6 +12,7 @@ use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Ivory\CKEditorBundle\Form\Type\CKEditorType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Cadoles\CoreBundle\Form\Type\IconChoiceType;
class PageUpdateEditorType extends AbstractType
{
@ -31,6 +32,11 @@ class PageUpdateEditorType extends AbstractType
'label' => 'Ordre'
])
->add('fonticon', IconChoiceType::class, [
'label' => 'Icône',
'required' => false,
])
->add('maxwidth', IntegerType::class, [
'label' => "Largeur maximum (0 pour largeur de l'écran)",
])

View File

@ -11,6 +11,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Cadoles\CoreBundle\Form\Type\IconChoiceType;
class PageUpdateToolType extends AbstractType
{
@ -28,8 +29,14 @@ class PageUpdateToolType extends AbstractType
->add('roworder', IntegerType::class, [
'label' => 'Ordre',
])
->add('fonticon', IconChoiceType::class, [
'label' => 'Icône',
'required' => false,
]);
if($options["access"]=="config") {
$builder
->add('roles', ChoiceType::class, [

View File

@ -11,6 +11,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Cadoles\CoreBundle\Form\Type\IconChoiceType;
class PageUpdateURLType extends AbstractType
{
@ -34,6 +35,11 @@ class PageUpdateURLType extends AbstractType
'label' => 'Ordre',
])
->add('fonticon', IconChoiceType::class, [
'label' => 'Icône',
'required' => false,
])
->add('maxwidth', IntegerType::class, [
'label' => "Largeur maximum (0 pour largeur de l'écran)",
]);

View File

@ -12,6 +12,7 @@ use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Tetranz\Select2EntityBundle\Form\Type\Select2EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Cadoles\CoreBundle\Form\Type\IconChoiceType;
class PageUpdateWidgetType extends AbstractType
{
@ -31,6 +32,11 @@ class PageUpdateWidgetType extends AbstractType
'label' => 'Ordre',
])
->add('fonticon', IconChoiceType::class, [
'label' => 'Icône',
'required' => false,
])
->add('maxwidth', IntegerType::class, [
'label' => "Largeur maximum (0 pour largeur de l'écran)",
])

View File

@ -14,9 +14,23 @@
{% endif %}
{% if entity.id is defined and page.id==entity.id %}
<li id="menupage-{{page.id}}" class="active" style="cursor:pointer"><a onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','portal','{{forcereload}}')">{{ page.name }}</a></li>
<li id="menupage-{{page.id}}" class="active" style="cursor:pointer">
<a onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','portal','{{forcereload}}')">
{% if page.fonticon %}
<i class="{{ page.fonticon }} fa-faw"></i>&nbsp;
{% endif %}
{{ page.name }}
</a>
</li>
{% else %}
<li id="menupage-{{page.id}}"><a style="cursor:pointer" onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','portal','{{forcereload}}')">{{ page.name }}</a></li>
<li id="menupage-{{page.id}}">
<a style="cursor:pointer" onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','portal','{{forcereload}}')">
{% if page.fonticon %}
<i class="{{ page.fonticon }} fa-faw"></i>&nbsp;
{% endif %}
{{ page.name }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
@ -29,9 +43,27 @@
{% endif %}
{% if entity.id is defined and page.id==entity.id %}
<li id="menupage-{{page.id}}" class="active" style="cursor:pointer"><a onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','user','{{forcereload}}')"><i class="fa fa-user fa-fw"></i>&nbsp;{{ page.name }}</a></li>
<li id="menupage-{{page.id}}" class="active" style="cursor:pointer">
<a onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','user','{{forcereload}}')">
{% if page.fonticon %}
<i class="{{ page.fonticon }} fa-faw"></i>
{% else %}
<li id="menupage-{{page.id}}"><a style="cursor:pointer" onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','user','{{forcereload}}')"><i class="fa fa-user fa-fw"></i>&nbsp;{{ page.name }}</a></li>
<i class="fa fa-user fa-fw"></i>
{% endif %}
&nbsp;{{ page.name }}
</a>
</li>
{% else %}
<li id="menupage-{{page.id}}">
<a style="cursor:pointer" onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','user','{{forcereload}}')">
{% if page.fonticon %}
<i class="{{ page.fonticon }} fa-faw"></i>
{% else %}
<i class="fa fa-user fa-fw"></i>
{% endif %}
&nbsp;{{ page.name }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
@ -45,7 +77,7 @@
<ul id="pagesshared" class="nav navbar-top-links navbar-left">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-users fa-fw"></i>Mes Groupes
<i class="fa fa-users fa-fw"></i>&nbsp;Mes Groupes
<span class="caret"></span>
</a>
@ -67,7 +99,13 @@
<li id="menupage-{{page.id}}" {{ isactive }} style="cursor:pointer">
<a data-group="{{groupshared.id}}" onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','group','{{forcereload}}','{{groupshared.id}}')">
<i class="fa fa-users fa-fw"></i>&nbsp;{{ groupshared.label }}
{% if page.fonticon %}
<i class="{{ page.fonticon }} fa-faw"></i>
{% else %}
<i class="fa fa-users fa-fw"></i>
{% endif %}
&nbsp;{{ groupshared.label }}
{% if page.counterread > 0 %}
<span id="badge-{{groupshared.id}}" class="badge">{{page.counterread}}</span>
{% endif %}
@ -77,7 +115,9 @@
<ul id="pagesshared" class="nav navbar-top-links navbar-left">
<li class="dropdown{{submenu}}">
<a data-group="{{groupshared.id}}" href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-users fa-fw"></i>&nbsp;{{ groupshared.label }}
<i class="fa fa-users fa-fw"></i>
&nbsp;{{ groupshared.label }}
{%if submenu is empty %}
<span class="caret"></span>
{% endif %}
@ -100,6 +140,9 @@
<li id="menupage-{{page.id}}" {{isactive}} style="cursor:pointer">
<a onClick="showPage({{ page.id }},{{ page.pagecategory.id }},'{{ page.canupdate }}','group','{{forcereload}}','{{groupshared.id}}')">
{% if page.fonticon %}
<i class="{{ page.fonticon }} fa-faw"></i>
{% endif %}
{{ page.name }}
</a>
</li>

View File

@ -49,6 +49,7 @@
<div id="pagegroup">{{ form_row(form.page) }}</div>
<div id="groupworkgroup">{{ form_row(form.groups) }}</div>
{{ form_row(form.roworder) }}
{{ form_row(form.fonticon) }}
{{ form_row(form.maxwidth) }}
</div>
</div>

View File

@ -55,6 +55,7 @@
{{ form_row(form.name) }}
{{ form_row(form.roworder) }}
{{ form_row(form.fonticon) }}
{{ form_row(form.maxwidth) }}
{{ form_row(form.html) }}
</div>

View File

@ -51,6 +51,7 @@
{{ form_row(form.name) }}
{{ form_row(form.roworder) }}
{{ form_row(form.fonticon) }}
</div>
{% if form.roles is defined %}

View File

@ -58,6 +58,7 @@
<em>le mot clé #login# sera remplacé par le login de l'utilisateur</em><br>
<em>Attention certains sites n'acceptent pas d'être encapsulés dans une frame.<br><br>
{{ form_row(form.roworder) }}
{{ form_row(form.fonticon) }}
{{ form_row(form.maxwidth) }}
</div>

View File

@ -208,6 +208,7 @@
{{ form_row(form.name) }}
{{ form_row(form.roworder) }}
{{ form_row(form.fonticon) }}
{{ form_row(form.maxwidth) }}
{{ form_row(form.template) }}
</div>