36 if ($component instanceof
MainBar) {
37 return $this->renderMainbar($component, $default_renderer);
39 if ($component instanceof
MetaBar) {
40 return $this->renderMetabar($component, $default_renderer);
42 if ($component instanceof
Footer) {
43 return $this->
renderFooter($component, $default_renderer);
45 if ($component instanceof
ModeInfo) {
55 if (!$slate instanceof
Slate && !$slate instanceof
MainBar) {
59 ->withMainBarTreePosition($pos)
61 function ($num, $slate, $is_tool =
false) use ($pos) {
75 UITemplateWrapper
$tpl,
76 RendererInterface $default_renderer
78 $hidden = $component->getInitiallyHiddenToolIds();
81 $is_removeable = array_key_exists($entry_id, $close_buttons);
82 $is_hidden = in_array($entry_id, $hidden);
85 $trigger_signal = $component->getTriggerSignal($mb_id, $component::ENTRY_ACTION_REMOVE);
86 $this->trigger_signals[] = $trigger_signal;
87 $btn_removetool = $close_buttons[$entry_id]
88 ->withAdditionalOnloadCode(
89 function ($id) use ($mb_id) {
90 return "il.UI.maincontrols.mainbar.addPartIdAndEntry('{$mb_id}', 'remover', '{$id}', true);";
93 ->withOnClick($trigger_signal);
95 $tpl->setCurrentBlock(
"tool_removal");
96 $tpl->setVariable(
"REMOVE_TOOL", $default_renderer->render($btn_removetool));
97 $tpl->parseCurrentBlock();
100 $is_removeable = $is_removeable ?
'true':
'false';
101 $is_hidden = $is_hidden ?
'true':
'false';
102 return "il.UI.maincontrols.mainbar.addToolEntry('{$mb_id}', {$is_removeable}, {$is_hidden}, '{$entry_id}');";
109 UITemplateWrapper
$tpl,
110 RendererInterface $default_renderer
112 $f = $this->getUIFactory();
113 foreach ($entries as $k => $entry) {
118 if ($entry instanceof
Slate) {
121 $is_tool = $block === static::BLOCK_MAINBAR_TOOLS;
123 $js = $this->renderToolEntry($entry, $k, $mb_id, $component,
$tpl, $default_renderer);
126 $trigger_signal = $component->getTriggerSignal($mb_id, $component::ENTRY_ACTION_TRIGGER);
127 $this->trigger_signals[] = $trigger_signal;
129 ->withOnClick($trigger_signal);
132 $pos = array_search($k, array_keys($entries));
133 $mb_id =
'0:' . $pos;
137 $button = $button->withAdditionalOnLoadCode(
138 function ($id) use ($js, $mb_id, $k, $is_tool) {
139 $add_as_tool = $is_tool ?
'true':
'false';
141 il.UI.maincontrols.mainbar.addPartIdAndEntry('{$mb_id}', 'triggerer', '{$id}', {$add_as_tool});
142 il.UI.maincontrols.mainbar.addMapping('{$k}','{$mb_id}');
146 )->withAriaRole(IBulky::MENUITEM);
148 $tpl->setCurrentBlock($block);
149 $tpl->setVariable(
"BUTTON", $default_renderer->render($button));
150 $tpl->parseCurrentBlock();
153 $entry = $entry->withAriaRole(ISlate::MENU);
155 $tpl->setCurrentBlock(
"slate_item");
156 $tpl->setVariable(
"SLATE", $default_renderer->render($entry));
157 $tpl->parseCurrentBlock();
162 protected function renderMainbar(
MainBar $component, RendererInterface $default_renderer)
164 $f = $this->getUIFactory();
165 $tpl = $this->getTemplate(
"tpl.mainbar.html",
true,
true);
167 $tpl->setVariable(
"ARIA_LABEL", $this->txt(
'mainbar_aria_label'));
168 $more_btn_label = $this->txt(
'mainbar_more_label');
172 $more_slate =
$f->mainControls()->slate()->combined(
174 $f->symbol()->glyph()->more()
176 $more_slate = $more_slate->withAriaRole(ISlate::MENU);
181 $component = $this->calculateMainBarTreePosition(
"0", $component);
184 static::BLOCK_MAINBAR_ENTRIES => $component->
getEntries(),
188 foreach ($mb_entries as $block => $entries) {
189 $this->renderMainbarEntry(
203 $tpl->setCurrentBlock(
"tools_trigger");
204 $tpl->setVariable(
"BUTTON", $default_renderer->render($btn_tools));
205 $tpl->parseCurrentBlock();
209 $btn_disengage =
$f->button()->bulky(
$f->symbol()->glyph()->back(
"#"),
"close",
"#")
211 $tpl->setVariable(
"CLOSE_SLATES", $default_renderer->render($btn_disengage));
214 $id = $this->bindMainbarJS($component);
215 $tpl->setVariable(
'ID', $id);
220 protected function renderMetabar(MetaBar $component, RendererInterface $default_renderer)
222 $f = $this->getUIFactory();
223 $tpl = $this->getTemplate(
"tpl.metabar.html",
true,
true);
226 'entry' => $component->getEntryClickSignal(),
227 'close_slates' => $component->getDisengageAllSignal()
229 $entries = $component->getEntries();
231 $more_label =
'more';
232 $more_symbol =
$f->symbol()->glyph()->disclosure()
233 ->withCounter(
$f->counter()->novelty(0))
234 ->withCounter(
$f->counter()->status(0));
238 $more_slate =
$f->mainControls()->slate()->combined($more_label, $more_symbol);
239 $more_slate = $more_slate->withAriaRole(ISlate::MENU);
240 $entries[] = $more_slate;
242 $this->renderTriggerButtonsAndSlates(
246 static::BLOCK_METABAR_ENTRIES,
251 $component = $component->withOnLoadCode(
252 function ($id) use ($signals) {
253 $entry_signal = $signals[
'entry'];
254 $close_slates_signal = $signals[
'close_slates'];
256 il.UI.maincontrols.metabar.registerSignals(
259 '{$close_slates_signal}',
261 il.UI.maincontrols.metabar.init();
262 $(window).resize(il.UI.maincontrols.metabar.init);
266 $tpl->setVariable(
'ARIA_LABEL', $this->txt(
'metabar_aria_label'));
268 $id = $this->bindJavaScript($component);
269 $tpl->setVariable(
'ID', $id);
275 $tpl = $this->getTemplate(
"tpl.mode_info.html",
true,
true);
279 $action = $base_URI .
'?' .
$query;
280 $close = $this->getUIFactory()->symbol()->glyph()->close($action);
281 $tpl->setVariable(
'CLOSE_GLYPH', $default_renderer->render($close));
288 $tpl = $this->getTemplate(
"tpl.system_info.html",
true,
true);
289 $tpl->setVariable(
'HEADLINE', $component->getHeadLine());
290 $tpl->setVariable(
'BODY', $component->getInformationText());
291 $tpl->setVariable(
'DENOTATION', $component->getDenotation());
292 switch ($component->getDenotation()) {
295 $tpl->setVariable(
'LIVE',
'aria-live="polite"');
298 $tpl->setVariable(
'ROLE',
'role="alert"');
301 if ($component->isDismissable()) {
302 $close = $this->getUIFactory()->symbol()->glyph()->close(
"#");
303 $signal = $component->getCloseSignal();
304 $close = $close->withOnClick($signal);
305 $tpl->setVariable(
'CLOSE_BUTTON', $default_renderer->render($close));
306 $tpl->setVariable(
'CLOSE_URI', (
string) $component->getDismissAction());
307 $component = $component->withAdditionalOnLoadCode(
function ($id) use ($signal) {
308 return "$(document).on('{$signal}', function() { il.UI.maincontrols.system_info.close('{$id}'); });";
312 $more = $this->getUIFactory()->symbol()->glyph()->more(
"#");
313 $tpl->setVariable(
'MORE_BUTTON', $default_renderer->render($more));
315 $component = $component->withAdditionalOnLoadCode(
function ($id) {
316 return "il.UI.maincontrols.system_info.init('{$id}')";
320 $id = $this->bindJavaScript($component);
321 $tpl->setVariable(
'ID', $id);
329 UITemplateWrapper
$tpl,
330 RendererInterface $default_renderer,
334 string $active =
null,
335 array $initially_hidden_ids = [],
336 array $close_buttons = [],
337 Signal $tool_removal_signal =
null
339 foreach ($entries as $id => $entry) {
341 $engaged = (string) $id === $active;
343 if ($entry instanceof
Slate) {
344 $f = $this->getUIFactory();
349 ->withOnClick($entry_signal)
350 ->appendOnClick($secondary_signal)
352 ->withAriaRole(IBulky::MENUITEM);
355 } elseif ($entry instanceof IBulky) {
357 $clickable = $clickable->withAriaRole(IBulky::MENUITEM);
363 $clickable_html = $default_renderer->render($clickable);
366 $tpl->setCurrentBlock(
"slate_item");
367 $tpl->setVariable(
"SLATE", $default_renderer->render($slate));
368 $tpl->parseCurrentBlock();
371 $tpl->setCurrentBlock($use_block);
372 $tpl->setVariable(
"BUTTON", $clickable_html);
373 $tpl->parseCurrentBlock();
379 $trigger_signals = $this->trigger_signals;
381 $inititally_active = $component->
getActive();
384 function ($id) use ($component, $trigger_signals, $inititally_active) {
388 $js =
"il.UI.maincontrols.mainbar.addTriggerSignal('{$disengage_all_signal}');";
389 $js .=
"il.UI.maincontrols.mainbar.addTriggerSignal('{$tools_toggle_signal}');";
391 foreach ($trigger_signals as $signal) {
392 $js .=
"il.UI.maincontrols.mainbar.addTriggerSignal('{$signal}');";
396 $signal = $component->getEngageToolSignal($k);
397 $js .=
"il.UI.maincontrols.mainbar.addTriggerSignal('{$signal}');";
401 window.addEventListener('resize', il.UI.maincontrols.mainbar.adjustToScreenSize);
402 il.UI.maincontrols.mainbar.init('{$inititally_active}');
408 $id = $this->bindJavaScript($component);
414 $tpl = $this->getTemplate(
"tpl.footer.html",
true,
true);
416 $modalsWithTriggers = $component->
getModals();
417 $links = array_merge($links, array_column($modalsWithTriggers, 1));
420 $link_list = $this->getUIFactory()->listing()->unordered($links);
421 $tpl->setVariable(
'LINKS', $default_renderer->render($link_list));
424 if ($modalsWithTriggers !== []) {
425 $tpl->setVariable(
'MODALS', $default_renderer->render(
426 array_column($modalsWithTriggers, 0)
433 if ($perm_url instanceof
URI) {
434 $url = $perm_url->__toString();
435 $tpl->setVariable(
'PERMA_LINK_LABEL', $this->txt(
'perma_link'));
436 $tpl->setVariable(
'PERMANENT_URL',
$url);
446 parent::registerResources($registry);
447 $registry->register(
'./src/UI/templates/js/MainControls/dist/mainbar.js');
448 $registry->register(
'./src/UI/templates/js/MainControls/metabar.js');
449 $registry->register(
'./src/GlobalScreen/Client/dist/GS.js');
450 $registry->register(
'./src/UI/templates/js/MainControls/footer.js');
451 $registry->register(
'./src/UI/templates/js/MainControls/system_info.js');
An exception for terminatinating execution or to throw for unit testing.
The scope of this class is split ilias-conform URI's into components.
getComponentInterfaceName()
Get the name of the component-interface this renderer is supposed to render.ATTENTION: Fully qualifie...
renderTriggerButtonsAndSlates(UITemplateWrapper $tpl, RendererInterface $default_renderer, Signal $entry_signal, string $block, array $entries, string $active=null, array $initially_hidden_ids=[], array $close_buttons=[], Signal $tool_removal_signal=null)
registerResources(\ILIAS\UI\Implementation\Render\ResourceRegistry $registry)
renderSystemInfo(Component\MainControls\SystemInfo $component, RendererInterface $default_renderer)
renderFooter(Footer $component, RendererInterface $default_renderer)
const BLOCK_METABAR_ENTRIES
renderModeInfo(ModeInfo $component, RendererInterface $default_renderer)
const BLOCK_MAINBAR_TOOLS
bindMainbarJS(MainBar $component)
calculateMainBarTreePosition($pos, $slate)
renderMainbarEntry(array $entries, string $block, MainBar $component, UITemplateWrapper $tpl, RendererInterface $default_renderer)
render(Component\Component $component, RendererInterface $default_renderer)
renderToolEntry(Slate $entry, string $entry_id, string $mb_id, MainBar $component, UITemplateWrapper $tpl, RendererInterface $default_renderer)
const BLOCK_MAINBAR_ENTRIES
Base class for all component renderers.
checkComponent(Component $component)
Check if a given component fits this renderer and throw \LogicError if that is not the case.
A component is the most general form of an entity in the UI.
withOnLoadCode(\Closure $binder)
This describes the Footer.
This describes the MainBar.
getCloseButtons()
Buttons to close tools; maybe configure with callback.
getToolsButton()
Returns the button of the tools-trigger.
withAdditionalEntry(string $id, $entry)
Append an entry.
getToggleToolsSignal()
Signal to toggle the tools-section.
getDisengageAllSignal()
This signal disengages all slates when triggered.
This describes the MetaBar.
getSymbol()
Get the Symbol of the slate.
getToggleSignal()
Signal that toggles the slate when triggered.
getName()
Get the name of this slate.
const DENOTATION_BREAKING
const DENOTATION_IMPORTANT
Interface to templating as it is used in the UI framework.
An entity that renders components to a string output.
if($DIC->http() ->request() ->getMethod()=="GET" &&isset($DIC->http() ->request() ->getQueryParams()['tex'])) $tpl
Class ChatMainBarProvider \MainMenu\Provider.