Exemple #1
0
 /**
  * Overrides Drupal\Core\Entity\EntityForm::form().
  */
 public function form(array $form, FormStateInterface $form_state)
 {
     $form = parent::form($form, $form_state);
     $item = $this->entity;
     $form['#title'] = $this->t('Job item @source_label', array('@source_label' => $item->getSourceLabel()));
     $form['info'] = array('#type' => 'container', '#attributes' => array('class' => array('tmgmt-ui-job-info', 'clearfix')), '#weight' => 0);
     $url = $item->getSourceUrl();
     $form['info']['source'] = array('#type' => 'item', '#title' => t('Source'), '#markup' => $url ? \Drupal::l($item->getSourceLabel(), $url) : $item->getSourceLabel(), '#prefix' => '<div class="tmgmt-ui-source tmgmt-ui-info-item">', '#suffix' => '</div>');
     $form['info']['sourcetype'] = array('#type' => 'item', '#title' => t('Source type'), '#markup' => $item->getSourceType(), '#prefix' => '<div class="tmgmt-ui-source-type tmgmt-ui-info-item">', '#suffix' => '</div>');
     $form['info']['source_language'] = array('#type' => 'item', '#title' => t('Source language'), '#markup' => $item->getJob()->getSourceLanguage()->getName(), '#prefix' => '<div class="tmgmt-ui-source-language tmgmt-ui-info-item">', '#suffix' => '</div>');
     $form['info']['target_language'] = array('#type' => 'item', '#title' => t('Target language'), '#markup' => $item->getJob()->getTargetLanguage()->getName(), '#prefix' => '<div class="tmgmt-ui-target-language tmgmt-ui-info-item">', '#suffix' => '</div>');
     $form['info']['changed'] = array('#type' => 'item', '#title' => t('Last change'), '#value' => $item->getChangedTime(), '#markup' => format_date($item->getChangedTime()), '#prefix' => '<div class="tmgmt-ui-changed tmgmt-ui-info-item">', '#suffix' => '</div>');
     $states = JobItem::getStates();
     $form['info']['state'] = array('#type' => 'item', '#title' => t('State'), '#markup' => $states[$item->getState()], '#prefix' => '<div class="tmgmt-ui-item-state tmgmt-ui-info-item">', '#suffix' => '</div>', '#value' => $item->getState());
     $job = $item->getJob();
     $url = $job->urlInfo();
     $form['info']['job'] = array('#type' => 'item', '#title' => t('Job'), '#markup' => \Drupal::l($job->label(), $url), '#prefix' => '<div class="tmgmt-ui-job tmgmt-ui-info-item">', '#suffix' => '</div>');
     // Display selected translator for already submitted jobs.
     if (!$item->getJob()->isSubmittable()) {
         $form['info']['translator'] = array('#type' => 'item', '#title' => t('Provider'), '#markup' => $job->getTranslatorLabel(), '#prefix' => '<div class="tmgmt-ui-translator tmgmt-ui-info-item">', '#suffix' => '</div>');
     }
     // Actually build the review form elements...
     $form['review'] = array('#type' => 'container');
     // Build the review form.
     $data = $item->getData();
     $this->trackChangedSource(\Drupal::service('tmgmt.data')->flatten($data), $form_state);
     // Need to keep the first hierarchy. So flatten must take place inside
     // of the foreach loop.
     foreach (Element::children($data) as $key) {
         $review_element = $this->reviewFormElement($form_state, \Drupal::service('tmgmt.data')->flatten($data[$key], $key), $key);
         if ($review_element) {
             $form['review'][$key] = $review_element;
         }
     }
     if ($view = entity_load('view', 'tmgmt_job_item_messages')) {
         $form['messages'] = array('#type' => 'details', '#title' => $view->label(), '#open' => FALSE, '#weight' => 50);
         $form['messages']['view'] = $view->getExecutable()->preview('block', array($item->id()));
     }
     $form['#attached']['library'][] = 'tmgmt/admin';
     // The reject functionality has to be implement by the translator plugin as
     // that process is completely unique and custom for each translation service.
     // Give the source ui controller a chance to affect the review form.
     $source = $this->sourceManager->createUIInstance($item->getPlugin());
     $form = $source->reviewForm($form, $form_state, $item);
     // Give the translator ui controller a chance to affect the review form.
     if ($item->getTranslator()) {
         $plugin_ui = $this->translatorManager->createUIInstance($item->getTranslator()->getPluginId());
         $form = $plugin_ui->reviewForm($form, $form_state, $item);
     }
     $form['footer'] = tmgmt_color_review_legend();
     return $form;
 }
Exemple #2
0
 /**
  * Overrides Drupal\Core\Entity\EntityForm::form().
  */
 public function form(array $form, FormStateInterface $form_state)
 {
     $job = $this->entity;
     // Handle source language.
     $available['source_language'] = tmgmt_available_languages();
     $job->source_language = $form_state->getValue('source_language') ?: $job->getSourceLangcode();
     // Handle target language.
     $available['target_language'] = tmgmt_available_languages();
     $job->target_language = $form_state->getValue('target_language') ?: $job->getTargetLangcode();
     // Remove impossible combinations so we don't end up with the same source and
     // target language in the dropdowns.
     foreach (array('source_language' => 'target_language', 'target_language' => 'source_language') as $key => $opposite) {
         if (!empty($job->{$key})) {
             unset($available[$opposite][$job->{$key}->value]);
         }
     }
     $source = $job->getSourceLanguage() ? $job->getSourceLanguage()->getName() : '?';
     if (!$job->getTargetLangcode() || $job->getTargetLangcode() == LanguageInterface::LANGCODE_NOT_SPECIFIED) {
         $job->target_language = key($available['target_language']);
         $target = '?';
     } else {
         $target = $job->getTargetLanguage()->getName();
     }
     $states = Job::getStates();
     // Set the title of the page to the label and the current state of the job.
     $form['#title'] = t('@title (@source to @target, @state)', array('@title' => $job->label(), '@source' => $source, '@target' => $target, '@state' => $states[$job->getState()]));
     $form = parent::form($form, $form_state);
     $form['info'] = array('#type' => 'container', '#attributes' => array('class' => array('tmgmt-ui-job-info', 'clearfix')), '#weight' => 0);
     // Check for label value and set for dynamically change.
     if ($form_state->getValue('label') && $form_state->getValue('label') == $job->label()) {
         $job->label = NULL;
         $job->label = $job->label();
         $form_state->setValue('label', $job->label());
     }
     $form['label']['widget'][0]['value']['#description'] = t('You can provide a label for this job in order to identify it easily later on. Or leave it empty to use the default one.');
     $form['label']['#group'] = 'info';
     $form['label']['#prefix'] = '<div id="tmgmt-ui-label">';
     $form['label']['#suffix'] = '</div>';
     // Make the source and target language flexible by showing either a select
     // dropdown or the plain string (if preselected).
     if ($job->getSourceLangcode() || !$job->isSubmittable()) {
         $form['info']['source_language'] = array('#title' => t('Source language'), '#type' => 'item', '#markup' => isset($available['source_language'][$job->getSourceLangcode()]) ? $available['source_language'][$job->getSourceLangcode()] : '', '#prefix' => '<div id="tmgmt-ui-source-language" class="tmgmt-ui-source-language tmgmt-ui-info-item">', '#suffix' => '</div>', '#value' => $job->getSourceLangcode());
     } else {
         $form['info']['source_language'] = array('#title' => t('Source language'), '#type' => 'select', '#options' => $available['source_language'], '#default_value' => $job->getSourceLangcode(), '#required' => TRUE, '#prefix' => '<div id="tmgmt-ui-source-language" class="tmgmt-ui-source-language tmgmt-ui-info-item">', '#suffix' => '</div>', '#ajax' => array('callback' => array($this, 'ajaxLanguageSelect')));
     }
     if (!$job->isSubmittable()) {
         $form['info']['target_language'] = array('#title' => t('Target language'), '#type' => 'item', '#markup' => isset($available['target_language'][$job->getTargetLangcode()]) ? $available['target_language'][$job->getTargetLangcode()] : '', '#prefix' => '<div id="tmgmt-ui-target-language" class="tmgmt-ui-target-language tmgmt-ui-info-item">', '#suffix' => '</div>', '#value' => $job->getTargetLangcode());
     } else {
         $form['info']['target_language'] = array('#title' => t('Target language'), '#type' => 'select', '#options' => $available['target_language'], '#default_value' => $job->getTargetLangcode(), '#required' => TRUE, '#prefix' => '<div id="tmgmt-ui-target-language" class="tmgmt-ui-target-language tmgmt-ui-info-item">', '#suffix' => '</div>', '#ajax' => array('callback' => array($this, 'ajaxLanguageSelect'), 'wrapper' => 'tmgmt-ui-target-language'));
     }
     // Display selected translator for already submitted jobs.
     if (!$job->isSubmittable() && !$job->isContinuous()) {
         $form['info']['translator'] = array('#type' => 'item', '#title' => t('Provider'), '#markup' => $job->getTranslatorLabel(), '#prefix' => '<div class="tmgmt-ui-translator tmgmt-ui-info-item">', '#suffix' => '</div>', '#value' => $job->getTranslatorId());
     }
     if (!$job->isContinuous()) {
         $form['info']['word_count'] = array('#type' => 'item', '#title' => t('Total words'), '#markup' => number_format($job->getWordCount()), '#prefix' => '<div class="tmgmt-ui-word-count tmgmt-ui-info-item">', '#suffix' => '</div>');
         $form['info']['tags_count'] = array('#type' => 'item', '#title' => t('Total HTML tags'), '#markup' => number_format($job->getTagsCount()), '#prefix' => '<div class="tmgmt-ui-tags-count tmgmt-ui-info-item">', '#suffix' => '</div>');
     } else {
         $roles1 = user_roles(TRUE, 'administer tmgmt');
         $roles2 = user_roles(TRUE, 'create translation jobs');
         $roles3 = user_roles(TRUE, 'submit translation jobs');
         $roles4 = user_roles(TRUE, 'accept translation jobs');
         $duplicates = array_merge($roles1, $roles2, $roles3, $roles4);
         $roles = array_unique($duplicates, SORT_REGULAR);
         if (array_key_exists('authenticated', $roles)) {
             $filter = [];
         } else {
             $ids = array_keys($roles);
             $roles = array_combine($ids, $ids);
             $filter = ['type' => 'role', 'role' => $roles];
         }
         $form['info']['uid'] = array('#title' => t('Owner'), '#type' => 'entity_autocomplete', '#target_type' => 'user', '#selection_settings' => ['include_anonymous' => FALSE, 'filter' => $filter, 'field' => 'uid'], '#process_default_value' => TRUE, '#default_value' => $job->getOwnerId() == 0 ? User::load(\Drupal::currentUser()->id()) : $job->getOwner(), '#required' => TRUE, '#prefix' => '<div id="tmgmt-ui-owner" class="tmgmt-ui-owner tmgmt-ui-info-item">', '#suffix' => '</div>');
     }
     if (!$job->isContinuous()) {
         // Checkout whether given source already has items in translation.
         $num_of_existing_items = count($job->getConflictingItemIds());
         $form['message'] = array('#type' => 'html_tag', '#tag' => 'div', '#value' => \Drupal::translation()->formatPlural($num_of_existing_items, '1 item conflict with pending item and will be dropped on submission.', '@count items conflict with pending items and will be dropped on submission.'), '#prefix' => '<div class="messages existing-items messages--warning hidden">', '#suffix' => '</div>');
         if ($num_of_existing_items) {
             $form['message']['#prefix'] = '<div class="messages existing-items messages--warning">';
         }
     }
     // Display created time only for jobs that are not new anymore.
     if (!$job->isUnprocessed() && !$job->isContinuousActive()) {
         $form['info']['created'] = array('#type' => 'item', '#title' => t('Created'), '#markup' => format_date($job->getCreatedTime()), '#prefix' => '<div class="tmgmt-ui-created tmgmt-ui-info-item">', '#suffix' => '</div>', '#value' => $job->getCreatedTime());
     } else {
         // Indicate the state to the forms css classes.
         $form['#attributes']['class'][] = 'state-unprocessed';
     }
     if (!$job->isContinuous()) {
         if ($view = Views::getView('tmgmt_job_items')) {
             $form['job_items_wrapper'] = array('#type' => 'details', '#title' => t('Job items'), '#open' => in_array($job->getState(), array(Job::STATE_ACTIVE, Job::STATE_UNPROCESSED)), '#weight' => 10, '#prefix' => '<div id="tmgmt-ui-job-checkout-details">', '#suffix' => '</div>');
             $form['footer'] = tmgmt_color_job_item_legend();
             $form['footer']['#weight'] = 100;
             // Translation jobs.
             $output = $view->preview($job->isSubmittable() ? 'checkout' : 'submitted', array($job->id()));
             $form['job_items_wrapper']['items'] = array('#type' => 'markup', '#title' => $view->storage->label(), '#prefix' => '<div class="' . 'tmgmt-ui-job-items ' . ($job->isSubmittable() ? 'tmgmt-ui-job-submit' : 'tmgmt-ui-job-manage') . '">', 'view' => ['#markup' => $this->renderer->render($output)], '#attributes' => array('class' => array('tmgmt-ui-job-items', $job->isSubmittable() ? 'tmgmt-ui-job-submit' : 'tmgmt-ui-job-manage')), '#suffix' => '</div>');
         }
         // A Wrapper for a button and a table with all suggestions.
         $form['job_items_wrapper']['suggestions'] = array('#type' => 'container', '#access' => $job->isSubmittable());
         // Button to load all translation suggestions with AJAX.
         $form['job_items_wrapper']['suggestions']['load'] = array('#type' => 'submit', '#value' => t('Load suggestions'), '#submit' => array('::loadSuggestionsSubmit'), '#limit_validation_errors' => array(), '#attributes' => array('class' => array('tmgmt-ui-job-suggestions-load')), '#ajax' => array('callback' => '::ajaxLoadSuggestions', 'wrapper' => 'tmgmt-ui-job-items-suggestions', 'method' => 'replace', 'effect' => 'fade'));
         $form['job_items_wrapper']['suggestions']['container'] = array('#type' => 'container', '#prefix' => '<div id="tmgmt-ui-job-items-suggestions">', '#suffix' => '</div>');
         // Create the suggestions table.
         $suggestions_table = array('#type' => 'tableselect', '#header' => array(), '#options' => array(), '#multiple' => TRUE);
         // If this is an AJAX-Request, load all related nodes and fill the table.
         if ($form_state->isRebuilding() && $form_state->get('rebuild_suggestions')) {
             $this->buildSuggestions($suggestions_table, $form_state);
             // A save button on bottom of the table is needed.
             $suggestions_table = array('suggestions_table' => $suggestions_table, 'suggestions_add' => array('#type' => 'submit', '#value' => t('Add suggestions'), '#submit' => array('::addSuggestionsSubmit'), '#limit_validation_errors' => array(array('suggestions_table')), '#attributes' => array('class' => array('tmgmt-ui-job-suggestions-add')), '#access' => !empty($suggestions_table['#options'])));
             $form['job_items_wrapper']['suggestions']['container']['suggestions_list'] = array('#type' => 'details', '#title' => t('Suggestions'), '#prefix' => '<div id="tmgmt-ui-job-items-suggestions">', '#suffix' => '</div>', '#open' => TRUE) + $suggestions_table;
         }
     }
     if ($job->isContinuous()) {
         $form['continuous_settings'] = array('#type' => 'details', '#title' => $this->t('Continuous settings'), '#description' => $this->t('Configure the sources that should be enabled for this continuous job.'), '#open' => TRUE, '#weight' => 10, '#tree' => TRUE);
         $source_manager = \Drupal::service('plugin.manager.tmgmt.source');
         $source_plugins = $source_manager->getDefinitions();
         foreach ($source_plugins as $type => $definition) {
             $plugin_type = $source_manager->createInstance($type);
             if ($plugin_type instanceof ContinuousSourceInterface) {
                 $form['continuous_settings'][$type] = $plugin_type->continuousSettingsForm($form, $form_state, $job);
             }
         }
     }
     // Display the checkout settings form if the job can be checked out.
     if ($job->isSubmittable() || $job->isContinuous()) {
         $form['translator_wrapper'] = array('#type' => 'details', '#title' => t('Configure provider'), '#weight' => 20, '#prefix' => '<div id="tmgmt-ui-translator-wrapper">', '#suffix' => '</div>', '#open' => TRUE);
         // Show a list of translators tagged by availability for the selected source
         // and target language combination.
         if (!($translators = tmgmt_translator_labels_flagged($job))) {
             drupal_set_message(t('There are no providers available. Before you can checkout you need to @configure at least one provider.', array('@configure' => \Drupal::l(t('configure'), Url::fromRoute('entity.tmgmt_translator.collection')))), 'warning');
         }
         $preselected_translator = $job->getTranslatorId() && isset($translators[$job->getTranslatorId()]) ? $job->getTranslatorId() : key($translators);
         $job->translator = $form_state->getValue('translator') ?: $preselected_translator;
         $form['translator_wrapper']['translator'] = array('#type' => 'select', '#title' => t('Provider'), '#description' => t('The configured provider that will process the translation.'), '#options' => $translators, '#access' => !empty($translators), '#default_value' => $job->getTranslatorId(), '#required' => TRUE, '#ajax' => array('callback' => array($this, 'ajaxTranslatorSelect'), 'wrapper' => 'tmgmt-ui-translator-settings'));
         $settings = $this->checkoutSettingsForm($form_state, $job);
         if (!is_array($settings)) {
             $settings = array();
         }
         $form['translator_wrapper']['settings'] = array('#type' => 'details', '#title' => t('Checkout settings'), '#prefix' => '<div id="tmgmt-ui-translator-settings">', '#suffix' => '</div>', '#tree' => TRUE, '#open' => TRUE) + $settings;
     } elseif ($job->getTranslatorId() && !$job->isContinuous()) {
         $form['translator_wrapper'] = array('#type' => 'details', '#title' => t('Provider information'), '#open' => TRUE, '#weight' => 20);
         $form['translator_wrapper']['checkout_info'] = $this->checkoutInfo($job);
     }
     if (!$job->isContinuous() && !$job->isSubmittable() && empty($form['translator_wrapper']['checkout_info'])) {
         $form['translator_wrapper']['checkout_info'] = array('#type' => 'markup', '#markup' => t('The translator does not provide any information.'));
     }
     $form['clearfix'] = array('#markup' => '<div class="clearfix"></div>', '#weight' => 45);
     if (!$job->isContinuous() && ($view = Views::getView('tmgmt_job_messages'))) {
         $form['messages'] = array('#type' => 'details', '#title' => $view->storage->label(), '#open' => $job->getTranslatorId() ? TRUE : FALSE, '#weight' => 50);
         $output = $view->preview('embed', array($job->id()));
         $form['messages']['view']['#markup'] = drupal_render($output);
     }
     $form['#attached']['library'][] = 'tmgmt/admin';
     return $form;
 }