comparison core/modules/views_ui/views_ui.theme.inc @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
comparison
equal deleted inserted replaced
-1:000000000000 0:c75dbcec494b
1 <?php
2
3 /**
4 * @file
5 * Preprocessors and theme functions for the Views UI.
6 */
7
8 use Drupal\Component\Utility\SafeMarkup;
9 use Drupal\Core\Form\FormState;
10 use Drupal\Core\Render\Element;
11 use Drupal\Core\Render\Element\Checkboxes;
12 use Drupal\Core\Render\Element\Radios;
13 use Drupal\Core\Url;
14 use Drupal\Core\Template\Attribute;
15
16 /**
17 * Prepares variables for Views UI display tab setting templates.
18 *
19 * Default template: views-ui-display-tab-setting.html.twig.
20 *
21 * @param array $variables
22 * An associative array containing:
23 * - link: The setting's primary link.
24 * - settings_links: An array of links for this setting.
25 * - defaulted: A boolean indicating the setting is in its default state.
26 * - overridden: A boolean indicating the setting has been overridden from
27 * the default.
28 * - description: The setting's description.
29 * - description_separator: A boolean indicating a separator colon should be
30 * appended to the setting's description.
31 */
32 function template_preprocess_views_ui_display_tab_setting(&$variables) {
33 // Put the primary link to the left side.
34 array_unshift($variables['settings_links'], $variables['link']);
35
36 if (!empty($variables['overridden'])) {
37 $variables['attributes']['title'][] = t('Overridden');
38 }
39
40 // Append a colon to the description, if requested.
41 if ($variables['description'] && $variables['description_separator']) {
42 $variables['description'] .= t(':');
43 }
44 }
45
46 /**
47 * Prepares variables for Views UI view listing templates.
48 *
49 * Default template: views-ui-view-listing-table.html.twig.
50 *
51 * @param array $variables
52 * An associative array containing:
53 * - headers: An associative array containing the headers for the view
54 * listing table.
55 * - rows: An associative array containing the rows data for the view
56 * listing table.
57 */
58 function template_preprocess_views_ui_views_listing_table(&$variables) {
59 // Convert the attributes to valid attribute objects.
60 foreach ($variables['headers'] as $key => $header) {
61 $variables['headers'][$key]['attributes'] = new Attribute($header['#attributes']);
62 }
63
64 if (!empty($variables['rows'])) {
65 foreach ($variables['rows'] as $key => $row) {
66 $variables['rows'][$key]['attributes'] = new Attribute($row['#attributes']);
67 }
68 }
69 }
70
71 /**
72 * Prepares variables for Views UI display tab bucket templates.
73 *
74 * Default template: views-ui-display-tab-bucket.html.twig.
75 *
76 * @param array $variables
77 * An associative array containing:
78 * - element: An associative array containing the properties of the element.
79 * Properties used: #name, #overridden, #children, #title, #actions.
80 */
81 function template_preprocess_views_ui_display_tab_bucket(&$variables) {
82 $element = $variables['element'];
83
84 if (!empty($element['#overridden'])) {
85 $variables['attributes']['title'][] = t('Overridden');
86 }
87
88 $variables['name'] = isset($element['#name']) ? $element['#name'] : NULL;
89 $variables['overridden'] = isset($element['#overridden']) ? $element['#overridden'] : NULL;
90 $variables['content'] = $element['#children'];
91 $variables['title'] = $element['#title'];
92 $variables['actions'] = !empty($element['#actions']) ? $element['#actions'] : [];
93 }
94
95 /**
96 * Prepares variables for Views UI build group filter form templates.
97 *
98 * Default template: views-ui-build-group-filter-form.html.twig.
99 *
100 * @param array $variables
101 * An associative array containing:
102 * - form: A render element representing the form.
103 */
104 function template_preprocess_views_ui_build_group_filter_form(&$variables) {
105 $form = $variables['form'];
106
107 // Prepare table of options.
108 $header = [
109 t('Default'),
110 t('Weight'),
111 t('Label'),
112 t('Operator'),
113 t('Value'),
114 t('Operations'),
115 ];
116
117 // Prepare default selectors.
118 $form_state = new FormState();
119 $form['default_group'] = Radios::processRadios($form['default_group'], $form_state, $form);
120 $form['default_group_multiple'] = Checkboxes::processCheckboxes($form['default_group_multiple'], $form_state, $form);
121 $form['default_group']['All']['#title'] = '';
122
123 $rows[] = [
124 ['data' => $form['default_group']['All']],
125 '',
126 [
127 'data' => \Drupal::config('views.settings')->get('ui.exposed_filter_any_label') == 'old_any' ? t('&lt;Any&gt;') : t('- Any -'),
128 'colspan' => 4,
129 'class' => ['class' => 'any-default-radios-row'],
130 ],
131 ];
132 // Remove the 'All' default_group form element because it's added to the
133 // table row.
134 unset($variables['form']['default_group']['All']);
135
136 foreach (Element::children($form['group_items']) as $group_id) {
137 $form['group_items'][$group_id]['value']['#title'] = '';
138 $default = [
139 $form['default_group'][$group_id],
140 $form['default_group_multiple'][$group_id],
141 ];
142 // Remove these fields from the form since they are moved into the table.
143 unset($variables['form']['default_group'][$group_id]);
144 unset($variables['form']['default_group_multiple'][$group_id]);
145
146 $link = [
147 '#type' => 'link',
148 '#url' => Url::fromRoute('<none>', [], [
149 'attributes' => [
150 'id' => 'views-remove-link-' . $group_id,
151 'class' => [
152 'views-hidden',
153 'views-button-remove',
154 'views-groups-remove-link',
155 'views-remove-link',
156 ],
157 'alt' => t('Remove this item'),
158 'title' => t('Remove this item'),
159 ],
160 ]),
161 '#title' => SafeMarkup::format('<span>@text</span>', ['@text' => t('Remove')]),
162 ];
163 $remove = [$form['group_items'][$group_id]['remove'], $link];
164 $data = [
165 'default' => ['data' => $default],
166 'weight' => ['data' => $form['group_items'][$group_id]['weight']],
167 'title' => ['data' => $form['group_items'][$group_id]['title']],
168 'operator' => ['data' => $form['group_items'][$group_id]['operator']],
169 'value' => ['data' => $form['group_items'][$group_id]['value']],
170 'remove' => ['data' => $remove],
171 ];
172 $rows[] = ['data' => $data, 'id' => 'views-row-' . $group_id, 'class' => ['draggable']];
173 }
174 $variables['table'] = [
175 '#type' => 'table',
176 '#header' => $header,
177 '#rows' => $rows,
178 '#attributes' => [
179 'class' => ['views-filter-groups'],
180 'id' => 'views-filter-groups',
181 ],
182 '#tabledrag' => [
183 [
184 'action' => 'order',
185 'relationship' => 'sibling',
186 'group' => 'weight',
187 ]
188 ],
189 ];
190
191 // Hide fields used in table.
192 unset($variables['form']['group_items']);
193 }
194
195 /**
196 * Prepares variables for Views UI rearrange filter form templates.
197 *
198 * Default template: views-ui-rearrange-filter-form.html.twig.
199 *
200 * @param array $variables
201 * An associative array containing:
202 * - form: A render element representing the form.
203 */
204 function template_preprocess_views_ui_rearrange_filter_form(&$variables) {
205 $form = &$variables['form'];
206 $rows = $ungroupable_rows = [];
207 // Enable grouping only if > 1 group.
208 $variables['grouping'] = count(array_keys($form['#group_options'])) > 1;
209
210 foreach ($form['#group_renders'] as $group_id => $contents) {
211 // Header row for the group.
212 if ($group_id !== 'ungroupable') {
213 // Set up tabledrag so that it changes the group dropdown when rows are
214 // dragged between groups.
215 $options = [
216 'table_id' => 'views-rearrange-filters',
217 'action' => 'match',
218 'relationship' => 'sibling',
219 'group' => 'views-group-select',
220 'subgroup' => 'views-group-select-' . $group_id,
221 ];
222 drupal_attach_tabledrag($form['override'], $options);
223
224 // Title row, spanning all columns.
225 $row = [];
226 // Add a cell to the first row, containing the group operator.
227 $row[] = [
228 'class' => ['group', 'group-operator', 'container-inline'],
229 'data' => $form['filter_groups']['groups'][$group_id],
230 'rowspan' => max([2, count($contents) + 1]),
231 ];
232 // Title.
233 $row[] = [
234 'class' => ['group', 'group-title'],
235 'data' => [
236 '#prefix' => '<span>',
237 '#markup' => $form['#group_options'][$group_id],
238 '#suffix' => '</span>',
239 ],
240 'colspan' => 4,
241 ];
242 $rows[] = [
243 'class' => ['views-group-title'],
244 'data' => $row,
245 'id' => 'views-group-title-' . $group_id,
246 ];
247
248 // Row which will only appear if the group has nothing in it.
249 $row = [];
250 $class = 'group-' . (count($contents) ? 'populated' : 'empty');
251 $instructions = '<span>' . t('No filters have been added.') . '</span> <span class="js-only">' . t('Drag to add filters.') . '</span>';
252 // When JavaScript is enabled, the button for removing the group (if it's
253 // present) should be hidden, since it will be replaced by a link on the
254 // client side.
255 if (!empty($form['remove_groups'][$group_id]['#type']) && $form['remove_groups'][$group_id]['#type'] == 'submit') {
256 $form['remove_groups'][$group_id]['#attributes']['class'][] = 'js-hide';
257 }
258 $row[] = [
259 'colspan' => 5,
260 'data' => [
261 ['#markup' => $instructions],
262 $form['remove_groups'][$group_id],
263 ],
264 ];
265 $rows[] = [
266 'class' => [
267 'group-message',
268 'group-' . $group_id . '-message',
269 $class,
270 ],
271 'data' => $row,
272 'id' => 'views-group-' . $group_id,
273 ];
274 }
275
276 foreach ($contents as $id) {
277 if (isset($form['filters'][$id]['name'])) {
278 $row = [];
279 $row[]['data'] = $form['filters'][$id]['name'];
280 $form['filters'][$id]['weight']['#attributes']['class'] = ['weight'];
281 $row[]['data'] = $form['filters'][$id]['weight'];
282 $form['filters'][$id]['group']['#attributes']['class'] = ['views-group-select views-group-select-' . $group_id];
283 $row[]['data'] = $form['filters'][$id]['group'];
284 $form['filters'][$id]['removed']['#attributes']['class'][] = 'js-hide';
285
286 $remove_link = [
287 '#type' => 'link',
288 '#url' => Url::fromRoute('<none>'),
289 '#title' => SafeMarkup::format('<span>@text</span>', ['@text' => t('Remove')]),
290 '#weight' => '1',
291 '#options' => [
292 'attributes' => [
293 'id' => 'views-remove-link-' . $id,
294 'class' => [
295 'views-hidden',
296 'views-button-remove',
297 'views-groups-remove-link',
298 'views-remove-link',
299 ],
300 'alt' => t('Remove this item'),
301 'title' => t('Remove this item'),
302 ],
303 ],
304 ];
305 $row[]['data'] = [
306 $form['filters'][$id]['removed'],
307 $remove_link,
308 ];
309
310 $row = [
311 'data' => $row,
312 'class' => ['draggable'],
313 'id' => 'views-row-' . $id,
314 ];
315
316 if ($group_id !== 'ungroupable') {
317 $rows[] = $row;
318 }
319 else {
320 $ungroupable_rows[] = $row;
321 }
322 }
323 }
324 }
325
326 if (!$variables['grouping']) {
327 $form['filter_groups']['groups'][0]['#title'] = t('Operator');
328 }
329
330 if (!empty($ungroupable_rows)) {
331 $header = [
332 t('Ungroupable filters'),
333 t('Weight'),
334 [
335 'data' => t('Group'),
336 'class' => ['views-hide-label'],
337 ],
338 [
339 'data' => t('Remove'),
340 'class' => ['views-hide-label'],
341 ],
342 ];
343 $variables['ungroupable_table'] = [
344 '#type' => 'table',
345 '#header' => $header,
346 '#rows' => $ungroupable_rows,
347 '#attributes' => [
348 'id' => 'views-rearrange-filters-ungroupable',
349 'class' => ['arrange'],
350 ],
351 '#tabledrag' => [
352 [
353 'action' => 'order',
354 'relationship' => 'sibling',
355 'group' => 'weight',
356 ]
357 ],
358 ];
359 }
360
361 if (empty($rows)) {
362 $rows[] = [['data' => t('No fields available.'), 'colspan' => '2']];
363 }
364
365 // Set up tabledrag so that the weights are changed when rows are dragged.
366 $variables['table'] = [
367 '#type' => 'table',
368 '#rows' => $rows,
369 '#attributes' => [
370 'id' => 'views-rearrange-filters',
371 'class' => ['arrange'],
372 ],
373 '#tabledrag' => [
374 [
375 'action' => 'order',
376 'relationship' => 'sibling',
377 'group' => 'weight',
378 ],
379 ],
380 ];
381
382 // When JavaScript is enabled, the button for adding a new group should be
383 // hidden, since it will be replaced by a link on the client side.
384 $form['actions']['add_group']['#attributes']['class'][] = 'js-hide';
385
386 }
387
388 /**
389 * Prepares variables for style plugin table templates.
390 *
391 * Default template: views-ui-style-plugin-table.html.twig.
392 *
393 * @param array $variables
394 * An associative array containing:
395 * - form: A render element representing the form.
396 */
397 function template_preprocess_views_ui_style_plugin_table(&$variables) {
398 $form = $variables['form'];
399
400 $header = [
401 t('Field'),
402 t('Column'),
403 t('Align'),
404 t('Separator'),
405 [
406 'data' => t('Sortable'),
407 'align' => 'center',
408 ],
409 [
410 'data' => t('Default order'),
411 'align' => 'center',
412 ],
413 [
414 'data' => t('Default sort'),
415 'align' => 'center',
416 ],
417 [
418 'data' => t('Hide empty column'),
419 'align' => 'center',
420 ],
421 [
422 'data' => t('Responsive'),
423 'align' => 'center',
424 ],
425 ];
426 $rows = [];
427 foreach (Element::children($form['columns']) as $id) {
428 $row = [];
429 $row[]['data'] = $form['info'][$id]['name'];
430 $row[]['data'] = $form['columns'][$id];
431 $row[]['data'] = $form['info'][$id]['align'];
432 $row[]['data'] = $form['info'][$id]['separator'];
433
434 if (!empty($form['info'][$id]['sortable'])) {
435 $row[] = [
436 'data' => $form['info'][$id]['sortable'],
437 'align' => 'center',
438 ];
439 $row[] = [
440 'data' => $form['info'][$id]['default_sort_order'],
441 'align' => 'center',
442 ];
443 $row[] = [
444 'data' => $form['default'][$id],
445 'align' => 'center',
446 ];
447 }
448 else {
449 $row[] = '';
450 $row[] = '';
451 $row[] = '';
452 }
453 $row[] = [
454 'data' => $form['info'][$id]['empty_column'],
455 'align' => 'center',
456 ];
457 $row[] = [
458 'data' => $form['info'][$id]['responsive'],
459 'align' => 'center',
460 ];
461 $rows[] = $row;
462 }
463
464 // Add the special 'None' row.
465 $rows[] = [['data' => t('None'), 'colspan' => 6], ['align' => 'center', 'data' => $form['default'][-1]], ['colspan' => 2]];
466
467 // Unset elements from the form array that are used to build the table so that
468 // they are not rendered twice.
469 unset($form['default']);
470 unset($form['info']);
471 unset($form['columns']);
472
473 $variables['table'] = [
474 '#type' => 'table',
475 '#theme' => 'table__views_ui_style_plugin_table',
476 '#header' => $header,
477 '#rows' => $rows,
478 ];
479 $variables['form'] = $form;
480 }
481
482 /**
483 * Prepares variables for views UI view preview section templates.
484 *
485 * Default template: views-ui-view-preview-section.html.twig.
486 *
487 * @param array $variables
488 * An associative array containing:
489 * - view: The view object.
490 * - section: The section name of a View (e.g. title, rows or pager).
491 */
492 function template_preprocess_views_ui_view_preview_section(&$variables) {
493 switch ($variables['section']) {
494 case 'title':
495 $variables['title'] = t('Title');
496 $links = views_ui_view_preview_section_display_category_links($variables['view'], 'title', $variables['title']);
497 break;
498 case 'header':
499 $variables['title'] = t('Header');
500 $links = views_ui_view_preview_section_handler_links($variables['view'], $variables['section']);
501 break;
502 case 'empty':
503 $variables['title'] = t('No results behavior');
504 $links = views_ui_view_preview_section_handler_links($variables['view'], $variables['section']);
505 break;
506 case 'exposed':
507 // @todo Sorts can be exposed too, so we may need a better title.
508 $variables['title'] = t('Exposed Filters');
509 $links = views_ui_view_preview_section_display_category_links($variables['view'], 'exposed_form_options', $variables['title']);
510 break;
511 case 'rows':
512 // @todo The title needs to depend on what is being viewed.
513 $variables['title'] = t('Content');
514 $links = views_ui_view_preview_section_rows_links($variables['view']);
515 break;
516 case 'pager':
517 $variables['title'] = t('Pager');
518 $links = views_ui_view_preview_section_display_category_links($variables['view'], 'pager_options', $variables['title']);
519 break;
520 case 'more':
521 $variables['title'] = t('More');
522 $links = views_ui_view_preview_section_display_category_links($variables['view'], 'use_more', $variables['title']);
523 break;
524 case 'footer':
525 $variables['title'] = t('Footer');
526 $links = views_ui_view_preview_section_handler_links($variables['view'], $variables['section']);
527 break;
528 case 'attachment_before':
529 // @todo: Add links to the attachment configuration page.
530 $variables['title'] = t('Attachment before');
531 break;
532 case 'attachment_after':
533 // @todo: Add links to the attachment configuration page.
534 $variables['title'] = t('Attachment after');
535 break;
536 }
537
538 if (isset($links)) {
539 $build = [
540 '#theme' => 'links__contextual',
541 '#links' => $links,
542 '#attributes' => ['class' => ['contextual-links']],
543 '#attached' => [
544 'library' => ['contextual/drupal.contextual-links'],
545 ],
546 ];
547 $variables['links'] = $build;
548 }
549 }