Chris@17: 'some_format',
Chris@17: 'name' => 'Some format',
Chris@17: 'weight' => 0,
Chris@17: 'filters' => [
Chris@17: 'filter_html' => [
Chris@17: 'status' => 1,
Chris@17: 'settings' => [
Chris@17: 'allowed_html' => '
',
Chris@17: ],
Chris@17: ],
Chris@17: ],
Chris@17: ])->save();
Chris@17: Editor::create([
Chris@17: 'format' => 'some_format',
Chris@17: 'editor' => 'ckeditor',
Chris@17: ])->save();
Chris@17:
Chris@17: // Create the Article node type.
Chris@17: $this->drupalCreateContentType(['type' => 'article', 'name' => 'Article']);
Chris@17:
Chris@17: // Add "tags" vocabulary + field to the Article node type.
Chris@17: $vocabulary = Vocabulary::create([
Chris@17: 'name' => 'Tags',
Chris@17: 'vid' => 'tags',
Chris@17: ]);
Chris@17: $vocabulary->save();
Chris@17: $field_name = 'field_' . $vocabulary->id();
Chris@17: $handler_settings = [
Chris@17: 'target_bundles' => [
Chris@17: $vocabulary->id() => $vocabulary->id(),
Chris@17: ],
Chris@17: 'auto_create' => TRUE,
Chris@17: ];
Chris@17: $this->createEntityReferenceField('node', 'article', $field_name, 'Tags', 'taxonomy_term', 'default', $handler_settings, FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED);
Chris@17:
Chris@17: // Add formatter & widget for "tags" field.
Chris@17: \Drupal::entityTypeManager()
Chris@17: ->getStorage('entity_form_display')
Chris@17: ->load('node.article.default')
Chris@17: ->setComponent($field_name, ['type' => 'entity_reference_autocomplete_tags'])
Chris@17: ->save();
Chris@17: \Drupal::entityTypeManager()
Chris@17: ->getStorage('entity_view_display')
Chris@17: ->load('node.article.default')
Chris@17: ->setComponent($field_name, ['type' => 'entity_reference_label'])
Chris@17: ->save();
Chris@17:
Chris@17: $this->drupalPlaceBlock('page_title_block');
Chris@17: $this->drupalPlaceBlock('system_main_block');
Chris@17:
Chris@17: // Log in as a content author who can use Quick Edit and edit Articles.
Chris@17: $this->contentAuthorUser = $this->drupalCreateUser([
Chris@17: 'access contextual links',
Chris@17: 'access toolbar',
Chris@17: 'access in-place editing',
Chris@17: 'access content',
Chris@17: 'create article content',
Chris@17: 'edit any article content',
Chris@17: 'use text format some_format',
Chris@17: 'edit terms in tags',
Chris@17: 'administer blocks',
Chris@17: ]);
Chris@17: $this->drupalLogin($this->contentAuthorUser);
Chris@17: }
Chris@17:
Chris@17: /**
Chris@17: * Tests if an article node can be in-place edited with Quick Edit.
Chris@17: */
Chris@17: public function testArticleNode() {
Chris@17: $term = Term::create([
Chris@17: 'name' => 'foo',
Chris@17: 'vid' => 'tags',
Chris@17: ]);
Chris@17: $term->save();
Chris@17:
Chris@17: $node = $this->drupalCreateNode([
Chris@17: 'type' => 'article',
Chris@17: 'title' => t('My Test Node'),
Chris@17: 'body' => [
Chris@17: 'value' => 'Hello world!
I do not know what to say…
I wish I were eloquent.
',
Chris@17: 'format' => 'some_format',
Chris@17: ],
Chris@17: 'field_tags' => [
Chris@17: ['target_id' => $term->id()],
Chris@17: ],
Chris@17: ]);
Chris@17:
Chris@17: $this->drupalGet('node/' . $node->id());
Chris@17:
Chris@17: // Initial state.
Chris@17: $this->awaitQuickEditForEntity('node', 1);
Chris@17: $this->assertEntityInstanceStates([
Chris@17: 'node/1[0]' => 'closed',
Chris@17: ]);
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => 'inactive',
Chris@17: 'node/1/uid/en/full' => 'inactive',
Chris@17: 'node/1/created/en/full' => 'inactive',
Chris@17: 'node/1/body/en/full' => 'inactive',
Chris@17: 'node/1/field_tags/en/full' => 'inactive',
Chris@17: ]);
Chris@17:
Chris@17: // Start in-place editing of the article node.
Chris@17: $this->startQuickEditViaToolbar('node', 1, 0);
Chris@17: $this->assertEntityInstanceStates([
Chris@17: 'node/1[0]' => 'opened',
Chris@17: ]);
Chris@17: $this->assertQuickEditEntityToolbar((string) $node->label(), NULL);
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => 'candidate',
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'candidate',
Chris@17: ]);
Chris@17:
Chris@17: $assert_session = $this->assertSession();
Chris@17:
Chris@17: // Click the title field.
Chris@17: $this->click('[data-quickedit-field-id="node/1/title/en/full"].quickedit-candidate');
Chris@17: $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="title"]');
Chris@17: $this->assertQuickEditEntityToolbar((string) $node->label(), 'Title');
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => 'active',
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'candidate',
Chris@17: ]);
Chris@17: $this->assertEntityInstanceFieldMarkup('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => '[contenteditable="true"]',
Chris@17: ]);
Chris@17:
Chris@17: // Append something to the title.
Chris@17: $this->typeInPlainTextEditor('[data-quickedit-field-id="node/1/title/en/full"].quickedit-candidate', ' Llamas are awesome!');
Chris@17: $this->awaitEntityInstanceFieldState('node', 1, 0, 'title', 'en', 'changed');
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => 'changed',
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'candidate',
Chris@17: ]);
Chris@17:
Chris@17: // Click the body field.
Chris@17: hold_test_response(TRUE);
Chris@17: $this->click('[data-quickedit-entity-id="node/1"] .field--name-body');
Chris@17: $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
Chris@17: $this->assertQuickEditEntityToolbar((string) $node->label(), 'Body');
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => 'saving',
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'active',
Chris@17: 'node/1/field_tags/en/full' => 'candidate',
Chris@17: ]);
Chris@17: hold_test_response(FALSE);
Chris@17:
Chris@17: // Wait for CKEditor to load, then verify it has.
Chris@17: $this->assertJsCondition('CKEDITOR.status === "loaded"');
Chris@17: $this->assertEntityInstanceFieldMarkup('node', 1, 0, [
Chris@17: 'node/1/body/en/full' => '.cke_editable_inline',
Chris@17: 'node/1/field_tags/en/full' => ':not(.quickedit-editor-is-popup)',
Chris@17: ]);
Chris@17: $this->assertSession()->elementExists('css', '#quickedit-entity-toolbar .quickedit-toolgroup.wysiwyg-main > .cke_chrome .cke_top[role="presentation"] .cke_toolbar[role="toolbar"] .cke_toolgroup[role="presentation"] > .cke_button[title~="Bold"][role="button"]');
Chris@17:
Chris@17: // Wait for the validating & saving of the title to complete.
Chris@17: $this->awaitEntityInstanceFieldState('node', 1, 0, 'title', 'en', 'candidate');
Chris@17:
Chris@17: // Click the tags field.
Chris@17: hold_test_response(TRUE);
Chris@17: $this->click('[data-quickedit-field-id="node/1/field_tags/en/full"]');
Chris@17: $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="tags"]');
Chris@17: $this->assertQuickEditEntityToolbar((string) $node->label(), 'Tags');
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'activating',
Chris@17: 'node/1/title/en/full' => 'candidate',
Chris@17: ]);
Chris@17: $this->assertEntityInstanceFieldMarkup('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => '.quickedit-changed',
Chris@17: 'node/1/field_tags/en/full' => '.quickedit-editor-is-popup',
Chris@17: ]);
Chris@17: // Assert the "Loading…" popup appears.
Chris@17: $this->assertSession()->elementExists('css', '.quickedit-form-container > .quickedit-form[role="dialog"] > .placeholder');
Chris@17: hold_test_response(FALSE);
Chris@17: // Wait for the form to load.
Chris@17: $this->assertJsCondition('document.querySelector(\'.quickedit-form-container > .quickedit-form[role="dialog"] > .placeholder\') === null');
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'active',
Chris@17: 'node/1/title/en/full' => 'candidate',
Chris@17: ]);
Chris@17:
Chris@17: // Enter an additional tag.
Chris@17: $this->typeInFormEditorTextInputField('field_tags[target_id]', 'foo, bar');
Chris@17: $this->awaitEntityInstanceFieldState('node', 1, 0, 'field_tags', 'en', 'changed');
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'changed',
Chris@17: 'node/1/title/en/full' => 'candidate',
Chris@17: ]);
Chris@17:
Chris@17: // Click 'Save'.
Chris@17: hold_test_response(TRUE);
Chris@17: $this->saveQuickEdit();
Chris@17: $this->assertEntityInstanceStates([
Chris@17: 'node/1[0]' => 'committing',
Chris@17: ]);
Chris@17: $this->assertEntityInstanceFieldStates('node', 1, 0, [
Chris@17: 'node/1/uid/en/full' => 'candidate',
Chris@17: 'node/1/created/en/full' => 'candidate',
Chris@17: 'node/1/body/en/full' => 'candidate',
Chris@17: 'node/1/field_tags/en/full' => 'saving',
Chris@17: 'node/1/title/en/full' => 'candidate',
Chris@17: ]);
Chris@17: hold_test_response(FALSE);
Chris@17: $this->assertEntityInstanceFieldMarkup('node', 1, 0, [
Chris@17: 'node/1/title/en/full' => '.quickedit-changed',
Chris@17: 'node/1/field_tags/en/full' => '.quickedit-changed',
Chris@17: ]);
Chris@17:
Chris@17: // Wait for the saving of the tags field to complete.
Chris@17: $this->assertJsCondition("Drupal.quickedit.collections.entities.get('node/1[0]').get('state') === 'closed'");
Chris@17: $this->assertEntityInstanceStates([
Chris@17: 'node/1[0]' => 'closed',
Chris@17: ]);
Chris@17: }
Chris@17:
Chris@17: /**
Chris@17: * Tests if a custom can be in-place edited with Quick Edit.
Chris@17: */
Chris@17: public function testCustomBlock() {
Chris@17: $block_content_type = BlockContentType::create([
Chris@17: 'id' => 'basic',
Chris@17: 'label' => 'basic',
Chris@17: 'revision' => FALSE,
Chris@17: ]);
Chris@17: $block_content_type->save();
Chris@17: block_content_add_body_field($block_content_type->id());
Chris@17:
Chris@17: $block_content = BlockContent::create([
Chris@17: 'info' => 'Llama',
Chris@17: 'type' => 'basic',
Chris@17: 'body' => [
Chris@17: 'value' => 'The name "llama" was adopted by European settlers from native Peruvians.',
Chris@17: 'format' => 'some_format',
Chris@17: ],
Chris@17: ]);
Chris@17: $block_content->save();
Chris@17: $this->drupalPlaceBlock('block_content:' . $block_content->uuid(), [
Chris@17: 'label' => 'My custom block!',
Chris@17: ]);
Chris@17:
Chris@17: $this->drupalGet('');
Chris@17:
Chris@17: // Initial state.
Chris@17: $this->awaitQuickEditForEntity('block_content', 1);
Chris@17: $this->assertEntityInstanceStates([
Chris@17: 'block_content/1[0]' => 'closed',
Chris@17: ]);
Chris@17:
Chris@17: // Start in-place editing of the article node.
Chris@17: $this->startQuickEditViaToolbar('block_content', 1, 0);
Chris@17: $this->assertEntityInstanceStates([
Chris@17: 'block_content/1[0]' => 'opened',
Chris@17: ]);
Chris@17: $this->assertQuickEditEntityToolbar((string) $block_content->label(), 'Body');
Chris@17: $this->assertEntityInstanceFieldStates('block_content', 1, 0, [
Chris@17: 'block_content/1/body/en/full' => 'highlighted',
Chris@17: ]);
Chris@17:
Chris@17: // Click the body field.
Chris@17: $this->click('[data-quickedit-entity-id="block_content/1"] .field--name-body');
Chris@17: $assert_session = $this->assertSession();
Chris@17: $assert_session->waitForElement('css', '.quickedit-toolbar-field div[id*="body"]');
Chris@17: $this->assertQuickEditEntityToolbar((string) $block_content->label(), 'Body');
Chris@17: $this->assertEntityInstanceFieldStates('block_content', 1, 0, [
Chris@17: 'block_content/1/body/en/full' => 'active',
Chris@17: ]);
Chris@17:
Chris@17: // Wait for CKEditor to load, then verify it has.
Chris@17: $this->assertJsCondition('CKEDITOR.status === "loaded"');
Chris@17: $this->assertEntityInstanceFieldMarkup('block_content', 1, 0, [
Chris@17: 'block_content/1/body/en/full' => '.cke_editable_inline',
Chris@17: ]);
Chris@17: $this->assertSession()->elementExists('css', '#quickedit-entity-toolbar .quickedit-toolgroup.wysiwyg-main > .cke_chrome .cke_top[role="presentation"] .cke_toolbar[role="toolbar"] .cke_toolgroup[role="presentation"] > .cke_button[title~="Bold"][role="button"]');
Chris@17: }
Chris@17:
Chris@17: }