2011-01-26 18:02:09 +01:00
|
|
|
<?php
|
|
|
|
|
2013-07-21 16:03:10 +02:00
|
|
|
final class PhabricatorObjectHandle
|
|
|
|
implements PhabricatorPolicyInterface {
|
2011-01-26 18:02:09 +01:00
|
|
|
|
|
|
|
private $uri;
|
|
|
|
private $phid;
|
|
|
|
private $type;
|
|
|
|
private $name;
|
2011-02-03 02:38:03 +01:00
|
|
|
private $fullName;
|
2013-04-11 17:15:31 +02:00
|
|
|
private $title;
|
2011-02-01 01:00:42 +01:00
|
|
|
private $imageURI;
|
2014-05-23 19:41:24 +02:00
|
|
|
private $icon;
|
2014-06-26 07:01:58 +02:00
|
|
|
private $tagColor;
|
2011-04-23 00:10:42 +02:00
|
|
|
private $timestamp;
|
2012-05-17 03:42:06 +02:00
|
|
|
private $status = PhabricatorObjectHandleStatus::STATUS_OPEN;
|
2011-08-30 21:03:58 +02:00
|
|
|
private $complete;
|
2011-11-16 18:49:18 +01:00
|
|
|
private $disabled;
|
2013-10-05 04:57:15 +02:00
|
|
|
private $objectName;
|
2013-10-17 19:49:21 +02:00
|
|
|
private $policyFiltered;
|
|
|
|
|
2014-05-23 19:41:24 +02:00
|
|
|
public function setIcon($icon) {
|
|
|
|
$this->icon = $icon;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getIcon() {
|
2014-06-26 17:49:44 +02:00
|
|
|
if ($this->getPolicyFiltered()) {
|
|
|
|
return 'fa-lock';
|
|
|
|
}
|
|
|
|
|
2014-05-23 19:41:24 +02:00
|
|
|
if ($this->icon) {
|
|
|
|
return $this->icon;
|
|
|
|
}
|
|
|
|
return $this->getTypeIcon();
|
|
|
|
}
|
|
|
|
|
2014-06-26 07:01:58 +02:00
|
|
|
public function setTagColor($color) {
|
|
|
|
static $colors;
|
|
|
|
if (!$colors) {
|
|
|
|
$colors = array_fuse(array_keys(PHUITagView::getShadeMap()));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($colors[$color])) {
|
|
|
|
$this->tagColor = $color;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getTagColor() {
|
2014-06-26 17:49:44 +02:00
|
|
|
if ($this->getPolicyFiltered()) {
|
|
|
|
return 'disabled';
|
|
|
|
}
|
|
|
|
|
2014-06-26 07:01:58 +02:00
|
|
|
if ($this->tagColor) {
|
|
|
|
return $this->tagColor;
|
|
|
|
}
|
|
|
|
return 'blue';
|
2014-06-26 07:01:42 +02:00
|
|
|
}
|
|
|
|
|
2014-02-14 19:23:56 +01:00
|
|
|
public function getTypeIcon() {
|
|
|
|
if ($this->getPHIDType()) {
|
|
|
|
return $this->getPHIDType()->getTypeIcon();
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2013-10-17 19:49:21 +02:00
|
|
|
public function setPolicyFiltered($policy_filered) {
|
|
|
|
$this->policyFiltered = $policy_filered;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPolicyFiltered() {
|
|
|
|
return $this->policyFiltered;
|
|
|
|
}
|
2013-10-05 04:57:15 +02:00
|
|
|
|
|
|
|
public function setObjectName($object_name) {
|
|
|
|
$this->objectName = $object_name;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getObjectName() {
|
|
|
|
if (!$this->objectName) {
|
|
|
|
return $this->getName();
|
|
|
|
}
|
|
|
|
return $this->objectName;
|
|
|
|
}
|
2011-01-26 18:02:09 +01:00
|
|
|
|
|
|
|
public function setURI($uri) {
|
|
|
|
$this->uri = $uri;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getURI() {
|
|
|
|
return $this->uri;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setPHID($phid) {
|
|
|
|
$this->phid = $phid;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPHID() {
|
|
|
|
return $this->phid;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function setName($name) {
|
|
|
|
$this->name = $name;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getName() {
|
2013-07-21 16:03:10 +02:00
|
|
|
if ($this->name === null) {
|
2013-10-17 19:49:21 +02:00
|
|
|
if ($this->getPolicyFiltered()) {
|
|
|
|
return pht('Restricted %s', $this->getTypeName());
|
|
|
|
} else {
|
|
|
|
return pht('Unknown Object (%s)', $this->getTypeName());
|
|
|
|
}
|
2013-07-21 16:03:10 +02:00
|
|
|
}
|
2011-01-26 18:02:09 +01:00
|
|
|
return $this->name;
|
|
|
|
}
|
|
|
|
|
Add object status to Handles
Summary:
We use ObjectHandles as proxy objects which can refer to any other object in the
system. Add the concept of the underlying object's "status" (e.g., open, closed
or busy).
This allows us to render completed tasks and revisions with strikethrough. In
the future, if we implement OOO or something, we could render users with a
"busy" status if they're on vacation, etc.
Test Plan: Viewed a task with closed revisions and dependencies:
https://secure.phabricator.com/file/view/PHID-FILE-6183e81286fa3288d33d/
Reviewed By: codeblock
Reviewers: codeblock, hunterbridges, jungejason, tuomaspelkonen, aran
CC: aran, codeblock
Differential Revision: 772
2011-08-03 15:37:18 +02:00
|
|
|
public function setStatus($status) {
|
|
|
|
$this->status = $status;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getStatus() {
|
|
|
|
return $this->status;
|
|
|
|
}
|
|
|
|
|
2011-02-03 02:38:03 +01:00
|
|
|
public function setFullName($full_name) {
|
|
|
|
$this->fullName = $full_name;
|
|
|
|
return $this;
|
|
|
|
}
|
2011-02-03 04:38:43 +01:00
|
|
|
|
2011-02-03 02:38:03 +01:00
|
|
|
public function getFullName() {
|
2011-02-21 05:08:16 +01:00
|
|
|
if ($this->fullName !== null) {
|
|
|
|
return $this->fullName;
|
|
|
|
}
|
|
|
|
return $this->getName();
|
2011-02-03 02:38:03 +01:00
|
|
|
}
|
2013-06-05 00:28:24 +02:00
|
|
|
|
2013-04-11 17:15:31 +02:00
|
|
|
public function setTitle($title) {
|
|
|
|
$this->title = $title;
|
|
|
|
return $this;
|
|
|
|
}
|
2013-06-05 00:28:24 +02:00
|
|
|
|
2013-04-11 17:15:31 +02:00
|
|
|
public function getTitle() {
|
|
|
|
return $this->title;
|
|
|
|
}
|
2011-02-03 02:38:03 +01:00
|
|
|
|
2011-01-26 18:02:09 +01:00
|
|
|
public function setType($type) {
|
|
|
|
$this->type = $type;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getType() {
|
|
|
|
return $this->type;
|
|
|
|
}
|
|
|
|
|
2011-02-01 01:00:42 +01:00
|
|
|
public function setImageURI($uri) {
|
|
|
|
$this->imageURI = $uri;
|
|
|
|
return $this;
|
|
|
|
}
|
2011-02-02 22:59:52 +01:00
|
|
|
|
2011-02-01 01:00:42 +01:00
|
|
|
public function getImageURI() {
|
|
|
|
return $this->imageURI;
|
|
|
|
}
|
2011-01-26 18:02:09 +01:00
|
|
|
|
2011-04-23 00:10:42 +02:00
|
|
|
public function setTimestamp($timestamp) {
|
|
|
|
$this->timestamp = $timestamp;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getTimestamp() {
|
|
|
|
return $this->timestamp;
|
|
|
|
}
|
|
|
|
|
Improve search result listing
Summary:
Make it prettier, paginate, add user pictures, show document types, clean some
stuff up a little. Plenty of room for improvement but this should make it a lot
more useful.
Test Plan:
Here's what the new one looks like:
https://secure.phabricator.com/file/view/PHID-FILE-edce2b83c2e3a121c2b7/
Reviewed By: jungejason
Reviewers: tomo, jungejason, aran, tuomaspelkonen, mroch
Commenters: tomo
CC: aran, tomo, jungejason, epriestley
Differential Revision: 545
2011-06-28 23:35:02 +02:00
|
|
|
public function getTypeName() {
|
2013-07-21 16:03:10 +02:00
|
|
|
if ($this->getPHIDType()) {
|
|
|
|
return $this->getPHIDType()->getTypeName();
|
2013-07-21 15:34:21 +02:00
|
|
|
}
|
|
|
|
|
2013-07-26 23:05:19 +02:00
|
|
|
return $this->getType();
|
Improve search result listing
Summary:
Make it prettier, paginate, add user pictures, show document types, clean some
stuff up a little. Plenty of room for improvement but this should make it a lot
more useful.
Test Plan:
Here's what the new one looks like:
https://secure.phabricator.com/file/view/PHID-FILE-edce2b83c2e3a121c2b7/
Reviewed By: jungejason
Reviewers: tomo, jungejason, aran, tuomaspelkonen, mroch
Commenters: tomo
CC: aran, tomo, jungejason, epriestley
Differential Revision: 545
2011-06-28 23:35:02 +02:00
|
|
|
}
|
|
|
|
|
2011-11-16 18:49:18 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set whether or not the underlying object is complete. See
|
2012-04-20 07:26:27 +02:00
|
|
|
* @{method:isComplete} for an explanation of what it means to be complete.
|
2011-11-16 18:49:18 +01:00
|
|
|
*
|
|
|
|
* @param bool True if the handle represents a complete object.
|
|
|
|
* @return this
|
|
|
|
*/
|
2011-08-30 21:03:58 +02:00
|
|
|
public function setComplete($complete) {
|
|
|
|
$this->complete = $complete;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-11-16 18:49:18 +01:00
|
|
|
|
2011-08-30 21:03:58 +02:00
|
|
|
/**
|
|
|
|
* Determine if the handle represents an object which was completely loaded
|
|
|
|
* (i.e., the underlying object exists) vs an object which could not be
|
|
|
|
* completely loaded (e.g., the type or data for the PHID could not be
|
|
|
|
* identified or located).
|
|
|
|
*
|
2013-09-11 21:27:28 +02:00
|
|
|
* Basically, @{class:PhabricatorHandleQuery} gives you back a handle for
|
2011-08-30 21:03:58 +02:00
|
|
|
* any PHID you give it, but it gives you a complete handle only for valid
|
|
|
|
* PHIDs.
|
|
|
|
*
|
|
|
|
* @return bool True if the handle represents a complete object.
|
|
|
|
*/
|
|
|
|
public function isComplete() {
|
|
|
|
return $this->complete;
|
|
|
|
}
|
|
|
|
|
2011-11-16 18:49:18 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set whether or not the underlying object is disabled. See
|
2012-04-20 07:26:27 +02:00
|
|
|
* @{method:isDisabled} for an explanation of what it means to be disabled.
|
2011-11-16 18:49:18 +01:00
|
|
|
*
|
|
|
|
* @param bool True if the handle represents a disabled object.
|
|
|
|
* @return this
|
|
|
|
*/
|
|
|
|
public function setDisabled($disabled) {
|
|
|
|
$this->disabled = $disabled;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if the handle represents an object which has been disabled --
|
|
|
|
* for example, disabled users, archived projects, etc. These objects are
|
|
|
|
* complete and exist, but should be excluded from some system interactions
|
|
|
|
* (for instance, they usually should not appear in typeaheads, and should
|
|
|
|
* not have mail/notifications delivered to or about them).
|
|
|
|
*
|
|
|
|
* @return bool True if the handle represents a disabled object.
|
|
|
|
*/
|
|
|
|
public function isDisabled() {
|
|
|
|
return $this->disabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-04-06 20:40:43 +02:00
|
|
|
public function renderLink($name = null) {
|
|
|
|
if ($name === null) {
|
|
|
|
$name = $this->getLinkName();
|
|
|
|
}
|
2013-08-06 18:20:04 +02:00
|
|
|
$classes = array();
|
2013-10-17 19:49:21 +02:00
|
|
|
$classes[] = 'phui-handle';
|
2013-04-11 17:15:31 +02:00
|
|
|
$title = $this->title;
|
2012-01-17 01:54:05 +01:00
|
|
|
|
Add object status to Handles
Summary:
We use ObjectHandles as proxy objects which can refer to any other object in the
system. Add the concept of the underlying object's "status" (e.g., open, closed
or busy).
This allows us to render completed tasks and revisions with strikethrough. In
the future, if we implement OOO or something, we could render users with a
"busy" status if they're on vacation, etc.
Test Plan: Viewed a task with closed revisions and dependencies:
https://secure.phabricator.com/file/view/PHID-FILE-6183e81286fa3288d33d/
Reviewed By: codeblock
Reviewers: codeblock, hunterbridges, jungejason, tuomaspelkonen, aran
CC: aran, codeblock
Differential Revision: 772
2011-08-03 15:37:18 +02:00
|
|
|
if ($this->status != PhabricatorObjectHandleStatus::STATUS_OPEN) {
|
2013-08-06 18:20:04 +02:00
|
|
|
$classes[] = 'handle-status-'.$this->status;
|
2013-04-11 17:15:31 +02:00
|
|
|
$title = $title ? $title : $this->status;
|
2012-01-17 01:54:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->disabled) {
|
2013-08-06 18:20:04 +02:00
|
|
|
$classes[] = 'handle-disabled';
|
2013-10-17 19:49:21 +02:00
|
|
|
$title = pht('Disabled'); // Overwrite status.
|
Add object status to Handles
Summary:
We use ObjectHandles as proxy objects which can refer to any other object in the
system. Add the concept of the underlying object's "status" (e.g., open, closed
or busy).
This allows us to render completed tasks and revisions with strikethrough. In
the future, if we implement OOO or something, we could render users with a
"busy" status if they're on vacation, etc.
Test Plan: Viewed a task with closed revisions and dependencies:
https://secure.phabricator.com/file/view/PHID-FILE-6183e81286fa3288d33d/
Reviewed By: codeblock
Reviewers: codeblock, hunterbridges, jungejason, tuomaspelkonen, aran
CC: aran, codeblock
Differential Revision: 772
2011-08-03 15:37:18 +02:00
|
|
|
}
|
|
|
|
|
2014-07-24 00:05:46 +02:00
|
|
|
if ($this->getType() == PhabricatorPeopleUserPHIDType::TYPECONST) {
|
2013-08-06 18:20:04 +02:00
|
|
|
$classes[] = 'phui-link-person';
|
|
|
|
}
|
|
|
|
|
2013-10-17 19:49:21 +02:00
|
|
|
$uri = $this->getURI();
|
|
|
|
|
|
|
|
$icon = null;
|
|
|
|
if ($this->getPolicyFiltered()) {
|
|
|
|
$icon = id(new PHUIIconView())
|
2014-05-12 19:08:32 +02:00
|
|
|
->setIconFont('fa-lock lightgreytext');
|
2013-10-17 19:49:21 +02:00
|
|
|
}
|
|
|
|
|
2013-01-18 03:43:35 +01:00
|
|
|
return phutil_tag(
|
2013-10-17 19:49:21 +02:00
|
|
|
$uri ? 'a' : 'span',
|
2011-01-27 23:55:52 +01:00
|
|
|
array(
|
2013-10-17 19:49:21 +02:00
|
|
|
'href' => $uri,
|
2013-08-06 18:20:04 +02:00
|
|
|
'class' => implode(' ', $classes),
|
2013-04-11 17:15:31 +02:00
|
|
|
'title' => $title,
|
2011-01-27 23:55:52 +01:00
|
|
|
),
|
2013-10-17 19:49:21 +02:00
|
|
|
array($icon, $name));
|
2011-01-27 23:55:52 +01:00
|
|
|
}
|
2011-01-26 18:02:09 +01:00
|
|
|
|
2014-06-26 07:01:42 +02:00
|
|
|
public function renderTag() {
|
|
|
|
return id(new PHUITagView())
|
|
|
|
->setType(PHUITagView::TYPE_OBJECT)
|
2014-06-26 07:01:58 +02:00
|
|
|
->setShade($this->getTagColor())
|
|
|
|
->setIcon($this->getIcon())
|
2014-06-26 07:01:42 +02:00
|
|
|
->setHref($this->getURI())
|
|
|
|
->setName($this->getLinkName());
|
|
|
|
}
|
|
|
|
|
2012-01-30 13:12:15 +01:00
|
|
|
public function getLinkName() {
|
|
|
|
switch ($this->getType()) {
|
2014-07-24 00:05:46 +02:00
|
|
|
case PhabricatorPeopleUserPHIDType::TYPECONST:
|
2012-01-30 13:12:15 +01:00
|
|
|
$name = $this->getName();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$name = $this->getFullName();
|
2012-03-08 21:46:29 +01:00
|
|
|
break;
|
2012-01-30 13:12:15 +01:00
|
|
|
}
|
|
|
|
return $name;
|
|
|
|
}
|
|
|
|
|
2013-07-21 16:03:10 +02:00
|
|
|
protected function getPHIDType() {
|
|
|
|
$types = PhabricatorPHIDType::getAllTypes();
|
|
|
|
return idx($types, $this->getType());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
public function getCapabilities() {
|
|
|
|
return array(
|
|
|
|
PhabricatorPolicyCapability::CAN_VIEW,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPolicy($capability) {
|
|
|
|
return PhabricatorPolicies::POLICY_PUBLIC;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
|
2013-08-07 22:29:09 +02:00
|
|
|
// NOTE: Handles are always visible, they just don't get populated with
|
|
|
|
// data if the user can't see the underlying object.
|
|
|
|
return true;
|
2013-07-21 16:03:10 +02:00
|
|
|
}
|
|
|
|
|
2013-09-27 17:43:41 +02:00
|
|
|
public function describeAutomaticCapability($capability) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-01-26 18:02:09 +01:00
|
|
|
}
|