mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-28 17:52:43 +01:00
35d03d36c7
Summary: See T372. Always render commit messages on one display line, so the table doesn't jump around as they AJAX in on browse views. The goal here is to have the cell choose a size naturally and for its content to render with "overflow: hidden" if the natural size isn't large enough to contain the content. "white-space: pre" or "white-space: nowrap" would prevent wrapping but potentially make the table exceed the display width when a better behavior is to hide some of the commit message. Also use utf8-aware shortening, now that we have a function for it. Casting a wide net in case anyone has a better way to do the CSS here. It's kind of nasty that we have to use so many DOM nodes. Test Plan: - Resized window while viewing browse and history views in Safari, Chrome and Firefox. Table exhibited described behavior. - Verified summaries render sensibly and are properly truncated to 100 characters. Reviewed By: aran Reviewers: aran, jungejason, tuomaspelkonen, tomo, mroch, cpojer CC: aran, epriestley Differential Revision: 750
175 lines
4.6 KiB
PHP
175 lines
4.6 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright 2011 Facebook, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
final class DiffusionBrowseTableView extends DiffusionView {
|
|
|
|
private $paths;
|
|
private $handles = array();
|
|
|
|
public function setPaths(array $paths) {
|
|
$this->paths = $paths;
|
|
return $this;
|
|
}
|
|
|
|
public function setHandles(array $handles) {
|
|
$this->handles = $handles;
|
|
return $this;
|
|
}
|
|
|
|
public static function renderLastModifiedColumns(
|
|
PhabricatorRepository $repository,
|
|
array $handles,
|
|
PhabricatorRepositoryCommit $commit = null,
|
|
PhabricatorRepositoryCommitData $data = null) {
|
|
|
|
if ($commit) {
|
|
$epoch = $commit->getEpoch();
|
|
$modified = DiffusionView::linkCommit(
|
|
$repository,
|
|
$commit->getCommitIdentifier());
|
|
$date = date('M j, Y', $epoch);
|
|
$time = date('g:i A', $epoch);
|
|
} else {
|
|
$modified = '';
|
|
$date = '';
|
|
$time = '';
|
|
}
|
|
|
|
if ($data) {
|
|
$author_phid = $data->getCommitDetail('authorPHID');
|
|
if ($author_phid && isset($handles[$author_phid])) {
|
|
$author = $handles[$author_phid]->renderLink();
|
|
} else {
|
|
$author = phutil_escape_html($data->getAuthorName());
|
|
}
|
|
$details = AphrontTableView::renderSingleDisplayLine(
|
|
phutil_escape_html($data->getSummary()));
|
|
} else {
|
|
$author = '';
|
|
$details = '';
|
|
}
|
|
|
|
return array(
|
|
'commit' => $modified,
|
|
'date' => $date,
|
|
'time' => $time,
|
|
'author' => $author,
|
|
'details' => $details,
|
|
);
|
|
}
|
|
|
|
public function render() {
|
|
$request = $this->getDiffusionRequest();
|
|
$repository = $request->getRepository();
|
|
|
|
$base_path = trim($request->getPath(), '/');
|
|
if ($base_path) {
|
|
$base_path = $base_path.'/';
|
|
}
|
|
|
|
$need_pull = array();
|
|
$rows = array();
|
|
foreach ($this->paths as $path) {
|
|
|
|
if ($path->getFileType() == DifferentialChangeType::FILE_DIRECTORY) {
|
|
$browse_text = $path->getPath().'/';
|
|
$dir_slash = '/';
|
|
|
|
$browse_link = '<strong>'.$this->linkBrowse(
|
|
$base_path.$path->getPath().$dir_slash,
|
|
array(
|
|
'text' => $browse_text,
|
|
)).'</strong>';
|
|
} else {
|
|
$browse_text = $path->getPath();
|
|
$dir_slash = null;
|
|
$browse_link = $this->linkBrowse(
|
|
$base_path.$path->getPath().$dir_slash,
|
|
array(
|
|
'text' => $browse_text,
|
|
));
|
|
}
|
|
|
|
$commit = $path->getLastModifiedCommit();
|
|
if ($commit) {
|
|
$dict = self::renderLastModifiedColumns(
|
|
$repository,
|
|
$this->handles,
|
|
$commit,
|
|
$path->getLastCommitData());
|
|
} else {
|
|
$dict = array(
|
|
'commit' => celerity_generate_unique_node_id(),
|
|
'date' => celerity_generate_unique_node_id(),
|
|
'time' => celerity_generate_unique_node_id(),
|
|
'author' => celerity_generate_unique_node_id(),
|
|
'details' => celerity_generate_unique_node_id(),
|
|
);
|
|
$uri =
|
|
'/diffusion/'.$repository->getCallsign().'/lastmodified/'.
|
|
$request->getBranchURIComponent($request->getBranch()).
|
|
$base_path.$path->getPath();
|
|
if ($request->getRawCommit()) {
|
|
$uri .= ';'.$request->getRawCommit();
|
|
}
|
|
$need_pull[$uri] = $dict;
|
|
foreach ($dict as $k => $uniq) {
|
|
$dict[$k] = '<span id="'.$uniq.'"></span>';
|
|
}
|
|
}
|
|
|
|
$rows[] = array(
|
|
$this->linkHistory($base_path.$path->getPath().$dir_slash),
|
|
$browse_link,
|
|
$dict['commit'],
|
|
$dict['date'],
|
|
$dict['time'],
|
|
$dict['author'],
|
|
$dict['details'],
|
|
);
|
|
}
|
|
|
|
if ($need_pull) {
|
|
Javelin::initBehavior('diffusion-pull-lastmodified', $need_pull);
|
|
}
|
|
|
|
$view = new AphrontTableView($rows);
|
|
$view->setHeaders(
|
|
array(
|
|
'History',
|
|
'Path',
|
|
'Modified',
|
|
'Date',
|
|
'Time',
|
|
'Author',
|
|
'Details',
|
|
));
|
|
$view->setColumnClasses(
|
|
array(
|
|
'',
|
|
'',
|
|
'',
|
|
'',
|
|
'right',
|
|
'',
|
|
'wide',
|
|
));
|
|
return $view->render();
|
|
}
|
|
|
|
}
|