View source
<?php
namespace Drupal\support_ticket\Controller;
use Drupal\Core\Url;
use Drupal\support_ticket\SupportTicketInterface;
use Drupal\diff\EntityComparisonBase;
use Drupal\Component\Utility\Xss;
class SupportTicketRevisionController extends EntityComparisonBase {
public function revisionOverview(SupportTicketInterface $support_ticket) {
return $this
->formBuilder()
->getForm('Drupal\\support_ticket\\Form\\RevisionOverviewForm', $support_ticket);
}
public function compareSupportTicketRevisions(SupportTicketInterface $support_ticket, $left_vid, $right_vid, $filter) {
$diff_rows = array();
$build = array(
'#title' => $this
->t('Revisions for %title', array(
'%title' => $support_ticket
->label(),
)),
);
if (!in_array($filter, array(
'raw',
'raw-plain',
))) {
$filter = 'raw';
}
elseif ($filter == 'raw-plain') {
$filter = 'raw_plain';
}
$storage = $this
->entityManager()
->getStorage('support_ticket');
$left_revision = $storage
->loadRevision($left_vid);
$right_revision = $storage
->loadRevision($right_vid);
$vids = $storage
->revisionIds($support_ticket);
$diff_rows[] = $this
->buildRevisionsNavigation($support_ticket
->id(), $vids, $left_vid, $right_vid);
$diff_rows[] = $this
->buildMarkdownNavigation($support_ticket
->id(), $left_vid, $right_vid, $filter);
$diff_header = $this
->buildTableHeader($left_revision, $right_revision);
if ($left_revision != FALSE && $right_revision != FALSE) {
$fields = $this
->compareRevisions($left_revision, $right_revision);
$support_ticket_base_fields = $this
->entityManager()
->getBaseFieldDefinitions('support_ticket');
foreach ($fields as $field_name => $field) {
$view_mode = $this->config
->get('support_ticket_type_settings.' . $support_ticket
->getType() . '.view_mode');
if ($view_mode == NULL) {
$view_mode = 'default';
}
$visible = entity_get_display('support_ticket', $support_ticket
->getType(), $view_mode)
->getComponent($field_name);
if ($visible == NULL && !array_key_exists($field_name, $support_ticket_base_fields)) {
unset($fields[$field_name]);
}
}
foreach ($fields as $field) {
$field_label_row = '';
if (!empty($field['#name'])) {
$field_label_row = array(
'data' => $this
->t('Changes to %name', array(
'%name' => $field['#name'],
)),
'colspan' => 4,
'class' => array(
'field-name',
),
);
}
$field_diff_rows = $this
->getRows($field['#states'][$filter]['#left'], $field['#states'][$filter]['#right']);
if (!empty($field_diff_rows) && !empty($field_label_row)) {
$diff_rows[] = array(
$field_label_row,
);
}
$diff_rows = array_merge($diff_rows, $field_diff_rows);
}
$build['#attached']['library'][] = 'diff/diff.general';
$theme = $this->config
->get('general_settings.theme');
if ($theme) {
if ($theme == 'default') {
$build['#attached']['library'][] = 'diff/diff.default';
}
elseif ($theme == 'github') {
$build['#attached']['library'][] = 'diff/diff.github';
}
}
elseif ($theme == NULL) {
$build['#attached']['library'][] = 'diff/diff.github';
}
$build['diff'] = array(
'#type' => 'table',
'#header' => $diff_header,
'#rows' => $diff_rows,
'#empty' => $this
->t('No visible changes'),
'#attributes' => array(
'class' => array(
'diff',
),
),
);
$build['back'] = array(
'#type' => 'link',
'#attributes' => array(
'class' => array(
'button',
'diff-button',
),
),
'#title' => $this
->t('Back to Revision Overview'),
'#url' => Url::fromRoute('entity.support_ticket.version_history', [
'support_ticket' => $support_ticket
->id(),
]),
);
return $build;
}
else {
drupal_set_message($this
->t('Selected support ticket revisions could not be loaded.'), 'error');
}
}
protected function buildTableHeader($left_revision, $right_revision) {
$revisions = array(
$left_revision,
$right_revision,
);
$header = array();
foreach ($revisions as $revision) {
$revision_log = $this->nonBreakingSpace;
if ($revision->revision_log->value != '') {
$revision_log = Xss::filter($revision->revision_log->value);
}
$username = array(
'#theme' => 'username',
'#account' => $revision->uid->entity,
);
$revision_date = $this->date
->format($revision
->getRevisionCreationTime(), 'short');
$revision_link = $this
->t($revision_log . '@date', array(
'@date' => $this
->l($revision_date, Url::fromRoute('entity.support_ticket.revision', array(
'support_ticket' => $revision
->id(),
'support_ticket_revision' => $revision
->getRevisionId(),
))),
));
$header[] = array(
'data' => array(
'#markup' => $this->nonBreakingSpace,
),
'colspan' => 1,
);
$header[] = array(
'data' => array(
'#markup' => $revision_link,
),
'colspan' => 1,
);
}
return $header;
}
protected function buildRevisionsNavigation($stid, $vids, $left_vid, $right_vid) {
$revisions_count = count($vids);
$i = 0;
$row = array();
while ($left_vid > $vids[$i]) {
$i += 1;
}
if ($i != 0) {
$row[] = array(
'data' => $this
->l($this
->t('< Previous difference'), Url::fromRoute('support_ticket.revisions_diff', array(
'support_ticket' => $stid,
'left_vid' => $vids[$i - 1],
'right_vid' => $left_vid,
))),
'colspan' => 2,
'class' => 'rev-navigation',
);
}
else {
$row[] = $this->nonBreakingSpace;
}
$row[] = $this->nonBreakingSpace;
$i = 0;
while ($i < $revisions_count && $right_vid >= $vids[$i]) {
$i += 1;
}
if ($revisions_count != $i && $vids[$i - 1] != $vids[$revisions_count - 1]) {
$row[] = array(
'data' => $this
->l($this
->t('Next difference >'), Url::fromRoute('support_ticket.revisions_diff', array(
'support_ticket' => $stid,
'left_vid' => $right_vid,
'right_vid' => $vids[$i],
))),
'colspan' => 2,
'class' => 'rev-navigation',
);
}
else {
$row[] = $this->nonBreakingSpace;
}
if ($revisions_count == 2) {
return array();
}
else {
return $row;
}
}
protected function buildMarkdownNavigation($stid, $left_vid, $right_vid, $active_filter) {
$links['raw'] = array(
'title' => $this
->t('Standard'),
'url' => Url::fromRoute('support_ticket.revisions_diff', array(
'support_ticket' => $stid,
'left_vid' => $left_vid,
'right_vid' => $right_vid,
)),
);
$links['raw_plain'] = array(
'title' => $this
->t('Markdown'),
'url' => Url::fromRoute('support_ticket.revisions_diff', array(
'support_ticket' => $stid,
'left_vid' => $left_vid,
'right_vid' => $right_vid,
'filter' => 'raw-plain',
)),
);
$filter = $links[$active_filter];
unset($links[$active_filter]);
array_unshift($links, $filter);
$row[] = array(
'data' => array(
'#type' => 'operations',
'#links' => $links,
),
'colspan' => 4,
);
return $row;
}
}