Commit f503d228 authored by webchick's avatar webchick

Issue #2074509 by tim.plunkett, falcon03, mgifford, Xano: Fixed Add missing...

Issue #2074509 by tim.plunkett, falcon03, mgifford, Xano: Fixed Add missing #title property to ensure form accessibility.
parent 11eeb98b
......@@ -2470,6 +2470,7 @@ function _install_configure_form($form, &$form_state, &$install_state) {
);
$form['update_notifications']['update_status_module'] = array(
'#type' => 'checkboxes',
'#title' => t('Update notifications'),
'#options' => array(
1 => t('Check for updates automatically'),
2 => t('Receive e-mail notifications'),
......
......@@ -72,7 +72,6 @@ public function form(array $form, array &$form_state) {
$form['id'] = array(
'#type' => 'machine_name',
'#title' => $this->t('Machine name'),
'#default_value' => $this->entity->id(),
'#disabled' => !$this->entity->isNew(),
'#maxlength' => 64,
......
......@@ -102,7 +102,6 @@ public function form(array $form, array &$form_state) {
// If creating a new block, calculate a safe default machine name.
$form['machine_name'] = array(
'#type' => 'machine_name',
'#title' => $this->t('Machine name'),
'#maxlength' => 64,
'#description' => $this->t('A unique name for this block instance. Must be alpha-numeric and underscore separated.'),
'#default_value' => !$entity->isNew() ? $entity->id() : $this->getUniqueMachineName($entity),
......
......@@ -262,8 +262,8 @@ public function buildForm(array $form, array &$form_state) {
'#type' => 'select',
'#default_value' => $region,
'#empty_value' => BLOCK_REGION_NONE,
'#title_display' => 'invisible',
'#title' => t('Region for @block block', array('@block' => $info['admin_label'])),
'#title_display' => 'invisible',
'#options' => $this->regions,
'#attributes' => array(
'class' => array('block-region-select', 'block-region-' . $region),
......@@ -279,8 +279,8 @@ public function buildForm(array $form, array &$form_state) {
'#type' => 'weight',
'#default_value' => $info['weight'],
'#delta' => $weight_delta,
'#title_display' => 'invisible',
'#title' => t('Weight for @block block', array('@block' => $info['admin_label'])),
'#title_display' => 'invisible',
'#attributes' => array(
'class' => array('block-weight', 'block-weight-' . $region),
),
......
......@@ -160,6 +160,8 @@ function _book_admin_table_tree($tree, &$form) {
'depth' => array('#type' => 'value', '#value' => $data['link']['depth']),
'href' => array('#type' => 'value', '#value' => $data['link']['href']),
'title' => array(
'#title' => t('Title'),
'#title_display' => 'invisible',
'#type' => 'textfield',
'#default_value' => $data['link']['link_title'],
'#maxlength' => 255,
......
......@@ -118,6 +118,7 @@ function comment_admin_overview($form, &$form_state, $arg) {
'#account' => comment_prepare_author($comment),
);
$options[$comment->id()] = array(
'title' => array('data' => array('#title' => $comment->subject->value ?: $comment->id())),
'subject' => array(
'data' => array(
'#type' => 'link',
......
......@@ -88,8 +88,8 @@ protected function buildFormStyle(array &$form, array &$form_state, $type) {
case 'comment':
$style_form['row_options']['links'] = array(
'#type' => 'select',
'#title_display' => 'invisible',
'#title' => t('Should links be displayed below each comment'),
'#title_display' => 'invisible',
'#options' => array(
1 => t('with links (allow users to reply to the comment, etc.)'),
0 => t('without links'),
......
......@@ -59,9 +59,10 @@ public function buildForm(array $form, array &$form_state) {
);
$form['import_tarball'] = array(
'#type' => 'file',
'#value' => $this->t('Select your configuration export file'),
'#title' => $this->t('Select your configuration export file'),
'#description' => $this->t('This form will redirect you to the import configuration screen.'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Upload'),
......
......@@ -89,6 +89,7 @@ function _content_translation_form_language_content_settings_form_alter(array &$
if ($fields) {
$form['settings'][$entity_type][$bundle]['translatable'] = array(
'#type' => 'checkbox',
'#title' => $bundle,
'#default_value' => content_translation_enabled($entity_type, $bundle),
);
......@@ -99,6 +100,7 @@ function _content_translation_form_language_content_settings_form_alter(array &$
$form['settings'][$entity_type][$bundle]['fields'][$field_name] = array(
'#label' => $instance['label'],
'#type' => 'checkbox',
'#title' => $instance['label'],
'#default_value' => $field['translatable'],
);
$column_element = content_translation_field_sync_widget($field, $instance);
......
......@@ -155,6 +155,8 @@ public function entityFormAlter(array &$form, array &$form_state, EntityInterfac
'#weight' => -100,
'#multilingual' => TRUE,
'source' => array(
'#title' => t('Select source language'),
'#title_display' => 'invisible',
'#type' => 'select',
'#default_value' => $source_langcode,
'#options' => array(),
......
......@@ -34,7 +34,11 @@ function getDefaultSettings() {
* Implements \Drupal\editor\Plugin\EditPluginInterface::settingsForm().
*/
function settingsForm(array $form, array &$form_state, EditorEntity $editor) {
$form['foo'] = array('#type' => 'textfield', '#default_value' => 'bar');
$form['foo'] = array(
'#title' => t('Foo'),
'#type' => 'textfield',
'#default_value' => 'bar',
);
return $form;
}
......
......@@ -82,7 +82,6 @@ public function form(array $form, array &$form_state) {
$form['id'] = array(
'#type' => 'machine_name',
'#title' => t('Machine-readable name'),
'#description' => t('A unique machine-readable name. Can only contain lowercase letters, numbers, and underscores.'),
'#disabled' => !$this->entity->isNew(),
'#default_value' => $this->entity->id(),
......
......@@ -54,6 +54,7 @@ function language_elements_configuration_element() {
*/
function language_elements_configuration_element_test() {
$form['langcode'] = array(
'#title' => t('Language select'),
'#type' => 'language_select',
'#default_value' => language_get_default_langcode('custom_type', 'some_bundle'),
);
......
......@@ -85,9 +85,10 @@
background: transparent url(../../../misc/menu-expanded.png) left .6em no-repeat;
}
#locale-translation-status-form label {
#locale-translation-status-form .label {
color: #1d1d1d;
font-size: 1.15em;
font-weight: bold;
}
#locale-translation-status-form .description {
cursor: pointer;
......
......@@ -167,7 +167,7 @@ function testUpdateImportSourceRemote() {
$this->drupalGet('admin/reports/translations/check');
// Check the status on the Available translation status page.
$this->assertRaw('<label for="edit-langcodes-de" class="language-name">German</label>', 'German language found');
$this->assertRaw('<label class="visually-hidden" for="edit-langcodes-de">Update German</label>', 'German language found');
$this->assertText('Updates for: Contributed module one, Contributed module two, Custom module one, Locale test', 'Updates found');
$this->assertText('Contributed module one (' . format_date($this->timestamp_now, 'html_date') . ')', 'Updates for Contrib module one');
$this->assertText('Contributed module two (' . format_date($this->timestamp_new, 'html_date') . ')', 'Updates for Contrib module two');
......
......@@ -5,6 +5,7 @@
* Interface translation summary, editing and deletion user interfaces.
*/
use Drupal\Component\Utility\String;
use Drupal\Core\Language\Language;
use Drupal\locale\SourceString;
use Drupal\locale\TranslationString;
......@@ -520,6 +521,7 @@ function locale_translation_status_form($form, &$form_state) {
// Build data options for the select table.
foreach($updates as $langcode => $update) {
$title = String::checkPlain($languages[$langcode]->name);
$locale_translation_update_info = array('#theme' => 'locale_translation_update_info');
foreach (array('updates', 'not_found') as $update_status) {
if (isset($update[$update_status])) {
......@@ -527,12 +529,20 @@ function locale_translation_status_form($form, &$form_state) {
}
}
$options[$langcode] = array(
'title' => check_plain($languages[$langcode]->name),
'title' => array(
'class' => array('label'),
'data' => array(
'#title' => $title,
'#markup' => $title
),
),
'status' => array('class' => array('description', 'expand', 'priority-low'), 'data' => drupal_render($locale_translation_update_info)),
);
}
// Sort the table data on language name.
uasort($options, 'drupal_sort_title');
uasort($options, function ($a, $b) {
return strcasecmp($a['title']['data']['#title'], $b['title']['data']['#title']);
});
}
$last_checked = Drupal::state()->get('locale.translation_last_checked');
......@@ -639,13 +649,6 @@ function locale_translation_status_form_submit($form, &$form_state) {
* translation files could not be found.
*/
function locale_translation_language_table($form_element) {
// Add labels to Language names.
foreach ($form_element['#options'] as $langcode => $option) {
$id = $form_element[$langcode]['#id'];
$title = $option['title'];
$form_element['#options'][$langcode]['title'] = '<label for="' . $form_element[$langcode]['#id'] . '" class="language-name">' . $title . '</label>';
}
// Remove checkboxes of languages without updates.
if ($form_element['#not_found']) {
foreach ($form_element['#not_found'] as $langcode) {
......
......@@ -315,8 +315,8 @@ protected function buildOverviewTreeForm($tree, $delta) {
'#type' => 'weight',
'#delta' => $delta,
'#default_value' => $item['weight'],
'#title_display' => 'invisible',
'#title' => t('Weight for @title', array('@title' => $item['title'])),
'#title_display' => 'invisible',
);
$form[$mlid]['mlid'] = array(
'#type' => 'hidden',
......
......@@ -39,6 +39,7 @@ public function buildForm(array $form, array &$form_state) {
$options[$type->type] = $type->name;
}
$form['bundles'] = array(
'#title' => t('Node types'),
'#type' => 'checkboxes',
'#options' => $options,
'#required' => TRUE,
......
......@@ -107,8 +107,8 @@ protected function buildFormStyle(array &$form, array &$form_state, $type) {
case 'teasers':
$style_form['row_options']['links'] = array(
'#type' => 'select',
'#title_display' => 'invisible',
'#title' => t('Should links be displayed below each node'),
'#title_display' => 'invisible',
'#options' => array(
1 => t('with links (allow users to add comments, etc.)'),
0 => t('without links'),
......@@ -117,8 +117,8 @@ protected function buildFormStyle(array &$form, array &$form_state, $type) {
);
$style_form['row_options']['comments'] = array(
'#type' => 'select',
'#title_display' => 'invisible',
'#title' => t('Should comments be displayed below each node'),
'#title_display' => 'invisible',
'#options' => array(
1 => t('with comments'),
0 => t('without comments'),
......
......@@ -94,11 +94,15 @@ public function buildOptionsForm(&$form, &$form_state) {
'#markup' => $id,
);
$form['field_options'][$id]['alias'] = array(
'#title' => t('Alias for @id', array('@id' => $id)),
'#title_display' => 'invisible',
'#type' => 'textfield',
'#default_value' => isset($options[$id]['alias']) ? $options[$id]['alias'] : '',
'#element_validate' => array(array($this, 'validateAliasName')),
);
$form['field_options'][$id]['raw_output'] = array(
'#title' => t('Raw output for @id', array('@id' => $id)),
'#title_display' => 'invisible',
'#type' => 'checkbox',
'#default_value' => isset($options[$id]['raw_output']) ? $options[$id]['raw_output'] : '',
);
......
......@@ -84,6 +84,7 @@ public function buildForm(array $form, array &$form_state) {
);
$form['cron'] = array(
'#title' => t('Cron settings'),
'#type' => 'details',
);
$form['cron']['cron_safe_threshold'] = array(
......
......@@ -125,7 +125,6 @@ public function form(array $form, array &$form_state) {
$form['id'] = array(
'#type' => 'machine_name',
'#title' => t('Machine-readable name'),
'#description' => t('A unique machine-readable name. Can only contain lowercase letters, numbers, and underscores.'),
'#disabled' => !$this->entity->isNew(),
'#default_value' => $this->entity->id(),
......
......@@ -49,6 +49,7 @@ function ajax_forms_test_simple_form($form, &$form_state) {
$form = array();
$form['select'] = array(
'#title' => t('Color'),
'#type' => 'select',
'#options' => array(
'red' => 'red',
......@@ -83,6 +84,7 @@ function ajax_forms_test_simple_form($form, &$form_state) {
foreach ($invalid_callbacks as $key => $value) {
$form['select_' . $key . '_callback'] = array(
'#type' => 'select',
'#title' => t('Test %key callbacks', array('%key' => $key)),
'#options' => array('red' => 'red'),
'#ajax' => array('callback' => $value),
);
......@@ -542,6 +544,7 @@ function ajax_forms_test_lazy_load_form($form, &$form_state) {
'data' => array('test' => 'currentPathUpdate'),
);
$form['add_files'] = array(
'#title' => t('Add files'),
'#type' => 'checkbox',
'#default_value' => FALSE,
);
......
......@@ -312,6 +312,7 @@ function _batch_test_nested_drupal_form_submit_callback($value) {
*/
function batch_test_mock_form($form, $form_state) {
$form['test_value'] = array(
'#title' => t('Test value'),
'#type' => 'textfield',
);
$form['submit'] = array(
......
<?php
use Drupal\Component\Utility\String;
use Drupal\Core\Database\Query\AlterableInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
......@@ -233,6 +234,7 @@ function database_test_theme_tablesort($form, &$form_state) {
foreach (user_load_multiple($uids) as $account) {
$options[$account->id()] = array(
'title' => array('data' => array('#title' => String::checkPlain($account->getUsername()))),
'username' => check_plain($account->getUsername()),
'status' => $account->isActive() ? t('active') : t('blocked'),
);
......
......@@ -701,6 +701,7 @@ function _form_test_tableselect_get_data() {
);
$options['row1'] = array(
'title' => array('data' => array('#title' => t('row1'))),
'one' => 'row1col1',
'two' => t('row1col2'),
'three' => t('row1col3'),
......@@ -708,6 +709,7 @@ function _form_test_tableselect_get_data() {
);
$options['row2'] = array(
'title' => array('data' => array('#title' => t('row2'))),
'one' => 'row2col1',
'two' => t('row2col2'),
'three' => t('row2col3'),
......@@ -715,6 +717,7 @@ function _form_test_tableselect_get_data() {
);
$options['row3'] = array(
'title' => array('data' => array('#title' => t('row3'))),
'one' => 'row3col1',
'two' => t('row3col2'),
'three' => t('row3col3'),
......@@ -1044,21 +1047,21 @@ function form_label_test_form() {
$form['form_checkboxes_title_attribute'] = array(
'#type' => 'checkboxes',
'#title' => 'Checkboxes test',
'#title_display' => 'attribute',
'#options' => array(
'first-checkbox' => 'First checkbox',
'second-checkbox' => 'Second checkbox',
),
'#title_display' => 'attribute',
'#required' => TRUE,
);
$form['form_radios_title_attribute'] = array(
'#type' => 'radios',
'#title' => 'Radios test',
'#title_display' => 'attribute',
'#options' => array(
'first-radio' => 'First radio',
'second-radio' => 'Second radio',
),
'#title_display' => 'attribute',
'#required' => TRUE,
);
......@@ -1338,25 +1341,30 @@ function form_test_language_select() {
$form['#submit'] = array('_form_test_submit_values_json');
$form['languages_all'] = array(
'#title' => t('Languages: All'),
'#type' => 'language_select',
'#languages' => Language::STATE_ALL,
'#default_value' => 'xx',
);
$form['languages_configurable'] = array(
'#title' => t('Languages: Configurable'),
'#type' => 'language_select',
'#languages' => Language::STATE_CONFIGURABLE,
'#default_value' => 'en',
);
$form['languages_locked'] = array(
'#title' => t('Languages: Locked'),
'#type' => 'language_select',
'#languages' => Language::STATE_LOCKED,
);
$form['languages_config_and_locked'] = array(
'#title' => t('Languages: Configurable and locked'),
'#type' => 'language_select',
'#languages' => Language::STATE_CONFIGURABLE | Language::STATE_LOCKED,
'#default_value' => 'dummy_value',
);
$form['language_custom_options'] = array(
'#title' => t('Languages: Custom'),
'#type' => 'language_select',
'#languages' => Language::STATE_CONFIGURABLE | Language::STATE_LOCKED,
'#options' => array('opt1' => 'First option', 'opt2' => 'Second option', 'opt3' => 'Third option'),
......@@ -1907,6 +1915,7 @@ function _form_test_input_forgery($form, &$form_state) {
// For testing that a user can't submit a value not matching one of the
// allowed options.
$form['checkboxes'] = array(
'#title' => t('Checkboxes'),
'#type' => 'checkboxes',
'#options' => array(
'one' => 'One',
......@@ -2050,6 +2059,7 @@ function form_test_programmatic_form($form, &$form_state) {
);
$form['checkboxes'] = array(
'#title' => t('Checkboxes'),
'#type' => 'checkboxes',
'#options' => array(
1 => 'First checkbox',
......@@ -2296,6 +2306,7 @@ function form_test_load_include_custom($form, &$form_state) {
function form_test_checkbox_type_juggling($form, $form_state, $default_value, $return_value) {
$form['checkbox'] = array(
'#title' => t('Checkbox'),
'#type' => 'checkbox',
'#return_value' => $return_value,
'#default_value' => $default_value,
......@@ -2305,15 +2316,18 @@ function form_test_checkbox_type_juggling($form, $form_state, $default_value, $r
function form_test_checkboxes_zero($form, &$form_state, $json = TRUE) {
$form['checkbox_off'] = array(
'#title' => t('Checkbox off'),
'#type' => 'checkboxes',
'#options' => array('foo', 'bar', 'baz'),
);
$form['checkbox_zero_default'] = array(
'#title' => t('Zero default'),
'#type' => 'checkboxes',
'#options' => array('foo', 'bar', 'baz'),
'#default_value' => array(0),
);
$form['checkbox_string_zero_default'] = array(
'#title' => t('Zero default (string)'),
'#type' => 'checkboxes',
'#options' => array('foo', 'bar', 'baz'),
'#default_value' => array('0'),
......
......@@ -258,8 +258,8 @@ public function buildForm(array $form, array &$form_state, VocabularyInterface $
$form['terms'][$key]['weight'] = array(
'#type' => 'weight',
'#delta' => $delta,
'#title_display' => 'invisible',
'#title' => $this->t('Weight for added term'),
'#title_display' => 'invisible',
'#default_value' => $term->weight->value,
'#attributes' => array(
'class' => array('term-weight'),
......
......@@ -162,6 +162,11 @@ function update_manager_update_form($form, $form_state = array(), $context) {
continue 2;
}
// Use the project title for the tableselect checkboxes.
$entry['title'] = array('data' => array(
'#title' => $entry['title'],
'#markup' => $entry['title'],
));
$entry['#attributes'] = array('class' => array('update-' . $type));
// Drupal core needs to be upgraded manually.
......
......@@ -139,7 +139,7 @@ public function buildForm(array $form, array &$form_state) {
'restrict access' => FALSE,
'warning' => !empty($perm_item['restrict access']) ? $this->t('Warning: Give to trusted roles only; this permission has security implications.') : '',
);
$options[$perm] = '';
$options[$perm] = $perm_item['title'];
$user_permission_description = array(
'#theme' => 'user_permission_description',
'#permission_item' => $perm_item,
......
......@@ -35,6 +35,7 @@ public function buildOptionsForm(&$form, &$form_state) {
parent::buildOptionsForm($form, $form_state);
$form['content'] = array(
'#title' => t('Content'),
'#type' => 'text_format',
'#default_value' => $this->options['content'],
'#rows' => 6,
......
......@@ -34,6 +34,7 @@ public function buildOptionsForm(&$form, &$form_state) {
parent::buildOptionsForm($form, $form_state);
$form['content'] = array(
'#title' => t('Content'),
'#type' => 'textarea',
'#default_value' => $this->options['content'],
'#rows' => 6,
......
......@@ -184,6 +184,8 @@ public function buildOptionsForm(&$form, &$form_state) {
'#markup' => '<div class="clearfix"></div>',
);
$form['default_action'] = array(
'#title' => t('Default actions'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#process' => array(array($this, 'processContainerRadios')),
'#default_value' => $this->options['default_action'],
......
......@@ -185,6 +185,7 @@ public function buildOptionsForm(&$form, &$form_state) {
case 'attachment_position':
$form['#title'] .= t('Position');
$form['attachment_position'] = array(
'#title' => t('Position'),
'#type' => 'radios',
'#description' => t('Attach before or after the parent display?'),
'#options' => $this->attachmentPositions(),
......@@ -200,6 +201,7 @@ public function buildOptionsForm(&$form, &$form_state) {
}
}
$form['displays'] = array(
'#title' => t('Displays'),
'#type' => 'checkboxes',
'#description' => t('Select which display or displays this should attach to.'),
'#options' => $displays,
......
......@@ -1411,6 +1411,7 @@ public function buildOptionsForm(&$form, &$form_state) {
case 'title':
$form['#title'] .= t('The title of this view');
$form['title'] = array(
'#title' => t('Title'),
'#type' => 'textfield',
'#description' => t('This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc.'),
'#default_value' => $this->getOption('title'),
......@@ -1500,6 +1501,8 @@ public function buildOptionsForm(&$form, &$form_state) {
$access = $this->getOption('access');
$form['access']['type'] = array(
'#title' => t('Access'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#options' => views_fetch_plugin_names('access', $this->getType(), array($this->view->storage->get('base_table'))),
'#default_value' => $access['type'],
......@@ -1535,6 +1538,8 @@ public function buildOptionsForm(&$form, &$form_state) {
$cache = $this->getOption('cache');
$form['cache']['type'] = array(
'#title' => t('Caching'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#options' => views_fetch_plugin_names('cache', $this->getType(), array($this->view->storage->get('base_table'))),
'#default_value' => $cache['type'],
......@@ -1626,6 +1631,8 @@ public function buildOptionsForm(&$form, &$form_state) {
$form['#title'] .= t('How should this view be styled');
$style_plugin = $this->getPlugin('style');
$form['style'] = array(
'#title' => t('Style'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#options' => views_fetch_plugin_names('style', $this->getType(), array($this->view->storage->get('base_table'))),
'#default_value' => $style_plugin->definition['id'],
......@@ -1668,6 +1675,8 @@ public function buildOptionsForm(&$form, &$form_state) {
$form['#title'] .= t('How should each row in this view be styled');
$row_plugin_instance = $this->getPlugin('row');
$form['row'] = array(
'#title' => t('Row'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#options' => views_fetch_plugin_names('row', $this->getType(), array($this->view->storage->get('base_table'))),
'#default_value' => $row_plugin_instance->definition['id'],
......@@ -1692,6 +1701,7 @@ public function buildOptionsForm(&$form, &$form_state) {
$options['custom_url'] = t('Custom URL');
if (count($options)) {
$form['link_display'] = array(
'#title' => t('Custom URL'),
'#type' => 'radios',
'#options' => $options,
'#description' => t("Which display to use to get this display's path for things like summary links, rss feed links, more links, etc."),
......@@ -1859,6 +1869,8 @@ public function buildOptionsForm(&$form, &$form_state) {
'#suffix' => '</div>',
);
$form['box']['theme'] = array(
'#title' => t('Theme'),
'#title_display' => 'invisible',
'#type' => 'select',
'#options' => $options,
'#default_value' => $this->theme,
......@@ -1987,6 +1999,8 @@ public function buildOptionsForm(&$form, &$form_state) {
$exposed_form = $this->getOption('exposed_form');
$form['exposed_form']['type'] = array(
'#title' => t('Exposed form'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#options' => views_fetch_plugin_names('exposed_form', $this->getType(), array($this->view->storage->get('base_table'))),
'#default_value' => $exposed_form['type'],
......@@ -2021,6 +2035,8 @@ public function buildOptionsForm(&$form, &$form_state) {
$pager = $this->getOption('pager');
$form['pager']['type'] = array(
'#title' => t('Pager'),
'#title_display' => 'invisible',
'#type' => 'radios',
'#options' => views_fetch_plugin_names('pager', !$this->usesPager() ? 'basic' : NULL, array($this->view->storage->get('base_table'))),
'#default_value' => $pager['type'],
......
......@@ -218,6 +218,7 @@ public function buildOptionsForm(&$form, &$form_state) {
}
}
$form['displays'] = array(
'#title' => t('Displays'),
'#type' => 'checkboxes',
'#description' => t('The feed icon will be available only to the selected displays.'),
'#options' => $displays,
......
......@@ -305,6 +305,7 @@ public function buildOptionsForm(&$form, &$form_state) {
$form['#title'] .= t('The menu path or URL of this view');
$form['path'] = array(
'#type' => 'textfield',
'#title' => t('Path'),
'#description' => t('This view will be displayed by visiting this path on your site. You may use "%" in your URL to represent values that will be used for contextual filters: For example, "node/%/feed".'),
'#default_value' => $this->getOption('path'),
'#field_prefix' => '<span dir="ltr">' . url(NULL, array('absolute' => TRUE)),
......
......@@ -8,6 +8,7 @@
namespace Drupal\views\Plugin\views\filter;
use Drupal\views\Plugin\views\HandlerBase;
use Drupal\Component\Utility\String;
use Drupal\views\Plugin\views\display\DisplayPluginBase;
use Drupal\Component\Annotation\Plugin;
use Drupal\views\ViewExecutable;
......@@ -745,6 +746,7 @@ public function groupForm(&$form, &$form_state) {
$value = $this->options['group_info']['identifier'];
$form[$value] = array(
'#title' => String::checkPlain($this->options['group_info']['label']),
'#type' => $this->options['group_info']['widget'],
'#default_value' => $this->group_info,
'#options' => $groups,
......@@ -785,10 +787,6 @@ public function buildExposedForm(&$form, &$form_state) {
$this->operatorForm($form, $form_state);
$form[$operator] = $form['operator'];
if (isset($form[$operator]['#title'])) {
unset($form[$operator]['#title']);
}
$this->exposedTranslate($form[$operator], 'operator');
unset($form['operator']);
......@@ -954,7 +952,7 @@ protected function buildExposedFiltersGroupForm(&$form, &$form_state) {
// In each row, we have to display the operator form and the value from
// $row acts as a fake form to render each widget in a row.
$row = array();
$groups[$item_id] = '';
$groups[$item_id] = t('Grouping @id', array('@id' => $item_id));
$this->operatorForm($row, $form_state);
// Force the operator form to be a select box. Some handlers uses
// radios and they occupy a lot of space in a table row.
......@@ -1012,12 +1010,16 @@ protected function buildExposedFiltersGroupForm(&$form, &$form_state) {
// Per item group, we have a title that identifies it.
$form['group_info']['group_items'][$item_id] = array(
'title' => array(