Commit 3f13fbf2 authored by Sylvain's avatar Sylvain

Création de Template 4

parent 09afd864
......@@ -21,7 +21,7 @@ Laravel 5.8 uses Package Auto-Discovery, so doesn't require you to manually add
```php
// Exemple sur une liste d'utilisateurs
{!! Template::list3([
{!! Template::list4([
'table_id' => null,
'table_class' => 'table-sortable',
'route_prefix' => $route_prefix,
......@@ -36,33 +36,47 @@ Laravel 5.8 uses Package Auto-Discovery, so doesn't require you to manually add
'source' => $items,
'columns' => array([
'label' => '#',
'value' => ['id'],
'value' => ':id',
'sortable' => 'id'
],[
'label' => 'Dossier',
'value' => ['folder_html'],
'value' => ':folder_html',
'sortable' => 'ged_folders.title'
],[
'label' => 'Nom',
'value' => ['name'],
'value' => ':name',
'sortable' => 'name',
],[
'label' => 'Version',
'value' => ['template' => 'v%s', 'key' => 'version'],
'value' => ['template' => [
'format' => 'v%s',
'args' => ':version'
]],
'sortable' => 'version',
'class' => 'text-center'
],[
'label' => 'Position',
'class' => 'text-center',
'value' => ['callback' => [
'function' => 'pos_sort',
'args' => [':id', ':position']
]],
'sortable' => 'position'
],[
'label' => 'Statut',
'value' => ['validation_html'],
'value' => ':validation_html',
'class' => 'text-center'
],[
'label' => 'Visibilité',
'class' => 'text-center',
'value' => ['key' => 'status', 'callback' => 'published_html'],
'value' => ['callback' => [
'function' => 'published_html',
'args' => ':status'
]],
'sortable' => 'status',
],[
'label' => 'Date',
'value' => ['updated_at->diffForHumans()'],
'value' => ':updated_at->diffForHumans()',
'sortable' => 'updated_at'
]
)
......
......@@ -20,33 +20,39 @@
'source' => $items,
'columns' => array([
'label' => '#',
'value' => ['id'],
'value' => ':id',
'sortable' => 'id'
],[
'label' => 'Dossier',
'value' => ['folder_html'],
'value' => ':folder_html',
'sortable' => 'ged_folders.title'
],[
'label' => 'Nom',
'value' => ['name'],
'value' => ':name',
'sortable' => 'name',
],[
'label' => 'Version',
'value' => ['template' => 'v%s', 'key' => 'version'],
'value' => ['template' => [
'format' => 'v%s',
'args' => ':version'
]],
'sortable' => 'version',
'class' => 'text-center'
],[
'label' => 'Statut',
'value' => ['validation_html'],
'value' => ':validation_html',
'class' => 'text-center'
],[
'label' => 'Visibilité',
'class' => 'text-center',
'value' => ['key' => 'status', 'callback' => 'published_html'],
'value' => ['callback' => [
'function' => 'published_html',
'args' => ':status'
]],
'sortable' => 'status',
],[
'label' => 'Date',
'value' => ['updated_at->diffForHumans()'],
'value' => ':updated_at->diffForHumans()',
'sortable' => 'updated_at'
]
)
......@@ -67,14 +73,19 @@
'is_editable' => true,
'is_deletable' => true,
'is_duplicable' => false,
'tags' => array(
['template' => '[ module|ged|document|%s ]', 'key' => 'id']
),
'tags' => [
['template' => ['format' => '[ module|ged|document|%s ]', 'args' => ':id']],
['template' => ['format' => '[ module|ged|document|%s ]', 'args' => ['callback' => [
'function' => 'Str::slug', 'args' => ':name']]
]],
]
'more' => array([
'label' => '<i class="fa fa-unlock mr-1"></i> RAZ validation',
'href' => [
'template' => url('backend/module/ged/file/status/%s/0?' . current_query_to_string()),
'key' => 'files->sortBy()->last()->id'
'template' => [
'format' => url('backend/module/ged/file/status/%s/0?' . current_query_to_string()),
'args' => ':files->sortBy()->last()->id'
],
],
]
)
......@@ -82,54 +93,75 @@
'source' => $items,
'rows' => array(
'class' => [
'value' => 'text-bold',
'condition' => [
'key' => 'file_current_version.status',
'operator' => '==',
'value' => -1
'value' => ':id',
'operator' => '==',
'comparator' => 1,
'true' => ':name',
'false' => 'text-danger'
]
],
),
'columns' => array([
'label' => '',
'id' => 'mon-id',
'class' => 'ma-class',
'value' => [
'template' => '<img class="thumb-list" src="%s" alt="image" width=50 />',
'key' => 'image_type_url']
],[
'label' => '#',
'value' => ['id'],
'sortable' => 'id'
],[
'label' => 'Dossier',
'value' => ['key' => 'folder_html'],
'sortable' => 'ged_folders.title'
],[
'label' => 'Nom',
'value' => ['name'],
'sortable' => 'name',
],[
'label' => 'Version',
'value' => ['template' => 'v%s', 'key' => 'version'],
'sortable' => 'version',
'class' => 'text-center'
],[
'label' => 'Statut',
'value' => ['validation_html'],
'class' => 'text-center'
],[
'label' => 'Visibilité',
'class' => 'text-center',
'value' => ['key' => 'status', 'callback' => 'published_html'],
'sortable' => 'status',
],[
'label' => 'Date',
'value' => ['updated_at->diffForHumans()'],
'sortable' => 'updated_at'
],[
'value' => ['download_file_html'],
]
'columns' => array(
[
'label' => '#',
'value' => ':id',
'sortable' => 'id'
],[
'label' => 'Poster',
'value' => ['template' => [
'format' => '<img class="thumb-list" src="%s" alt="%s"',
'args' => [':poster', ':name']
]],
'sortable' => 'poster'
],[
'label' => 'Nom',
'value' => ':name',
'sortable' => 'name'
],[
'label' => 'Description',
'sortable' => 'description',
'value' => [
'callback' => [
'function' => 'str_limit',
'args' => [
'callback' => [
'function' => 'strip_tags',
'args' => [
'callback' => [
'function' => 'html_entity_decode',
'args' => ':description'
]
]
],
20
]
]
],
],[
'label' => 'Position',
'class' => 'text-center',
'value' => ['callback' => [
'function' => 'pos_sort',
'args' => [':id', ':position']
]],
'sortable' => 'position'
], [
'label' => 'Categories',
'value' => ':categories_html',
],[
'label' => 'Visibilité',
'class' => 'text-center',
'value' => ['callback' => [
'function' => 'published_html',
'args' => ':status'
]],
'sortable' => 'status',
],[
'label' => 'Date',
'value' => ':updated_at->diffForHumans()',
'sortable' => 'updated_at'
]
)
]) !!}
```
<?php
namespace Goldenscarab\Modulus\Service\Template\Compose;
use \Illuminate\Support\HtmlString;
use Illuminate\Support\Facades\Request;
use Goldenscarab\Modulus\Helpers\Dynamik;
class Template4Bt4
{
private $route_prefix;
private $route_param;
private $table_id;
private $table_class;
private $can_prefix;
private $source;
private $_menu;
private $_rows;
private $_columns;
public function __construct($attrs = [])
{
$this->setAttrs($attrs);
}
/**
* Retourne le rendu d'un tableau liste
* @return string le rendu du tableau liste
*/
public function renderList(): string
{
$template = '<div class="table-responsive-lg" style="min-height: 250px;">' . PHP_EOL;
$template .= ' <table id="%s" class="%s">' . PHP_EOL;
$template .= ' <thead>' . PHP_EOL;
$template .= ' <tr>' . PHP_EOL;
$template .= '%s';
$template .= ' </tr>' . PHP_EOL;
$template .= ' </thead>' . PHP_EOL;
$template .= ' <tbody>' . PHP_EOL;
$template .= '%s';
$template .= ' </tbody>' . PHP_EOL;
$template .= ' </table>';
$template .= '</div>';
$render = vsprintf($template, [
empty($this->table_id) ? 'table-' . str_slug($this->route_prefix) : $this->table_id,
trim('table table-sm table-hover table-striped ' . $this->table_class),
$this->renderIndent($this->renderListHead(), 3),
$this->renderIndent($this->renderListBody(), 2),
]);
return $render;
}
/**
* Retourne le rendu des entêtes de colonnes d'un tableau liste
* @return string Le rendu des entêtes de colonnes
*/
public function renderListHead(): string
{
$template = '<th scope="col" class="text-nowrap%s">%s%s</th>' . PHP_EOL;
$render = '';
$columns = $this->_columns;
// Colonne titre
if (is_iterable($columns)) {
foreach ($columns as $column) {
$sortable = data_get($column, 'sortable');
$class = data_get($column, 'class');
$render .= vsprintf($template, [
is_null($class) ? '' : ' ' . $class,
data_get($column, 'label'),
is_null($sortable) ? '' : col_sort($sortable)
]);
}
}
// Colonne menu
$render .= vsprintf($template, ['','', '']);
return $render;
}
/**
* Retourne le rendu des lignes d'un tableau liste
* @return string Le rendu des lignes du tableau
*/
public function renderListBody(): string
{
$template_row = '<tr scope="row"%s>' . PHP_EOL;
$template_row .= '%s';
$template_row .= '</tr>' . PHP_EOL;
$template_cel = '<td%s>%s</td>' . PHP_EOL;
$render = '';
$collection = $this->source;
$columns = $this->_columns;
$rows = $this->_rows;
if (is_iterable($collection)) {
if (count($collection) == 0) {
$render_cels_row = vsprintf($template_cel, [
' colspan="' . (count($columns) + 1) .'"',
'Aucun élément disponible'
]);
$render .= vsprintf($template_row, [
null,
$this->renderIndent($render_cels_row, 1)
]);
} else {
foreach ($collection as $item) {
$render_cels_row = '';
if (is_iterable($columns)) {
foreach ($columns as $column) {
$attrs = collect($column)->except(['label', 'row', 'value', 'sortable', 'id']);
$attributes = $this->renderAttributes($attrs, $item);
$value = $this->getValue(data_get($column, 'value'), $item);
// Création de la cellule
$render_cels_row .= vsprintf($template_cel, [
$attributes,
$value
]);
}
// Ajout du menu en fin de ligne
$render_cels_row .= vsprintf($template_cel, [
null,
data_get($this->_menu, 'display') ? $this->renderListMenuItems($item) : ''
]);
}
$render .= vsprintf($template_row, [
$this->renderAttributes($rows, $item),
$this->renderIndent($render_cels_row, 1)
]);
}
}
}
return $render;
}
/**
* Retourne le rendu du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItems($source): string
{
$template = '<div class="dropdown">' . PHP_EOL;
$template .= ' <button class="btn btn-default btn-xs dropdown-toggle no-caret square-to-circle item-option" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' . PHP_EOL;
$template .= ' <i class="fa fa-cog" aria-hidden="true"></i>' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' <div class="dropdown-menu dropdown-menu-right">' . PHP_EOL;
$template .= '%s';
$template .= '%s';
$template .= '%s';
$template .= '%s';
$template .= '%s';
$template .= '%s';
$template .= ' </div>' . PHP_EOL;
$render = '';
$render = vsprintf($template, [
$this->renderIndent($this->renderListMenuItemRead($source), 2),
$this->renderIndent($this->renderListMenuItemUpdate($source), 2),
$this->renderIndent($this->renderListMenuItemTag($source), 2),
$this->renderIndent($this->renderListMenuItemMore($source), 2),
$this->renderIndent($this->renderListMenuItemDuplicate($source), 2),
$this->renderIndent($this->renderListMenuItemDelete($source), 2),
]);
return $render;
}
/**
* Retourne l'element voir du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItemRead($source): string
{
$render = '';
if (auth()->user()->can($this->can_prefix . '-read')) {
if (data_get($this->_menu, 'is_readable')) {
$template = '<a class="dropdown-item" href="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-eye mr-1"></i>Voir' . PHP_EOL;
$template .= '</a>' . PHP_EOL;
if (empty($this->route_param)) {
$render = sprintf($template, route($this->route_prefix . '.' . 'read', array_merge([$source->id], Request::query())));
} else {
$render = sprintf($template, route($this->route_prefix . '.' . 'read', array_merge([$this->route_param, $source->id ], Request::query())));
}
}
}
return $render;
}
/**
* Retourne l'element modifier du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItemUpdate($source): string
{
$render = '';
if (auth()->user()->can($this->can_prefix . '-update')) {
if (data_get($this->_menu, 'is_editable')) {
$template = '<a class="dropdown-item" href="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-pencil-square-o mr-1"></i>Modifier' . PHP_EOL;
$template .= '</a>' . PHP_EOL;
if (empty($this->route_param)) {
$render = sprintf($template, route($this->route_prefix . '.' . 'update', array_merge([$source->id], Request::query())));
} else {
$render = sprintf($template, route($this->route_prefix . '.' . 'update', array_merge([$this->route_param, $source->id ], Request::query())));
}
}
}
return $render;
}
/**
* Retourne l'element tag du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItemTag($source): string
{
$render = '';
if (auth()->user()->hasRole('admin')) {
$tags = data_get($this->_menu, 'tags', []);
if (count($tags) > 0) {
$template = '<a class="dropdown-item clipboard-copy" href="#" title="Copier le Tag" data-clipboard-action="copy" data-clipboard-text="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-clipboard mr-1"></i>%s' . PHP_EOL;
$template .= '</a>' . PHP_EOL;
foreach ($tags as $tag) {
$tag_value = $this->getValue($tag, $source);
$render .= vsprintf($template, [$tag_value, $tag_value]);
}
}
}
return $render;
}
/**
* Retourne les éléments supplémentaires du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItemMore($source): string
{
$render = '';
if (auth()->user()->can($this->can_prefix . '-read')) {
$menu_more = data_get($this->_menu, 'more', []);
if (count($menu_more) > 0) {
$template = '<a class="dropdown-item%s"%s>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= '</a>' . PHP_EOL;
foreach ($menu_more as $menu_item) {
$href = data_get($menu_item, 'href');
$name = data_get($menu_item, 'name');
$class = data_get($menu_item, 'class');
$attrs = collect($menu_item)->except(['label', 'name', 'class']);
// Rendu de l'élément
$render .= vsprintf($template, [
empty($class) ? '' : ' ' . $class,
$this->renderAttributes($attrs, $source),
$menu_item['label']
]);
}
}
}
return $render;
}
/**
* Retourne l'element dupliqué du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItemDuplicate($source): string
{
$render = '';
if (auth()->user()->can($this->can_prefix . '-create')) {
if (data_get($this->_menu, 'is_duplicable')) {
$template = '<a class="dropdown-item" href="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-clone mr-1"></i>Dupliquer' . PHP_EOL;
$template .= '</a>' . PHP_EOL;
if (empty($this->route_param)) {
$render = sprintf($template, route($this->route_prefix . '.' . 'duplicate', array_merge([$source->id], Request::query())));
} else {
$render = sprintf($template, route($this->route_prefix . '.' . 'duplicate', array_merge([$this->route_param, $source->id], Request::query())));
}
}
}
return $render;
}
/**
* Retourne l'element supprimer du menu item
* @param Object $source Source des données
* @return string Le rendu
*/
private function renderListMenuItemDelete($source): string
{
$render = '';
if (auth()->user()->can($this->can_prefix . '-delete')) {
if (data_get($this->_menu, 'is_deletable')) {
$template = '<div class="dropdown-divider"></div>' . PHP_EOL;
$template .= '<a class="dropdown-item delete" href="#" data-href="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-trash mr-1"></i>Supprimer' . PHP_EOL;
$template .= '</a>' . PHP_EOL;
if (empty($this->route_param)) {
$render = sprintf($template, route($this->route_prefix . '.' . 'delete', array_merge([$source->id], Request::query())));
} else {
$render = sprintf($template, route($this->route_prefix . '.' . 'delete', array_merge([$this->route_param, $source->id], Request::query())));
}
}
}
return $render;
}
/**
* Retourne le rendu d'attributs avec leur valeur
* @param array $attrs Les attributs avec la colonne de l'object conteant la valeur
* @param Object $item Object contenant la valeur de l'attribut
* @return string Le rendu des attributs avec leur valeur
*/
private function renderAttributes($attrs = [], $source = null): string
{
$render = '';
if (is_iterable($attrs)) {
$template = ' %s="%s"';
foreach ($attrs as $name => $data) {
if (is_null($source) || !is_array($data)) {
$value = $data;
} else if (is_array($data)) {
$value = $this->getValue($data, $source);
}
$render .= vsprintf($template, [$name, $value]);
}
}
return $render;
}
/**
* Récupération d'une valeur en fonction de sa composition
* @param Mixed $value array pour une valeur dynamique ou string|int|float|bool pour une valeur statique
* @param Object $datas Objet dans lequel aller chercher la valeur si dynamique
* @param boolean $strip Supprimer les balises HTML dela valeur résultante
* @return Mixed La valeur
*/
private function getValue($value, $datas = null)
{
$dynamik = new Dynamik($datas);
return $dynamik->getValue($value);
}
/**
* Retourne le rendu d'une chaine de caractère en HTML
* @param String $string La chains de caractères à traiter
* @return String Le rendu HTML
*/
public function renderHTML($string): string
{
return new HtmlString($string);
}
/**
* Retourne le rendu avec indentation d'un texte
* @param string $text Le texte à traiter
* @param Integer $nb Le nombre d'indentation à appliquer
* @return string Le rendu avec indentation
*/
private function renderIndent($text, $nb): string
{
$indent = ' ';
$render = '';
$real_indent = '';
for ($i = 1; $i <= $nb; $i++) {
$real_indent .= $indent;
}
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if (!empty($line)) {
$render .= $real_indent . $line . PHP_EOL;
}
}
return $render;
}
/**
* Mise à jour des attributs depuis le tableau passé en paramètre
* @param Array $attrs Liste des attributs à traiter
* @return void
*/
private function setAttrs($attrs)
{
$this->resetAttrs();
if (is_null($attrs)) {
return ;
}
// Liste des attributs autorisés
$attrs_available = array_map(function ($val) {
return trim($val, '_');
}, array_keys(get_object_vars($this)));
// Traitement des attributs
if (is_array($attrs)) {
foreach ($attrs as $attr => $value) {
if (in_array($attr, $attrs_available)) {
if (is_array($value)) {
$this->{'_' . $attr} = $value;
} else {
$this->{$attr} = $value;
}
} else {
throw new \InvalidArgumentException("Le paramètre [" . $attr . "] n'est pas pris en charge");
}
}
} else {
throw new \InvalidArgumentException("Type de paramètre invalide. Attendu : Tableau");
}
}
/**
* Réinitialisation des attributs de constructions
* @return void
*/
private function resetAttrs()
{
$attrs = array_keys(get_object_vars($this));
foreach ($attrs as $attr) {
if (preg_match('/^_.*/', $attr)) {
$this->{$attr} = [];
} else if (preg_match('/^is_.*/', $attr)) {
$this->{$attr} = false;
} else {
$this->{$attr} = null;
}
}
}
}
......@@ -5,7 +5,7 @@ namespace Goldenscarab\Modulus\Service\Template;
use Goldenscarab\Modulus\Service\Template\Compose\Template1Bt4;
use Goldenscarab\Modulus\Service\Template\Compose\Template2Bt4;
use Goldenscarab\Modulus\Service\Template\Compose\Template3Bt4;
use Goldenscarab\Modulus\Service\Template\Compose\Template4Bt4;
class Template
......@@ -37,6 +37,14 @@ class Template
$template = new Template3Bt4($attrs);
$render = $template->renderList();
return $template->renderHTML($render);
}
public function list4($attrs = []): string
{
$template = new Template4Bt4($attrs);
$render = $template->renderList();
return $template->renderHTML($render);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment