Differential D20279 Diff 48493 src/applications/project/controller/trigger/PhabricatorProjectTriggerViewController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/project/controller/trigger/PhabricatorProjectTriggerViewController.php
- This file was added.
<?php | |||||
final class PhabricatorProjectTriggerViewController | |||||
extends PhabricatorProjectTriggerController { | |||||
public function shouldAllowPublic() { | |||||
return true; | |||||
} | |||||
public function handleRequest(AphrontRequest $request) { | |||||
$request = $this->getRequest(); | |||||
$viewer = $request->getViewer(); | |||||
$id = $request->getURIData('id'); | |||||
$trigger = id(new PhabricatorProjectTriggerQuery()) | |||||
->setViewer($viewer) | |||||
->withIDs(array($id)) | |||||
->executeOne(); | |||||
if (!$trigger) { | |||||
return new Aphront404Response(); | |||||
} | |||||
$columns_view = $this->newColumnsView($trigger); | |||||
$title = $trigger->getObjectName(); | |||||
$header = id(new PHUIHeaderView()) | |||||
->setHeader($trigger->getDisplayName()); | |||||
$timeline = $this->buildTransactionTimeline( | |||||
$trigger, | |||||
new PhabricatorProjectTriggerTransactionQuery()); | |||||
$timeline->setShouldTerminate(true); | |||||
$curtain = $this->newCurtain($trigger); | |||||
$column_view = id(new PHUITwoColumnView()) | |||||
->setHeader($header) | |||||
->setCurtain($curtain) | |||||
->setMainColumn( | |||||
array( | |||||
$columns_view, | |||||
$timeline, | |||||
)); | |||||
$crumbs = $this->buildApplicationCrumbs() | |||||
->addTextCrumb($trigger->getObjectName()) | |||||
->setBorder(true); | |||||
return $this->newPage() | |||||
->setTitle($title) | |||||
->setCrumbs($crumbs) | |||||
->appendChild($column_view); | |||||
} | |||||
private function newColumnsView(PhabricatorProjectTrigger $trigger) { | |||||
$viewer = $this->getViewer(); | |||||
// NOTE: When showing columns which use this trigger, we want to represent | |||||
// all columns the trigger is used by: even columns the user can't see. | |||||
// If we hide columns the viewer can't see, they might think that the | |||||
// trigger isn't widely used and is safe to edit, when it may actually | |||||
// be in use on workboards they don't have access to. | |||||
// Query the columns with the omnipotent viewer first, then pull out their | |||||
// PHIDs and throw the actual objects away. Re-query with the real viewer | |||||
// so we load only the columns they can actually see, but have a list of | |||||
// all the impacted column PHIDs. | |||||
$omnipotent_viewer = PhabricatorUser::getOmnipotentUser(); | |||||
$all_columns = id(new PhabricatorProjectColumnQuery()) | |||||
->setViewer($omnipotent_viewer) | |||||
->withTriggerPHIDs(array($trigger->getPHID())) | |||||
->execute(); | |||||
$column_phids = mpull($all_columns, 'getPHID'); | |||||
if ($column_phids) { | |||||
$visible_columns = id(new PhabricatorProjectColumnQuery()) | |||||
->setViewer($viewer) | |||||
->withPHIDs($column_phids) | |||||
->execute(); | |||||
$visible_columns = mpull($visible_columns, null, 'getPHID'); | |||||
} else { | |||||
$visible_columns = array(); | |||||
} | |||||
$rows = array(); | |||||
foreach ($column_phids as $column_phid) { | |||||
$column = idx($visible_columns, $column_phid); | |||||
if ($column) { | |||||
$project = $column->getProject(); | |||||
$project_name = phutil_tag( | |||||
'a', | |||||
array( | |||||
'href' => $project->getURI(), | |||||
), | |||||
$project->getDisplayName()); | |||||
$column_name = phutil_tag( | |||||
'a', | |||||
array( | |||||
'href' => $column->getBoardURI(), | |||||
), | |||||
$column->getDisplayName()); | |||||
} else { | |||||
$project_name = null; | |||||
$column_name = phutil_tag('em', array(), pht('Restricted Column')); | |||||
} | |||||
$rows[] = array( | |||||
$project_name, | |||||
$column_name, | |||||
); | |||||
} | |||||
$table_view = id(new AphrontTableView($rows)) | |||||
->setNoDataString(pht('This trigger is not used by any columns.')) | |||||
->setHeaders( | |||||
array( | |||||
pht('Project'), | |||||
pht('Column'), | |||||
)) | |||||
->setColumnClasses( | |||||
array( | |||||
null, | |||||
'wide pri', | |||||
)); | |||||
$header_view = id(new PHUIHeaderView()) | |||||
->setHeader(pht('Used by Columns')); | |||||
return id(new PHUIObjectBoxView()) | |||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) | |||||
->setHeader($header_view) | |||||
->setTable($table_view); | |||||
} | |||||
private function newCurtain(PhabricatorProjectTrigger $trigger) { | |||||
$viewer = $this->getViewer(); | |||||
$can_edit = PhabricatorPolicyFilter::hasCapability( | |||||
$viewer, | |||||
$trigger, | |||||
PhabricatorPolicyCapability::CAN_EDIT); | |||||
$curtain = $this->newCurtainView($trigger); | |||||
$edit_uri = $this->getApplicationURI( | |||||
urisprintf( | |||||
'trigger/edit/%d/', | |||||
$trigger->getID())); | |||||
$curtain->addAction( | |||||
id(new PhabricatorActionView()) | |||||
->setName(pht('Edit Trigger')) | |||||
->setIcon('fa-pencil') | |||||
->setHref($edit_uri) | |||||
->setDisabled(!$can_edit) | |||||
->setWorkflow(!$can_edit)); | |||||
return $curtain; | |||||
} | |||||
} |