1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-20 09:18:48 +02:00

Allow Nuance source definitions to add actions to source views

Summary:
Ref T8783. If you have a source (like a "report bug" form), let it put a link (like "View Form") on the source detail page.

This also straightens out getting definitions from sources, which had a bug with the modern way we do `PhutilClassMapQuery`.

Specifically, if you called the old mechanism on two different sources, they'd return the same definition object, but they need to return different definitions.

Test Plan:
{F747093}

{F747092}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T8783

Differential Revision: https://secure.phabricator.com/D13966
This commit is contained in:
epriestley 2015-08-23 07:39:04 -07:00
parent b5672e7e55
commit 5caeb5c4db
6 changed files with 55 additions and 15 deletions

View file

@ -13,7 +13,7 @@ final class NuanceSourceActionController extends NuanceController {
return new Aphront404Response(); return new Aphront404Response();
} }
$def = NuanceSourceDefinition::getDefinitionForSource($source); $def = $source->requireDefinition();
$def->setActor($viewer); $def->setActor($viewer);
$response = $def->handleActionRequest($request); $response = $def->handleActionRequest($request);

View file

@ -41,7 +41,7 @@ final class NuanceSourceEditController extends NuanceController {
$cancel_uri = $source->getURI(); $cancel_uri = $source->getURI();
} }
$definition = NuanceSourceDefinition::getDefinitionForSource($source); $definition = $source->requireDefinition();
$definition->setActor($viewer); $definition->setActor($viewer);
$response = $definition->buildEditLayout($request); $response = $definition->buildEditLayout($request);

View file

@ -77,6 +77,13 @@ final class NuanceSourceViewController extends NuanceController {
->setDisabled(!$can_edit) ->setDisabled(!$can_edit)
->setWorkflow(!$can_edit)); ->setWorkflow(!$can_edit));
$request = $this->getRequest();
$definition = $source->requireDefinition();
$source_actions = $definition->getSourceViewActions($request);
foreach ($source_actions as $source_action) {
$actions->addAction($source_action);
}
return $actions; return $actions;
} }
@ -90,7 +97,7 @@ final class NuanceSourceViewController extends NuanceController {
->setObject($source) ->setObject($source)
->setActionList($actions); ->setActionList($actions);
$definition = NuanceSourceDefinition::getDefinitionForSource($source); $definition = $source->requireDefinition();
$properties->addProperty( $properties->addProperty(
pht('Source Type'), pht('Source Type'),
$definition->getName()); $definition->getName());

View file

@ -15,6 +15,17 @@ final class NuancePhabricatorFormSourceDefinition
return 'phabricator-form'; return 'phabricator-form';
} }
public function getSourceViewActions(AphrontRequest $request) {
$actions = array();
$actions[] = id(new PhabricatorActionView())
->setName(pht('View Form'))
->setIcon('fa-align-justify')
->setHref($this->getActionURI());
return $actions;
}
public function updateItems() { public function updateItems() {
return null; return null;
} }

View file

@ -43,18 +43,8 @@ abstract class NuanceSourceDefinition extends Phobject {
return $source; return $source;
} }
/** public function getSourceViewActions(AphrontRequest $request) {
* Gives a @{class:NuanceSourceDefinition} object for a given return array();
* @{class:NuanceSource}. Note you still need to @{method:setActor}
* before the @{class:NuanceSourceDefinition} object will be useful.
*/
public static function getDefinitionForSource(NuanceSource $source) {
$definitions = self::getAllDefinitions();
$map = mpull($definitions, null, 'getSourceTypeConstant');
$definition = $map[$source->getType()];
$definition->setSourceObject($source);
return $definition;
} }
public static function getAllDefinitions() { public static function getAllDefinitions() {
@ -286,4 +276,9 @@ abstract class NuanceSourceDefinition extends Phobject {
return new Aphront404Response(); return new Aphront404Response();
} }
public function getActionURI($path = null) {
$source_id = $this->getSourceObject()->getID();
return '/action/'.$source_id.'/'.ltrim($path, '/');
}
} }

View file

@ -12,6 +12,8 @@ final class NuanceSource extends NuanceDAO
protected $viewPolicy; protected $viewPolicy;
protected $editPolicy; protected $editPolicy;
private $definition;
protected function getConfiguration() { protected function getConfiguration() {
return array( return array(
self::CONFIG_AUX_PHID => true, self::CONFIG_AUX_PHID => true,
@ -62,6 +64,31 @@ final class NuanceSource extends NuanceDAO
->setEditPolicy($edit_policy); ->setEditPolicy($edit_policy);
} }
public function getDefinition() {
if ($this->definition === null) {
$definitions = NuanceSourceDefinition::getAllDefinitions();
if (isset($definitions[$this->getType()])) {
$definition = clone $definitions[$this->getType()];
$definition->setSourceObject($this);
$this->definition = $definition;
}
}
return $this->definition;
}
public function requireDefinition() {
$definition = $this->getDefinition();
if (!$definition) {
throw new Exception(
pht(
'Unable to load source definition implementation for source '.
'type "%s".',
$this->getType()));
}
return $definition;
}
/* -( PhabricatorApplicationTransactionInterface )------------------------- */ /* -( PhabricatorApplicationTransactionInterface )------------------------- */