diff --git a/src/applications/nuance/controller/NuanceSourceActionController.php b/src/applications/nuance/controller/NuanceSourceActionController.php --- a/src/applications/nuance/controller/NuanceSourceActionController.php +++ b/src/applications/nuance/controller/NuanceSourceActionController.php @@ -13,7 +13,7 @@ return new Aphront404Response(); } - $def = NuanceSourceDefinition::getDefinitionForSource($source); + $def = $source->requireDefinition(); $def->setActor($viewer); $response = $def->handleActionRequest($request); diff --git a/src/applications/nuance/controller/NuanceSourceEditController.php b/src/applications/nuance/controller/NuanceSourceEditController.php --- a/src/applications/nuance/controller/NuanceSourceEditController.php +++ b/src/applications/nuance/controller/NuanceSourceEditController.php @@ -41,7 +41,7 @@ $cancel_uri = $source->getURI(); } - $definition = NuanceSourceDefinition::getDefinitionForSource($source); + $definition = $source->requireDefinition(); $definition->setActor($viewer); $response = $definition->buildEditLayout($request); diff --git a/src/applications/nuance/controller/NuanceSourceViewController.php b/src/applications/nuance/controller/NuanceSourceViewController.php --- a/src/applications/nuance/controller/NuanceSourceViewController.php +++ b/src/applications/nuance/controller/NuanceSourceViewController.php @@ -77,6 +77,13 @@ ->setDisabled(!$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; } @@ -90,7 +97,7 @@ ->setObject($source) ->setActionList($actions); - $definition = NuanceSourceDefinition::getDefinitionForSource($source); + $definition = $source->requireDefinition(); $properties->addProperty( pht('Source Type'), $definition->getName()); diff --git a/src/applications/nuance/source/NuancePhabricatorFormSourceDefinition.php b/src/applications/nuance/source/NuancePhabricatorFormSourceDefinition.php --- a/src/applications/nuance/source/NuancePhabricatorFormSourceDefinition.php +++ b/src/applications/nuance/source/NuancePhabricatorFormSourceDefinition.php @@ -15,6 +15,17 @@ 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() { return null; } diff --git a/src/applications/nuance/source/NuanceSourceDefinition.php b/src/applications/nuance/source/NuanceSourceDefinition.php --- a/src/applications/nuance/source/NuanceSourceDefinition.php +++ b/src/applications/nuance/source/NuanceSourceDefinition.php @@ -43,18 +43,8 @@ return $source; } - /** - * Gives a @{class:NuanceSourceDefinition} object for a given - * @{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 function getSourceViewActions(AphrontRequest $request) { + return array(); } public static function getAllDefinitions() { @@ -286,4 +276,9 @@ return new Aphront404Response(); } + public function getActionURI($path = null) { + $source_id = $this->getSourceObject()->getID(); + return '/action/'.$source_id.'/'.ltrim($path, '/'); + } + } diff --git a/src/applications/nuance/storage/NuanceSource.php b/src/applications/nuance/storage/NuanceSource.php --- a/src/applications/nuance/storage/NuanceSource.php +++ b/src/applications/nuance/storage/NuanceSource.php @@ -12,6 +12,8 @@ protected $viewPolicy; protected $editPolicy; + private $definition; + protected function getConfiguration() { return array( self::CONFIG_AUX_PHID => true, @@ -62,6 +64,31 @@ ->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 )------------------------- */