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;
 }