X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fdropzonejs%2Fmodules%2Feb_widget%2Fsrc%2FPlugin%2FEntityBrowser%2FWidget%2FInlineEntityFormMediaWidget.php;fp=web%2Fmodules%2Fcontrib%2Fdropzonejs%2Fmodules%2Feb_widget%2Fsrc%2FPlugin%2FEntityBrowser%2FWidget%2FInlineEntityFormMediaWidget.php;h=3b4a212e6f80ffc36e14c695f1c73b3fcb97d6e0;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website
diff --git a/web/modules/contrib/dropzonejs/modules/eb_widget/src/Plugin/EntityBrowser/Widget/InlineEntityFormMediaWidget.php b/web/modules/contrib/dropzonejs/modules/eb_widget/src/Plugin/EntityBrowser/Widget/InlineEntityFormMediaWidget.php
new file mode 100644
index 000000000..3b4a212e6
--- /dev/null
+++ b/web/modules/contrib/dropzonejs/modules/eb_widget/src/Plugin/EntityBrowser/Widget/InlineEntityFormMediaWidget.php
@@ -0,0 +1,273 @@
+entityDisplayRepository = $entity_display_repository;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+ return new static(
+ $configuration,
+ $plugin_id,
+ $plugin_definition,
+ $container->get('event_dispatcher'),
+ $container->get('entity_type.manager'),
+ $container->get('plugin.manager.entity_browser.widget_validation'),
+ $container->get('dropzonejs.upload_save'),
+ $container->get('current_user'),
+ $container->get('token'),
+ $container->get('module_handler'),
+ $container->get('entity_display.repository')
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function defaultConfiguration() {
+ return [
+ 'form_mode' => 'default',
+ ] + parent::defaultConfiguration();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getForm(array &$original_form, FormStateInterface $form_state, array $additional_widget_parameters) {
+ $form = parent::getForm($original_form, $form_state, $additional_widget_parameters);
+
+ // @todo Remove this when/if EB provides a way to define dependencies.
+ if (!$this->moduleHandler->moduleExists('inline_entity_form')) {
+ return [
+ '#type' => 'container',
+ 'error' => [
+ '#markup' => $this->t('Missing requirement: in order to use this widget you have to install Inline entity form module first'),
+ ],
+ ];
+ }
+
+ $form['#attached']['library'][] = 'dropzonejs_eb_widget/ief_edit';
+ $form['edit'] = [
+ '#type' => 'submit',
+ '#value' => $this->t('Edit'),
+ '#attributes' => [
+ 'class' => ['js-hide'],
+ ],
+ '#ajax' => [
+ 'wrapper' => 'ief-dropzone-upload',
+ 'callback' => [static::class, 'onEdit'],
+ 'effect' => 'fade',
+ ],
+ '#submit' => [
+ [$this, 'submitEdit'],
+ ],
+ ];
+
+ $form['entities']['#prefix'] = '
';
+ $form['entities']['#suffix'] = '
';
+
+ $form += ['entities' => []];
+ if ($entities = $form_state->get('uploaded_entities')) {
+ foreach ($entities as $entity) {
+ /** @var \Drupal\Core\Entity\EntityInterface $entity */
+ $form['entities'][$entity->uuid()] = [
+ '#type' => 'inline_entity_form',
+ '#entity_type' => $entity->getEntityTypeId(),
+ '#bundle' => $entity->bundle(),
+ '#default_value' => $entity,
+ '#form_mode' => $this->configuration['form_mode'],
+ ];
+ }
+ }
+
+ if (!empty(Element::children($form['entities']))) {
+ // Make it possible to select those submitted entities.
+ $pos = array_search('dropzonejs-disable-submit', $original_form['#attributes']['class']);
+ if ($pos !== FALSE) {
+ unset($original_form['#attributes']['class'][$pos]);
+ }
+ }
+
+ $form['actions']['submit'] += ['#submit' => []];
+
+ return $form;
+ }
+
+ /**
+ * Submit callback for the edit button.
+ *
+ * @param array $form
+ * Form array.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ * Form object.
+ */
+ public function submitEdit(array $form, FormStateInterface $form_state) {
+ $form_state->setRebuild(TRUE);
+
+ // Files have to saved before they can be viewed in the IEF form.
+ $media_entities = $this->prepareEntities($form, $form_state);
+ $source_field = $this->getBundle()->getTypeConfiguration()['source_field'];
+ foreach ($media_entities as $media_entity) {
+ /** @var \Drupal\file\Entity\File $file */
+ $file = $media_entity->$source_field->entity;
+ $file->save();
+ $media_entity->$source_field->target_id = $file->id();
+ }
+
+ $form_state->set('uploaded_entities', $media_entities);
+ }
+
+ /**
+ * Ajax callback triggered when hitting the edit button.
+ *
+ * @param array $form
+ * The form.
+ *
+ * @return array
+ * Returns the entire form.
+ */
+ public static function onEdit(array $form) {
+ return $form['widget']['entities'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function validate(array &$form, FormStateInterface $form_state) {
+ // Skip the DropzoneJsEbWidget specific validations.
+ WidgetBase::validate($form, $form_state);
+ }
+
+ /**
+ * Prepares entities from the form.
+ *
+ * @param array $form
+ * The form.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ * The form state.
+ *
+ * @return \Drupal\media_entity\MediaInterface[]
+ * The prepared media entities.
+ */
+ protected function prepareEntitiesFromForm(array $form, FormStateInterface $form_state) {
+ $media_entities = [];
+ foreach (Element::children($form['widget']['entities']) as $key) {
+ /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
+ $entity = $form['widget']['entities'][$key]['#entity'];
+ $inline_entity_form_handler = InlineEntityForm::getInlineFormHandler($entity->getEntityTypeId());
+ $inline_entity_form_handler->entityFormSubmit($form['widget']['entities'][$key], $form_state);
+ $media_entities[] = $entity;
+ }
+ return $media_entities;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submit(array &$element, array &$form, FormStateInterface $form_state) {
+ $media_entities = $this->prepareEntitiesFromForm($form, $form_state);
+ $source_field = $this->getBundle()->getTypeConfiguration()['source_field'];
+
+ foreach ($media_entities as $media_entity) {
+ $file = $media_entity->{$source_field}->entity;
+ /** @var \Drupal\dropzonejs\Events\DropzoneMediaEntityCreateEvent $event */
+ $event = $this->eventDispatcher->dispatch(Events::MEDIA_ENTITY_CREATE, new DropzoneMediaEntityCreateEvent($media_entity, $file, $form, $form_state, $element));
+ $media_entity = $event->getMediaEntity();
+ $media_entity->save();
+ }
+
+ if (!empty(array_filter($media_entities))) {
+ $this->selectEntities($media_entities, $form_state);
+ $this->clearFormValues($element, $form_state);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function clearFormValues(array &$element, FormStateInterface $form_state) {
+ parent::clearFormValues($element, $form_state);
+ // Clear uploaded_entities to get a clean form in multi-step selection.
+ $form_state->set('uploaded_entities', []);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+ $form = parent::buildConfigurationForm($form, $form_state);
+ $form['form_mode'] = [
+ '#type' => 'select',
+ '#title' => $this->t('Form mode'),
+ '#options' => $this->entityDisplayRepository->getFormModeOptions('media'),
+ '#default_value' => $this->configuration['form_mode'],
+ ];
+ return $form;
+ }
+
+}