Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/diff/view/PHUIDiffTableOfContentsItemView.php
| Show First 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | final class PHUIDiffTableOfContentsItemView extends AphrontView { | ||||
| public function render() { | public function render() { | ||||
| $changeset = $this->getChangeset(); | $changeset = $this->getChangeset(); | ||||
| $cells = array(); | $cells = array(); | ||||
| $cells[] = $this->getContext(); | $cells[] = $this->getContext(); | ||||
| $cells[] = $this->renderPathChangeCharacter(); | $cells[] = $changeset->newFileTreeIcon(); | ||||
| $cells[] = $this->renderPropertyChangeCharacter(); | |||||
| $cells[] = $this->renderPropertyChangeDescription(); | |||||
| $link = $this->renderChangesetLink(); | $link = $this->renderChangesetLink(); | ||||
| $lines = $this->renderChangesetLines(); | $lines = $this->renderChangesetLines(); | ||||
| $meta = $this->renderChangesetMetadata(); | $meta = $this->renderChangesetMetadata(); | ||||
| $cells[] = array( | $cells[] = array( | ||||
| $link, | $link, | ||||
| $lines, | $lines, | ||||
| $meta, | $meta, | ||||
| ); | ); | ||||
| $cells[] = $this->renderCoverage(); | $cells[] = $this->renderCoverage(); | ||||
| $cells[] = $this->renderModifiedCoverage(); | $cells[] = $this->renderModifiedCoverage(); | ||||
| $cells[] = $this->renderPackages(); | $cells[] = $this->renderPackages(); | ||||
| return $cells; | return $cells; | ||||
| } | } | ||||
| private function renderPathChangeCharacter() { | public function newLink() { | ||||
| $changeset = $this->getChangeset(); | |||||
| $type = $changeset->getChangeType(); | |||||
| $color = DifferentialChangeType::getSummaryColorForChangeType($type); | |||||
| $char = DifferentialChangeType::getSummaryCharacterForChangeType($type); | |||||
| $title = DifferentialChangeType::getFullNameForChangeType($type); | |||||
| return javelin_tag( | |||||
| 'span', | |||||
| array( | |||||
| 'sigil' => 'has-tooltip', | |||||
| 'meta' => array( | |||||
| 'tip' => $title, | |||||
| 'align' => 'E', | |||||
| ), | |||||
| 'class' => 'phui-text-'.$color, | |||||
| ), | |||||
| $char); | |||||
| } | |||||
| private function renderPropertyChangeCharacter() { | |||||
| $changeset = $this->getChangeset(); | |||||
| $old = $changeset->getOldProperties(); | |||||
| $new = $changeset->getNewProperties(); | |||||
| if ($old === $new) { | |||||
| return null; | |||||
| } | |||||
| return javelin_tag( | |||||
| 'span', | |||||
| array( | |||||
| 'sigil' => 'has-tooltip', | |||||
| 'meta' => array( | |||||
| 'tip' => pht('Properties Modified'), | |||||
| 'align' => 'E', | |||||
| 'size' => 200, | |||||
| ), | |||||
| ), | |||||
| 'M'); | |||||
| } | |||||
| private function renderPropertyChangeDescription() { | |||||
| $changeset = $this->getChangeset(); | |||||
| $file_type = $changeset->getFileType(); | |||||
| $desc = DifferentialChangeType::getShortNameForFileType($file_type); | |||||
| if ($desc === null) { | |||||
| return null; | |||||
| } | |||||
| return pht('(%s)', $desc); | |||||
| } | |||||
| private function renderChangesetLink() { | |||||
| $anchor = $this->getAnchor(); | $anchor = $this->getAnchor(); | ||||
| $changeset = $this->getChangeset(); | $changeset = $this->getChangeset(); | ||||
| $name = $changeset->getDisplayFilename(); | $name = $changeset->getDisplayFilename(); | ||||
| $name = basename($name); | |||||
| $change_type = $changeset->getChangeType(); | |||||
| if (DifferentialChangeType::isOldLocationChangeType($change_type)) { | |||||
| $away = $changeset->getAwayPaths(); | |||||
| if (count($away) == 1) { | |||||
| if ($change_type == DifferentialChangeType::TYPE_MOVE_AWAY) { | |||||
| $right_arrow = "\xE2\x86\x92"; | |||||
| $name = $this->renderRename($name, head($away), $right_arrow); | |||||
| } | |||||
| } | |||||
| } else if ($change_type == DifferentialChangeType::TYPE_MOVE_HERE) { | |||||
| $left_arrow = "\xE2\x86\x90"; | |||||
| $name = $this->renderRename($name, $changeset->getOldFile(), $left_arrow); | |||||
| } | |||||
| return javelin_tag( | return javelin_tag( | ||||
| 'a', | 'a', | ||||
| array( | array( | ||||
| 'href' => '#'.$anchor, | 'href' => '#'.$anchor, | ||||
| 'sigil' => 'differential-load', | 'sigil' => 'differential-load', | ||||
| 'meta' => array( | 'meta' => array( | ||||
| 'id' => 'diff-'.$anchor, | 'id' => 'diff-'.$anchor, | ||||
| ), | ), | ||||
| ), | ), | ||||
| $name); | $name); | ||||
| } | } | ||||
| private function renderChangesetLines() { | public function renderChangesetLines() { | ||||
| $changeset = $this->getChangeset(); | $changeset = $this->getChangeset(); | ||||
| if ($changeset->getIsLowImportanceChangeset()) { | |||||
| return null; | |||||
| } | |||||
| $line_count = $changeset->getAffectedLineCount(); | $line_count = $changeset->getAffectedLineCount(); | ||||
| if (!$line_count) { | if (!$line_count) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| return ' '.pht('(%d line(s))', $line_count); | return pht('%d line(s)', $line_count); | ||||
| } | } | ||||
| private function renderCoverage() { | public function renderCoverage() { | ||||
| $not_applicable = '-'; | $not_applicable = '-'; | ||||
| $coverage = $this->getCoverage(); | $coverage = $this->getCoverage(); | ||||
| if (!strlen($coverage)) { | if (!strlen($coverage)) { | ||||
| return $not_applicable; | return $not_applicable; | ||||
| } | } | ||||
| $covered = substr_count($coverage, 'C'); | $covered = substr_count($coverage, 'C'); | ||||
| $not_covered = substr_count($coverage, 'U'); | $not_covered = substr_count($coverage, 'U'); | ||||
| if (!$not_covered && !$covered) { | if (!$not_covered && !$covered) { | ||||
| return $not_applicable; | return $not_applicable; | ||||
| } | } | ||||
| return sprintf('%d%%', 100 * ($covered / ($covered + $not_covered))); | return sprintf('%d%%', 100 * ($covered / ($covered + $not_covered))); | ||||
| } | } | ||||
| private function renderModifiedCoverage() { | public function renderModifiedCoverage() { | ||||
| $not_applicable = '-'; | $not_applicable = '-'; | ||||
| $coverage = $this->getCoverage(); | $coverage = $this->getCoverage(); | ||||
| if (!strlen($coverage)) { | if (!strlen($coverage)) { | ||||
| return $not_applicable; | return $not_applicable; | ||||
| } | } | ||||
| if ($this->getIsVisible()) { | if ($this->getIsVisible()) { | ||||
| ▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | private function renderChangesetMetadata() { | ||||
| return phutil_tag( | return phutil_tag( | ||||
| 'div', | 'div', | ||||
| array( | array( | ||||
| 'class' => 'differential-toc-meta', | 'class' => 'differential-toc-meta', | ||||
| ), | ), | ||||
| $meta); | $meta); | ||||
| } | } | ||||
| private function renderPackages() { | public function renderPackages() { | ||||
| $packages = $this->getPackages(); | $packages = $this->getPackages(); | ||||
| if (!$packages) { | if (!$packages) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| $viewer = $this->getUser(); | $viewer = $this->getViewer(); | ||||
| $package_phids = mpull($packages, 'getPHID'); | $package_phids = mpull($packages, 'getPHID'); | ||||
| return $viewer->renderHandleList($package_phids) | return $viewer->renderHandleList($package_phids) | ||||
| ->setGlyphLimit(48); | ->setGlyphLimit(48); | ||||
| } | } | ||||
| private function renderRename($self, $other, $arrow) { | |||||
| $old = explode('/', $self); | |||||
| $new = explode('/', $other); | |||||
| $start = count($old); | |||||
| foreach ($old as $index => $part) { | |||||
| if (!isset($new[$index]) || $part != $new[$index]) { | |||||
| $start = $index; | |||||
| break; | |||||
| } | |||||
| } | |||||
| $end = count($old); | |||||
| foreach (array_reverse($old) as $from_end => $part) { | |||||
| $index = count($new) - $from_end - 1; | |||||
| if (!isset($new[$index]) || $part != $new[$index]) { | |||||
| $end = $from_end; | |||||
| break; | |||||
| } | |||||
| } | |||||
| $rename = | |||||
| '{'. | |||||
| implode('/', array_slice($old, $start, count($old) - $end - $start)). | |||||
| ' '.$arrow.' '. | |||||
| implode('/', array_slice($new, $start, count($new) - $end - $start)). | |||||
| '}'; | |||||
| array_splice($new, $start, count($new) - $end - $start, $rename); | |||||
| return implode('/', $new); | |||||
| } | |||||
| } | } | ||||