19 declare(strict_types=1);
44 return $this->
renderMode($component, $default_renderer);
55 throw new LogicException(
"Component '{$component->getCanonicalName()}' isn't supported by this renderer.");
62 $tpl = $this->
getTemplate(
"tpl.mode.html",
true,
true);
64 $activate_first_item =
false;
65 $active = $component->getActive();
67 $activate_first_item =
true;
70 $tpl->setVariable(
"ARIA", $this->
txt($component->getAriaLabel()));
71 $tpl->setVariable(
"ROLE", self::MODE_ROLE);
72 foreach ($component->getLabelledActions() as $label => $action) {
73 $tpl->setCurrentBlock(
"view_control");
77 $button =
$f->button()->standard($label, $action)->withAriaLabel($label);
78 if ($activate_first_item) {
79 $button = $button->withEngagedState(
true);
80 $activate_first_item =
false;
81 } elseif ($active == $label) {
82 $button = $button->withEngagedState(
true);
84 $button = $button->withEngagedState(
false);
86 $tpl->setVariable(
"BUTTON", $default_renderer->render($button));
87 $tpl->parseCurrentBlock();
97 $tpl = $this->
getTemplate(
"tpl.section.html",
true,
true);
100 $tpl->setVariable(
"BUTTON", $default_renderer->render($component->getSelectorButton()));
113 $uptype = strtoupper($type);
115 $action = $component->getAction();
117 $label = ($type ==
"next")
119 : $this->
txt(
"previous");
121 if ($component->isActive()) {
128 $this->
renderId($component, $tpl, $type .
"_with_id", $uptype .
"_ID");
137 $tpl = $this->
getTemplate(
"tpl.sortation.html",
true,
true);
139 $component = $component->withResetSignals();
140 $triggeredSignals = $component->getTriggeredSignals();
141 if ($triggeredSignals) {
142 $internal_signal = $component->getSelectSignal();
143 $signal = $triggeredSignals[0]->getSignal();
145 $component = $component->withAdditionalOnLoadCode(fn(
$id) =>
"$(document).on('$internal_signal', function(event, signalData) { 146 il.UI.viewcontrol.sortation.onInternalSelect(event, signalData, '$signal', '$id'); 151 $this->
renderId($component, $tpl,
"id",
"ID");
154 $options = $component->getOptions();
155 $init_label = $component->getLabel();
157 foreach ($options as $val => $label) {
158 if ($triggeredSignals) {
159 $shy =
$f->button()->shy($label, $val)->withOnClick($internal_signal);
161 $url = $component->getTargetURL() ??
'';
162 $url .= (strpos(
$url,
'?') ===
false) ?
'?' :
'&';
163 $url .= $component->getParameterName() .
'=' . $val;
164 $shy =
$f->button()->shy($label,
$url);
169 $dd =
$f->dropdown()->standard($items)
170 ->withAriaLabel($init_label);
172 $tpl->setVariable(
'SORTATION_DROPDOWN', $default_renderer->render($dd));
182 if($component->getNumberOfPages() < 2) {
186 $tpl = $this->
getTemplate(
"tpl.pagination.html",
true,
true);
187 $component = $component->withResetSignals();
188 $triggeredSignals = $component->getTriggeredSignals();
189 if ($triggeredSignals) {
190 $internal_signal = $component->getInternalSignal();
191 $signal = $triggeredSignals[0]->getSignal();
192 $component = $component->withOnLoadCode(
193 fn(
$id) =>
"$(document).on('$internal_signal', function(event, signalData) { 194 il.UI.viewcontrol.pagination.onInternalSelect(event, signalData, '$signal', '$id'); 199 $tpl->setVariable(
'ID',
$id);
202 $chunk_options = array();
203 foreach (
$range as $entry) {
205 if ($entry === $component->getCurrentPage()) {
206 $shy = $shy->withEngagedState(
true);
208 $chunk_options[] = $shy;
211 if ($component->getDropdownAt() == null ||
212 $component->getDropdownAt() > $component->getNumberOfPages()) {
213 foreach ($chunk_options as $entry) {
214 $tpl->setCurrentBlock(
"entry");
215 $tpl->setVariable(
'BUTTON', $default_renderer->render($entry));
216 $tpl->parseCurrentBlock();
222 $dd_label_template = $component->getDropdownLabel();
223 if ($dd_label_template === $component->getDefaultDropdownLabel()) {
224 $dd_label_template = $this->
txt($dd_label_template);
228 $component->getCurrentPage() + 1,
229 $component->getNumberOfPages()
232 $dd =
$f->dropdown()->standard($chunk_options)->withLabel($dd_label);
233 $tpl->setCurrentBlock(
"entry");
234 $tpl->setVariable(
'BUTTON', $default_renderer->render($dd));
235 $tpl->parseCurrentBlock();
238 if ($component->getMaxPaginationButtons()) {
253 if (!$component->getMaxPaginationButtons()) {
255 $stop = max($component->getNumberOfPages() - 1, 0);
258 $start = (
int) ($component->getCurrentPage() - floor($component->getMaxPaginationButtons() / 2));
259 $start = max($start, 0);
261 $stop = $start + $component->getMaxPaginationButtons() - 1;
263 if ($stop > $component->getNumberOfPages() - 1) {
264 $stop = max($component->getNumberOfPages() - 1, 0);
265 $start = $stop - $component->getMaxPaginationButtons();
266 $start = max($start, 0);
269 return range($start, $stop);
280 $label = (string) ($val + 1);
283 if ($component->getTriggeredSignals()) {
284 $shy =
$f->button()->shy($label, (
string) $val)->withOnClick($component->getInternalSignal());
286 $url = $component->getTargetURL() ??
'';
287 if (strpos(
$url,
'?') ===
false) {
288 $url .=
'?' . $component->getParameterName() .
'=' . $val;
290 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
291 $query = parse_url(
$url, PHP_URL_QUERY);
293 $params[$component->getParameterName()] = $val;
296 $shy =
$f->button()->shy($label,
$url);
309 $prev = max(0, $component->getCurrentPage() - 1);
310 $next = $component->getCurrentPage() + 1;
314 if ($component->getTriggeredSignals()) {
315 $back =
$f->symbol()->glyph()->back(
'')->withOnClick($component->getInternalSignal());
316 $forward =
$f->symbol()->glyph()->next(
'')->withOnClick($component->getInternalSignal());
318 $url = $component->getTargetURL() ??
'';
319 if (strpos(
$url,
'?') ===
false) {
320 $url_prev =
$url .
'?' . $component->getParameterName() .
'=' . $prev;
321 $url_next =
$url .
'?' . $component->getParameterName() .
'=' . $next;
323 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
324 $query = parse_url(
$url, PHP_URL_QUERY);
327 $params[$component->getParameterName()] = $prev;
328 $url_prev = $base . http_build_query(
$params);
329 $params[$component->getParameterName()] = $next;
330 $url_next = $base . http_build_query(
$params);
333 $back =
$f->symbol()->glyph()->back($url_prev);
334 $forward =
$f->symbol()->glyph()->next($url_next);
337 if ($component->getCurrentPage() === 0) {
338 $back = $back->withUnavailableAction();
340 if ($component->getCurrentPage() >= $component->getNumberOfPages() - 1) {
341 $forward = $forward->withUnavailableAction();
344 $tpl->
setVariable(
'PREVIOUS', $default_renderer->render($back));
345 $tpl->
setVariable(
'NEXT', $default_renderer->render($forward));
359 if (!in_array(0, $range)) {
361 $tpl->
setVariable(
'FIRST', $default_renderer->render($shy));
363 $last = max($component->getNumberOfPages() - 1, 0);
364 if (!in_array($last, $range)) {
366 $tpl->
setVariable(
'LAST', $default_renderer->render($shy));
375 parent::registerResources($registry);
376 $registry->
register(
'./src/UI/templates/js/ViewControl/sortation.js');
377 $registry->
register(
'./src/UI/templates/js/ViewControl/pagination.js');
renderSection(Component\ViewControl\Section $component, RendererInterface $default_renderer)
Registry for resources required by rendered output like Javascript or CSS.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
renderSortation(Component\ViewControl\Sortation $component, RendererInterface $default_renderer)
checkComponent(Component $component)
Check if a given component fits this renderer and throw if that is not the case. ...
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
txt(string $id)
Get a text from the language file.
render(Component\Component $component, RendererInterface $default_renderer)
renderId(Component\JavaScriptBindable $component, Template $tpl, string $block, string $template_var)
getComponentInterfaceName()
setPaginationBrowseControls(Component\ViewControl\Pagination $component, RendererInterface $default_renderer, Template $tpl)
Add back/next-glyphs to the template for left/right browsing in pagination.
setCurrentBlock(string $name)
Set the block to work on.
getPaginationShyButton(int $val, Component\ViewControl\Pagination $component, string $label='')
createId()
Get a fresh unique id.
setVariable(string $name, $value)
Set a variable in the current block.
getPaginationRange(Component\ViewControl\Pagination $component)
Get the range of pagination-buttons to show.
renderMode(Component\ViewControl\Mode $component, RendererInterface $default_renderer)
getTemplate(string $name, bool $purge_unfilled_vars, bool $purge_unused_blocks)
Get template of component this renderer is made for.
register(string $name)
Add a dependency.
setPaginationFirstLast(Component\ViewControl\Pagination $component, array $range, RendererInterface $default_renderer, Template $tpl)
Add quick-access to first/last pages in pagination.
parseCurrentBlock()
Parse the block that is currently worked on.
renderPagination(Component\ViewControl\Pagination $component, RendererInterface $default_renderer)
touchBlock(string $name)
Touch a block without working further on it.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
getUIFactory()
Get a UI factory.
registerResources(ResourceRegistry $registry)
Announce resources this renderer requires.
renderSectionButton(Component\Button\Button $component, Template $tpl, string $type)
Base class for all component renderers.
bindJavaScript(JavaScriptBindable $component)
Bind the component to JavaScript.