private function buildActionTranscriptPanel(HeraldTranscript $xscript) { $action_xscript = mgroup($xscript->getApplyTranscripts(), 'getRuleID'); $adapter = $this->getAdapter(); $field_names = $adapter->getFieldNameMap(); $condition_names = $adapter->getConditionNameMap(); $handles = $this->handles; $rule_markup = array(); foreach ($xscript->getRuleTranscripts() as $rule_id => $rule) { $cond_markup = array(); foreach ($xscript->getConditionTranscriptsForRule($rule_id) as $cond) { if ($cond->getNote()) { $note = phutil_tag_div('herald-condition-note', $cond->getNote()); } else { $note = null; } if ($cond->getResult()) { $result = phutil_tag('span', array('class' => 'herald-outcome condition-pass'), "✓"); } else { $result = phutil_tag('span', array('class' => 'herald-outcome condition-fail'), "✘"); } $cond_markup[] = phutil_tag('li', array(), pht('%s Condition: %s %s %s%s', $result, idx($field_names, $cond->getFieldName(), pht('Unknown')), idx($condition_names, $cond->getCondition(), pht('Unknown')), $this->renderConditionTestValue($cond, $handles), $note)); } if ($rule->getResult()) { $result = phutil_tag('span', array('class' => 'herald-outcome rule-pass'), pht('PASS')); $class = 'herald-rule-pass'; } else { $result = phutil_tag('span', array('class' => 'herald-outcome rule-fail'), pht('FAIL')); $class = 'herald-rule-fail'; } $cond_markup[] = phutil_tag('li', array(), array($result, $rule->getReason())); $user_phid = $this->getRequest()->getUser()->getPHID(); $name = $rule->getRuleName(); $rule_markup[] = phutil_tag('li', array('class' => $class), phutil_tag_div('rule-name', array(phutil_tag('strong', array(), $name), ' ', phutil_tag('ul', array(), $cond_markup)))); } $box = null; if ($rule_markup) { $box = new PHUIObjectBoxView(); $box->setHeaderText(pht('Rule Details')); $box->appendChild(phutil_tag('ul', array('class' => 'herald-explain-list'), $rule_markup)); } return $box; }
private function buildActionTranscriptPanel(HeraldTranscript $xscript) { $action_xscript = mgroup($xscript->getApplyTranscripts(), 'getRuleID'); $adapter = $this->getAdapter(); $field_names = $adapter->getFieldNameMap(); $condition_names = $adapter->getConditionNameMap(); $handles = $this->handles; $action_map = $xscript->getApplyTranscripts(); $action_map = mgroup($action_map, 'getRuleID'); $rule_list = id(new PHUIObjectItemListView())->setNoDataString(pht('No Herald rules applied to this object.')); $rule_xscripts = $xscript->getRuleTranscripts(); $rule_xscripts = msort($rule_xscripts, 'getRuleID'); foreach ($rule_xscripts as $rule_xscript) { $rule_id = $rule_xscript->getRuleID(); $rule_item = id(new PHUIObjectItemView())->setObjectName(pht('H%d', $rule_id))->setHeader($rule_xscript->getRuleName()); if (!$rule_xscript->getResult()) { $rule_item->setDisabled(true); } $rule_list->addItem($rule_item); // Build the field/condition transcript. $cond_xscripts = $xscript->getConditionTranscriptsForRule($rule_id); $cond_list = id(new PHUIStatusListView()); $cond_list->addItem(id(new PHUIStatusItemView())->setTarget(phutil_tag('strong', array(), pht('Conditions')))); foreach ($cond_xscripts as $cond_xscript) { if ($cond_xscript->getResult()) { $icon = 'fa-check'; $color = 'green'; $result = pht('Passed'); } else { $icon = 'fa-times'; $color = 'red'; $result = pht('Failed'); } if ($cond_xscript->getNote()) { $note = phutil_tag('div', array('class' => 'herald-condition-note'), $cond_xscript->getNote()); } else { $note = null; } // TODO: This is not really translatable and should be driven through // HeraldField. $explanation = pht('%s %s %s', idx($field_names, $cond_xscript->getFieldName(), pht('Unknown')), idx($condition_names, $cond_xscript->getCondition(), pht('Unknown')), $this->renderConditionTestValue($cond_xscript, $handles)); $cond_item = id(new PHUIStatusItemView())->setIcon($icon, $color)->setTarget($result)->setNote(array($explanation, $note)); $cond_list->addItem($cond_item); } if ($rule_xscript->getResult()) { $last_icon = 'fa-check-circle'; $last_color = 'green'; $last_result = pht('Passed'); $last_note = pht('Rule passed.'); } else { $last_icon = 'fa-times-circle'; $last_color = 'red'; $last_result = pht('Failed'); $last_note = pht('Rule failed.'); } $cond_last = id(new PHUIStatusItemView())->setIcon($last_icon, $last_color)->setTarget(phutil_tag('strong', array(), $last_result))->setNote($last_note); $cond_list->addItem($cond_last); $cond_box = id(new PHUIBoxView())->appendChild($cond_list)->addMargin(PHUI::MARGIN_LARGE_LEFT); $rule_item->appendChild($cond_box); if (!$rule_xscript->getResult()) { // If the rule didn't pass, don't generate an action transcript since // actions didn't apply. continue; } $cond_box->addMargin(PHUI::MARGIN_MEDIUM_BOTTOM); $action_xscripts = idx($action_map, $rule_id, array()); foreach ($action_xscripts as $action_xscript) { $action_key = $action_xscript->getAction(); $action = $adapter->getActionImplementation($action_key); if ($action) { $name = $action->getHeraldActionName(); $action->setViewer($this->getViewer()); } else { $name = pht('Unknown Action ("%s")', $action_key); } $name = pht('Action: %s', $name); $action_list = id(new PHUIStatusListView()); $action_list->addItem(id(new PHUIStatusItemView())->setTarget(phutil_tag('strong', array(), $name))); $action_box = id(new PHUIBoxView())->appendChild($action_list)->addMargin(PHUI::MARGIN_LARGE_LEFT); $rule_item->appendChild($action_box); $log = $action_xscript->getAppliedReason(); // Handle older transcripts which used a static string to record // action results. if ($xscript->getDryRun()) { $action_list->addItem(id(new PHUIStatusItemView())->setIcon('fa-ban', 'grey')->setTarget(pht('Dry Run'))->setNote(pht('This was a dry run, so no actions were taken.'))); continue; } else { if (!is_array($log)) { $action_list->addItem(id(new PHUIStatusItemView())->setIcon('fa-clock-o', 'grey')->setTarget(pht('Old Transcript'))->setNote(pht('This is an old transcript which uses an obsolete log ' . 'format. Detailed action information is not available.'))); continue; } } foreach ($log as $entry) { $type = idx($entry, 'type'); $data = idx($entry, 'data'); if ($action) { $icon = $action->renderActionEffectIcon($type, $data); $color = $action->renderActionEffectColor($type, $data); $name = $action->renderActionEffectName($type, $data); $note = $action->renderEffectDescription($type, $data); } else { $icon = 'fa-question-circle'; $color = 'indigo'; $name = pht('Unknown Effect ("%s")', $type); $note = null; } $action_item = id(new PHUIStatusItemView())->setIcon($icon, $color)->setTarget($name)->setNote($note); $action_list->addItem($action_item); } } } $box = id(new PHUIObjectBoxView())->setHeaderText(pht('Rule Transcript'))->appendChild($rule_list); return $box; }