public function validateTransactions($object, array $xactions)
 {
     $errors = array();
     $valid = PhabricatorCalendarExport::getPolicyModes();
     $valid = array_fuse($valid);
     foreach ($xactions as $xaction) {
         $value = $xaction->getNewValue();
         if (isset($valid[$value])) {
             continue;
         }
         $errors[] = $this->newInvalidError(pht('Mode "%s" is not a valid policy mode. Valid modes are: %s.', $value, implode(', ', $valid)), $xaction);
     }
     return $errors;
 }
 private function buildPropertySection(PhabricatorCalendarExport $export)
 {
     $viewer = $this->getViewer();
     $properties = id(new PHUIPropertyListView())->setUser($viewer);
     $mode = $export->getPolicyMode();
     $policy_icon = PhabricatorCalendarExport::getPolicyModeIcon($mode);
     $policy_name = PhabricatorCalendarExport::getPolicyModeName($mode);
     $policy_desc = PhabricatorCalendarExport::getPolicyModeDescription($mode);
     $policy_color = PhabricatorCalendarExport::getPolicyModeColor($mode);
     $policy_view = id(new PHUIStatusListView())->addItem(id(new PHUIStatusItemView())->setIcon($policy_icon, $policy_color)->setTarget($policy_name)->setNote($policy_desc));
     $properties->addProperty(pht('Mode'), $policy_view);
     $query_key = $export->getQueryKey();
     $query_link = phutil_tag('a', array('href' => $this->getApplicationURI("/query/{$query_key}/")), $query_key);
     $properties->addProperty(pht('Query'), $query_link);
     $ics_uri = $export->getICSURI();
     $ics_uri = PhabricatorEnv::getURI($ics_uri);
     if ($export->getIsDisabled()) {
         $ics_href = phutil_tag('em', array(), $ics_uri);
     } else {
         $ics_href = phutil_tag('a', array('href' => $ics_uri), $ics_uri);
     }
     $properties->addProperty(pht('ICS URI'), $ics_href);
     return $properties;
 }
 protected function buildCustomEditFields($object)
 {
     $viewer = $this->getViewer();
     $export_modes = PhabricatorCalendarExport::getAvailablePolicyModes();
     $export_modes = array_fuse($export_modes);
     $current_mode = $object->getPolicyMode();
     if (empty($export_modes[$current_mode])) {
         array_shift($export_modes, $current_mode);
     }
     $mode_options = array();
     foreach ($export_modes as $export_mode) {
         $mode_name = PhabricatorCalendarExport::getPolicyModeName($export_mode);
         $mode_summary = PhabricatorCalendarExport::getPolicyModeSummary($export_mode);
         $mode_options[$export_mode] = pht('%s: %s', $mode_name, $mode_summary);
     }
     $fields = array(id(new PhabricatorTextEditField())->setKey('name')->setLabel(pht('Name'))->setDescription(pht('Name of the export.'))->setIsRequired(true)->setTransactionType(PhabricatorCalendarExportNameTransaction::TRANSACTIONTYPE)->setConduitDescription(pht('Rename the export.'))->setConduitTypeDescription(pht('New export name.'))->setValue($object->getName()), id(new PhabricatorBoolEditField())->setKey('disabled')->setOptions(pht('Active'), pht('Disabled'))->setLabel(pht('Disabled'))->setDescription(pht('Disable the export.'))->setTransactionType(PhabricatorCalendarExportDisableTransaction::TRANSACTIONTYPE)->setIsConduitOnly(true)->setConduitDescription(pht('Disable or restore the export.'))->setConduitTypeDescription(pht('True to cancel the export.'))->setValue($object->getIsDisabled()), id(new PhabricatorTextEditField())->setKey('queryKey')->setLabel(pht('Query Key'))->setDescription(pht('Query to execute.'))->setIsRequired(true)->setTransactionType(PhabricatorCalendarExportQueryKeyTransaction::TRANSACTIONTYPE)->setConduitDescription(pht('Change the export query key.'))->setConduitTypeDescription(pht('New export query key.'))->setValue($object->getQueryKey()), id(new PhabricatorSelectEditField())->setKey('mode')->setLabel(pht('Mode'))->setTransactionType(PhabricatorCalendarExportModeTransaction::TRANSACTIONTYPE)->setOptions($mode_options)->setDescription(pht('Change the policy mode for the export.'))->setConduitDescription(pht('Adjust export mode.'))->setConduitTypeDescription(pht('New export mode.'))->setValue($current_mode));
     return $fields;
 }
 protected function renderResultList(array $exports, PhabricatorSavedQuery $query, array $handles)
 {
     assert_instances_of($exports, 'PhabricatorCalendarExport');
     $viewer = $this->requireViewer();
     $list = new PHUIObjectItemListView();
     foreach ($exports as $export) {
         $item = id(new PHUIObjectItemView())->setViewer($viewer)->setObjectName(pht('Export %d', $export->getID()))->setHeader($export->getName())->setHref($export->getURI());
         if ($export->getIsDisabled()) {
             $item->setDisabled(true);
         }
         $mode = $export->getPolicyMode();
         $policy_icon = PhabricatorCalendarExport::getPolicyModeIcon($mode);
         $policy_name = PhabricatorCalendarExport::getPolicyModeName($mode);
         $policy_color = PhabricatorCalendarExport::getPolicyModeColor($mode);
         $item->addIcon("{$policy_icon} {$policy_color}", $policy_name);
         $list->addItem($item);
     }
     $result = new PhabricatorApplicationSearchResultView();
     $result->setObjectList($list);
     $result->setNoDataString(pht('No exports found.'));
     return $result;
 }