entity_embed.module | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/entity_embed.module b/entity_embed.module index 26f3318..c1d8c16 100644 --- a/entity_embed.module +++ b/entity_embed.module @@ -254,3 +254,61 @@ function entity_embed_field_widget_form_alter(&$element, FormStateInterface $for } } } + +/** + * Implements hook_form_views_form_media_library_widget_alter(). + * + * @see media_library.module + */ +function entity_embed_form_views_form_media_library_widget_alter(&$form, FormStateInterface $form_state, $context) { + // When the Media Library is triggered from the text editor, override the + // submit handler. + if (!$form_state->has('is_triggered_by_entity_embed_in_editor')) { + $form_state->set('is_triggered_by_entity_embed_in_editor', array_key_exists('editor_object', $form_state->getUserInput())); + $form_state->setCached(TRUE); + } + + + if ($form_state->get('is_triggered_by_entity_embed_in_editor')) { + $form['#attached']['library'][] = 'editor/drupal.editor.dialog'; + $form['actions']['submit']['#ajax']['callback'] = 'entity_embed_form_views_form_media_library_widget_ajax_update'; + } +} + +/** + * Submit handler for the media library select form. + * + * Modified version of MediaLibrarySelectForm::updateWidget() until + * https://www.drupal.org/project/drupal/issues/3044649 is available. + * + * @param array $form + * An associative array containing the structure of the form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current state of the form. + * + * @return \Drupal\Core\Ajax\AjaxResponse + * A command to send the selection to the text editor. + * + * @see \Drupal\media_library\Plugin\views\field\MediaLibrarySelectForm::updateWidget + * @see https://www.drupal.org/project/drupal/issues/3044649 + */ +function entity_embed_form_views_form_media_library_widget_ajax_update(array &$form, FormStateInterface $form_state) { + $field_id = $form_state->getTriggeringElement()['#field_id']; + $selected_media_id = $form_state->getValue($field_id, []); + $selected_media = \Drupal\media\Entity\Media::load($selected_media_id); + + $response = new \Drupal\Core\Ajax\AjaxResponse(); + $values = [ + 'attributes' => [ + 'data-entity-type' => 'media', + 'data-entity-uuid' => $selected_media->uuid(), + 'data-entity-embed-display' => 'entity_reference:entity_reference_entity_view', + 'data-entity-embed-display-settings' => 'teaser', + 'data-embed-button' => 'media', + ], + ]; + $response->addCommand(new \Drupal\editor\Ajax\EditorDialogSave($values)); + $response->addCommand(new \Drupal\Core\Ajax\CloseDialogCommand()); + + return $response; +}