19 declare(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();
93 $tpl = $this->
getTemplate(
"tpl.section.html",
true,
true);
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");
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}'));" 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"));
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'); 221 $tpl->setVariable(
'ID',
$id);
224 $chunk_options = array();
225 foreach (
$range as $entry) {
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();
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()) {
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);
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);
331 $prev = max(0, $component->getCurrentPage() - 1);
332 $next = $component->getCurrentPage() + 1;
336 if ($component->getTriggeredSignals()) {
337 $back =
$f->symbol()->glyph()->back(
'')->withOnClick($component->getInternalSignal());
338 $forward =
$f->symbol()->glyph()->next(
'')->withOnClick($component->getInternalSignal());
340 $url = $component->getTargetURL() ??
'';
341 if (strpos(
$url,
'?') ===
false) {
342 $url_prev =
$url .
'?' . $component->getParameterName() .
'=' . $prev;
343 $url_next =
$url .
'?' . $component->getParameterName() .
'=' . $next;
345 $base = substr(
$url, 0, strpos(
$url,
'?') + 1);
346 $query = parse_url(
$url, PHP_URL_QUERY);
349 $params[$component->getParameterName()] = $prev;
350 $url_prev = $base . http_build_query(
$params);
351 $params[$component->getParameterName()] = $next;
352 $url_next = $base . http_build_query(
$params);
355 $back =
$f->symbol()->glyph()->back($url_prev);
356 $forward =
$f->symbol()->glyph()->next($url_next);
359 if ($component->getCurrentPage() === 0) {
360 $back = $back->withUnavailableAction();
362 if ($component->getCurrentPage() >= $component->getNumberOfPages() - 1) {
363 $forward = $forward->withUnavailableAction();
366 $tpl->
setVariable(
'PREVIOUS', $default_renderer->render($back));
367 $tpl->
setVariable(
'NEXT', $default_renderer->render($forward));
381 if (!in_array(0, $range)) {
383 $tpl->
setVariable(
'FIRST', $default_renderer->render($shy));
385 $last = max($component->getNumberOfPages() - 1, 0);
386 if (!in_array($last, $range)) {
388 $tpl->
setVariable(
'LAST', $default_renderer->render($shy));
397 parent::registerResources($registry);
398 $registry->
register(
'assets/js/viewcontrols.min.js');
399 $registry->
register(
'assets/js/dropdown.js');
renderSection(Component\ViewControl\Section $component, RendererInterface $default_renderer)
Registry for resources required by rendered output like Javascript or CSS.
renderSortation(Component\ViewControl\Sortation $component, RendererInterface $default_renderer)
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
txt(string $id)
Get a text from the language file.
renderId(Component\JavaScriptBindable $component, Template $tpl, string $block, string $template_var)
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.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
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.
cannotHandleComponent(Component $component)
This method MUST be called by derived component renderers, if.
render(Component\Component $component, RendererInterface $default_renderer)
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.
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
renderPagination(Component\ViewControl\Pagination $component, RendererInterface $default_renderer)
touchBlock(string $name)
Touch a block without working further on it.
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.