diff --git a/src/applications/phid/PhabricatorObjectHandle.php b/src/applications/phid/PhabricatorObjectHandle.php index f3c04d2a2..943464ed6 100644 --- a/src/applications/phid/PhabricatorObjectHandle.php +++ b/src/applications/phid/PhabricatorObjectHandle.php @@ -1,395 +1,405 @@ icon = $icon; return $this; } public function getIcon() { if ($this->getPolicyFiltered()) { return 'fa-lock'; } if ($this->icon) { return $this->icon; } return $this->getTypeIcon(); } public function setSubtitle($subtitle) { $this->subtitle = $subtitle; return $this; } public function getSubtitle() { return $this->subtitle; } 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() { if ($this->getPolicyFiltered()) { return 'disabled'; } if ($this->tagColor) { return $this->tagColor; } return 'blue'; } public function getIconColor() { if ($this->tagColor) { return $this->tagColor; } return null; } public function setTokenIcon($icon) { $this->tokenIcon = $icon; return $this; } public function getTokenIcon() { if ($this->tokenIcon !== null) { return $this->tokenIcon; } return $this->getIcon(); } public function getTypeIcon() { if ($this->getPHIDType()) { return $this->getPHIDType()->getTypeIcon(); } return null; } public function setPolicyFiltered($policy_filered) { $this->policyFiltered = $policy_filered; return $this; } public function getPolicyFiltered() { return $this->policyFiltered; } public function setObjectName($object_name) { $this->objectName = $object_name; return $this; } public function getObjectName() { if (!$this->objectName) { return $this->getName(); } return $this->objectName; } 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() { if ($this->name === null) { if ($this->getPolicyFiltered()) { return pht('Restricted %s', $this->getTypeName()); } else { return pht('Unknown Object (%s)', $this->getTypeName()); } } return $this->name; } public function setAvailability($availability) { $this->availability = $availability; return $this; } public function getAvailability() { return $this->availability; } public function isDisabled() { return ($this->getAvailability() == self::AVAILABILITY_DISABLED); } public function setStatus($status) { $this->status = $status; return $this; } public function getStatus() { return $this->status; } public function setFullName($full_name) { $this->fullName = $full_name; return $this; } public function getFullName() { if ($this->fullName !== null) { return $this->fullName; } return $this->getName(); } public function setCommandLineObjectName($command_line_object_name) { $this->commandLineObjectName = $command_line_object_name; return $this; } public function getCommandLineObjectName() { if ($this->commandLineObjectName !== null) { return $this->commandLineObjectName; } return $this->getObjectName(); } public function setTitle($title) { $this->title = $title; return $this; } public function getTitle() { return $this->title; } public function setType($type) { $this->type = $type; return $this; } public function getType() { return $this->type; } public function setImageURI($uri) { $this->imageURI = $uri; return $this; } public function getImageURI() { return $this->imageURI; } public function setTimestamp($timestamp) { $this->timestamp = $timestamp; return $this; } public function getTimestamp() { return $this->timestamp; } public function getTypeName() { if ($this->getPHIDType()) { return $this->getPHIDType()->getTypeName(); } return $this->getType(); } /** * Set whether or not the underlying object is complete. See * @{method:isComplete} for an explanation of what it means to be complete. * * @param bool True if the handle represents a complete object. * @return this */ public function setComplete($complete) { $this->complete = $complete; return $this; } /** * 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). * * Basically, @{class:PhabricatorHandleQuery} gives you back a handle for * 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; } public function renderLink($name = null) { return $this->renderLinkWithAttributes($name, array()); } public function renderHovercardLink($name = null) { Javelin::initBehavior('phui-hovercards'); $attributes = array( 'sigil' => 'hovercard', 'meta' => array( 'hoverPHID' => $this->getPHID(), ), ); return $this->renderLinkWithAttributes($name, $attributes); } private function renderLinkWithAttributes($name, array $attributes) { if ($name === null) { $name = $this->getLinkName(); } $classes = array(); $classes[] = 'phui-handle'; $title = $this->title; if ($this->status != self::STATUS_OPEN) { $classes[] = 'handle-status-'.$this->status; } + $circle = null; if ($this->availability != self::AVAILABILITY_FULL) { $classes[] = 'handle-availability-'.$this->availability; + $circle = array( + phutil_tag( + 'span', + array( + 'class' => 'perfect-circle', + ), + "\xE2\x80\xA2"), + ' ', + ); } if ($this->getType() == PhabricatorPeopleUserPHIDType::TYPECONST) { $classes[] = 'phui-link-person'; } $uri = $this->getURI(); $icon = null; if ($this->getPolicyFiltered()) { $icon = id(new PHUIIconView()) ->setIcon('fa-lock lightgreytext'); } $attributes = $attributes + array( 'href' => $uri, 'class' => implode(' ', $classes), 'title' => $title, ); return javelin_tag( $uri ? 'a' : 'span', $attributes, - array($icon, $name)); + array($circle, $icon, $name)); } public function renderTag() { return id(new PHUITagView()) ->setType(PHUITagView::TYPE_OBJECT) ->setShade($this->getTagColor()) ->setIcon($this->getIcon()) ->setHref($this->getURI()) ->setName($this->getLinkName()); } public function getLinkName() { switch ($this->getType()) { case PhabricatorPeopleUserPHIDType::TYPECONST: $name = $this->getName(); break; default: $name = $this->getFullName(); break; } return $name; } 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) { // NOTE: Handles are always visible, they just don't get populated with // data if the user can't see the underlying object. return true; } public function describeAutomaticCapability($capability) { return null; } } diff --git a/webroot/rsrc/css/application/base/standard-page-view.css b/webroot/rsrc/css/application/base/standard-page-view.css index 36294ca28..ebcf157ad 100644 --- a/webroot/rsrc/css/application/base/standard-page-view.css +++ b/webroot/rsrc/css/application/base/standard-page-view.css @@ -1,176 +1,168 @@ /** * @provides phabricator-standard-page-view */ .phabricator-anchor-view, .phabricator-anchor-navigation-marker { position: absolute; margin-top: -15px; } .phabricator-chromeless-page .phabricator-standard-page { background: transparent; border-width: 0px; } .phabricator-standard-page-body { clear: both; } body.white-background { background: #fff; } .phabricator-standard-page-footer { text-align: right; margin: 44px 16px 16px; padding: 12px 0; border-top: 1px solid rgba({$alphagrey},.1); color: {$greytext}; } .with-durable-column .phabricator-standard-page-footer { margin: 36px 16px 28px; } .device .phabricator-standard-page-footer { margin: 24px 8px 16px; } !print .phabricator-standard-page-footer { display: none; } .device-desktop .has-local-nav + .phabricator-standard-page-footer { margin-left: 221px; } .device .phabricator-side-menu-home + .phabricator-standard-page-footer { display: none; } .keyboard-shortcut-help td, .keyboard-shortcut-help th { padding: 8px; vertical-align: middle; } .keyboard-shortcut-help th { white-space: nowrap; color: {$greytext}; } .keyboard-focus-focus-reticle { background: #ffffd3; position: absolute; border: 1px solid #999900; } a.handle-status-closed { text-decoration: line-through; color: #676767; } a.handle-status-closed:hover { text-decoration: line-through; color: #19558D; } -a.handle-availability-disabled, -a.handle-availability-none, -a.handle-availability-partial { - padding-left: 11px; - background-repeat: no-repeat; - background-position: -4px center; +.handle-availability-none .perfect-circle { + color: {$red}; } -a.handle-availability-none { - background-image: url(/rsrc/image/icon/fatcow/bullet_red.png); +.handle-availability-partial .perfect-circle { + color: {$orange}; } -a.handle-availability-partial { - background-image: url(/rsrc/image/icon/fatcow/bullet_orange.png); -} - -a.handle-availability-disabled { - background-image: url(/rsrc/image/icon/fatcow/bullet_black.png); +.handle-availability-disabled .perfect-circle { + color: {$greytext}; } .aphront-developer-error-callout { position: relative; padding: 2em; background: #aa0000; color: white; text-align: center; font-size: {$smallerfontsize}; } .phui-handle .phui-icon-view { display: inline-block; margin: 2px 2px -2px 0; } .jx-scrollbar-frame { position: relative; overflow: hidden; } .jx-scrollbar-viewport { position: absolute; overflow-x: hidden; overflow-y: scroll; top: 0; bottom: 0; left: 0; right: 0; } .jx-scrollbar-test { position: absolute; left: -300px; } .jx-scrollbar-bar { position: absolute; top: 0; right: 0; bottom: 7px; width: 11px; } .jx-scrollbar-bar .jx-scrollbar-handle { position: absolute; right: 2px; -webkit-border-radius: 7px; -moz-border-radius: 7px; border-radius: 7px; min-height: 10px; width: 7px; opacity: 0; -webkit-transition: opacity 0.2s linear; -moz-transition: opacity 0.2s linear; -o-transition: opacity 0.2s linear; -ms-transition: opacity 0.2s linear; transition: opacity 0.2s linear; background: #6c6e71; -webkit-background-clip: padding-box; -moz-background-clip: padding; } .jx-scrollbar-bar:hover .jx-scrollbar-handle { opacity: 0.7; -webkit-transition: opacity 0 linear; -moz-transition: opacity 0 linear; -o-transition: opacity 0 linear; -ms-transition: opacity 0 linear; transition: opacity 0 linear; } .jx-scrollbar-bar .jx-scrollbar-visible { opacity: 0.7; } .jx-scrollbar-link { position: absolute; left: -50px; } diff --git a/webroot/rsrc/image/icon/fatcow/bullet_black.png b/webroot/rsrc/image/icon/fatcow/bullet_black.png deleted file mode 100644 index a113d8ef3..000000000 Binary files a/webroot/rsrc/image/icon/fatcow/bullet_black.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/bullet_orange.png b/webroot/rsrc/image/icon/fatcow/bullet_orange.png deleted file mode 100644 index dacfd4697..000000000 Binary files a/webroot/rsrc/image/icon/fatcow/bullet_orange.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/bullet_red.png b/webroot/rsrc/image/icon/fatcow/bullet_red.png deleted file mode 100644 index cc56c4b4b..000000000 Binary files a/webroot/rsrc/image/icon/fatcow/bullet_red.png and /dev/null differ