Created 'i_patch' to patch the 'i_view' each one have the same name as the associated 'warehouse module' + it can bind multiple files to a main's block each + done machine/view + its patch 'motheure' + machine refactored (blockized the templates)
This commit is contained in:
parent
d161f464fb
commit
be6b3502be
|
@ -7,19 +7,55 @@
|
|||
|
||||
/* (1) Attributes
|
||||
---------------------------------------------------------*/
|
||||
private $view_class;
|
||||
private $core_class;
|
||||
private $patch_class = [];
|
||||
private $arguments;
|
||||
|
||||
public static $html_error = "<span class='error'>Une erreur est survenue, veuilez contacter le webmaster si cette erreur persiste.</span>";
|
||||
|
||||
|
||||
/* (2) Instance constructor
|
||||
/* (2) Instance constructor (add patches)
|
||||
*
|
||||
* @view_class<String> The target view class
|
||||
* @core_class<String> The target view class
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function __construct(String $view_class){
|
||||
$this->view_class = $view_class;
|
||||
private function __construct(String $core_class){
|
||||
|
||||
/* (1) Get class directory & namespace */
|
||||
$root_ns = str_replace('/', '\\', dirname( str_replace('\\', '/', $core_class) ) ).'\\';
|
||||
$root_dir = __BUILD__.'/generic/'.dirname( str_replace('\\', '/', $core_class) );
|
||||
|
||||
/* (2) Get patches */
|
||||
foreach( glob($root_dir.'/*.php') as $class ){
|
||||
|
||||
// {1} Extract basename (without '.php') //
|
||||
$basename = basename($class);
|
||||
$basename = substr($basename, 0, strlen($basename)-strlen('.php'));
|
||||
$class_ns = $root_ns.$basename;
|
||||
|
||||
// {2} Ignore main (core class) //
|
||||
if( $basename == 'main' )
|
||||
continue;
|
||||
|
||||
// {3} Check if class exists //
|
||||
if( !class_exists($class_ns) )
|
||||
continue;
|
||||
|
||||
// {4} Check if instance of 'i_patch' //
|
||||
if( !(new $class_ns() instanceof i_patch) )
|
||||
continue;
|
||||
|
||||
// {5} Check if it corresponds to a warehouse's module //
|
||||
if( !in_array($basename, $_SESSION['WAREHOUSE']['modules']) )
|
||||
continue;
|
||||
|
||||
// {6} Store each patch instance //
|
||||
$this->patch_class[$basename] = new $class_ns();
|
||||
|
||||
}
|
||||
|
||||
/* (3) Store core class */
|
||||
$this->core_class = $core_class;
|
||||
}
|
||||
|
||||
|
||||
|
@ -31,12 +67,15 @@
|
|||
* @return render<String> Rendered view
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function render($injected_data=[]){
|
||||
public function render(array $injected_data=[]){
|
||||
/* (1) Create core instance with data */
|
||||
$view = new $this->core_class(...$injected_data);
|
||||
|
||||
/* (1) Create instance with data */
|
||||
$view = new $this->view_class(...$injected_data);
|
||||
/* (2) Patch it every @patch_class */
|
||||
foreach($this->patch_class as $patch_name=>$patch_inst)
|
||||
$view->patch($patch_name, $patch_inst);
|
||||
|
||||
/* (2) Dispatch rendering */
|
||||
/* (3) Dispatch rendering */
|
||||
return $view->render();
|
||||
|
||||
}
|
||||
|
@ -59,21 +98,20 @@
|
|||
return null;
|
||||
|
||||
/* (2) Extract class */
|
||||
$view_class = '\\view\\'.str_replace('.', '\\', $view_path).'\\main';
|
||||
$core_class = '\\view\\'.str_replace('.', '\\', $view_path).'\\main';
|
||||
|
||||
/* (3) Check if class exists */
|
||||
if( !class_exists($view_class) )
|
||||
if( !class_exists($core_class) )
|
||||
return null;
|
||||
|
||||
|
||||
/* (2) Return View instance
|
||||
---------------------------------------------------------*/
|
||||
return new self($view_class);
|
||||
return new self($core_class);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace generic\core;
|
||||
|
||||
|
||||
abstract class i_patch{
|
||||
|
||||
/* (1) Attributes
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Patch index */
|
||||
public $patch = [];
|
||||
|
||||
}
|
|
@ -5,27 +5,74 @@
|
|||
|
||||
abstract class i_view{
|
||||
|
||||
/* (1) Renders the view
|
||||
/* (1) Attributes
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Will contain patches according to warehouse's modules */
|
||||
public $patch = [];
|
||||
|
||||
|
||||
/* (2) Add a patch to the core view
|
||||
*
|
||||
* @patch_name<String> Patch name
|
||||
* @patch_inst<i_patch> Patch instance
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function patch(String $patch_name, i_patch $patch_inst){
|
||||
$this->patch[$patch_name] = $patch_inst;
|
||||
}
|
||||
|
||||
/* (3) Returns the auto patch code
|
||||
*
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function autopatch(){
|
||||
/* (1) Pre-code */
|
||||
$code = "{% extends 'main.twig' %}\n\n";
|
||||
|
||||
/* (2) For each module patch */
|
||||
foreach($this->patch as $name=>$inst)
|
||||
|
||||
/* (3) For each block patch */
|
||||
foreach($inst->patch as $block=>$temp)
|
||||
$code .= "{% block $block %}{% include '$temp' %}{% endblock %}\n";
|
||||
|
||||
|
||||
/* (4) Return code */
|
||||
return $code;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (4) Renders the view
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function render(){
|
||||
|
||||
/* (1) Get path information (child class)
|
||||
/* (1) Get path information (core class)
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Get child class */
|
||||
$child_class = str_replace('\\', '/', get_class(debug_backtrace()[0]['object']));
|
||||
/* (1) Get core class */
|
||||
$core_class = str_replace('\\', '/', get_class($this));
|
||||
|
||||
/* (2) Extract root DIR */
|
||||
$root_path = __BUILD__.'/generic/'.dirname($child_class);
|
||||
$root_path = __BUILD__.'/generic/'.dirname($core_class);
|
||||
|
||||
/* (3) Extract file name */
|
||||
$base_path = basename($child_class).'.twig';
|
||||
$model_path = basename($core_class).'.twig';
|
||||
|
||||
|
||||
/* (2) Get patches
|
||||
---------------------------------------------------------*/
|
||||
$auto_patch = [ 'render.twig' => $this->autopatch() ];
|
||||
|
||||
|
||||
/* (2) Setup
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize twig */
|
||||
$loader = new \Twig_Loader_Filesystem($root_path);
|
||||
$loader = new \Twig_Loader_Chain([
|
||||
new \Twig_Loader_Filesystem($root_path), // default directory templates
|
||||
new \Twig_Loader_Array($auto_patch) // custom auto-patch system
|
||||
]);
|
||||
|
||||
$twig = new \Twig_Environment($loader, [
|
||||
'debug' => true,
|
||||
'cache' => false,
|
||||
|
@ -36,7 +83,7 @@
|
|||
/* (3) Build the view and return it back
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Render and return the view */
|
||||
return $twig->render($base_path, [ 'core' => $this ]);
|
||||
return $twig->render('render.twig', [ 'core' => $this, 'patch' => $this->patch ]);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,17 @@
|
|||
<form class='valid'>
|
||||
{% block form_tag %} <form class='valid'> {% endblock %}
|
||||
|
||||
<input id='create_name' type='text' placeholder='Name'><br>
|
||||
<span class='error-msg create_name'></span><br>
|
||||
{% block input %}
|
||||
|
||||
<input id='create_name' type='text' placeholder='Name'><br>
|
||||
<span class='error-msg create_name'></span><br>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
|
||||
<button id='create_submit'>Créer</button>
|
||||
{% block submit %}
|
||||
|
||||
<button id='create_submit'>Créer</button>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
</form>
|
|
@ -1,18 +1,43 @@
|
|||
<form class='neutral'>
|
||||
{% block form_tag %} <form class='neutral'> {% endblock %}
|
||||
|
||||
<!-- Recherche de machine -->
|
||||
<input id='edit_search_keyword' type='text' class='search' placeholder='Recherche...'><br>
|
||||
<input id='edit_search_id' type='hidden' value=''>
|
||||
{% block search %}
|
||||
|
||||
<!-- Indice du resultat -->
|
||||
<span class='edit_search_view'>machine <span class='edit_search_num'>0</span> sur <span class='edit_search_sum'>0</span></span><br><br>
|
||||
<button id='edit_search_submit' class='search'>Trouver/Suivant</button><br>
|
||||
{% block search_input %}
|
||||
|
||||
<input id='edit_search_keyword' type='text' class='search' placeholder='Recherche...'><br>
|
||||
<input id='edit_search_id' type='hidden' value=''>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
<!-- Indice du resultat -->
|
||||
{% block search_submit %}
|
||||
|
||||
<span class='edit_search_view'>machine <span class='edit_search_num'>0</span> sur <span class='edit_search_sum'>0</span></span><br><br>
|
||||
<button id='edit_search_submit' class='search'>Trouver/Suivant</button><br>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
<br><br><hr class='OR' data-label='PUIS' /><br><br>
|
||||
|
||||
<!-- Modification de machine -->
|
||||
<input id='edit_name' type='text' placeholder='Name'><br>
|
||||
<span class='error-msg edit_name'></span><br>
|
||||
<button id='edit_submit' disabled>Modifier</button>
|
||||
{% block edit %}
|
||||
|
||||
{% block edit_input %}
|
||||
|
||||
<input id='edit_name' type='text' placeholder='Name'><br>
|
||||
<span class='error-msg edit_name'></span><br>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block edit_submit %}
|
||||
|
||||
<button id='edit_submit' disabled>Modifier</button>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
</form>
|
|
@ -1,16 +1,41 @@
|
|||
<form class='invalid'>
|
||||
{% block form_tag %} <form class='invalid'> {% endblock %}
|
||||
|
||||
<!-- Recherche de machine -->
|
||||
<input id='remove_search_keyword' type='text' class='search' placeholder='Recherche...'><br>
|
||||
<input id='remove_search_id' type='hidden' value=''>
|
||||
{% block search %}
|
||||
|
||||
<!-- Indice du resultat -->
|
||||
<span class='remove_search_view'>machine <span class='remove_search_num'>0</span> sur <span class='remove_search_sum'>0</span></span><br><br>
|
||||
<button id='remove_search_submit' class='search'>Trouver/Suivant</button><br>
|
||||
{% block search_input %}
|
||||
|
||||
<input id='remove_search_keyword' type='text' class='search' placeholder='Recherche...'><br>
|
||||
<input id='remove_search_id' type='hidden' value=''>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
<!-- Indice du resultat -->
|
||||
{% block search_submit %}
|
||||
|
||||
<span class='remove_search_view'>machine <span class='remove_search_num'>0</span> sur <span class='remove_search_sum'>0</span></span><br><br>
|
||||
<button id='remove_search_submit' class='search'>Trouver/Suivant</button><br>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
<br><br><hr class='OR' data-label='PUIS' /><br><br>
|
||||
|
||||
<!-- Suppression de machine -->
|
||||
<input id='remove_name' type='text' placeholder='Name'><br>
|
||||
<button id='remove_submit' disabled>Supprimer</button>
|
||||
{% block edit %}
|
||||
|
||||
{% block edit_input %}
|
||||
<input id='remove_name' type='text' placeholder='Name'><br>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block edit_submit %}
|
||||
|
||||
<button id='remove_submit' disabled>Supprimer</button>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
</form>
|
|
@ -1,54 +1,82 @@
|
|||
<input type='text' class='searchbar' placeholder='Recherche'>
|
||||
|
||||
{% for cluster in core.get_clusters() %}
|
||||
<article class='inline-box' id='{{ cluster.id_machine_cluster }}'>
|
||||
|
||||
{% set machinelist = core.get_members(cluster.id_machine_cluster) %}
|
||||
|
||||
<span class='title' style='color: {{ core.theme }}'>{{ cluster.name }}</span>
|
||||
<span class='link_remove' data-cluster='{{ cluster.id_machine_cluster }}'>{{ core.icon.remove | raw }}</span>
|
||||
|
||||
<span class='link_edit' data-cluster='{{ cluster.id_machine_cluster }}'>{{ core.icon.edit | raw }}</span>
|
||||
|
||||
<span class='code'>
|
||||
{{ core.icon.device | raw }}
|
||||
<span>{{ machinelist | length }} machines</span>
|
||||
</span>
|
||||
{% block search_bar %} <input type='text' class='searchbar' placeholder='Recherche'> {% endblock %}
|
||||
|
||||
|
||||
<span class='option'>
|
||||
{{ core.icon.option | raw }}
|
||||
{% for option in core.get_options(cluster.id_machine_cluster) %}
|
||||
<span class='ignore'>
|
||||
<span>{{ option.name }}:{{ option.daemon }}</span>
|
||||
</span>
|
||||
{% else %}
|
||||
<span class='ignore'>Aucune option</span>
|
||||
{% endfor %}
|
||||
</span>
|
||||
{% block group_list %}
|
||||
|
||||
<span class='groups'>
|
||||
{{ core.icon.group | raw }}
|
||||
{% for cluster in core.get_clusters() %}
|
||||
|
||||
<span class='ignore'>
|
||||
{% for machine in machinelist %}
|
||||
<span>
|
||||
{{ machine.name }}
|
||||
<span class='rem-member' data-member='{{ machine.id_machine }}' data-cluster='{{ cluster.id_machine_cluster }}'></span>
|
||||
{% block group_card %}
|
||||
|
||||
{% block card_tag %} <article class='inline-box' id='{{ cluster.id_machine_cluster }}'> {% endblock %}
|
||||
|
||||
{% set machinelist = core.get_members(cluster.id_machine_cluster) %}
|
||||
|
||||
{% block card_title %} <span class='title' style='color: {{ core.theme }}'>{{ cluster.name }}</span> {% endblock %}
|
||||
|
||||
{% block card_remove %} <span class='link_remove' data-cluster='{{ cluster.id_machine_cluster }}'>{{ core.icon.remove | raw }}</span> {% endblock %}
|
||||
{% block card_edit %} <span class='link_edit' data-cluster='{{ cluster.id_machine_cluster }}'>{{ core.icon.edit | raw }}</span> {% endblock %}
|
||||
|
||||
{# To be patched #}
|
||||
{% block card_patch %}{% endblock %}
|
||||
|
||||
{% block card_count %}
|
||||
|
||||
<span class='code'>
|
||||
{{ core.icon.device | raw }}
|
||||
<span>{{ machinelist | length }} machines</span>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</span>
|
||||
|
||||
<span class='add-member' data-cluster='{{ cluster.id_machine_cluster }}'>+</span>
|
||||
</span>
|
||||
{% endblock %}
|
||||
|
||||
</article>
|
||||
{% block card_option %}
|
||||
|
||||
{# if no result #}
|
||||
{% else %}
|
||||
<span class='option'>
|
||||
{{ core.icon.option | raw }}
|
||||
{% for option in core.get_options(cluster.id_machine_cluster) %}
|
||||
<span class='ignore'>
|
||||
<span>{{ option.name }}:{{ option.daemon }}</span>
|
||||
</span>
|
||||
{% else %}
|
||||
<span class='ignore'>Aucune option</span>
|
||||
{% endfor %}
|
||||
</span>
|
||||
|
||||
<article class='inline-box'>
|
||||
<span>Aucun groupe trouvé.</span>
|
||||
</article>
|
||||
{% endblock %}
|
||||
|
||||
{% endfor %}
|
||||
{% block card_group %}
|
||||
|
||||
<span class='groups'>
|
||||
{{ core.icon.group | raw }}
|
||||
|
||||
<span class='ignore'>
|
||||
{% for machine in machinelist %}
|
||||
<span>
|
||||
{{ machine.name }}
|
||||
<span class='rem-member' data-member='{{ machine.id_machine }}' data-cluster='{{ cluster.id_machine_cluster }}'></span>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</span>
|
||||
|
||||
<span class='add-member' data-cluster='{{ cluster.id_machine_cluster }}'>+</span>
|
||||
</span>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
</article>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{# if no result #}
|
||||
{% else %}
|
||||
|
||||
{% block no_result %}
|
||||
|
||||
<article class='inline-box'>
|
||||
<span>Aucun groupe trouvé.</span>
|
||||
</article>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
|
@ -79,24 +79,4 @@
|
|||
return $answer->get('clusters');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public function get_motheure($id_machine){
|
||||
/* (1) Get its machine_clusters
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Create request */
|
||||
$motheureReq = new Request('motheure/getCount', ['id_machine' => $id_machine]);
|
||||
|
||||
/* (2) Execute */
|
||||
$motheureRes = $motheureReq->dispatch();
|
||||
|
||||
/* (3) Manage error */
|
||||
if( $motheureRes->error->get() != Err::Success )
|
||||
return null;
|
||||
|
||||
return $motheureRes->get('count');
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,45 +1,51 @@
|
|||
<input type='text' class='searchbar' placeholder='Recherche'>
|
||||
{% block search_bar %} <input type='text' class='searchbar' placeholder='Recherche'> {% endblock %}
|
||||
|
||||
{% for machine in core.get_machines() %}
|
||||
<article class='inline-box' id='{{ machine.id_machine }}'>
|
||||
{% block machine_list %}
|
||||
|
||||
<span class='state' data-state='{{ core.get_state(machine.id_machine) }}'></span>
|
||||
<span class='title' style='color: {{ core.theme }}' title='{{ machine.ap | default('?') }} ({{ machine.ip | default('?') }})'>{{ machine.name }} <span>#{{ machine.name }}</span></span>
|
||||
<span class='link_remove' data-machine='{{ machine.id_machine }}'>{{ core.icon.remove | raw }}</span>
|
||||
{% for machine in core.get_machines() %}
|
||||
|
||||
<span class='link_edit' data-machine='{{ machine.id_machine }}'>{{ core.icon.edit | raw }}</span>
|
||||
{% block machine_card %}
|
||||
|
||||
{# List etrees #}
|
||||
{% set motheure = core.get_motheure(machine.id_machine) %}
|
||||
{% block card_tag %} <article class='inline-box' id='{{ machine.id_machine }}'> {% endblock %}
|
||||
|
||||
{% if motheure %}
|
||||
<span class='motheure'>
|
||||
{{ core.icon.motor | raw }}
|
||||
<span>{{ motheure }}</span>ms
|
||||
</span>
|
||||
{% endif %}
|
||||
{% block card_state %} <span class='state' data-state='{{ core.get_state(machine.id_machine) }}'></span> {% endblock %}
|
||||
{% block card_title %} <span class='title' style='color: {{ core.theme }}' title='{{ machine.ap | default('?') }} ({{ machine.ip | default('?') }})'>{{ machine.name }} <span>#{{ machine.name }}</span></span> {% endblock %}
|
||||
|
||||
<span class='groups'>
|
||||
{{ core.icon.group | raw }}
|
||||
{% block card_remove %} <span class='link_remove' data-machine='{{ machine.id_machine }}'>{{ core.icon.remove | raw }}</span> {% endblock %}
|
||||
{% block card_edit %} <span class='link_edit' data-machine='{{ machine.id_machine }}'>{{ core.icon.edit | raw }}</span> {% endblock %}
|
||||
|
||||
<span class='ignore'>
|
||||
{% for cluster in core.get_clusters(machine.id_machine) %}
|
||||
<span>
|
||||
{{ cluster.name }}
|
||||
<span class='rem-group' data-group='{{ cluster.id_machine_cluster }}' data-machine='{{ machine.id_machine }}'></span>
|
||||
{# To be patched #}
|
||||
{% block card_motheure_patch %}{% endblock %}
|
||||
|
||||
{% block card_group %}
|
||||
|
||||
<span class='groups'>
|
||||
{{ core.icon.group | raw }}
|
||||
|
||||
<span class='ignore'>
|
||||
{% for cluster in core.get_clusters(machine.id_machine) %}
|
||||
<span>
|
||||
{{ cluster.name }}
|
||||
<span class='rem-group' data-group='{{ cluster.id_machine_cluster }}' data-machine='{{ machine.id_machine }}'></span>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</span>
|
||||
|
||||
<span class='add-group' data-machine='{{ machine.id_machine }}'>+</span>
|
||||
</span>
|
||||
{% endfor %}
|
||||
</span>
|
||||
|
||||
<span class='add-group' data-machine='{{ machine.id_machine }}'>+</span>
|
||||
</span>
|
||||
{% endblock %}
|
||||
|
||||
</article>
|
||||
</article>
|
||||
|
||||
{# if no result #}
|
||||
{% else %}
|
||||
{% endblock %}
|
||||
|
||||
<article class='inline-box'>
|
||||
<span>Aucune machine trouvée</span>
|
||||
</article>
|
||||
{% endfor %}
|
||||
{# if no result #}
|
||||
{% else %}
|
||||
|
||||
<article class='inline-box'>
|
||||
<span>Aucune machine trouvée</span>
|
||||
</article>
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
namespace view\machine\view;
|
||||
|
||||
use \generic\core\i_patch;
|
||||
use \api\core\Request;
|
||||
use \error\core\Err;
|
||||
|
||||
|
||||
class motheure extends i_patch{
|
||||
|
||||
/* (1) Attributes
|
||||
---------------------------------------------------------*/
|
||||
public $patch = [
|
||||
'card_motheure_patch' => 'motheure_count.twig'
|
||||
];
|
||||
|
||||
|
||||
public function get_motheure($id_machine){
|
||||
/* (1) Get its machine_clusters
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Create request */
|
||||
$motheureReq = new Request('motheure/getCount', ['id_machine' => $id_machine]);
|
||||
|
||||
/* (2) Execute */
|
||||
$motheureRes = $motheureReq->dispatch();
|
||||
|
||||
/* (3) Manage error */
|
||||
if( $motheureRes->error->get() != Err::Success )
|
||||
return null;
|
||||
|
||||
return $motheureRes->get('count');
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
{% set motheure = patch.motheure.get_motheure(machine.id_machine) %}
|
||||
|
||||
{% if motheure %}
|
||||
|
||||
<span class='motheure'>
|
||||
{{ core.icon.motor | raw }}
|
||||
<span>{{ motheure }}</span>ms
|
||||
</span>
|
||||
|
||||
{% endif %}
|
Loading…
Reference in New Issue