Unverified Commit 6b0b5e1d authored by Stefan Auditor's avatar Stefan Auditor Committed by Stefan Auditor
Browse files

Issue #3282696 by sanduhrs: Port of l10n_community: Add ajax functionality

parent 40fe580b
Loading
Loading
Loading
Loading
+42 −8
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ namespace Drupal\l10n_community\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Language\Language;
use Drupal\Core\Url;
use Drupal\l10n_community\Controller\L10nCommunityLanguagesController;

@@ -49,6 +50,7 @@ class FilterForm extends FormBase {
    /** @var \Drupal\group\Entity\Group $group */
    $group = \Drupal::routeMatch()->getParameter('group');
    $langcode = $group->get('field_translation_language')->first()->getValue()['target_id'];
    $language = \Drupal::languageManager()->getLanguage($langcode);

    $translation_options = [
      L10N_STATUS_ALL => '<' . $this->t('Any') . '>',
@@ -93,8 +95,8 @@ class FilterForm extends FormBase {
      '#title' => $this->t('Project'),
      '#default_value' => $selected_project ?? NULL,
      '#ajax' => [
        // 'event' missing, Drupal will apply the per-#type defaults.
        'callback' => 'ajaxReleases',
        'callback' => '::ajaxReleases',
        'event' => 'change',
        'wrapper' => 'l10n-server-releases',
        'effect' => 'fade',
        'progress' => [
@@ -110,7 +112,7 @@ class FilterForm extends FormBase {
    if ($project_count <= 30) {
      // Select widget for 1-30 projects.
      $form['project']['#type'] = 'select';
      $form['project']['#options'] = ['' => $this->t('All')];
      $form['project']['#options'] = ['all' => $this->t('All')];
      $projects = $project_storage->loadMultiple();
      /** @var \Drupal\l10n_server\Entity\L10nServerProjectInterface $project */
      foreach ($projects as $project) {
@@ -143,7 +145,7 @@ class FilterForm extends FormBase {
      '#title' => $this->t('Release'),
      '#type' => 'select',
      '#options' => $release_options,
      '#default_value' => $form_state->getValue('release'),
      '#default_value' => $form_state->getValue('release') ?? 'all',
      // Wrapper used to replace release options via AJAX.
      '#prefix' => '<div id="l10n-server-releases">',
      '#suffix' => '</div>',
@@ -155,7 +157,7 @@ class FilterForm extends FormBase {

    if (isset($selected_project)
        && $form_state->getValue('release') != 'all') {
      $form['release']['#field_suffix'] = '<div class="start-over-link"><a href="' . Url::fromUri('internal:/translate/languages/' . $langcode . '/translate/reset/' . $selected_project->getUri() . '/' . $form_state->getValue('release'))->toString() . '">' . t('Missing strings?') . '</a></div>';
      $form['release']['#field_suffix'] = '<div class="start-over-link"><a href="' . Url::fromUri('internal:/group/' . $group->id() . '/reset/' . $selected_project->getUri() . '/' . $form_state->getValue('release'))->toString() . '">' . t('Missing strings?') . '</a></div>';
    }

    if (count($contexts = $this->getContexts()) > 1) {
@@ -185,12 +187,12 @@ class FilterForm extends FormBase {
    $form['status']['translation'] = [
      '#type' => 'select',
      '#options' => $translation_options,
      '#default_value' => $form_state->getValue('status') & (L10N_STATUS_TRANSLATED | L10N_STATUS_UNTRANSLATED | L10N_STATUS_IS_TRANSLATION),
      '#default_value' => $form_state->getValue('status') || (L10N_STATUS_TRANSLATED | L10N_STATUS_UNTRANSLATED | L10N_STATUS_IS_TRANSLATION),
    ];
    $form['status']['suggestion'] = [
      '#type' => 'select',
      '#options' => $suggestion_options,
      '#default_value' => $form_state->getValue('status') & (L10N_STATUS_HAS_SUGGESTION | L10N_STATUS_NO_SUGGESTION | L10N_STATUS_IS_SUGGESTION),
      '#default_value' => $form_state->getValue('status') || (L10N_STATUS_HAS_SUGGESTION | L10N_STATUS_NO_SUGGESTION | L10N_STATUS_IS_SUGGESTION),
    ];

    $class_is_default_author = empty($form_state->getValue('author')) ? 'is-default' : 'is-not-default';
@@ -265,7 +267,10 @@ class FilterForm extends FormBase {
      '#type' => 'markup',
      '#markup' => '<div class="reset-link"><a href="' . Url::fromUri('internal:/group/' . $group->id() . '/translate')->toString() . '" class="filter-exclude">' . $this->t('Clear all filters') . '</a></div>',
    ];
    $form['#attached']['library'][] = 'l10n_community/editor';
    if ($language->getDirection() == LANGUAGE::DIRECTION_RTL) {
      $form['#attached']['library'][] = 'l10n_community/editor-rtl';
    }
    return $form;
  }

@@ -327,4 +332,33 @@ class FilterForm extends FormBase {
    return $contexts;
  }

  /**
   * Ajax callback.
   *
   * @param array $form
   *   The form array.
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The form_state object.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public static function ajaxReleases(array &$form, FormStateInterface $form_state) {
    $release_options = [];
    if ($pid = $form_state->getValue('project')) {
      $releases = \Drupal::entityTypeManager()
        ->getStorage('l10n_server_release')
        ->loadByProperties(['pid' => $pid]);
      foreach ($releases as $release) {
        $release_options[$release->id()] = t('@version only', [
          '@version' => $release->getVersion(),
        ]);
      }
      krsort($release_options);
    }
    $release_options = ['all' => t('All')] + $release_options;
    $form['release']['#options'] = $release_options;
    return $form['release'];
  }

}