19declare(strict_types=1);
53 if ($component instanceof
MainBar) {
54 return $this->renderMainbar($component, $default_renderer);
56 if ($component instanceof
MetaBar) {
57 return $this->renderMetabar($component, $default_renderer);
59 if ($component instanceof
Footer) {
60 return $this->
renderFooter($component, $default_renderer);
62 if ($component instanceof
ModeInfo) {
68 throw new LogicException(
"Cannot render: " . get_class($component));
73 if (!$slate instanceof
Slate && !$slate instanceof
MainBar) {
77 ->withMainBarTreePosition($pos)
79 function ($num, $slate, $is_tool =
false) use ($pos) {
92 UITemplateWrapper
$tpl,
93 RendererInterface $default_renderer
95 $hidden = $component->getInitiallyHiddenToolIds();
98 $is_removeable = array_key_exists($entry_id, $close_buttons);
99 $is_hidden = in_array($entry_id, $hidden);
101 if ($is_removeable) {
102 $trigger_signal = $component->getTriggerSignal($mb_id, $component::ENTRY_ACTION_REMOVE);
103 $this->trigger_signals[] = $trigger_signal;
104 $btn_removetool = $close_buttons[$entry_id]
105 ->withAdditionalOnloadCode(
106 fn (
$id) =>
"il.UI.maincontrols.mainbar.addPartIdAndEntry('$mb_id', 'remover', '$id', true);"
108 ->withOnClick($trigger_signal);
110 $tpl->setCurrentBlock(
"tool_removal");
111 $tpl->setVariable(
"REMOVE_TOOL", $default_renderer->render($btn_removetool));
112 $tpl->parseCurrentBlock();
115 $is_removeable = $is_removeable ?
'true' :
'false';
116 $is_hidden = $is_hidden ?
'true' :
'false';
117 return "il.UI.maincontrols.mainbar.addToolEntry('$mb_id', $is_removeable, $is_hidden, '$entry_id');";
124 UITemplateWrapper
$tpl,
125 RendererInterface $default_renderer
127 $f = $this->getUIFactory();
128 foreach ($entries as $k => $entry) {
133 if ($entry instanceof
Slate) {
135 $mb_id = $entry->getMainBarTreePosition();
136 $is_tool = $block === static::BLOCK_MAINBAR_TOOLS;
138 $js = $this->renderToolEntry($k, $mb_id, $component,
$tpl, $default_renderer);
141 $trigger_signal = $component->getTriggerSignal($mb_id, $component::ENTRY_ACTION_TRIGGER);
142 $this->trigger_signals[] = $trigger_signal;
143 $button =
$f->button()->bulky($entry->getSymbol(), $entry->getName(),
'#')
144 ->withOnClick($trigger_signal);
147 $pos = array_search($k, array_keys($entries));
148 $mb_id =
'0:' . $pos;
152 $button = $button->withAdditionalOnLoadCode(
153 function (
$id) use ($js, $mb_id, $k, $is_tool):
string {
154 $add_as_tool = $is_tool ?
'true' :
'false';
156 il.UI.maincontrols.mainbar.addPartIdAndEntry('$mb_id', 'triggerer', '$id', $add_as_tool);
157 il.UI.maincontrols.mainbar.addMapping('$k','$mb_id');
161 )->withAriaRole(IBulky::MENUITEM);
163 $tpl->setCurrentBlock($block);
164 $tpl->setVariable(
"BUTTON", $default_renderer->render($button));
165 $tpl->parseCurrentBlock();
168 $entry = $entry->withAriaRole(ISlate::MENU);
170 $tpl->setCurrentBlock(
"slate_item");
171 $tpl->setVariable(
"SLATE", $default_renderer->render($entry));
172 $tpl->parseCurrentBlock();
177 protected function renderMainbar(MainBar $component, RendererInterface $default_renderer): string
179 $f = $this->getUIFactory();
180 $tpl = $this->getTemplate(
"tpl.mainbar.html",
true,
true);
182 $tpl->setVariable(
"ARIA_LABEL", $this->txt(
'mainbar_aria_label'));
183 $more_btn_label = $this->txt(
'mainbar_more_label');
187 $more_slate =
$f->mainControls()->slate()->combined(
189 $f->symbol()->glyph()->more()
191 $more_slate = $more_slate->withAriaRole(ISlate::MENU);
192 $component = $component->withAdditionalEntry(
196 $component = $this->calculateMainBarTreePosition(
"0", $component);
199 static::BLOCK_MAINBAR_ENTRIES => $component->getEntries(),
200 static::BLOCK_MAINBAR_TOOLS => $component->getToolEntries()
203 foreach ($mb_entries as $block => $entries) {
204 $this->renderMainbarEntry(
214 if (count($component->getToolEntries()) > 0) {
215 $btn_tools = $component->getToolsButton()
216 ->withOnClick($component->getToggleToolsSignal());
218 $tpl->setCurrentBlock(
"tools_trigger");
219 $tpl->setVariable(
"BUTTON", $default_renderer->render($btn_tools));
220 $tpl->parseCurrentBlock();
224 $btn_disengage =
$f->button()->bulky(
$f->symbol()->glyph()->collapseHorizontal(
"#"), $this->txt(
'close'),
"#")
225 ->withOnClick($component->getDisengageAllSignal());
226 $tpl->setVariable(
"CLOSE_SLATES", $default_renderer->render($btn_disengage));
229 $id = $this->bindMainbarJS($component);
235 protected function renderMetabar(MetaBar $component, RendererInterface $default_renderer): string
237 $f = $this->getUIFactory();
238 $tpl = $this->getTemplate(
"tpl.metabar.html",
true,
true);
241 'entry' => $component->getEntryClickSignal(),
242 'close_slates' => $component->getDisengageAllSignal()
244 $entries = $component->getEntries();
246 $more_label = $this->txt(
'show_more');
247 $more_symbol =
$f->symbol()->glyph()->disclosure()
248 ->withCounter(
$f->counter()->novelty(0))
249 ->withCounter(
$f->counter()->status(0));
253 $more_slate =
$f->mainControls()->slate()->combined($more_label, $more_symbol);
254 $more_slate = $more_slate->withAriaRole(ISlate::MENU);
255 $entries[] = $more_slate;
257 $this->renderTriggerButtonsAndSlates(
261 static::BLOCK_METABAR_ENTRIES,
266 $component = $component->withOnLoadCode(
267 function (
$id) use ($signals) {
268 $entry_signal = $signals[
'entry'];
269 $close_slates_signal = $signals[
'close_slates'];
271 il.UI.maincontrols.metabar.registerSignals(
274 '$close_slates_signal',
276 il.UI.maincontrols.metabar.init();
277 $(window).resize(il.UI.maincontrols.metabar.init);
281 $tpl->setVariable(
'ARIA_LABEL', $this->txt(
'metabar_aria_label'));
283 $id = $this->bindJavaScript($component);
290 $tpl = $this->getTemplate(
"tpl.mode_info.html",
true,
true);
294 $action = $base_URI .
'?' .
$query;
295 $close = $this->getUIFactory()->symbol()->glyph()->close($action);
296 $tpl->setVariable(
'CLOSE_GLYPH', $default_renderer->render($close));
303 RendererInterface $default_renderer
305 $tpl = $this->getTemplate(
"tpl.system_info.html",
true,
true);
306 $tpl->setVariable(
'HEADLINE', $component->getHeadLine());
307 $tpl->setVariable(
'BODY', $component->getInformationText());
308 $tpl->setVariable(
'DENOTATION', $component->getDenotation());
309 switch ($component->getDenotation()) {
310 case Component\MainControls\SystemInfo::DENOTATION_NEUTRAL:
311 case Component\MainControls\SystemInfo::DENOTATION_IMPORTANT:
312 $tpl->setVariable(
'LIVE',
'aria-live="polite"');
314 case Component\MainControls\SystemInfo::DENOTATION_BREAKING:
315 $tpl->setVariable(
'ROLE',
'role="alert"');
318 if ($component->isDismissable()) {
319 $close = $this->getUIFactory()->symbol()->glyph()->close(
"#");
320 $signal = $component->getCloseSignal();
321 $close = $close->withOnClick($signal);
322 $tpl->setVariable(
'CLOSE_BUTTON', $default_renderer->render($close));
323 $tpl->setVariable(
'CLOSE_URI', (
string) $component->getDismissAction());
324 $component = $component->withAdditionalOnLoadCode(fn (
$id) =>
"$(document).on('$signal', function() { il.UI.maincontrols.system_info.close('$id'); });");
327 $more = $this->getUIFactory()->symbol()->glyph()->more(
"#");
328 $tpl->setVariable(
'MORE_BUTTON', $default_renderer->render($more));
330 $component = $component->withAdditionalOnLoadCode(fn (
$id) =>
"il.UI.maincontrols.system_info.init('$id')");
332 $id = $this->bindJavaScript($component);
334 $tpl->setVariable(
'ID_HEADLINE',
$id .
"_headline");
335 $tpl->setVariable(
'ID_DESCRIPTION',
$id .
"_description");
342 UITemplateWrapper
$tpl,
343 RendererInterface $default_renderer,
347 string $active =
null
349 foreach ($entries as
$id => $entry) {
353 if ($entry instanceof
Slate) {
354 $f = $this->getUIFactory();
355 $secondary_signal = $entry->getToggleSignal();
356 $clickable =
$f->button()->bulky($entry->getSymbol(), $entry->getName(),
'#')
358 ->withOnClick($entry_signal)
359 ->appendOnClick($secondary_signal)
360 ->withAriaRole(IBulky::MENUITEM);
363 } elseif ($entry instanceof IBulky) {
365 $clickable = $clickable->withAriaRole(IBulky::MENUITEM);
371 $clickable_html = $default_renderer->render($clickable);
374 $tpl->setCurrentBlock(
"slate_item");
375 $tpl->setVariable(
"SLATE", $default_renderer->render($slate));
376 $tpl->parseCurrentBlock();
379 $tpl->setCurrentBlock($use_block);
380 $tpl->setVariable(
"BUTTON", $clickable_html);
381 $tpl->parseCurrentBlock();
387 $trigger_signals = $this->trigger_signals;
389 $inititally_active = $component->
getActive();
392 function (
$id) use ($component, $trigger_signals, $inititally_active):
string {
396 $js =
"il.UI.maincontrols.mainbar.addTriggerSignal('$disengage_all_signal');";
397 $js .=
"il.UI.maincontrols.mainbar.addTriggerSignal('$tools_toggle_signal');";
399 foreach ($trigger_signals as $signal) {
400 $js .=
"il.UI.maincontrols.mainbar.addTriggerSignal('$signal');";
404 $signal = $component->getEngageToolSignal($k);
405 $js .=
"il.UI.maincontrols.mainbar.addTriggerSignal('$signal');";
409 window.addEventListener('resize', il.UI.maincontrols.mainbar.adjustToScreenSize);
410 il.UI.maincontrols.mainbar.init('$inititally_active');
416 return $this->bindJavaScript($component);
421 $tpl = $this->getTemplate(
"tpl.footer.html",
true,
true);
423 $modalsWithTriggers = $component->
getModals();
424 $links = array_merge($links, array_column($modalsWithTriggers, 1));
427 $link_list = $this->getUIFactory()->listing()->unordered($links);
428 $tpl->setVariable(
'LINKS', $default_renderer->render($link_list));
431 if ($modalsWithTriggers !== []) {
432 $tpl->setVariable(
'MODALS', $default_renderer->render(
433 array_column($modalsWithTriggers, 0)
440 if ($perm_url instanceof
URI) {
441 $url = $perm_url->__toString();
442 $link = $this->getUIFactory()
444 ->standard($this->txt(
'perma_link'),
$url);
445 $tpl->setVariable(
'PERMANENT', $default_renderer->render($link));
455 parent::registerResources($registry);
456 $registry->
register(
'./src/UI/templates/js/MainControls/dist/mainbar.js');
457 $registry->
register(
'./src/UI/templates/js/MainControls/metabar.js');
458 $registry->
register(
'./src/GlobalScreen/Client/dist/GS.js');
459 $registry->
register(
'./src/UI/templates/js/MainControls/system_info.js');
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
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)
renderSystemInfo(Component\MainControls\SystemInfo $component, RendererInterface $default_renderer)
renderFooter(Footer $component, RendererInterface $default_renderer)
renderToolEntry(string $entry_id, string $mb_id, MainBar $component, UITemplateWrapper $tpl, 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)
registerResources(ResourceRegistry $registry)
Announce resources this renderer requires.
render(Component\Component $component, 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.
withOnLoadCode(Closure $binder)
This describes the Footer.
This describes the MainBar.
getCloseButtons()
Buttons to close tools; maybe configure with callback.
getToggleToolsSignal()
Signal to toggle the tools-section.
getDisengageAllSignal()
This signal disengages all slates when triggered.
This describes the MetaBar.
Registry for resources required by rendered output like Javascript or CSS.
register(string $name)
Add a dependency.
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
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...