diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ return array( 'names' => array( - 'core.pkg.css' => 'c2e44da2', + 'core.pkg.css' => 'e428441c', 'core.pkg.js' => '8c184823', 'darkconsole.pkg.js' => 'df001cab', 'differential.pkg.css' => '4a93db37', @@ -142,7 +142,7 @@ 'rsrc/css/phui/phui-remarkup-preview.css' => '19ad512b', 'rsrc/css/phui/phui-spacing.css' => '042804d6', 'rsrc/css/phui/phui-status.css' => '2f562399', - 'rsrc/css/phui/phui-tag-view.css' => '67017012', + 'rsrc/css/phui/phui-tag-view.css' => '8ac14ba8', 'rsrc/css/phui/phui-text.css' => '23e9b4b7', 'rsrc/css/phui/phui-timeline-view.css' => 'bbd990d0', 'rsrc/css/phui/phui-workboard-view.css' => '2bf82d00', @@ -787,7 +787,7 @@ 'phui-remarkup-preview-css' => '19ad512b', 'phui-spacing-css' => '042804d6', 'phui-status-list-view-css' => '2f562399', - 'phui-tag-view-css' => '67017012', + 'phui-tag-view-css' => '8ac14ba8', 'phui-text-css' => '23e9b4b7', 'phui-timeline-view-css' => 'bbd990d0', 'phui-workboard-view-css' => '2bf82d00', diff --git a/resources/sql/autopatches/20140624.projcolor.1.sql b/resources/sql/autopatches/20140624.projcolor.1.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20140624.projcolor.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD color VARCHAR(32) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140624.projcolor.2.sql b/resources/sql/autopatches/20140624.projcolor.2.sql new file mode 100644 --- /dev/null +++ b/resources/sql/autopatches/20140624.projcolor.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_project.project + SET color = 'blue' WHERE color = ''; diff --git a/src/applications/phid/PhabricatorObjectHandle.php b/src/applications/phid/PhabricatorObjectHandle.php --- a/src/applications/phid/PhabricatorObjectHandle.php +++ b/src/applications/phid/PhabricatorObjectHandle.php @@ -11,6 +11,7 @@ private $title; private $imageURI; private $icon; + private $tagColor; private $timestamp; private $status = PhabricatorObjectHandleStatus::STATUS_OPEN; private $complete; @@ -30,8 +31,24 @@ return $this->getTypeIcon(); } - public function getIconColor() { - return 'bluegrey'; + 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->tagColor) { + return $this->tagColor; + } + return 'blue'; } public function getTypeIcon() { @@ -262,7 +279,8 @@ public function renderTag() { return id(new PHUITagView()) ->setType(PHUITagView::TYPE_OBJECT) - ->setIcon($this->getIcon().' '.$this->getIconColor()) + ->setShade($this->getTagColor()) + ->setIcon($this->getIcon()) ->setHref($this->getURI()) ->setName($this->getLinkName()); } diff --git a/src/applications/project/controller/PhabricatorProjectEditIconController.php b/src/applications/project/controller/PhabricatorProjectEditIconController.php --- a/src/applications/project/controller/PhabricatorProjectEditIconController.php +++ b/src/applications/project/controller/PhabricatorProjectEditIconController.php @@ -30,11 +30,20 @@ $edit_uri = $this->getApplicationURI('edit/'.$project->getID().'/'); if ($request->isFormPost()) { + $xactions = array(); + $v_icon = $request->getStr('icon'); + $v_icon_color = $request->getStr('color'); + $type_icon = PhabricatorProjectTransaction::TYPE_ICON; - $xactions = array(id(new PhabricatorProjectTransaction()) + $xactions[] = id(new PhabricatorProjectTransaction()) ->setTransactionType($type_icon) - ->setNewValue($v_icon)); + ->setNewValue($v_icon); + + $type_icon_color = PhabricatorProjectTransaction::TYPE_COLOR; + $xactions[] = id(new PhabricatorProjectTransaction()) + ->setTransactionType($type_icon_color) + ->setNewValue($v_icon_color); $editor = id(new PhabricatorProjectTransactionEditor()) ->setActor($viewer) @@ -47,6 +56,20 @@ return id(new AphrontReloadResponse())->setURI($edit_uri); } + $shades = PHUITagView::getShadeMap(); + $shades = array_select_keys( + $shades, + array(PhabricatorProject::DEFAULT_COLOR)) + $shades; + unset($shades[PHUITagView::COLOR_DISABLED]); + + $color_form = id(new AphrontFormView()) + ->appendChild( + id(new AphrontFormSelectControl()) + ->setLabel(pht('Color')) + ->setName('color') + ->setValue($project->getColor()) + ->setOptions($shades)); + require_celerity_resource('project-icon-css'); Javelin::initBehavior('phabricator-tooltips'); @@ -55,7 +78,7 @@ $buttons = array(); foreach ($project_icons as $icon => $label) { $view = id(new PHUIIconView()) - ->setIconFont($icon.' bluegrey'); + ->setIconFont($icon); $aural = javelin_tag( 'span', @@ -66,10 +89,8 @@ if ($icon == $project->getIcon()) { $class_extra = ' selected'; - $tip = $label.pht(' - selected'); } else { $class_extra = null; - $tip = $label; } $buttons[] = javelin_tag( @@ -81,7 +102,7 @@ 'type' => 'submit', 'sigil' => 'has-tooltip', 'meta' => array( - 'tip' => $tip, + 'tip' => $label, ) ), array( @@ -100,12 +121,14 @@ ), $buttons); - $dialog = id(new AphrontDialogView()) - ->setUser($viewer) + $color_form->appendChild( + id(new AphrontFormMarkupControl()) + ->setLabel(pht('Icon')) + ->setValue($buttons)); + + return $this->newDialog() ->setTitle(pht('Choose Project Icon')) - ->appendChild($buttons) + ->appendChild($color_form->buildLayoutView()) ->addCancelButton($edit_uri); - - return id(new AphrontDialogResponse())->setDialog($dialog); } } diff --git a/src/applications/project/controller/PhabricatorProjectEditMainController.php b/src/applications/project/controller/PhabricatorProjectEditMainController.php --- a/src/applications/project/controller/PhabricatorProjectEditMainController.php +++ b/src/applications/project/controller/PhabricatorProjectEditMainController.php @@ -145,6 +145,12 @@ $viewer, $project); + $this->loadHandles(array($project->getPHID())); + + $view->addProperty( + pht('Looks Like'), + $this->getHandle($project->getPHID())->renderTag()); + $view->addProperty( pht('Visible To'), $descriptions[PhabricatorPolicyCapability::CAN_VIEW]); diff --git a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php --- a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php +++ b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php @@ -16,6 +16,7 @@ $types[] = PhabricatorProjectTransaction::TYPE_STATUS; $types[] = PhabricatorProjectTransaction::TYPE_IMAGE; $types[] = PhabricatorProjectTransaction::TYPE_ICON; + $types[] = PhabricatorProjectTransaction::TYPE_COLOR; return $types; } @@ -38,6 +39,8 @@ return $object->getProfileImagePHID(); case PhabricatorProjectTransaction::TYPE_ICON: return $object->getIcon(); + case PhabricatorProjectTransaction::TYPE_COLOR: + return $object->getColor(); } return parent::getCustomTransactionOldValue($object, $xaction); @@ -53,6 +56,7 @@ case PhabricatorProjectTransaction::TYPE_STATUS: case PhabricatorProjectTransaction::TYPE_IMAGE: case PhabricatorProjectTransaction::TYPE_ICON: + case PhabricatorProjectTransaction::TYPE_COLOR: return $xaction->getNewValue(); } @@ -79,6 +83,9 @@ case PhabricatorProjectTransaction::TYPE_ICON: $object->setIcon($xaction->getNewValue()); return; + case PhabricatorProjectTransaction::TYPE_COLOR: + $object->setColor($xaction->getNewValue()); + return; case PhabricatorTransactions::TYPE_EDGE: return; case PhabricatorTransactions::TYPE_VIEW_POLICY: @@ -181,6 +188,7 @@ case PhabricatorProjectTransaction::TYPE_STATUS: case PhabricatorProjectTransaction::TYPE_IMAGE: case PhabricatorProjectTransaction::TYPE_ICON: + case PhabricatorProjectTransaction::TYPE_COLOR: return; case PhabricatorTransactions::TYPE_EDGE: $edge_type = $xaction->getMetadataValue('edge:type'); @@ -358,6 +366,7 @@ case PhabricatorProjectTransaction::TYPE_STATUS: case PhabricatorProjectTransaction::TYPE_IMAGE: case PhabricatorProjectTransaction::TYPE_ICON: + case PhabricatorProjectTransaction::TYPE_COLOR: PhabricatorPolicyFilter::requireCapability( $this->requireActor(), $object, diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php --- a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php +++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php @@ -50,6 +50,7 @@ $handle->setURI("/tag/{$slug}/"); $handle->setImageURI($project->getProfileImageURI()); $handle->setIcon($project->getIcon()); + $handle->setTagColor($project->getColor()); if ($project->isArchived()) { $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED); diff --git a/src/applications/project/storage/PhabricatorProject.php b/src/applications/project/storage/PhabricatorProject.php --- a/src/applications/project/storage/PhabricatorProject.php +++ b/src/applications/project/storage/PhabricatorProject.php @@ -15,6 +15,7 @@ protected $phrictionSlug; protected $profileImagePHID; protected $icon; + protected $color; protected $viewPolicy; protected $editPolicy; @@ -29,12 +30,14 @@ private $slugs = self::ATTACHABLE; const DEFAULT_ICON = 'fa-briefcase'; + const DEFAULT_COLOR = 'blue'; public static function initializeNewProject(PhabricatorUser $actor) { return id(new PhabricatorProject()) ->setName('') ->setAuthorPHID($actor->getPHID()) ->setIcon(self::DEFAULT_ICON) + ->setColor(self::DEFAULT_COLOR) ->setViewPolicy(PhabricatorPolicies::POLICY_USER) ->setEditPolicy(PhabricatorPolicies::POLICY_USER) ->setJoinPolicy(PhabricatorPolicies::POLICY_USER) @@ -208,6 +211,14 @@ return $this->assertAttached($this->slugs); } + public function getColor() { + if ($this->isArchived()) { + return PHUITagView::COLOR_DISABLED; + } + + return $this->color; + } + /* -( PhabricatorSubscribableInterface )----------------------------------- */ diff --git a/src/applications/project/storage/PhabricatorProjectTransaction.php b/src/applications/project/storage/PhabricatorProjectTransaction.php --- a/src/applications/project/storage/PhabricatorProjectTransaction.php +++ b/src/applications/project/storage/PhabricatorProjectTransaction.php @@ -8,6 +8,7 @@ const TYPE_STATUS = 'project:status'; const TYPE_IMAGE = 'project:image'; const TYPE_ICON = 'project:icon'; + const TYPE_COLOR = 'project:color'; // NOTE: This is deprecated, members are just a normal edge now. const TYPE_MEMBERS = 'project:members'; @@ -93,6 +94,12 @@ $author_handle, PhabricatorProjectIcon::getLabel($new)); + case PhabricatorProjectTransaction::TYPE_COLOR: + return pht( + '%s set this project\'s color to %s.', + $author_handle, + PHUITagView::getShadeName($new)); + case PhabricatorProjectTransaction::TYPE_SLUGS: $add = array_diff($new, $old); $rem = array_diff($old, $new); diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php --- a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php +++ b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php @@ -288,7 +288,7 @@ ->setDisplayType('Project') ->setURI('/project/view/'.$proj->getID().'/') ->setPHID($proj->getPHID()) - ->setIcon($proj->getIcon().' bluegrey') + ->setIcon($proj->getIcon().' '.$proj->getColor()) ->setPriorityType('proj') ->setClosed($closed); diff --git a/src/view/phui/PHUIIconView.php b/src/view/phui/PHUIIconView.php --- a/src/view/phui/PHUIIconView.php +++ b/src/view/phui/PHUIIconView.php @@ -586,5 +586,4 @@ ); } - } diff --git a/src/view/phui/PHUITagView.php b/src/view/phui/PHUITagView.php --- a/src/view/phui/PHUITagView.php +++ b/src/view/phui/PHUITagView.php @@ -211,20 +211,29 @@ } public static function getShades() { + return array_keys(self::getShadeMap()); + } + + public static function getShadeMap() { return array( - self::COLOR_RED, - self::COLOR_ORANGE, - self::COLOR_YELLOW, - self::COLOR_BLUE, - self::COLOR_INDIGO, - self::COLOR_VIOLET, - self::COLOR_GREEN, - self::COLOR_GREY, - self::COLOR_CHECKERED, - self::COLOR_DISABLED, + self::COLOR_RED => pht('Red'), + self::COLOR_ORANGE => pht('Orange'), + self::COLOR_YELLOW => pht('Yellow'), + self::COLOR_BLUE => pht('Blue'), + self::COLOR_INDIGO => pht('Indigo'), + self::COLOR_VIOLET => pht('Violet'), + self::COLOR_GREEN => pht('Green'), + self::COLOR_GREY => pht('Grey'), + self::COLOR_CHECKERED => pht('Checkered'), + self::COLOR_DISABLED => pht('Disabled'), ); } + public static function getShadeName($shade) { + return idx(self::getShadeMap(), $shade, $shade); + } + + public function setExternal($external) { $this->external = $external; return $this;