Browse Source
* add integer_weight_selector * test integer weight drag-n-drop * move reorder_children view to corepull/729/head
Seth Shaw
5 years ago
committed by
dannylamb
9 changed files with 912 additions and 0 deletions
@ -0,0 +1,25 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Provide Views data for integer-weight fields. |
||||
*/ |
||||
|
||||
/** |
||||
* Implements hook_views_data_alter(). |
||||
*/ |
||||
function islandora_views_data_alter(&$data) { |
||||
// For now only support Nodes. |
||||
$fields = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions('node'); |
||||
foreach ($fields as $field => $field_storage_definition) { |
||||
if ($field_storage_definition->getType() == 'integer' && strpos($field, "field_") === 0) { |
||||
$data['node__' . $field][$field . '_value']['field'] = $data['node__' . $field][$field]['field']; |
||||
$data['node__' . $field][$field]['title'] = t('Integer Weight Selector (@field)', [ |
||||
'@field' => $field, |
||||
]); |
||||
$data['node__' . $field][$field]['help'] = t('Provides a drag-n-drop reordering of integer-based weight fields.'); |
||||
$data['node__' . $field][$field]['title short'] = t('Integer weight selector'); |
||||
$data['node__' . $field][$field]['field']['id'] = 'integer_weight_selector'; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,271 @@
|
||||
langcode: en |
||||
status: true |
||||
dependencies: |
||||
enforced: |
||||
module: |
||||
- islandora_core_feature |
||||
module: |
||||
- islandora |
||||
- node |
||||
- user |
||||
id: reorder_children |
||||
label: 'Reorder children' |
||||
module: views |
||||
description: 'Manage members belonging to a piece of content' |
||||
tag: '' |
||||
base_table: node_field_data |
||||
base_field: nid |
||||
core: 8.x |
||||
display: |
||||
default: |
||||
display_plugin: default |
||||
id: default |
||||
display_title: Master |
||||
position: 0 |
||||
display_options: |
||||
access: |
||||
type: perm |
||||
options: |
||||
perm: 'manage members' |
||||
cache: |
||||
type: tag |
||||
options: { } |
||||
query: |
||||
type: views_query |
||||
options: |
||||
disable_sql_rewrite: false |
||||
distinct: false |
||||
replica: false |
||||
query_comment: '' |
||||
query_tags: { } |
||||
exposed_form: |
||||
type: basic |
||||
options: |
||||
submit_button: Apply |
||||
reset_button: false |
||||
reset_button_label: Reset |
||||
exposed_sorts_label: 'Sort by' |
||||
expose_sort_order: true |
||||
sort_asc_label: Asc |
||||
sort_desc_label: Desc |
||||
pager: |
||||
type: full |
||||
options: |
||||
items_per_page: 10 |
||||
offset: 0 |
||||
id: 0 |
||||
total_pages: null |
||||
tags: |
||||
previous: ‹‹ |
||||
next: ›› |
||||
first: '« First' |
||||
last: 'Last »' |
||||
expose: |
||||
items_per_page: true |
||||
items_per_page_label: 'Items per page' |
||||
items_per_page_options: '10, 25, 50, 100' |
||||
items_per_page_options_all: true |
||||
items_per_page_options_all_label: '- All -' |
||||
offset: false |
||||
offset_label: Offset |
||||
quantity: 9 |
||||
style: |
||||
type: table |
||||
row: |
||||
type: fields |
||||
fields: |
||||
title: |
||||
id: title |
||||
table: node_field_data |
||||
field: title |
||||
entity_type: node |
||||
entity_field: title |
||||
alter: |
||||
alter_text: false |
||||
make_link: false |
||||
absolute: false |
||||
trim: false |
||||
word_boundary: false |
||||
ellipsis: false |
||||
strip_tags: false |
||||
html: false |
||||
hide_empty: false |
||||
empty_zero: false |
||||
settings: |
||||
link_to_entity: true |
||||
plugin_id: field |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
label: Title |
||||
exclude: false |
||||
element_type: '' |
||||
element_class: '' |
||||
element_label_type: '' |
||||
element_label_class: '' |
||||
element_label_colon: true |
||||
element_wrapper_type: '' |
||||
element_wrapper_class: '' |
||||
element_default_classes: true |
||||
empty: '' |
||||
hide_alter_empty: true |
||||
click_sort_column: value |
||||
type: string |
||||
group_column: value |
||||
group_columns: { } |
||||
group_rows: true |
||||
delta_limit: 0 |
||||
delta_offset: 0 |
||||
delta_reversed: false |
||||
delta_first_last: false |
||||
multi_type: separator |
||||
separator: ', ' |
||||
field_api_classes: false |
||||
field_weight: |
||||
id: field_weight |
||||
table: node__field_weight |
||||
field: field_weight |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
label: '' |
||||
exclude: false |
||||
alter: |
||||
alter_text: false |
||||
text: '' |
||||
make_link: false |
||||
path: '' |
||||
absolute: false |
||||
external: false |
||||
replace_spaces: false |
||||
path_case: none |
||||
trim_whitespace: false |
||||
alt: '' |
||||
rel: '' |
||||
link_class: '' |
||||
prefix: '' |
||||
suffix: '' |
||||
target: '' |
||||
nl2br: false |
||||
max_length: 0 |
||||
word_boundary: true |
||||
ellipsis: true |
||||
more_link: false |
||||
more_link_text: '' |
||||
more_link_path: '' |
||||
strip_tags: false |
||||
trim: false |
||||
preserve_tags: '' |
||||
html: false |
||||
element_type: '' |
||||
element_class: '' |
||||
element_label_type: '' |
||||
element_label_class: '' |
||||
element_label_colon: false |
||||
element_wrapper_type: '' |
||||
element_wrapper_class: '' |
||||
element_default_classes: true |
||||
empty: '' |
||||
hide_empty: false |
||||
empty_zero: false |
||||
hide_alter_empty: true |
||||
plugin_id: integer_weight_selector |
||||
filters: { } |
||||
sorts: |
||||
field_weight_value: |
||||
id: field_weight_value |
||||
table: node__field_weight |
||||
field: field_weight_value |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
order: ASC |
||||
exposed: false |
||||
expose: |
||||
label: '' |
||||
plugin_id: standard |
||||
title: 'Reorder children' |
||||
header: { } |
||||
footer: { } |
||||
empty: { } |
||||
relationships: { } |
||||
arguments: |
||||
field_member_of_target_id: |
||||
id: field_member_of_target_id |
||||
table: node__field_member_of |
||||
field: field_member_of_target_id |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
default_action: default |
||||
exception: |
||||
value: all |
||||
title_enable: false |
||||
title: All |
||||
title_enable: false |
||||
title: '' |
||||
default_argument_type: node |
||||
default_argument_options: { } |
||||
default_argument_skip_url: false |
||||
summary_options: |
||||
base_path: '' |
||||
count: true |
||||
items_per_page: 25 |
||||
override: false |
||||
summary: |
||||
sort_order: asc |
||||
number_of_records: 0 |
||||
format: default_summary |
||||
specify_validation: true |
||||
validate: |
||||
type: 'entity:node' |
||||
fail: 'not found' |
||||
validate_options: |
||||
operation: view |
||||
multiple: 0 |
||||
bundles: { } |
||||
access: false |
||||
break_phrase: false |
||||
not: false |
||||
plugin_id: numeric |
||||
display_extenders: { } |
||||
filter_groups: |
||||
operator: AND |
||||
groups: { } |
||||
cache_metadata: |
||||
max-age: -1 |
||||
contexts: |
||||
- 'languages:language_content' |
||||
- 'languages:language_interface' |
||||
- url |
||||
- url.query_args |
||||
- 'user.node_grants:view' |
||||
- user.permissions |
||||
tags: { } |
||||
page_1: |
||||
display_plugin: page |
||||
id: page_1 |
||||
display_title: Page |
||||
position: 1 |
||||
display_options: |
||||
display_extenders: { } |
||||
path: node/%node/reorder |
||||
menu: |
||||
type: tab |
||||
title: 'Reorder Children' |
||||
description: '' |
||||
expanded: false |
||||
parent: '' |
||||
weight: 0 |
||||
context: '0' |
||||
menu_name: main |
||||
cache_metadata: |
||||
max-age: -1 |
||||
contexts: |
||||
- 'languages:language_content' |
||||
- 'languages:language_interface' |
||||
- url |
||||
- url.query_args |
||||
- 'user.node_grants:view' |
||||
- user.permissions |
||||
tags: { } |
@ -0,0 +1,101 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\islandora\Plugin\views\field; |
||||
|
||||
use Drupal\views\Plugin\views\field\FieldPluginBase; |
||||
use Drupal\Core\Form\FormStateInterface; |
||||
use Drupal\views\ResultRow; |
||||
use Drupal\views\Render\ViewsRenderPipelineMarkup; |
||||
|
||||
/** |
||||
* Field handler to present a weight selector element. |
||||
* |
||||
* A port of the weight module's weight selector element |
||||
* to support an unsigned integer using the values found |
||||
* in the result set. |
||||
* |
||||
* @ingroup views_field_handlers |
||||
* |
||||
* @ViewsField("integer_weight_selector") |
||||
*/ |
||||
class IntegerWeightSelector extends FieldPluginBase { |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function render(ResultRow $values) { |
||||
return ViewsRenderPipelineMarkup::create('<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->'); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function viewsForm(array &$form, FormStateInterface $form_state) { |
||||
// The view is empty, abort. |
||||
if (empty($this->view->result)) { |
||||
return; |
||||
} |
||||
|
||||
$form[$this->options['id']] = [ |
||||
'#tree' => TRUE, |
||||
]; |
||||
|
||||
// Use the existing values of this result set to populate the options. |
||||
$options = []; |
||||
foreach ($this->view->result as $row_index => $row) { |
||||
$options[$this->getValue($row)] = $this->getValue($row); |
||||
} |
||||
|
||||
// Now that we have all the available weight values, populate the forms. |
||||
foreach ($this->view->result as $row_index => $row) { |
||||
$entity = $row->_entity; |
||||
$field_langcode = $entity->getEntityTypeId() . '__' . $this->field . '_langcode'; |
||||
|
||||
$form[$this->options['id']][$row_index]['weight'] = [ |
||||
'#type' => 'select', |
||||
'#options' => $options, |
||||
'#default_value' => $this->getValue($row), |
||||
'#attributes' => ['class' => ['weight-selector']], |
||||
]; |
||||
|
||||
$form[$this->options['id']][$row_index]['entity'] = [ |
||||
'#type' => 'value', |
||||
'#value' => $entity, |
||||
]; |
||||
|
||||
$form[$this->options['id']][$row_index]['langcode'] = [ |
||||
'#type' => 'value', |
||||
'#value' => $row->{$field_langcode}, |
||||
]; |
||||
} |
||||
|
||||
$form['views_field'] = [ |
||||
'#type' => 'value', |
||||
'#value' => $this->field, |
||||
]; |
||||
|
||||
$form['#action'] = \Drupal::request()->getRequestUri(); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function viewsFormSubmit(array &$form, FormStateInterface $form_state) { |
||||
$field_name = $form_state->getValue('views_field'); |
||||
$rows = $form_state->getValue($field_name); |
||||
|
||||
foreach ($rows as $row) { |
||||
if ($row['langcode']) { |
||||
$entity = $row['entity']->getTranslation($row['langcode']); |
||||
} |
||||
else { |
||||
$entity = $row['entity']; |
||||
} |
||||
if ($entity && $entity->hasField($field_name)) { |
||||
$entity->set($field_name, $row['weight']); |
||||
$entity->save(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,9 @@
|
||||
name: 'Integer weight test views' |
||||
type: module |
||||
description: 'Provides default views for integer weight views tests.' |
||||
package: Testing |
||||
core: 8.x |
||||
dependencies: |
||||
- drupal:node |
||||
- drupal:views |
||||
- drupal:language |
@ -0,0 +1,251 @@
|
||||
langcode: en |
||||
status: true |
||||
dependencies: |
||||
config: |
||||
- node.type.repo_item |
||||
module: |
||||
- node |
||||
- user |
||||
id: test_integer_weight |
||||
label: 'test integer weight' |
||||
module: views |
||||
description: '' |
||||
tag: '' |
||||
base_table: node_field_data |
||||
base_field: nid |
||||
core: 8.x |
||||
display: |
||||
default: |
||||
display_plugin: default |
||||
id: default |
||||
display_title: Master |
||||
position: 0 |
||||
display_options: |
||||
access: |
||||
type: perm |
||||
options: |
||||
perm: 'access content' |
||||
cache: |
||||
type: tag |
||||
options: { } |
||||
query: |
||||
type: views_query |
||||
options: |
||||
disable_sql_rewrite: false |
||||
distinct: false |
||||
replica: false |
||||
query_comment: '' |
||||
query_tags: { } |
||||
exposed_form: |
||||
type: basic |
||||
options: |
||||
submit_button: Apply |
||||
reset_button: false |
||||
reset_button_label: Reset |
||||
exposed_sorts_label: 'Sort by' |
||||
expose_sort_order: true |
||||
sort_asc_label: Asc |
||||
sort_desc_label: Desc |
||||
pager: |
||||
type: mini |
||||
options: |
||||
items_per_page: 10 |
||||
offset: 0 |
||||
id: 0 |
||||
total_pages: null |
||||
expose: |
||||
items_per_page: false |
||||
items_per_page_label: 'Items per page' |
||||
items_per_page_options: '5, 10, 25, 50' |
||||
items_per_page_options_all: false |
||||
items_per_page_options_all_label: '- All -' |
||||
offset: false |
||||
offset_label: Offset |
||||
tags: |
||||
previous: ‹‹ |
||||
next: ›› |
||||
style: |
||||
type: table |
||||
row: |
||||
type: fields |
||||
fields: |
||||
title: |
||||
id: title |
||||
table: node_field_data |
||||
field: title |
||||
entity_type: node |
||||
entity_field: title |
||||
alter: |
||||
alter_text: false |
||||
make_link: false |
||||
absolute: false |
||||
trim: false |
||||
word_boundary: false |
||||
ellipsis: false |
||||
strip_tags: false |
||||
html: false |
||||
hide_empty: false |
||||
empty_zero: false |
||||
settings: |
||||
link_to_entity: true |
||||
plugin_id: field |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
label: Title |
||||
exclude: false |
||||
element_type: '' |
||||
element_class: '' |
||||
element_label_type: '' |
||||
element_label_class: '' |
||||
element_label_colon: true |
||||
element_wrapper_type: '' |
||||
element_wrapper_class: '' |
||||
element_default_classes: true |
||||
empty: '' |
||||
hide_alter_empty: true |
||||
click_sort_column: value |
||||
type: string |
||||
group_column: value |
||||
group_columns: { } |
||||
group_rows: true |
||||
delta_limit: 0 |
||||
delta_offset: 0 |
||||
delta_reversed: false |
||||
delta_first_last: false |
||||
multi_type: separator |
||||
separator: ', ' |
||||
field_api_classes: false |
||||
field_integer_weight: |
||||
id: field_integer_weight |
||||
table: node__field_integer_weight |
||||
field: field_integer_weight |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
label: 'Integer weight selector (field_integer_weight)' |
||||
exclude: false |
||||
alter: |
||||
alter_text: false |
||||
text: '' |
||||
make_link: false |
||||
path: '' |
||||
absolute: false |
||||
external: false |
||||
replace_spaces: false |
||||
path_case: none |
||||
trim_whitespace: false |
||||
alt: '' |
||||
rel: '' |
||||
link_class: '' |
||||
prefix: '' |
||||
suffix: '' |
||||
target: '' |
||||
nl2br: false |
||||
max_length: 0 |
||||
word_boundary: true |
||||
ellipsis: true |
||||
more_link: false |
||||
more_link_text: '' |
||||
more_link_path: '' |
||||
strip_tags: false |
||||
trim: false |
||||
preserve_tags: '' |
||||
html: false |
||||
element_type: '' |
||||
element_class: '' |
||||
element_label_type: '' |
||||
element_label_class: '' |
||||
element_label_colon: true |
||||
element_wrapper_type: '' |
||||
element_wrapper_class: '' |
||||
element_default_classes: true |
||||
empty: '' |
||||
hide_empty: false |
||||
empty_zero: false |
||||
hide_alter_empty: true |
||||
range: '20' |
||||
plugin_id: integer_weight_selector |
||||
filters: |
||||
status: |
||||
value: '1' |
||||
table: node_field_data |
||||
field: status |
||||
plugin_id: boolean |
||||
entity_type: node |
||||
entity_field: status |
||||
id: status |
||||
expose: |
||||
operator: '' |
||||
group: 1 |
||||
type: |
||||
id: type |
||||
table: node_field_data |
||||
field: type |
||||
value: |
||||
repo_item:repo_item |
||||
entity_type: node |
||||
entity_field: type |
||||
plugin_id: bundle |
||||
sorts: |
||||
created: |
||||
id: created |
||||
table: node_field_data |
||||
field: created |
||||
order: DESC |
||||
entity_type: node |
||||
entity_field: created |
||||
plugin_id: date |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
exposed: false |
||||
expose: |
||||
label: '' |
||||
granularity: second |
||||
field_integer_weight_value: |
||||
id: field_integer_weight_value |
||||
table: node__field_integer_weight |
||||
field: field_integer_weight_value |
||||
relationship: none |
||||
group_type: group |
||||
admin_label: '' |
||||
order: ASC |
||||
exposed: false |
||||
expose: |
||||
label: '' |
||||
plugin_id: standard |
||||
title: 'test weight' |
||||
header: { } |
||||
footer: { } |
||||
empty: { } |
||||
relationships: { } |
||||
arguments: { } |
||||
display_extenders: { } |
||||
cache_metadata: |
||||
max-age: -1 |
||||
contexts: |
||||
- 'languages:language_content' |
||||
- 'languages:language_interface' |
||||
- url.query_args |
||||
- 'user.node_grants:view' |
||||
- user.permissions |
||||
tags: { } |
||||
page_1: |
||||
display_plugin: page |
||||
id: page_1 |
||||
display_title: Page |
||||
position: 1 |
||||
display_options: |
||||
display_extenders: { } |
||||
path: test-integer-weight |
||||
cache_metadata: |
||||
max-age: -1 |
||||
contexts: |
||||
- 'languages:language_content' |
||||
- 'languages:language_interface' |
||||
- url.query_args |
||||
- 'user.node_grants:view' |
||||
- user.permissions |
||||
tags: { } |
||||
|
@ -0,0 +1,201 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\Tests\islandora\FunctionalJavascript; |
||||
|
||||
use Behat\Mink\Exception\ExpectationException; |
||||
use Drupal\FunctionalJavascriptTests\WebDriverTestBase; |
||||
use Drupal\Tests\field_ui\Traits\FieldUiTestTrait; |
||||
use Drupal\field\Entity\FieldStorageConfig; |
||||
use Drupal\field\Entity\FieldConfig; |
||||
use Drupal\node\Entity\Node; |
||||
|
||||
/** |
||||
* Test integer weight selector. |
||||
* |
||||
* Taken from the weight module with some edits. |
||||
* |
||||
* @group islandora |
||||
*/ |
||||
class IntegerWeightTest extends WebDriverTestBase { |
||||
|
||||
use FieldUiTestTrait; |
||||
|
||||
/** |
||||
* Modules to enable. |
||||
* |
||||
* @var array |
||||
*/ |
||||
protected static $modules = [ |
||||
'node', |
||||
'views', |
||||
'field_ui', |
||||
'integer_weight_test_views', |
||||
]; |
||||
|
||||
/** |
||||
* Name of the field. |
||||
* |
||||
* Used in the test view; change there |
||||
* if changed here. |
||||
* |
||||
* @var string |
||||
*/ |
||||
protected static $fieldName = 'field_integer_weight'; |
||||
|
||||
/** |
||||
* Type of the field. |
||||
* |
||||
* @var string |
||||
*/ |
||||
protected static $fieldType = 'integer'; |
||||
|
||||
/** |
||||
* User that can edit content types. |
||||
* |
||||
* @var \Drupal\user\UserInterface |
||||
*/ |
||||
protected $adminUser; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public static $testViews = [ |
||||
'test_integer_weight', |
||||
]; |
||||
|
||||
/** |
||||
* Array of nodes to test with. |
||||
* |
||||
* @var array |
||||
*/ |
||||
public $nodes = []; |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$this->adminUser = $this->drupalCreateUser( |
||||
[ |
||||
'administer content types', |
||||
'administer node fields', |
||||
'administer node display', |
||||
] |
||||
); |
||||
|
||||
// Create dummy repo_item type to sort (since we don't have |
||||
// repository_object without islandora_defaults). |
||||
$type = $this->container->get('entity_type.manager')->getStorage('node_type') |
||||
->create([ |
||||
'type' => 'repo_item', |
||||
'name' => 'Repository Item', |
||||
]); |
||||
$type->save(); |
||||
$this->container->get('router.builder')->rebuild(); |
||||
|
||||
$fieldStorage = FieldStorageConfig::create([ |
||||
'fieldName' => static::$fieldName, |
||||
'entity_type' => 'node', |
||||
'type' => static::$fieldType, |
||||
]); |
||||
$fieldStorage->save(); |
||||
$field = FieldConfig::create([ |
||||
'field_storage' => $fieldStorage, |
||||
'bundle' => 'repo_item', |
||||
'required' => FALSE, |
||||
]); |
||||
$field->save(); |
||||
|
||||
for ($n = 1; $n <= 3; $n++) { |
||||
$node = $this->drupalCreateNode([ |
||||
'type' => 'repo_item', |
||||
'title' => "Item $n", |
||||
static::$fieldName => $n, |
||||
]); |
||||
$node->save(); |
||||
$this->nodes[] = $node; |
||||
} |
||||
|
||||
ViewsTestData::createTestViews(get_class($this), ['integer_weight_test_views']); |
||||
} |
||||
|
||||
/** |
||||
* Test integer weight selector. |
||||
*/ |
||||
public function testIntegerWeightSelector() { |
||||
$this->drupalGet('test-integer-weight'); |
||||
$page = $this->getSession()->getPage(); |
||||
|
||||
$weight_select1 = $page->findField("field_integer_weight[0][weight]"); |
||||
$weight_select2 = $page->findField("field_integer_weight[1][weight]"); |
||||
$weight_select3 = $page->findField("field_integer_weight[2][weight]"); |
||||
|
||||
// Are row weight selects hidden? |
||||
$this->assertFalse($weight_select1->isVisible()); |
||||
$this->assertFalse($weight_select2->isVisible()); |
||||
$this->assertFalse($weight_select3->isVisible()); |
||||
|
||||
// Check that 'Item 2' is feavier than 'Item 1'. |
||||
$this->assertGreaterThan($weight_select1->getValue(), $weight_select2->getValue()); |
||||
|
||||
// Does 'Item 1' preced 'Item 2'? |
||||
$this->assertOrderInPage(['Item 1', 'Item 2']); |
||||
|
||||
// No changes yet, so no warning... |
||||
$this->assertSession()->pageTextNotContains('You have unsaved changes.'); |
||||
|
||||
// Drag and drop 'Item 1' over 'Item 2'. |
||||
$dragged = $this->xpath("//tr[@class='draggable'][1]//a[@class='tabledrag-handle']")[0]; |
||||
$target = $this->xpath("//tr[@class='draggable'][2]//a[@class='tabledrag-handle']")[0]; |
||||
$dragged->dragTo($target); |
||||
|
||||
// Pause for javascript to do it's thing. |
||||
$this->assertJsCondition('jQuery(".tabledrag-changed-warning").is(":visible")'); |
||||
|
||||
// Look for unsaved changes warning. |
||||
$this->assertSession()->pageTextContains('You have unsaved changes.'); |
||||
|
||||
// 'Item 2' should now preced 'Item 1'. |
||||
$this->assertOrderInPage(['Item 2', 'Item 1']); |
||||
|
||||
$this->submitForm([], 'Save'); |
||||
|
||||
// Form refresh should reflect the new order still. |
||||
$this->assertOrderInPage(['Item 2', 'Item 1']); |
||||
|
||||
// Ensure the stored values reflect the new order. |
||||
$item1 = Node::load($this->nodes[0]->id()); |
||||
$item2 = Node::load($this->nodes[1]->id()); |
||||
$this->assertGreaterThan($item2->field_integer_weight->getString(), $item1->field_integer_weight->getString()); |
||||
} |
||||
|
||||
/** |
||||
* Asserts that several pieces of markup are in a given order in the page. |
||||
* |
||||
* Taken verbatim from the weight module. |
||||
* |
||||
* @param string[] $items |
||||
* An ordered list of strings. |
||||
* |
||||
* @throws \Behat\Mink\Exception\ExpectationException |
||||
* When any of the given string is not found. |
||||
*/ |
||||
protected function assertOrderInPage(array $items) { |
||||
$session = $this->getSession(); |
||||
$text = $session->getPage()->getHtml(); |
||||
$strings = []; |
||||
foreach ($items as $item) { |
||||
if (($pos = strpos($text, $item)) === FALSE) { |
||||
throw new ExpectationException("Cannot find '$item' in the page", $session->getDriver()); |
||||
} |
||||
$strings[$pos] = $item; |
||||
} |
||||
ksort($strings); |
||||
$ordered = implode(', ', array_map(function ($item) { |
||||
return "'$item'"; |
||||
}, $items)); |
||||
$this->assertSame($items, array_values($strings), "Found strings, ordered as: $ordered."); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue