/**
  * Create a HeraldAction to save from data.
  *
  * $data is of the form:
  *   array(
  *     0 => <action type>
  *     1 => array(<targets>)
  *   )
  */
 public static function willSaveAction($rule_type, $author_phid, $data)
 {
     $obj = new HeraldAction();
     $obj->setAction($data[0]);
     // for personal rule types, set the target to be the owner of the rule
     if ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL) {
         switch ($obj->getAction()) {
             case HeraldActionConfig::ACTION_EMAIL:
             case HeraldActionConfig::ACTION_ADD_CC:
             case HeraldActionConfig::ACTION_REMOVE_CC:
             case HeraldActionConfig::ACTION_AUDIT:
                 $data[1] = array($author_phid => $author_phid);
                 break;
             case HeraldActionConfig::ACTION_FLAG:
                 // Make sure flag color is valid; set to blue if not.
                 $color_map = PhabricatorFlagColor::getColorNameMap();
                 if (empty($color_map[$data[1]])) {
                     $data[1] = PhabricatorFlagColor::COLOR_BLUE;
                 }
                 break;
             case HeraldActionConfig::ACTION_NOTHING:
                 break;
             default:
                 throw new Exception('Unrecognized action type: ' . $obj->getAction());
         }
     }
     if (is_array($data[1])) {
         $obj->setTarget(array_keys($data[1]));
     } else {
         $obj->setTarget($data[1]);
     }
     return $obj;
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $user = $request->getUser();
     $phid = $this->phid;
     $handle = PhabricatorObjectHandleData::loadOneHandle($phid);
     if (!$handle->isComplete()) {
         return new Aphront404Response();
     }
     $flag = PhabricatorFlagQuery::loadUserFlag($user, $phid);
     if (!$flag) {
         $flag = new PhabricatorFlag();
         $flag->setOwnerPHID($user->getPHID());
         $flag->setType($handle->getType());
         $flag->setObjectPHID($handle->getPHID());
         $flag->setReasonPHID($user->getPHID());
     }
     if ($request->isDialogFormPost()) {
         $flag->setColor($request->getInt('color'));
         $flag->setNote($request->getStr('note'));
         $flag->save();
         return id(new AphrontReloadResponse())->setURI('/flag/');
     }
     $type_name = $handle->getTypeName();
     $dialog = new AphrontDialogView();
     $dialog->setUser($user);
     $dialog->setTitle("Flag {$type_name}");
     require_celerity_resource('phabricator-flag-css');
     $form = new AphrontFormLayoutView();
     $is_new = !$flag->getID();
     if ($is_new) {
         $form->appendChild("<p>You can flag this {$type_name} if you want to remember to look " . "at it later.</p><br />");
     }
     $radio = new AphrontFormRadioButtonControl();
     foreach (PhabricatorFlagColor::getColorNameMap() as $color => $text) {
         $class = 'phabricator-flag-radio phabricator-flag-color-' . $color;
         $radio->addButton($color, $text, '', $class);
     }
     $form->appendChild($radio->setName('color')->setLabel('Flag Color')->setValue($flag->getColor()))->appendChild(id(new AphrontFormTextAreaControl())->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_SHORT)->setName('note')->setLabel('Note')->setValue($flag->getNote()));
     $dialog->appendChild($form);
     $dialog->addCancelButton($handle->getURI());
     $dialog->addSubmitButton($is_new ? "Flag {$type_name}" : 'Save');
     return id(new AphrontDialogResponse())->setDialog($dialog);
 }
 protected function renderInput()
 {
     require_celerity_resource('phabricator-flag-css');
     $colors = PhabricatorFlagColor::getColorNameMap();
     $value_map = array_fuse($this->getValue());
     $file_map = array(PhabricatorFlagColor::COLOR_RED => 'red', PhabricatorFlagColor::COLOR_ORANGE => 'orange', PhabricatorFlagColor::COLOR_YELLOW => 'yellow', PhabricatorFlagColor::COLOR_GREEN => 'green', PhabricatorFlagColor::COLOR_BLUE => 'blue', PhabricatorFlagColor::COLOR_PINK => 'pink', PhabricatorFlagColor::COLOR_PURPLE => 'purple', PhabricatorFlagColor::COLOR_CHECKERED => 'finish');
     $out = array();
     foreach ($colors as $const => $name) {
         // TODO: This should probably be a sprite sheet.
         $partial = $file_map[$const];
         $uri = '/rsrc/image/icon/fatcow/flag_' . $partial . '.png';
         $uri = celerity_get_resource_uri($uri);
         $icon = id(new PHUIIconView())->setImage($uri);
         $input = phutil_tag('input', array('type' => 'checkbox', 'name' => $this->getName() . '[]', 'value' => $const, 'checked' => isset($value_map[$const]) ? 'checked' : null, 'class' => 'phabricator-flag-select-checkbox'));
         $label = phutil_tag('label', array('class' => 'phabricator-flag-select-label'), array($icon, $input));
         $out[] = $label;
     }
     return $out;
 }
 public function handleRequest(AphrontRequest $request)
 {
     $viewer = $request->getViewer();
     $phid = $request->getURIData('phid');
     $handle = id(new PhabricatorHandleQuery())->setViewer($viewer)->withPHIDs(array($phid))->executeOne();
     if (!$handle->isComplete()) {
         return new Aphront404Response();
     }
     $flag = PhabricatorFlagQuery::loadUserFlag($viewer, $phid);
     if (!$flag) {
         $flag = new PhabricatorFlag();
         $flag->setOwnerPHID($viewer->getPHID());
         $flag->setType($handle->getType());
         $flag->setObjectPHID($handle->getPHID());
         $flag->setReasonPHID($viewer->getPHID());
     }
     if ($request->isDialogFormPost()) {
         $flag->setColor($request->getInt('color'));
         $flag->setNote($request->getStr('note'));
         $flag->save();
         return id(new AphrontReloadResponse())->setURI('/flag/');
     }
     $type_name = $handle->getTypeName();
     $dialog = new AphrontDialogView();
     $dialog->setUser($viewer);
     $dialog->setTitle(pht('Flag %s', $type_name));
     require_celerity_resource('phabricator-flag-css');
     $form = new PHUIFormLayoutView();
     $is_new = !$flag->getID();
     if ($is_new) {
         $form->appendChild(hsprintf('<p>%s</p><br />', pht('You can flag this %s if you want to remember to look ' . 'at it later.', $type_name)));
     }
     $radio = new AphrontFormRadioButtonControl();
     foreach (PhabricatorFlagColor::getColorNameMap() as $color => $text) {
         $class = 'phabricator-flag-radio phabricator-flag-color-' . $color;
         $radio->addButton($color, $text, '', $class);
     }
     $form->appendChild($radio->setName('color')->setLabel(pht('Flag Color'))->setValue($flag->getColor()))->appendChild(id(new AphrontFormTextAreaControl())->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_SHORT)->setName('note')->setLabel(pht('Note'))->setValue($flag->getNote()));
     $dialog->appendChild($form);
     $dialog->addCancelButton($handle->getURI());
     $dialog->addSubmitButton($is_new ? pht('Create Flag') : pht('Save'));
     return id(new AphrontDialogResponse())->setDialog($dialog);
 }
 private function setupEditorBehavior(HeraldRule $rule, array $handles, HeraldAdapter $adapter)
 {
     $serial_conditions = array(array('default', 'default', ''));
     if ($rule->getConditions()) {
         $serial_conditions = array();
         foreach ($rule->getConditions() as $condition) {
             $value = $adapter->getEditorValueForCondition($this->getViewer(), $condition, $handles);
             $serial_conditions[] = array($condition->getFieldName(), $condition->getFieldCondition(), $value);
         }
     }
     $serial_actions = array(array('default', ''));
     if ($rule->getActions()) {
         $serial_actions = array();
         foreach ($rule->getActions() as $action) {
             switch ($action->getAction()) {
                 case HeraldAdapter::ACTION_FLAG:
                 case HeraldAdapter::ACTION_BLOCK:
                     $current_value = $action->getTarget();
                     break;
                 default:
                     if (is_array($action->getTarget())) {
                         $target_map = array();
                         foreach ((array) $action->getTarget() as $fbid) {
                             $target_map[$fbid] = $handles[$fbid]->getName();
                         }
                         $current_value = $target_map;
                     } else {
                         $current_value = $action->getTarget();
                     }
                     break;
             }
             $serial_actions[] = array($action->getAction(), $current_value);
         }
     }
     $all_rules = $this->loadRulesThisRuleMayDependUpon($rule);
     $all_rules = mpull($all_rules, 'getName', 'getPHID');
     asort($all_rules);
     $all_fields = $adapter->getFieldNameMap();
     $all_conditions = $adapter->getConditionNameMap();
     $all_actions = $adapter->getActionNameMap($rule->getRuleType());
     $fields = $adapter->getFields();
     $field_map = array_select_keys($all_fields, $fields);
     // Populate any fields which exist in the rule but which we don't know the
     // names of, so that saving a rule without touching anything doesn't change
     // it.
     foreach ($rule->getConditions() as $condition) {
         $field_name = $condition->getFieldName();
         if (empty($field_map[$field_name])) {
             $field_map[$field_name] = pht('<Unknown Field "%s">', $field_name);
         }
     }
     $actions = $adapter->getActions($rule->getRuleType());
     $action_map = array_select_keys($all_actions, $actions);
     // Populate any actions which exist in the rule but which we don't know the
     // names of, so that saving a rule without touching anything doesn't change
     // it.
     foreach ($rule->getActions() as $action) {
         $action_name = $action->getAction();
         if (empty($action_map[$action_name])) {
             $action_map[$action_name] = pht('<Unknown Action "%s">', $action_name);
         }
     }
     $config_info = array();
     $config_info['fields'] = $field_map;
     $config_info['conditions'] = $all_conditions;
     $config_info['actions'] = $action_map;
     foreach ($config_info['fields'] as $field => $name) {
         try {
             $field_conditions = $adapter->getConditionsForField($field);
         } catch (Exception $ex) {
             $field_conditions = array(HeraldAdapter::CONDITION_UNCONDITIONALLY);
         }
         $config_info['conditionMap'][$field] = $field_conditions;
     }
     foreach ($config_info['fields'] as $field => $fname) {
         foreach ($config_info['conditionMap'][$field] as $condition) {
             $value_type = $adapter->getValueTypeForFieldAndCondition($field, $condition);
             $config_info['values'][$field][$condition] = $value_type;
         }
     }
     $config_info['rule_type'] = $rule->getRuleType();
     foreach ($config_info['actions'] as $action => $name) {
         try {
             $action_value = $adapter->getValueTypeForAction($action, $rule->getRuleType());
         } catch (Exception $ex) {
             $action_value = array(HeraldAdapter::VALUE_NONE);
         }
         $config_info['targets'][$action] = $action_value;
     }
     $changeflag_options = PhabricatorRepositoryPushLog::getHeraldChangeFlagConditionOptions();
     Javelin::initBehavior('herald-rule-editor', array('root' => 'herald-rule-edit-form', 'conditions' => (object) $serial_conditions, 'actions' => (object) $serial_actions, 'select' => array(HeraldAdapter::VALUE_CONTENT_SOURCE => array('options' => PhabricatorContentSource::getSourceNameMap(), 'default' => PhabricatorContentSource::SOURCE_WEB), HeraldAdapter::VALUE_FLAG_COLOR => array('options' => PhabricatorFlagColor::getColorNameMap(), 'default' => PhabricatorFlagColor::COLOR_BLUE), HeraldPreCommitRefAdapter::VALUE_REF_TYPE => array('options' => array(PhabricatorRepositoryPushLog::REFTYPE_BRANCH => pht('branch (git/hg)'), PhabricatorRepositoryPushLog::REFTYPE_TAG => pht('tag (git)'), PhabricatorRepositoryPushLog::REFTYPE_BOOKMARK => pht('bookmark (hg)')), 'default' => PhabricatorRepositoryPushLog::REFTYPE_BRANCH), HeraldPreCommitRefAdapter::VALUE_REF_CHANGE => array('options' => $changeflag_options, 'default' => PhabricatorRepositoryPushLog::CHANGEFLAG_ADD)), 'template' => $this->buildTokenizerTemplates($handles) + array('rules' => $all_rules), 'author' => array($rule->getAuthorPHID() => $handles[$rule->getAuthorPHID()]->getName()), 'info' => $config_info));
 }
Esempio n. 6
0
 private function buildFlagColorFieldValue()
 {
     return id(new HeraldSelectFieldValue())->setKey('flag.color')->setOptions(PhabricatorFlagColor::getColorNameMap())->setDefault(PhabricatorFlagColor::COLOR_BLUE);
 }
Esempio n. 7
0
 public function willSaveAction(HeraldRule $rule, HeraldAction $action)
 {
     $target = $action->getTarget();
     if (is_array($target)) {
         $target = array_keys($target);
     }
     $author_phid = $rule->getAuthorPHID();
     $rule_type = $rule->getRuleType();
     if ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL) {
         switch ($action->getAction()) {
             case self::ACTION_EMAIL:
             case self::ACTION_ADD_CC:
             case self::ACTION_REMOVE_CC:
             case self::ACTION_AUDIT:
             case self::ACTION_ASSIGN_TASK:
             case self::ACTION_ADD_REVIEWERS:
             case self::ACTION_ADD_BLOCKING_REVIEWERS:
                 // For personal rules, force these actions to target the rule owner.
                 $target = array($author_phid);
                 break;
             case self::ACTION_FLAG:
                 // Make sure flag color is valid; set to blue if not.
                 $color_map = PhabricatorFlagColor::getColorNameMap();
                 if (empty($color_map[$target])) {
                     $target = PhabricatorFlagColor::COLOR_BLUE;
                 }
                 break;
             case self::ACTION_BLOCK:
             case self::ACTION_NOTHING:
                 break;
             default:
                 throw new HeraldInvalidActionException(pht('Unrecognized action type "%s"!', $action->getAction()));
         }
     }
     $action->setTarget($target);
 }
 protected function buildWhereClauseParts(AphrontDatabaseConnection $conn)
 {
     $where = parent::buildWhereClauseParts($conn);
     if ($this->ids !== null) {
         $where[] = qsprintf($conn, 'm.id IN (%Ld)', $this->ids);
     }
     if ($this->phids !== null) {
         $where[] = qsprintf($conn, 'm.phid IN (%Ls)', $this->phids);
     }
     if ($this->authorPHIDs !== null) {
         $where[] = qsprintf($conn, 'm.authorPHID IN (%Ls)', $this->authorPHIDs);
     }
     if (strlen($this->nameLike)) {
         $where[] = qsprintf($conn, 'm.name LIKE %~', $this->nameLike);
     }
     if ($this->names !== null) {
         $where[] = qsprintf($conn, 'm.name IN (%Ls)', $this->names);
     }
     if (strlen($this->namePrefix)) {
         $where[] = qsprintf($conn, 'm.name LIKE %>', $this->namePrefix);
     }
     switch ($this->status) {
         case self::STATUS_ACTIVE:
             $where[] = qsprintf($conn, 'm.isDisabled = 0');
             break;
         case self::STATUS_DISABLED:
             $where[] = qsprintf($conn, 'm.isDisabled = 1');
             break;
         case self::STATUS_ANY:
             break;
         default:
             throw new Exception(pht("Unknown status '%s'!", $this->status));
     }
     if ($this->dateCreatedAfter) {
         $where[] = qsprintf($conn, 'm.dateCreated >= %d', $this->dateCreatedAfter);
     }
     if ($this->dateCreatedBefore) {
         $where[] = qsprintf($conn, 'm.dateCreated <= %d', $this->dateCreatedBefore);
     }
     if ($this->flagColor != '-1' && $this->flagColor !== null) {
         if ($this->flagColor == '-2') {
             $flag_colors = array_keys(PhabricatorFlagColor::getColorNameMap());
         } else {
             $flag_colors = array($this->flagColor);
         }
         $flags = id(new PhabricatorFlagQuery())->withOwnerPHIDs(array($this->getViewer()->getPHID()))->withTypes(array(PhabricatorMacroMacroPHIDType::TYPECONST))->withColors($flag_colors)->setViewer($this->getViewer())->execute();
         if (empty($flags)) {
             throw new PhabricatorEmptyQueryException(pht('No matching flags.'));
         } else {
             $where[] = qsprintf($conn, 'm.phid IN (%Ls)', mpull($flags, 'getObjectPHID'));
         }
     }
     return $where;
 }
 private function setupEditorBehavior($rule, $handles)
 {
     $serial_conditions = array(array('default', 'default', ''));
     if ($rule->getConditions()) {
         $serial_conditions = array();
         foreach ($rule->getConditions() as $condition) {
             $value = $condition->getValue();
             if (is_array($value)) {
                 $value_map = array();
                 foreach ($value as $k => $fbid) {
                     $value_map[$fbid] = $handles[$fbid]->getName();
                 }
                 $value = $value_map;
             }
             $serial_conditions[] = array($condition->getFieldName(), $condition->getFieldCondition(), $value);
         }
     }
     $serial_actions = array(array('default', ''));
     if ($rule->getActions()) {
         $serial_actions = array();
         foreach ($rule->getActions() as $action) {
             switch ($action->getAction()) {
                 case HeraldActionConfig::ACTION_FLAG:
                     $current_value = $action->getTarget();
                     break;
                 default:
                     $target_map = array();
                     foreach ((array) $action->getTarget() as $fbid) {
                         $target_map[$fbid] = $handles[$fbid]->getName();
                     }
                     $current_value = $target_map;
                     break;
             }
             $serial_actions[] = array($action->getAction(), $current_value);
         }
     }
     $all_rules = $this->loadRulesThisRuleMayDependUpon($rule);
     $all_rules = mpull($all_rules, 'getName', 'getID');
     asort($all_rules);
     $config_info = array();
     $config_info['fields'] = HeraldFieldConfig::getFieldMapForContentType($rule->getContentType());
     $config_info['conditions'] = HeraldConditionConfig::getConditionMap();
     foreach ($config_info['fields'] as $field => $name) {
         $config_info['conditionMap'][$field] = array_keys(HeraldConditionConfig::getConditionMapForField($field));
     }
     foreach ($config_info['fields'] as $field => $fname) {
         foreach ($config_info['conditions'] as $condition => $cname) {
             $config_info['values'][$field][$condition] = HeraldValueTypeConfig::getValueTypeForFieldAndCondition($field, $condition);
         }
     }
     $config_info['actions'] = HeraldActionConfig::getActionMessageMap($rule->getContentType(), $rule->getRuleType());
     $config_info['rule_type'] = $rule->getRuleType();
     foreach ($config_info['actions'] as $action => $name) {
         $config_info['targets'][$action] = HeraldValueTypeConfig::getValueTypeForAction($action, $rule->getRuleType());
     }
     Javelin::initBehavior('herald-rule-editor', array('root' => 'herald-rule-edit-form', 'conditions' => (object) $serial_conditions, 'actions' => (object) $serial_actions, 'template' => $this->buildTokenizerTemplates() + array('rules' => $all_rules, 'colors' => PhabricatorFlagColor::getColorNameMap(), 'defaultColor' => PhabricatorFlagColor::COLOR_BLUE), 'author' => array($rule->getAuthorPHID() => $handles[$rule->getAuthorPHID()]->getName()), 'info' => $config_info));
 }
 public function getHeraldActionValueType()
 {
     return id(new HeraldSelectFieldValue())->setKey('flag.color')->setOptions(PhabricatorFlagColor::getColorNameMap())->setDefault(PhabricatorFlagColor::COLOR_BLUE);
 }