diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -408,12 +408,12 @@ 'rsrc/js/application/phortune/phortune-credit-card-form.js' => 'd12d214f', 'rsrc/js/application/policy/behavior-policy-control.js' => '0eaa33a9', 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '9347f172', - 'rsrc/js/application/projects/WorkboardBoard.js' => 'ba6e36b0', + 'rsrc/js/application/projects/WorkboardBoard.js' => '2f893acd', 'rsrc/js/application/projects/WorkboardCard.js' => '0392a5d8', 'rsrc/js/application/projects/WorkboardCardTemplate.js' => '2a61f8d4', 'rsrc/js/application/projects/WorkboardColumn.js' => 'c344eb3c', 'rsrc/js/application/projects/WorkboardController.js' => '42c7a5a7', - 'rsrc/js/application/projects/WorkboardDropEffect.js' => '101121be', + 'rsrc/js/application/projects/WorkboardDropEffect.js' => 'c808589e', 'rsrc/js/application/projects/WorkboardHeader.js' => '111bfd2d', 'rsrc/js/application/projects/WorkboardHeaderTemplate.js' => 'ebe83a6b', 'rsrc/js/application/projects/WorkboardOrderTemplate.js' => '03e8891f', @@ -730,12 +730,12 @@ 'javelin-view-renderer' => '9aae2b66', 'javelin-view-visitor' => '308f9fe4', 'javelin-websocket' => 'fdc13e4e', - 'javelin-workboard-board' => 'ba6e36b0', + 'javelin-workboard-board' => '2f893acd', 'javelin-workboard-card' => '0392a5d8', 'javelin-workboard-card-template' => '2a61f8d4', 'javelin-workboard-column' => 'c344eb3c', 'javelin-workboard-controller' => '42c7a5a7', - 'javelin-workboard-drop-effect' => '101121be', + 'javelin-workboard-drop-effect' => 'c808589e', 'javelin-workboard-header' => '111bfd2d', 'javelin-workboard-header-template' => 'ebe83a6b', 'javelin-workboard-order-template' => '03e8891f', @@ -1003,10 +1003,6 @@ 'javelin-workflow', 'phuix-icon-view', ), - '101121be' => array( - 'javelin-install', - 'javelin-dom', - ), '111bfd2d' => array( 'javelin-install', ), @@ -1170,6 +1166,18 @@ 'phuix-autocomplete', 'javelin-mask', ), + '2f893acd' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', + 'javelin-workboard-column', + 'javelin-workboard-header-template', + 'javelin-workboard-card-template', + 'javelin-workboard-order-template', + ), '308f9fe4' => array( 'javelin-install', 'javelin-util', @@ -1880,18 +1888,6 @@ 'javelin-uri', 'phabricator-notification', ), - 'ba6e36b0' => array( - 'javelin-install', - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-workflow', - 'phabricator-draggable-list', - 'javelin-workboard-column', - 'javelin-workboard-header-template', - 'javelin-workboard-card-template', - 'javelin-workboard-order-template', - ), 'bdce4d78' => array( 'javelin-install', 'javelin-util', @@ -1955,6 +1951,10 @@ 'phuix-icon-view', 'phabricator-busy', ), + 'c808589e' => array( + 'javelin-install', + 'javelin-dom', + ), 'c8147a20' => array( 'javelin-behavior', 'javelin-dom', diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php --- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php @@ -655,6 +655,8 @@ $properties[$task->getPHID()] = array( 'points' => (double)$task->getPoints(), 'status' => $task->getStatus(), + 'priority' => (int)$task->getPriority(), + 'owner' => $task->getOwnerPHID(), ); } diff --git a/src/applications/project/icon/PhabricatorProjectDropEffect.php b/src/applications/project/icon/PhabricatorProjectDropEffect.php --- a/src/applications/project/icon/PhabricatorProjectDropEffect.php +++ b/src/applications/project/icon/PhabricatorProjectDropEffect.php @@ -6,6 +6,7 @@ private $icon; private $color; private $content; + private $conditions = array(); public function setIcon($icon) { $this->icon = $icon; @@ -39,7 +40,22 @@ 'icon' => $this->getIcon(), 'color' => $this->getColor(), 'content' => hsprintf('%s', $this->getContent()), + 'conditions' => $this->getConditions(), ); } + public function addCondition($field, $operator, $value) { + $this->conditions[] = array( + 'field' => $field, + 'operator' => $operator, + 'value' => $value, + ); + + return $this; + } + + public function getConditions() { + return $this->conditions; + } + } diff --git a/src/applications/project/order/PhabricatorProjectColumnOwnerOrder.php b/src/applications/project/order/PhabricatorProjectColumnOwnerOrder.php --- a/src/applications/project/order/PhabricatorProjectColumnOwnerOrder.php +++ b/src/applications/project/order/PhabricatorProjectColumnOwnerOrder.php @@ -171,6 +171,7 @@ $this->newEffect() ->setIcon($owner_icon) ->setColor($owner_color) + ->addCondition('owner', '!=', $owner_phid) ->setContent($effect_content)); } diff --git a/src/applications/project/order/PhabricatorProjectColumnPriorityOrder.php b/src/applications/project/order/PhabricatorProjectColumnPriorityOrder.php --- a/src/applications/project/order/PhabricatorProjectColumnPriorityOrder.php +++ b/src/applications/project/order/PhabricatorProjectColumnPriorityOrder.php @@ -68,6 +68,7 @@ $drop_effect = $this->newEffect() ->setIcon($priority_icon) ->setColor($priority_color) + ->addCondition('priority', '!=', $priority) ->setContent( pht( 'Change priority to %s.', diff --git a/src/applications/project/order/PhabricatorProjectColumnStatusOrder.php b/src/applications/project/order/PhabricatorProjectColumnStatusOrder.php --- a/src/applications/project/order/PhabricatorProjectColumnStatusOrder.php +++ b/src/applications/project/order/PhabricatorProjectColumnStatusOrder.php @@ -75,6 +75,7 @@ $drop_effect = $this->newEffect() ->setIcon($status_icon) ->setColor($status_color) + ->addCondition('status', '!=', $status_key) ->setContent( pht( 'Change status to %s.', diff --git a/src/applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php b/src/applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php --- a/src/applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php +++ b/src/applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php @@ -51,6 +51,7 @@ $this->newEffect() ->setIcon($status_icon) ->setColor($status_color) + ->addCondition('status', '!=', $value) ->setContent($content), ); } diff --git a/webroot/rsrc/js/application/projects/WorkboardBoard.js b/webroot/rsrc/js/application/projects/WorkboardBoard.js --- a/webroot/rsrc/js/application/projects/WorkboardBoard.js +++ b/webroot/rsrc/js/application/projects/WorkboardBoard.js @@ -228,6 +228,17 @@ effects = effects.concat(header.getDropEffects()); } + var card_phid = JX.Stratcom.getData(src_node).objectPHID; + var card = src_column.getCard(card_phid); + + var visible = []; + for (var ii = 0; ii < effects.length; ii++) { + if (effects[ii].isEffectVisibleForCard(card)) { + visible.push(effects[ii]); + } + } + effects = visible; + if (!effects.length) { JX.DOM.remove(node); return; diff --git a/webroot/rsrc/js/application/projects/WorkboardDropEffect.js b/webroot/rsrc/js/application/projects/WorkboardDropEffect.js --- a/webroot/rsrc/js/application/projects/WorkboardDropEffect.js +++ b/webroot/rsrc/js/application/projects/WorkboardDropEffect.js @@ -10,7 +10,8 @@ properties: { icon: null, color: null, - content: null + content: null, + conditions: [] }, statics: { @@ -18,7 +19,8 @@ return new JX.WorkboardDropEffect() .setIcon(map.icon) .setColor(map.color) - .setContent(JX.$H(map.content)); + .setContent(JX.$H(map.content)) + .setConditions(map.conditions || []); } }, @@ -30,6 +32,32 @@ .getNode(); return JX.$N('li', {}, [icon, this.getContent()]); + }, + + isEffectVisibleForCard: function(card) { + var conditions = this.getConditions(); + + var properties = card.getProperties(); + for (var ii = 0; ii < conditions.length; ii++) { + var condition = conditions[ii]; + + var field = properties[condition.field]; + var value = condition.value; + + var result = true; + switch (condition.operator) { + case '!=': + result = (field !== value); + break; + } + + if (!result) { + return false; + } + } + + return true; } + } });