19declare(strict_types=1);
45 return $this->
renderMode($component, $default_renderer);
63 $tpl = $this->
getTemplate(
"tpl.mode.html",
true,
true);
65 $activate_first_item =
false;
66 $active = $component->getActive();
68 $activate_first_item =
true;
71 $tpl->setVariable(
"ARIA", $this->
txt($component->getAriaLabel()));
72 $tpl->setVariable(
"ROLE", self::MODE_ROLE);
73 foreach ($component->getLabelledActions() as $label => $action) {
74 $tpl->setCurrentBlock(
"view_control");
76 $button =
$f->button()->standard($label, $action);
77 if ($activate_first_item) {
78 $button = $button->withEngagedState(
true);
79 $activate_first_item =
false;
80 } elseif ($active == $label) {
81 $button = $button->withEngagedState(
true);
83 $button = $button->withEngagedState(
false);
85 $tpl->setVariable(
"BUTTON", $default_renderer->render($button));
86 $tpl->parseCurrentBlock();
94 RendererInterface $default_renderer
99 $tpl->setVariable(
"BUTTON", $default_renderer->render($component->getSelectorButton()));
112 $uptype = strtoupper($type);
114 $action = $component->getAction();
116 $label = ($type ==
"next")
118 : $this->txt(
"previous");
120 if ($component->isActive()) {
127 $this->renderId($component, $tpl, $type .
"_with_id", $uptype .
"_ID");
132 RendererInterface $default_renderer
134 $f = $this->getUIFactory();
136 $tpl = $this->getTemplate(
"tpl.sortation.html",
true,
true);
137 $label_prefix = $component->getLabelPrefix() ?? $this->txt(
'vc_sort');
139 $component = $component->withResetSignals();
140 $triggeredSignals = $component->getTriggeredSignals();
141 if ($triggeredSignals) {
142 $internal_signal = $component->getSelectSignal();
143 $internal_signal->addOption(
'label_prefix', $label_prefix);
144 $signal = $triggeredSignals[0]->getSignal();
145 $component = $component
146 ->withAdditionalOnLoadCode(
147 fn(
$id) =>
"$(document).on('$internal_signal', function(event, signalData) {
148 il.UI.viewcontrol.sortation.get('$id').onInternalSelect(event, signalData, '$signal');
154 $component = $component
155 ->withAdditionalOnLoadCode(
156 fn(
$id) =>
"il.UI.viewcontrol.sortation.init('$id');"
158 ->withAdditionalOnLoadCode(
160 "il.UI.dropdown.init(document.getElementById('{$id}'));"
163 $id = $this->bindJavaScript($component);
164 $tpl->setVariable(
"ID",
$id);
165 $tpl->setVariable(
"ID_MENU",
$id .
'_ctrl');
167 $options = $component->getOptions();
170 $selected = $component->getSelected();
171 foreach (
$options as $val => $label) {
172 $tpl->setCurrentBlock(
'option');
174 if ($val === $selected) {
175 $tpl->touchBlock(
'selected');
176 $tpl->setCurrentBlock(
'option');
179 if ($triggeredSignals) {
180 $shy =
$f->button()->shy($label, $val)->withOnClick($internal_signal);
182 $url = $component->getTargetURL() ??
'';
183 $url .= (strpos(
$url,
'?') ===
false) ?
'?' :
'&';
184 $url .= $component->getParameterName() .
'=' . $val;
185 $shy =
$f->button()->shy($label,
$url);
188 $tpl->setVariable(
'OPTION', $default_renderer->render($shy));
189 $tpl->parseCurrentBlock();
192 $tpl->setVariable(
'LABEL', $label_prefix .
' ' .
$options[$selected] .
' ');
193 $tpl->setVariable(
"ARIA_LABEL", $this->txt(
"sortation"));
199 RendererInterface $default_renderer
201 $range = $this->getPaginationRange($component);
203 if ($component->getNumberOfPages() < 2) {
207 $tpl = $this->getTemplate(
"tpl.pagination.html",
true,
true);
208 $component = $component->withResetSignals();
209 $triggeredSignals = $component->getTriggeredSignals();
210 if ($triggeredSignals) {
211 $internal_signal = $component->getInternalSignal();
212 $signal = $triggeredSignals[0]->getSignal();
213 $component = $component
214 ->withAdditionalOnLoadCode(
215 fn(
$id) =>
"il.UI.viewcontrol.pagination.init('$id');"
217 ->withAdditionalOnLoadCode(
218 fn(
$id) =>
"$(document).on('$internal_signal', function(event, signalData) {
219 il.UI.viewcontrol.pagination.get('$id').onInternalSelect(event, signalData, '$signal');
223 $id = $this->bindJavaScript($component);
224 $tpl->setVariable(
'ID',
$id);
227 $chunk_options = array();
228 foreach (
$range as $entry) {
229 $shy = $this->getPaginationShyButton($entry, $component);
230 if ($entry === $component->getCurrentPage()) {
231 $shy = $shy->withEngagedState(
true);
233 $chunk_options[] = $shy;
236 if ($component->getDropdownAt() ==
null ||
237 $component->getDropdownAt() > $component->getNumberOfPages()) {
238 foreach ($chunk_options as $entry) {
239 $tpl->setCurrentBlock(
"entry");
240 $tpl->setVariable(
'BUTTON', $default_renderer->render($entry));
241 $tpl->parseCurrentBlock();
245 $f = $this->getUIFactory();
247 $dd_label_template = $component->getDropdownLabel();
248 if ($dd_label_template === $component->getDefaultDropdownLabel()) {
249 $dd_label_template = $this->txt($dd_label_template);
253 $component->getCurrentPage() + 1,
254 $component->getNumberOfPages()
257 $dd =
$f->dropdown()->standard($chunk_options)->withLabel($dd_label);
258 $tpl->setCurrentBlock(
"entry");
259 $tpl->setVariable(
'BUTTON', $default_renderer->render($dd));
260 $tpl->parseCurrentBlock();
263 if ($component->getMaxPaginationButtons()) {
264 $this->setPaginationFirstLast($component,
$range, $default_renderer, $tpl);
267 $this->setPaginationBrowseControls($component, $default_renderer, $tpl);
278 if (!$component->getMaxPaginationButtons()) {
280 $stop = max($component->getNumberOfPages() - 1, 0);
283 $start = (
int) ($component->getCurrentPage() - floor($component->getMaxPaginationButtons() / 2));
284 $start = max($start, 0);
286 $stop = $start + $component->getMaxPaginationButtons() - 1;
288 if ($stop > $component->getNumberOfPages() - 1) {
289 $stop = max($component->getNumberOfPages() - 1, 0);
290 $start = $stop - $component->getMaxPaginationButtons();
291 $start = max($start, 0);
294 return range($start, $stop);
302 $f = $this->getUIFactory();
305 $label = (string) ($val + 1);
308 if ($component->getTriggeredSignals()) {
309 $shy =
$f->button()->shy($label, (
string) $val)->withOnClick($component->getInternalSignal());
311 $url = $component->getTargetURL() ??
'';
312 if (strpos(
$url,
'?') ===
false) {
313 $url .=
'?' . $component->getParameterName() .
'=' . $val;
315 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
316 $query = parse_url(
$url, PHP_URL_QUERY);
318 $params[$component->getParameterName()] = $val;
321 $shy =
$f->button()->shy($label,
$url);
331 RendererInterface $default_renderer,
334 $prev = max(0, $component->getCurrentPage() - 1);
335 $next = $component->getCurrentPage() + 1;
337 $f = $this->getUIFactory();
339 $back_btn =
$f->button()->standard(
"",
"");
340 $forward_btn =
$f->button()->standard(
"",
"");
342 if ($component->getTriggeredSignals()) {
343 $back_btn = $back_btn->withOnClick($component->getInternalSignal());
344 $forward_btn = $forward_btn->withOnClick($component->getInternalSignal());
346 $url = $component->getTargetURL() ??
'';
347 if (strpos(
$url,
'?') ===
false) {
348 $url_prev =
$url .
'?' . $component->getParameterName() .
'=' . $prev;
349 $url_next =
$url .
'?' . $component->getParameterName() .
'=' . $next;
351 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
352 $query = parse_url(
$url, PHP_URL_QUERY);
355 $params[$component->getParameterName()] = $prev;
356 $url_prev = $base . http_build_query(
$params);
357 $params[$component->getParameterName()] = $next;
358 $url_next = $base . http_build_query(
$params);
361 $back_btn =
$f->button()->standard(
"", $url_prev);
362 $forward_btn =
$f->button()->standard(
"", $url_next);
365 if ($component->getCurrentPage() != 0) {
366 $back_glyph =
$f->symbol()->glyph()->back();
367 $back_btn = $back_btn->withSymbol($back_glyph);
368 $tpl->
setVariable(
'PREVIOUS', $default_renderer->render($back_btn));
370 if ($component->getCurrentPage() != $component->getNumberOfPages() - 1) {
371 $forward_glyph =
$f->symbol()->glyph()->next();
372 $forward_btn = $forward_btn->withSymbol($forward_glyph);
373 $tpl->
setVariable(
'NEXT', $default_renderer->render($forward_btn));
385 RendererInterface $default_renderer,
389 $shy = $this->getPaginationShyButton(0, $component);
390 $tpl->
setVariable(
'FIRST', $default_renderer->render($shy));
392 $last = max($component->getNumberOfPages() - 1, 0);
393 if (!in_array($last,
$range)) {
394 $shy = $this->getPaginationShyButton($component->getNumberOfPages() - 1, $component);
395 $tpl->
setVariable(
'LAST', $default_renderer->render($shy));
404 parent::registerResources($registry);
405 $registry->
register(
'assets/js/viewcontrols.min.js');
406 $registry->
register(
'assets/js/dropdown.js');
415 $id = $this->bindJavaScript($component);
417 $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)
@inheritdocs
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.
addTriggererOnLoadCode(Triggerer $triggerer)
Add onload-code for triggerer.
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'))