Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/differential/view/DifferentialRevisionListView.php b/src/applications/differential/view/DifferentialRevisionListView.php
index b74a7e9815..87b7006979 100644
--- a/src/applications/differential/view/DifferentialRevisionListView.php
+++ b/src/applications/differential/view/DifferentialRevisionListView.php
@@ -1,254 +1,252 @@
<?php
/**
* Render a table of Differential revisions.
*/
final class DifferentialRevisionListView extends AphrontView {
private $revisions;
private $flags = array();
private $drafts = array();
private $handles;
private $fields;
private $highlightAge;
private $header;
private $noDataString;
public function setNoDataString($no_data_string) {
$this->noDataString = $no_data_string;
return $this;
}
public function setHeader($header) {
$this->header = $header;
return $this;
}
public function setFields(array $fields) {
assert_instances_of($fields, 'DifferentialFieldSpecification');
$this->fields = $fields;
return $this;
}
public function setRevisions(array $revisions) {
assert_instances_of($revisions, 'DifferentialRevision');
$this->revisions = $revisions;
return $this;
}
public function setHighlightAge($bool) {
$this->highlightAge = $bool;
return $this;
}
public function getRequiredHandlePHIDs() {
$phids = array();
foreach ($this->fields as $field) {
foreach ($this->revisions as $revision) {
$phids[] = $field->getRequiredHandlePHIDsForRevisionList($revision);
}
}
return array_mergev($phids);
}
public function setHandles(array $handles) {
assert_instances_of($handles, 'PhabricatorObjectHandle');
$this->handles = $handles;
return $this;
}
public function loadAssets() {
$user = $this->user;
if (!$user) {
throw new Exception("Call setUser() before loadAssets()!");
}
if ($this->revisions === null) {
throw new Exception("Call setRevisions() before loadAssets()!");
}
$this->flags = id(new PhabricatorFlagQuery())
->setViewer($user)
->withOwnerPHIDs(array($user->getPHID()))
->withObjectPHIDs(mpull($this->revisions, 'getPHID'))
->execute();
$this->drafts = id(new DifferentialRevisionQuery())
->setViewer($user)
->withIDs(mpull($this->revisions, 'getID'))
->withDraftRepliesByAuthors(array($user->getPHID()))
->execute();
return $this;
}
public function render() {
$user = $this->user;
if (!$user) {
throw new Exception("Call setUser() before render()!");
}
$fresh = PhabricatorEnv::getEnvConfig('differential.days-fresh');
if ($fresh) {
$fresh = PhabricatorCalendarHoliday::getNthBusinessDay(
time(),
-$fresh);
}
$stale = PhabricatorEnv::getEnvConfig('differential.days-stale');
if ($stale) {
$stale = PhabricatorCalendarHoliday::getNthBusinessDay(
time(),
-$stale);
}
Javelin::initBehavior('phabricator-tooltips', array());
require_celerity_resource('aphront-tooltip-css');
$flagged = mpull($this->flags, null, 'getObjectPHID');
foreach ($this->fields as $field) {
$field->setHandles($this->handles);
}
$list = new PhabricatorObjectItemListView();
$list->setCards(true);
foreach ($this->revisions as $revision) {
$item = new PhabricatorObjectItemView();
$rev_fields = array();
$icons = array();
$phid = $revision->getPHID();
if (isset($flagged[$phid])) {
- $icons['flag'] = array(
- 'icon' => 'flag-'.$flagged[$phid]->getColor(),
- );
+ $flag = $flagged[$phid];
+ $flag_class = PhabricatorFlagColor::getCSSClass($flag->getColor());
+ $icons['flag'] = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phabricator-flag-icon '.$flag_class,
+ ),
+ '');
}
if (array_key_exists($revision->getID(), $this->drafts)) {
$icons['draft'] = array(
'icon' => 'file-grey',
);
}
$modified = $revision->getDateModified();
foreach ($this->fields as $field) {
if (($fresh || $stale) &&
$field instanceof DifferentialDateModifiedFieldSpecification) {
if ($stale && $modified < $stale) {
$days = floor((time() - $modified) / 60 / 60 / 24);
$icons['age'] = array(
'icon' => 'warning-grey',
'label' => pht('Old (%d days)', $days),
);
} else if ($fresh && $modified < $fresh) {
$days = floor((time() - $modified) / 60 / 60 / 24);
$icons['age'] = array(
'icon' => 'perflab-grey',
'label' => pht('Stale (%d days)', $days),
);
} else {
// Fresh, noOp();
}
}
$rev_header = $field->renderHeaderForRevisionList();
$rev_fields[$rev_header] = $field
->renderValueForRevisionList($revision);
}
$status = $revision->getStatus();
$status_name =
ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status);
- $flag_icon = null;
if (isset($icons['flag'])) {
- $flag_icon = $icons['flag']['icon'];
+ $item->addHeadIcon($icons['flag']);
}
$item->setObjectName('D'.$revision->getID());
$item->setHeader(phutil_tag('a',
array('href' => '/D'.$revision->getID()),
$revision->getTitle()));
$item->addAttribute($status_name);
// Author
$author_handle = $this->handles[$revision->getAuthorPHID()];
$item->addByline(pht('Author: %s', $author_handle->renderLink()));
// Reviewers
$item->addAttribute(pht('Reviewers: %s', $rev_fields['Reviewers']));
$item->setStateIconColumns(1);
if (isset($icons['draft'])) {
$item->addStateIcon(
$icons['draft']['icon'],
pht('Saved Comments'));
} else {
$item->addStateIcon('none');
}
- if ($flag_icon) {
- $item->addStateIcon($flag_icon, pht('Flagged'));
- } else {
- $item->addStateIcon('none');
- }
-
$time_icon = 'none';
$time_attr = array();
if ($this->highlightAge) {
$do_not_display_age = array(
ArcanistDifferentialRevisionStatus::CLOSED => true,
ArcanistDifferentialRevisionStatus::ABANDONED => true,
);
if (isset($icons['age']) && !isset($do_not_display_age[$status])) {
$time_icon = $icons['age']['icon'];
$time_attr = array(
'tip' => $icons['age']['label'],
);
}
}
$item->addIcon($time_icon, $rev_fields['Updated'], $time_attr);
// First remove the fields we already have
$count = 7;
$rev_fields = array_slice($rev_fields, $count);
// Then add each one of them
// TODO: Add render-to-foot-icon support
foreach ($rev_fields as $header => $field) {
$item->addAttribute(pht('%s: %s', $header, $field));
}
$list->addItem($item);
}
$list->setHeader($this->header);
$list->setNoDataString($this->noDataString);
return $list;
}
public static function getDefaultFields(PhabricatorUser $user) {
$selector = DifferentialFieldSelector::newSelector();
$fields = $selector->getFieldSpecifications();
foreach ($fields as $key => $field) {
$field->setUser($user);
if (!$field->shouldAppearOnRevisionList()) {
unset($fields[$key]);
}
}
if (!$fields) {
throw new Exception(
"Phabricator configuration has no fields that appear on the list ".
"interface!");
}
return $selector->sortFieldsForRevisionList($fields);
}
}
diff --git a/src/applications/flag/view/PhabricatorFlagListView.php b/src/applications/flag/view/PhabricatorFlagListView.php
index 1ee5b2ed48..2b31ddf887 100644
--- a/src/applications/flag/view/PhabricatorFlagListView.php
+++ b/src/applications/flag/view/PhabricatorFlagListView.php
@@ -1,74 +1,74 @@
<?php
final class PhabricatorFlagListView extends AphrontView {
private $flags;
private $flush = false;
public function setFlags(array $flags) {
assert_instances_of($flags, 'PhabricatorFlag');
$this->flags = $flags;
return $this;
}
public function setFlush($flush) {
$this->flush = $flush;
return $this;
}
public function render() {
$user = $this->user;
require_celerity_resource('phabricator-flag-css');
$list = new PhabricatorObjectItemListView();
$list->setCards(true);
$list->setNoDataString(pht('No flags.'));
$list->setFlush($this->flush);
$rows = array();
foreach ($this->flags as $flag) {
$class = PhabricatorFlagColor::getCSSClass($flag->getColor());
$flag_icon = phutil_tag(
'div',
array(
'class' => 'phabricator-flag-icon '.$class,
),
'');
$edit_link = javelin_tag(
'a',
array(
'href' => '/flag/edit/'.$flag->getObjectPHID().'/',
'sigil' => 'workflow',
),
pht('Edit'));
$remove_link = javelin_tag(
'a',
array(
'href' => '/flag/delete/'.$flag->getID().'/',
'sigil' => 'workflow',
),
pht('Remove'));
$item = new PhabricatorObjectItemView();
$item->addIcon('edit', $edit_link);
$item->addIcon('delete', $remove_link);
- $item->setHeader(hsprintf('%s %s',
- $flag_icon, $flag->getHandle()->renderLink()));
+ $item->addHeadIcon($flag_icon);
+ $item->setHeader($flag->getHandle()->renderLink());
$item->addAttribute(phabricator_datetime($flag->getDateCreated(), $user));
if ($flag->getNote()) {
$item->addAttribute($flag->getNote());
}
$list->addItem($item);
}
return $list;
}
}
diff --git a/src/view/layout/PhabricatorObjectItemView.php b/src/view/layout/PhabricatorObjectItemView.php
index f78774e2b9..34cae3dad2 100644
--- a/src/view/layout/PhabricatorObjectItemView.php
+++ b/src/view/layout/PhabricatorObjectItemView.php
@@ -1,544 +1,551 @@
<?php
final class PhabricatorObjectItemView extends AphrontTagView {
private $objectName;
private $header;
private $subhead;
private $href;
private $attributes = array();
private $icons = array();
private $barColor;
private $object;
private $effect;
private $footIcons = array();
private $handleIcons = array();
private $bylines = array();
private $grippable;
private $actions = array();
private $stateIconColumns = 0;
private $stateIcons = array();
+ private $headIcons = array();
public function setStateIconColumns($state_icon_columns) {
$this->stateIconColumns = $state_icon_columns;
return $this;
}
public function addStateIcon($name, $label = null, $attributes = array()) {
$this->stateIcons[] = array(
'name' => $name,
'label' => $label,
'attributes' => $attributes,
);
if (!$this->stateIconColumns) {
$this->stateIconColumns = 1;
}
return $this;
}
+ public function addHeadIcon($icon) {
+ $this->headIcons[] = $icon;
+ return $this;
+ }
+
public function setObjectName($name) {
$this->objectName = $name;
return $this;
}
public function setGrippable($grippable) {
$this->grippable = $grippable;
return $this;
}
public function getGrippable() {
return $this->grippable;
}
public function setEffect($effect) {
$this->effect = $effect;
return $this;
}
public function getEffect() {
return $this->effect;
}
public function setObject($object) {
$this->object = $object;
return $this;
}
public function getObject() {
return $this->object;
}
public function setHref($href) {
$this->href = $href;
return $this;
}
public function getHref() {
return $this->href;
}
public function setHeader($header) {
$this->header = $header;
return $this;
}
public function setSubHead($subhead) {
$this->subhead = $subhead;
return $this;
}
public function getHeader() {
return $this->header;
}
public function addByline($byline) {
$this->bylines[] = $byline;
return $this;
}
public function addAction(PHUIListItemView $action) {
if (count($this->actions) >= 3) {
throw new Exception("Limit 3 actions per item.");
}
$this->actions[] = $action;
return $this;
}
public function addIcon($icon, $label = null, $attributes = array()) {
$this->icons[] = array(
'icon' => $icon,
'label' => $label,
'attributes' => $attributes,
);
return $this;
}
public function addFootIcon($icon, $label = null) {
$this->footIcons[] = array(
'icon' => $icon,
'label' => $label,
);
return $this;
}
public function addHandleIcon(
PhabricatorObjectHandle $handle,
$label = null) {
$this->handleIcons[] = array(
'icon' => $handle,
'label' => $label,
);
return $this;
}
public function setBarColor($bar_color) {
$this->barColor = $bar_color;
return $this;
}
public function getBarColor() {
return $this->barColor;
}
public function addAttribute($attribute) {
if (!empty($attribute)) {
$this->attributes[] = $attribute;
}
return $this;
}
protected function getTagName() {
return 'li';
}
protected function getTagAttributes() {
$item_classes = array();
$item_classes[] = 'phabricator-object-item';
if ($this->icons) {
$item_classes[] = 'phabricator-object-item-with-icons';
}
if ($this->attributes) {
$item_classes[] = 'phabricator-object-item-with-attrs';
}
if ($this->handleIcons) {
$item_classes[] = 'phabricator-object-item-with-handle-icons';
}
if ($this->barColor) {
$item_classes[] = 'phabricator-object-item-bar-color-'.$this->barColor;
}
if ($this->footIcons) {
$item_classes[] = 'phabricator-object-item-with-foot-icons';
}
if ($this->bylines) {
$item_classes[] = 'phabricator-object-item-with-bylines';
}
if ($this->actions) {
$n = count($this->actions);
$item_classes[] = 'phabricator-object-item-with-actions';
$item_classes[] = 'phabricator-object-item-with-'.$n.'-actions';
}
switch ($this->effect) {
case 'highlighted':
$item_classes[] = 'phabricator-object-item-highlighted';
break;
case 'selected':
$item_classes[] = 'phabricator-object-item-selected';
break;
case null:
break;
default:
throw new Exception(pht("Invalid effect!"));
}
if ($this->getGrippable()) {
$item_classes[] = 'phabricator-object-item-grippable';
}
if ($this->stateIconColumns) {
$cols = $this->stateIconColumns;
$item_classes[] = 'phabricator-object-item-state-'.$cols.'-cols';
}
return array(
'class' => $item_classes,
);
}
public function getTagContent() {
$content_classes = array();
$content_classes[] = 'phabricator-object-item-content';
$header_name = null;
if ($this->objectName) {
$header_name = array(
phutil_tag(
'span',
array(
'class' => 'phabricator-object-item-objname',
),
$this->objectName),
' ',
);
}
$header_link = phutil_tag(
$this->href ? 'a' : 'div',
array(
'href' => $this->href,
'class' => 'phabricator-object-item-link',
),
$this->header);
$header = javelin_tag(
'div',
array(
'class' => 'phabricator-object-item-name',
'sigil' => 'slippery',
),
array(
+ $this->headIcons,
$header_name,
$header_link,
));
$icons = array();
if ($this->icons) {
$icon_list = array();
foreach ($this->icons as $spec) {
$icon = $spec['icon'];
$sigil = null;
$meta = null;
if (isset($spec['attributes']['tip'])) {
$sigil = 'has-tooltip';
$meta = array(
'tip' => $spec['attributes']['tip'],
'align' => 'W',
);
}
$icon = javelin_tag(
'span',
array(
'class' => 'phabricator-object-item-icon-image '.
'sprite-icons icons-'.$icon,
'sigil' => $sigil,
'meta' => $meta,
),
'');
$label = phutil_tag(
'span',
array(
'class' => 'phabricator-object-item-icon-label',
),
$spec['label']);
if (isset($spec['attributes']['href'])) {
$icon_href = phutil_tag(
'a',
array('href' => $spec['attributes']['href']),
array($label, $icon));
} else {
$icon_href = array($label, $icon);
}
$classes = array();
$classes[] = 'phabricator-object-item-icon';
if ($spec['icon'] == 'none') {
$classes[] = 'phabricator-object-item-icon-none';
}
$icon_list[] = javelin_tag(
'li',
array(
'class' => implode(' ', $classes),
),
$icon_href);
}
$icons[] = phutil_tag(
'ul',
array(
'class' => 'phabricator-object-item-icons',
),
$icon_list);
}
if ($this->handleIcons) {
$handle_bar = array();
foreach ($this->handleIcons as $icon) {
$handle_bar[] = $this->renderHandleIcon($icon['icon'], $icon['label']);
}
$icons[] = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-handle-icons',
),
$handle_bar);
}
$bylines = array();
if ($this->bylines) {
foreach ($this->bylines as $byline) {
$bylines[] = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-byline',
),
$byline);
}
$bylines = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-bylines',
),
$bylines);
}
$subhead = null;
if ($this->subhead) {
$subhead = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-subhead',
),
$this->subhead);
}
if ($icons) {
$icons = phutil_tag(
'div',
array(
'class' => 'phabricator-object-icon-pane',
),
$icons);
}
$attrs = null;
if ($this->attributes) {
$attrs = array();
$spacer = phutil_tag(
'span',
array(
'class' => 'phabricator-object-item-attribute-spacer',
),
"\xC2\xB7");
$first = true;
foreach ($this->attributes as $attribute) {
$attrs[] = phutil_tag(
'li',
array(
'class' => 'phabricator-object-item-attribute',
),
array(
($first ? null : $spacer),
$attribute,
));
$first = false;
}
$attrs = phutil_tag(
'ul',
array(
'class' => 'phabricator-object-item-attributes',
),
$attrs);
}
$foot = null;
if ($this->footIcons) {
$foot_bar = array();
foreach ($this->footIcons as $icon) {
$foot_bar[] = $this->renderFootIcon($icon['icon'], $icon['label']);
}
$foot = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-foot-icons',
),
$foot_bar);
}
$grippable = null;
if ($this->getGrippable()) {
$grippable = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-grip',
),
'');
}
$state_icons = null;
if ($this->stateIconColumns) {
$state_icon_list = array();
foreach ($this->stateIcons as $state_icon) {
$sicon = id(new PHUIIconView())
->setSpriteSheet(PHUIIconView::SPRITE_ICONS)
->setSpriteIcon($state_icon['name']);
if ($state_icon['label']) {
$sicon->addSigil('has-tooltip');
$sicon->setMetadata(
array(
'tip' => $state_icon['label'],
));
}
$state_icon_list[] = $sicon;
}
$cols = $this->stateIconColumns;
$state_icons = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-state-icons '.
'state-icon-'.$cols.'-cols',
),
$state_icon_list);
}
$content = phutil_tag(
'div',
array(
'class' => implode(' ', $content_classes),
),
array(
$subhead,
$attrs,
$this->renderChildren(),
$foot,
));
$box = phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-content-box',
),
array(
$grippable,
$state_icons,
$header,
$icons,
$bylines,
$content,
));
$actions = array();
if ($this->actions) {
foreach (array_reverse($this->actions) as $action) {
$actions[] = $action;
}
$actions = phutil_tag(
'ul',
array(
'class' => 'phabricator-object-item-actions',
),
$actions);
}
return phutil_tag(
'div',
array(
'class' => 'phabricator-object-item-frame',
),
array(
$actions,
$box,
));
}
private function renderFootIcon($icon, $label) {
require_celerity_resource('sprite-icons-css');
$icon = phutil_tag(
'span',
array(
'class' => 'sprite-icons icons-'.$icon,
),
'');
$label = phutil_tag(
'span',
array(
),
$label);
return phutil_tag(
'span',
array(
'class' => 'phabricator-object-item-foot-icon',
),
array($icon, $label));
}
private function renderHandleIcon(PhabricatorObjectHandle $handle, $label) {
Javelin::initBehavior('phabricator-tooltips');
$options = array(
'class' => 'phabricator-object-item-handle-icon',
'style' => 'background-image: url('.$handle->getImageURI().')',
);
if (strlen($label)) {
$options['sigil'] = 'has-tooltip';
$options['meta'] = array('tip' => $label);
}
return javelin_tag(
'span',
$options,
'');
}
}

File Metadata

Mime Type
text/x-diff
Expires
Wed, Dec 3, 1:17 AM (5 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
433021
Default Alt Text
(22 KB)

Event Timeline