19declare(strict_types=1);
42 return $this->
renderMode($component, $default_renderer);
60 $tpl = $this->
getTemplate(
"tpl.mode.html",
true,
true);
62 $activate_first_item =
false;
63 $active = $component->getActive();
65 $activate_first_item =
true;
68 $tpl->setVariable(
"ARIA", $this->
txt($component->getAriaLabel()));
69 $tpl->setVariable(
"ROLE", self::MODE_ROLE);
70 foreach ($component->getLabelledActions() as $label => $action) {
71 $tpl->setCurrentBlock(
"view_control");
73 $button =
$f->button()->standard($label, $action);
74 if ($activate_first_item) {
75 $button = $button->withEngagedState(
true);
76 $activate_first_item =
false;
77 } elseif ($active == $label) {
78 $button = $button->withEngagedState(
true);
80 $button = $button->withEngagedState(
false);
82 $tpl->setVariable(
"BUTTON", $default_renderer->render($button));
83 $tpl->parseCurrentBlock();
91 RendererInterface $default_renderer
96 $tpl->setVariable(
"BUTTON", $default_renderer->render($component->getSelectorButton()));
109 $uptype = strtoupper($type);
111 $action = $component->getAction();
113 $label = ($type ==
"next")
115 : $this->txt(
"previous");
117 if ($component->isActive()) {
124 $this->renderId($component, $tpl, $type .
"_with_id", $uptype .
"_ID");
129 RendererInterface $default_renderer
131 $f = $this->getUIFactory();
133 $tpl = $this->getTemplate(
"tpl.sortation.html",
true,
true);
134 $label_prefix = $component->getLabelPrefix() ?? $this->txt(
'vc_sort');
136 $component = $component->withResetSignals();
137 $triggeredSignals = $component->getTriggeredSignals();
138 if ($triggeredSignals) {
139 $internal_signal = $component->getSelectSignal();
140 $internal_signal->addOption(
'label_prefix', $label_prefix);
141 $signal = $triggeredSignals[0]->getSignal();
142 $component = $component
143 ->withAdditionalOnLoadCode(
144 fn(
$id) =>
"$(document).on('$internal_signal', function(event, signalData) {
145 il.UI.viewcontrol.sortation.get('$id').onInternalSelect(event, signalData, '$signal');
151 $component = $component
152 ->withAdditionalOnLoadCode(
153 fn(
$id) =>
"il.UI.viewcontrol.sortation.init('$id');"
155 ->withAdditionalOnLoadCode(
157 "il.UI.dropdown.init(document.getElementById('{$id}'));"
160 $id = $this->bindJavaScript($component);
161 $tpl->setVariable(
"ID",
$id);
162 $tpl->setVariable(
"ID_MENU",
$id .
'_ctrl');
164 $options = $component->getOptions();
167 $selected = $component->getSelected();
168 foreach ($options as $val => $label) {
169 $tpl->setCurrentBlock(
'option');
171 if ($val === $selected) {
172 $tpl->touchBlock(
'selected');
173 $tpl->setCurrentBlock(
'option');
176 if ($triggeredSignals) {
177 $shy =
$f->button()->shy($label, $val)->withOnClick($internal_signal);
179 $url = $component->getTargetURL() ??
'';
180 $url .= (strpos(
$url,
'?') ===
false) ?
'?' :
'&';
181 $url .= $component->getParameterName() .
'=' . $val;
182 $shy =
$f->button()->shy($label,
$url);
185 $tpl->setVariable(
'OPTION', $default_renderer->render($shy));
186 $tpl->parseCurrentBlock();
189 $tpl->setVariable(
'LABEL', $label_prefix .
' ' . $options[$selected] .
' ');
190 $tpl->setVariable(
"ARIA_LABEL", $this->txt(
"sortation"));
196 RendererInterface $default_renderer
198 $range = $this->getPaginationRange($component);
200 if ($component->getNumberOfPages() < 2) {
204 $tpl = $this->getTemplate(
"tpl.pagination.html",
true,
true);
205 $component = $component->withResetSignals();
206 $triggeredSignals = $component->getTriggeredSignals();
207 if ($triggeredSignals) {
208 $internal_signal = $component->getInternalSignal();
209 $signal = $triggeredSignals[0]->getSignal();
210 $component = $component
211 ->withAdditionalOnLoadCode(
212 fn(
$id) =>
"il.UI.viewcontrol.pagination.init('$id');"
214 ->withAdditionalOnLoadCode(
215 fn(
$id) =>
"$(document).on('$internal_signal', function(event, signalData) {
216 il.UI.viewcontrol.pagination.get('$id').onInternalSelect(event, signalData, '$signal');
220 $id = $this->bindJavaScript($component);
221 $tpl->setVariable(
'ID',
$id);
224 $chunk_options = array();
225 foreach (
$range as $entry) {
226 $shy = $this->getPaginationShyButton($entry, $component);
227 if ($entry === $component->getCurrentPage()) {
228 $shy = $shy->withEngagedState(
true);
230 $chunk_options[] = $shy;
233 if ($component->getDropdownAt() ==
null ||
234 $component->getDropdownAt() > $component->getNumberOfPages()) {
235 foreach ($chunk_options as $entry) {
236 $tpl->setCurrentBlock(
"entry");
237 $tpl->setVariable(
'BUTTON', $default_renderer->render($entry));
238 $tpl->parseCurrentBlock();
242 $f = $this->getUIFactory();
244 $dd_label_template = $component->getDropdownLabel();
245 if ($dd_label_template === $component->getDefaultDropdownLabel()) {
246 $dd_label_template = $this->txt($dd_label_template);
250 $component->getCurrentPage() + 1,
251 $component->getNumberOfPages()
254 $dd =
$f->dropdown()->standard($chunk_options)->withLabel($dd_label);
255 $tpl->setCurrentBlock(
"entry");
256 $tpl->setVariable(
'BUTTON', $default_renderer->render($dd));
257 $tpl->parseCurrentBlock();
260 if ($component->getMaxPaginationButtons()) {
261 $this->setPaginationFirstLast($component,
$range, $default_renderer, $tpl);
264 $this->setPaginationBrowseControls($component, $default_renderer, $tpl);
275 if (!$component->getMaxPaginationButtons()) {
277 $stop = max($component->getNumberOfPages() - 1, 0);
280 $start = (
int) ($component->getCurrentPage() - floor($component->getMaxPaginationButtons() / 2));
281 $start = max($start, 0);
283 $stop = $start + $component->getMaxPaginationButtons() - 1;
285 if ($stop > $component->getNumberOfPages() - 1) {
286 $stop = max($component->getNumberOfPages() - 1, 0);
287 $start = $stop - $component->getMaxPaginationButtons();
288 $start = max($start, 0);
291 return range($start, $stop);
299 $f = $this->getUIFactory();
302 $label = (string) ($val + 1);
305 if ($component->getTriggeredSignals()) {
306 $shy =
$f->button()->shy($label, (
string) $val)->withOnClick($component->getInternalSignal());
308 $url = $component->getTargetURL() ??
'';
309 if (strpos(
$url,
'?') ===
false) {
310 $url .=
'?' . $component->getParameterName() .
'=' . $val;
312 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
313 $query = parse_url(
$url, PHP_URL_QUERY);
315 $params[$component->getParameterName()] = $val;
318 $shy =
$f->button()->shy($label,
$url);
328 RendererInterface $default_renderer,
331 $prev = max(0, $component->getCurrentPage() - 1);
332 $next = $component->getCurrentPage() + 1;
334 $f = $this->getUIFactory();
336 $back_btn =
$f->button()->standard(
"",
"");
337 $forward_btn =
$f->button()->standard(
"",
"");
339 if ($component->getTriggeredSignals()) {
340 $back_btn = $back_btn->withOnClick($component->getInternalSignal());
341 $forward_btn = $forward_btn->withOnClick($component->getInternalSignal());
343 $url = $component->getTargetURL() ??
'';
344 if (strpos(
$url,
'?') ===
false) {
345 $url_prev =
$url .
'?' . $component->getParameterName() .
'=' . $prev;
346 $url_next =
$url .
'?' . $component->getParameterName() .
'=' . $next;
348 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
349 $query = parse_url(
$url, PHP_URL_QUERY);
352 $params[$component->getParameterName()] = $prev;
353 $url_prev = $base . http_build_query(
$params);
354 $params[$component->getParameterName()] = $next;
355 $url_next = $base . http_build_query(
$params);
358 $back_btn =
$f->button()->standard(
"", $url_prev);
359 $forward_btn =
$f->button()->standard(
"", $url_next);
362 if ($component->getCurrentPage() != 0) {
363 $back_glyph =
$f->symbol()->glyph()->back();
364 $back_btn = $back_btn->withSymbol($back_glyph);
365 $tpl->
setVariable(
'PREVIOUS', $default_renderer->render($back_btn));
367 if ($component->getCurrentPage() != $component->getNumberOfPages() - 1) {
368 $forward_glyph =
$f->symbol()->glyph()->next();
369 $forward_btn = $forward_btn->withSymbol($forward_glyph);
370 $tpl->
setVariable(
'NEXT', $default_renderer->render($forward_btn));
382 RendererInterface $default_renderer,
386 $shy = $this->getPaginationShyButton(0, $component);
387 $tpl->
setVariable(
'FIRST', $default_renderer->render($shy));
389 $last = max($component->getNumberOfPages() - 1, 0);
390 if (!in_array($last,
$range)) {
391 $shy = $this->getPaginationShyButton($component->getNumberOfPages() - 1, $component);
392 $tpl->
setVariable(
'LAST', $default_renderer->render($shy));
401 parent::registerResources($registry);
402 $registry->
register(
'assets/js/viewcontrols.min.js');
403 $registry->
register(
'assets/js/dropdown.js');
412 $id = $this->bindJavaScript($component);
414 $id = $this->createId();
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
renderMode(Component\ViewControl\Mode $component, RendererInterface $default_renderer)
registerResources(ResourceRegistry $registry)
Announce resources this renderer requires.
setPaginationBrowseControls(Component\ViewControl\Pagination $component, RendererInterface $default_renderer, Template $tpl)
Add back/next-glyphs to the template for left/right browsing in pagination.
renderPagination(Component\ViewControl\Pagination $component, RendererInterface $default_renderer)
renderSortation(Component\ViewControl\Sortation $component, RendererInterface $default_renderer)
render(Component\Component $component, RendererInterface $default_renderer)
getPaginationRange(Component\ViewControl\Pagination $component)
Get the range of pagination-buttons to show.
renderSectionButton(Component\Button\Button $component, Template $tpl, string $type)
renderSection(Component\ViewControl\Section $component, RendererInterface $default_renderer)
getPaginationShyButton(int $val, Component\ViewControl\Pagination $component, string $label='')
setPaginationFirstLast(Component\ViewControl\Pagination $component, array $range, RendererInterface $default_renderer, Template $tpl)
Add quick-access to first/last pages in pagination.
renderId(Component\JavaScriptBindable $component, Template $tpl, string $block, string $template_var)
Base class for all component renderers.
cannotHandleComponent(Component $component)
This method MUST be called by derived component renderers, if.
txt(string $id)
Get a text from the language file.
getUIFactory()
Get a UI factory.
getTemplate(string $name, bool $purge_unfilled_vars, bool $purge_unused_blocks)
Get template of component this renderer is made for.
Interface to be extended by components that have the possibility to bind to Javascript.
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.
setVariable(string $name, $value)
Set a variable in the current block.
setCurrentBlock(string $name)
Set the block to work on.
touchBlock(string $name)
Touch a block without working further on it.
parseCurrentBlock()
Parse the block that is currently worked on.
An entity that renders components to a string output.
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
if(!file_exists('../ilias.ini.php'))