Path: blob/master/src/applications/calendar/controller/PhabricatorCalendarImportViewController.php
12256 views
<?php12final class PhabricatorCalendarImportViewController3extends PhabricatorCalendarController {45public function handleRequest(AphrontRequest $request) {6$viewer = $request->getViewer();78$import = id(new PhabricatorCalendarImportQuery())9->setViewer($viewer)10->withIDs(array($request->getURIData('id')))11->executeOne();12if (!$import) {13return new Aphront404Response();14}1516$crumbs = $this->buildApplicationCrumbs();17$crumbs->addTextCrumb(18pht('Imports'),19'/calendar/import/');20$crumbs->addTextCrumb(pht('Import %d', $import->getID()));21$crumbs->setBorder(true);2223$timeline = $this->buildTransactionTimeline(24$import,25new PhabricatorCalendarImportTransactionQuery());26$timeline->setShouldTerminate(true);2728$header = $this->buildHeaderView($import);29$curtain = $this->buildCurtain($import);30$details = $this->buildPropertySection($import);3132$log_messages = $this->buildLogMessages($import);33$imported_events = $this->buildImportedEvents($import);3435$view = id(new PHUITwoColumnView())36->setHeader($header)37->setMainColumn(38array(39$log_messages,40$imported_events,41$timeline,42))43->setCurtain($curtain)44->addPropertySection(pht('Details'), $details);4546$page_title = pht(47'Import %d %s',48$import->getID(),49$import->getDisplayName());5051return $this->newPage()52->setTitle($page_title)53->setCrumbs($crumbs)54->setPageObjectPHIDs(array($import->getPHID()))55->appendChild($view);56}5758private function buildHeaderView(59PhabricatorCalendarImport $import) {60$viewer = $this->getViewer();61$id = $import->getID();6263if ($import->getIsDisabled()) {64$icon = 'fa-ban';65$color = 'red';66$status = pht('Disabled');67} else {68$icon = 'fa-check';69$color = 'bluegrey';70$status = pht('Active');71}7273$header = id(new PHUIHeaderView())74->setViewer($viewer)75->setHeader($import->getDisplayName())76->setStatus($icon, $color, $status)77->setPolicyObject($import);7879return $header;80}8182private function buildCurtain(PhabricatorCalendarImport $import) {83$viewer = $this->getViewer();84$id = $import->getID();8586$curtain = $this->newCurtainView($import);87$engine = $import->getEngine();8889$can_edit = PhabricatorPolicyFilter::hasCapability(90$viewer,91$import,92PhabricatorPolicyCapability::CAN_EDIT);9394$edit_uri = "import/edit/{$id}/";95$edit_uri = $this->getApplicationURI($edit_uri);9697$can_disable = ($can_edit && $engine->canDisable($viewer, $import));9899$curtain->addAction(100id(new PhabricatorActionView())101->setName(pht('Edit Import'))102->setIcon('fa-pencil')103->setDisabled(!$can_edit)104->setWorkflow(!$can_edit)105->setHref($edit_uri));106107$reload_uri = "import/reload/{$id}/";108$reload_uri = $this->getApplicationURI($reload_uri);109110$curtain->addAction(111id(new PhabricatorActionView())112->setName(pht('Reload Import'))113->setIcon('fa-refresh')114->setDisabled(!$can_edit)115->setWorkflow(true)116->setHref($reload_uri));117118$disable_uri = "import/disable/{$id}/";119$disable_uri = $this->getApplicationURI($disable_uri);120if ($import->getIsDisabled()) {121$disable_name = pht('Enable Import');122$disable_icon = 'fa-check';123} else {124$disable_name = pht('Disable Import');125$disable_icon = 'fa-ban';126}127128$curtain->addAction(129id(new PhabricatorActionView())130->setName($disable_name)131->setIcon($disable_icon)132->setDisabled(!$can_disable)133->setWorkflow(true)134->setHref($disable_uri));135136if ($can_edit) {137$can_delete = $engine->canDeleteAnyEvents($viewer, $import);138} else {139$can_delete = false;140}141142$delete_uri = "import/delete/{$id}/";143$delete_uri = $this->getApplicationURI($delete_uri);144145$curtain->addAction(146id(new PhabricatorActionView())147->setName(pht('Delete Imported Events'))148->setIcon('fa-times')149->setDisabled(!$can_delete)150->setWorkflow(true)151->setHref($delete_uri));152153return $curtain;154}155156private function buildPropertySection(157PhabricatorCalendarImport $import) {158$viewer = $this->getViewer();159160$properties = id(new PHUIPropertyListView())161->setViewer($viewer);162163$engine = $import->getEngine();164165$properties->addProperty(166pht('Source Type'),167$engine->getImportEngineTypeName());168169if ($import->getIsDisabled()) {170$auto_updates = phutil_tag('em', array(), pht('Import Disabled'));171$has_trigger = false;172} else {173$frequency = $import->getTriggerFrequency();174$frequency_map = PhabricatorCalendarImport::getTriggerFrequencyMap();175$frequency_names = ipull($frequency_map, 'name');176$auto_updates = idx($frequency_names, $frequency, $frequency);177178if ($frequency == PhabricatorCalendarImport::FREQUENCY_ONCE) {179$has_trigger = false;180$auto_updates = phutil_tag('em', array(), $auto_updates);181} else {182$has_trigger = true;183}184}185186$properties->addProperty(187pht('Automatic Updates'),188$auto_updates);189190if ($has_trigger) {191$trigger = id(new PhabricatorWorkerTriggerQuery())192->setViewer($viewer)193->withPHIDs(array($import->getTriggerPHID()))194->needEvents(true)195->executeOne();196197if (!$trigger) {198$next_trigger = phutil_tag('em', array(), pht('Invalid Trigger'));199} else {200$now = PhabricatorTime::getNow();201$next_epoch = $trigger->getNextEventPrediction();202$next_trigger = pht(203'%s (%s)',204phabricator_datetime($next_epoch, $viewer),205phutil_format_relative_time($next_epoch - $now));206}207208$properties->addProperty(209pht('Next Update'),210$next_trigger);211}212213$engine->appendImportProperties(214$viewer,215$import,216$properties);217218return $properties;219}220221private function buildLogMessages(PhabricatorCalendarImport $import) {222$viewer = $this->getViewer();223224$logs = id(new PhabricatorCalendarImportLogQuery())225->setViewer($viewer)226->withImportPHIDs(array($import->getPHID()))227->setLimit(25)228->execute();229230$logs_view = id(new PhabricatorCalendarImportLogView())231->setViewer($viewer)232->setLogs($logs);233234$all_uri = $this->getApplicationURI('import/log/');235$all_uri = (string)id(new PhutilURI($all_uri))236->replaceQueryParam('importSourcePHID', $import->getPHID());237238$all_button = id(new PHUIButtonView())239->setTag('a')240->setText(pht('View All'))241->setIcon('fa-search')242->setHref($all_uri);243244$header = id(new PHUIHeaderView())245->setHeader(pht('Log Messages'))246->addActionLink($all_button);247248return id(new PHUIObjectBoxView())249->setHeader($header)250->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)251->setTable($logs_view);252}253254private function buildImportedEvents(PhabricatorCalendarImport $import) {255$viewer = $this->getViewer();256257$engine = id(new PhabricatorCalendarEventSearchEngine())258->setViewer($viewer);259260$saved = $engine->newSavedQuery()261->setParameter('importSourcePHIDs', array($import->getPHID()));262263$pager = $engine->newPagerForSavedQuery($saved);264$pager->setPageSize(25);265266$query = $engine->buildQueryFromSavedQuery($saved);267268$results = $engine->executeQuery($query, $pager);269$view = $engine->renderResults($results, $saved);270$list = $view->getObjectList();271$list->setNoDataString(pht('No imported events.'));272273$all_uri = $this->getApplicationURI();274$all_uri = (string)id(new PhutilURI($all_uri))275->replaceQueryParam('importSourcePHID', $import->getPHID())276->replaceQueryParam('display', 'list');277278$all_button = id(new PHUIButtonView())279->setTag('a')280->setText(pht('View All'))281->setIcon('fa-search')282->setHref($all_uri);283284$header = id(new PHUIHeaderView())285->setHeader(pht('Imported Events'))286->addActionLink($all_button);287288return id(new PHUIObjectBoxView())289->setHeader($header)290->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)291->setObjectList($list);292}293294}295296297