Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14098189
D7585.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
26 KB
Referenced Files
None
Subscribers
None
D7585.diff
View Options
Index: resources/sql/patches/20131120.nuancesourcetype.sql
===================================================================
--- /dev/null
+++ resources/sql/patches/20131120.nuancesourcetype.sql
@@ -0,0 +1,11 @@
+ALTER TABLE {$NAMESPACE}_nuance.nuance_source
+ DROP KEY key_type;
+
+ALTER TABLE {$NAMESPACE}_nuance.nuance_source
+ DROP COLUMN type;
+
+ALTER TABLE {$NAMESPACE}_nuance.nuance_source
+ ADD type VARCHAR(32) NOT NULL COLLATE utf8_bin AFTER name;
+
+ALTER TABLE {$NAMESPACE}_nuance.nuance_source
+ ADD KEY `key_type` (type, dateModified);
Index: src/__phutil_library_map__.php
===================================================================
--- src/__phutil_library_map__.php
+++ src/__phutil_library_map__.php
@@ -867,6 +867,7 @@
'NuancePHIDTypeQueue' => 'applications/nuance/phid/NuancePHIDTypeQueue.php',
'NuancePHIDTypeRequestor' => 'applications/nuance/phid/NuancePHIDTypeRequestor.php',
'NuancePHIDTypeSource' => 'applications/nuance/phid/NuancePHIDTypeSource.php',
+ 'NuancePhabricatorFormSourceDefinition' => 'applications/nuance/source/NuancePhabricatorFormSourceDefinition.php',
'NuanceQuery' => 'applications/nuance/query/NuanceQuery.php',
'NuanceQueue' => 'applications/nuance/storage/NuanceQueue.php',
'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php',
@@ -887,13 +888,13 @@
'NuanceRequestorTransactionQuery' => 'applications/nuance/query/NuanceRequestorTransactionQuery.php',
'NuanceRequestorViewController' => 'applications/nuance/controller/NuanceRequestorViewController.php',
'NuanceSource' => 'applications/nuance/storage/NuanceSource.php',
+ 'NuanceSourceDefinition' => 'applications/nuance/source/NuanceSourceDefinition.php',
'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php',
'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php',
'NuanceSourceQuery' => 'applications/nuance/query/NuanceSourceQuery.php',
'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php',
'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php',
'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php',
- 'NuanceSourceType' => 'applications/nuance/constants/NuanceSourceType.php',
'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php',
'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php',
'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php',
@@ -3238,6 +3239,7 @@
'NuancePHIDTypeQueue' => 'PhabricatorPHIDType',
'NuancePHIDTypeRequestor' => 'PhabricatorPHIDType',
'NuancePHIDTypeSource' => 'PhabricatorPHIDType',
+ 'NuancePhabricatorFormSourceDefinition' => 'NuanceSourceDefinition',
'NuanceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'NuanceQueue' =>
array(
@@ -3266,13 +3268,13 @@
0 => 'NuanceDAO',
1 => 'PhabricatorPolicyInterface',
),
+ 'NuanceSourceDefinition' => 'Phobject',
'NuanceSourceEditController' => 'NuanceController',
'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor',
'NuanceSourceQuery' => 'NuanceQuery',
'NuanceSourceTransaction' => 'NuanceTransaction',
'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment',
'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
- 'NuanceSourceType' => 'NuanceConstants',
'NuanceSourceViewController' => 'NuanceController',
'NuanceTransaction' => 'PhabricatorApplicationTransaction',
'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler',
Index: src/applications/nuance/application/PhabricatorApplicationNuance.php
===================================================================
--- src/applications/nuance/application/PhabricatorApplicationNuance.php
+++ src/applications/nuance/application/PhabricatorApplicationNuance.php
@@ -23,6 +23,10 @@
return true;
}
+ public function getBaseURI() {
+ return '/nuance/';
+ }
+
public function getRoutes() {
return array(
'/nuance/' => array(
Index: src/applications/nuance/constants/NuanceSourceType.php
===================================================================
--- src/applications/nuance/constants/NuanceSourceType.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-final class NuanceSourceType extends NuanceConstants {
-
- /* internal source types */
- const PHABRICATOR_FORM = 1;
-
- /* social media source types */
- const TWITTER = 101;
-
- /* engineering media source types */
- const GITHUB = 201;
-
-
- public static function getSelectOptions() {
-
- return array(
- self::PHABRICATOR_FORM => pht('Phabricator Form'),
- );
- }
-
-}
Index: src/applications/nuance/controller/NuanceSourceEditController.php
===================================================================
--- src/applications/nuance/controller/NuanceSourceEditController.php
+++ src/applications/nuance/controller/NuanceSourceEditController.php
@@ -28,7 +28,6 @@
if ($is_new) {
$source = NuanceSource::initializeNewSource($user);
- $title = pht('Create Source');
} else {
$source = id(new NuanceSourceQuery())
->setViewer($user)
@@ -39,71 +38,29 @@
PhabricatorPolicyCapability::CAN_EDIT,
))
->executeOne();
- $title = pht('Edit Source');
}
if (!$source) {
return new Aphront404Response();
}
- $error_view = null;
- $e_name = null;
- if ($request->isFormPost()) {
- $error_view = id(new AphrontErrorView())
- ->setTitle(pht('This does not work at all yet.'));
- }
+ $definition = NuanceSourceDefinition::getDefinitionForSource($source);
+ $definition->setActor($user);
- $policies = id(new PhabricatorPolicyQuery())
- ->setViewer($user)
- ->setObject($source)
- ->execute();
+ $response = $definition->buildEditLayout($request);
+ if ($response instanceof AphrontResponse) {
+ return $response;
+ }
+ $layout = $response;
$crumbs = $this->buildApplicationCrumbs();
-
- $form = id(new AphrontFormView())
- ->setUser($user)
- ->appendChild(
- id(new AphrontFormTextControl())
- ->setLabel(pht('Name'))
- ->setName('name')
- ->setError($e_name)
- ->setValue($source->getName()))
- ->appendChild(
- id(new AphrontFormSelectControl())
- ->setLabel(pht('Type'))
- ->setName('type')
- ->setOptions(NuanceSourceType::getSelectOptions())
- ->setValue($source->getType()))
- ->appendChild(
- id(new AphrontFormPolicyControl())
- ->setUser($user)
- ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
- ->setPolicyObject($source)
- ->setPolicies($policies)
- ->setName('viewPolicy'))
- ->appendChild(
- id(new AphrontFormPolicyControl())
- ->setUser($user)
- ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
- ->setPolicyObject($source)
- ->setPolicies($policies)
- ->setName('editPolicy'))
- ->appendChild(
- id(new AphrontFormSubmitControl())
- ->setValue(pht('Save')));
-
- $layout = id(new PHUIObjectBoxView())
- ->setHeaderText($title)
- ->setFormError($error_view)
- ->setForm($form);
-
return $this->buildApplicationPage(
array(
$crumbs,
$layout,
),
array(
- 'title' => $title,
+ 'title' => $definition->getEditTitle(),
'device' => true));
}
}
Index: src/applications/nuance/controller/NuanceSourceViewController.php
===================================================================
--- src/applications/nuance/controller/NuanceSourceViewController.php
+++ src/applications/nuance/controller/NuanceSourceViewController.php
@@ -18,11 +18,11 @@
public function processRequest() {
$request = $this->getRequest();
- $user = $request->getUser();
+ $viewer = $request->getUser();
$source_id = $this->getSourceID();
$source = id(new NuanceSourceQuery())
- ->setViewer($user)
+ ->setViewer($viewer)
->withIDs(array($source_id))
->executeOne();
@@ -30,13 +30,107 @@
return new Aphront404Response();
}
+ $source_phid = $source->getPHID();
+ $xactions = id(new NuanceSourceTransactionQuery())
+ ->setViewer($viewer)
+ ->withObjectPHIDs(array($source_phid))
+ ->execute();
+
+ $engine = id(new PhabricatorMarkupEngine())
+ ->setViewer($viewer);
+
+ $timeline = id(new PhabricatorApplicationTransactionView())
+ ->setUser($viewer)
+ ->setObjectPHID($source_phid)
+ ->setMarkupEngine($engine)
+ ->setTransactions($xactions);
+
+ $title = pht('%s', $source->getName());
$crumbs = $this->buildApplicationCrumbs();
- $title = 'TODO';
+ $crumbs->addCrumb(
+ id(new PhabricatorCrumbView())
+ ->setName($title));
+
+ $header = $this->buildHeaderView($source);
+ $actions = $this->buildActionView($source);
+ $properties = $this->buildPropertyView($source, $actions);
+
+ $box = id(new PHUIObjectBoxView())
+ ->setHeader($header)
+ ->addPropertyList($properties);
return $this->buildApplicationPage(
- $crumbs,
+ array(
+ $crumbs,
+ $box,
+ $timeline,
+ ),
array(
'title' => $title,
- 'device' => true));
+ 'device' => true,
+ ));
+
+ }
+
+
+ private function buildHeaderView(NuanceSource $source) {
+ $viewer = $this->getRequest()->getUser();
+
+ $header = id(new PHUIHeaderView())
+ ->setUser($viewer)
+ ->setHeader($source->getName())
+ ->setPolicyObject($source);
+
+ return $header;
+ }
+
+ private function buildActionView(NuanceSource $source) {
+ $viewer = $this->getRequest()->getUser();
+ $id = $source->getID();
+
+ $actions = id(new PhabricatorActionListView())
+ ->setObjectURI($source->getURI())
+ ->setUser($viewer);
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $source,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ $actions->addAction(
+ id(new PhabricatorActionView())
+ ->setName(pht('Edit Source'))
+ ->setIcon('edit')
+ ->setHref($this->getApplicationURI("source/edit/{$id}/"))
+ ->setDisabled(!$can_edit)
+ ->setWorkflow(!$can_edit));
+
+ return $actions;
+ }
+
+ private function buildPropertyView(
+ NuanceSource $source,
+ PhabricatorActionListView $actions) {
+ $viewer = $this->getRequest()->getUser();
+
+ $properties = id(new PHUIPropertyListView())
+ ->setUser($viewer)
+ ->setObject($source)
+ ->setActionList($actions);
+
+ $definition = NuanceSourceDefinition::getDefinitionForSource($source);
+ $properties->addProperty(
+ pht('Source Type'),
+ $definition->getName());
+
+ $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
+ $viewer,
+ $source);
+
+ $properties->addProperty(
+ pht('Editable By'),
+ $descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
+
+ return $properties;
}
}
Index: src/applications/nuance/editor/NuanceSourceEditor.php
===================================================================
--- src/applications/nuance/editor/NuanceSourceEditor.php
+++ src/applications/nuance/editor/NuanceSourceEditor.php
@@ -6,6 +6,8 @@
public function getTransactionTypes() {
$types = parent::getTransactionTypes();
+ $types[] = NuanceSourceTransaction::TYPE_NAME;
+
$types[] = PhabricatorTransactions::TYPE_EDGE;
$types[] = PhabricatorTransactions::TYPE_COMMENT;
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
@@ -14,4 +16,80 @@
return $types;
}
+ protected function getCustomTransactionOldValue(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case NuanceSourceTransaction::TYPE_NAME:
+ return $object->getName();
+ }
+
+ return parent::getCustomTransactionOldValue($object, $xaction);
+ }
+
+ protected function getCustomTransactionNewValue(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case NuanceSourceTransaction::TYPE_NAME:
+ return $xaction->getNewValue();
+ }
+
+ return parent::getCustomTransactionNewValue($object, $xaction);
+ }
+
+ protected function applyCustomInternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case NuanceSourceTransaction::TYPE_NAME:
+ $object->setName($xaction->getNewValue());
+ break;
+ }
+ }
+
+ protected function applyCustomExternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case NuanceSourceTransaction::TYPE_NAME:
+ return;
+ }
+
+ return parent::applyCustomExternalTransaction($object, $xaction);
+ }
+
+ protected function validateTransaction(
+ PhabricatorLiskDAO $object,
+ $type,
+ array $xactions) {
+
+ $errors = parent::validateTransaction($object, $type, $xactions);
+
+ switch ($type) {
+ case NuanceSourceTransaction::TYPE_NAME:
+ $missing = $this->validateIsEmptyTextField(
+ $object->getName(),
+ $xactions);
+
+ if ($missing) {
+ $error = new PhabricatorApplicationTransactionValidationError(
+ $type,
+ pht('Required'),
+ pht('Source name is required.'),
+ nonempty(last($xactions), null));
+
+ $error->setIsMissingFieldError(true);
+ $errors[] = $error;
+ }
+ break;
+ }
+
+ return $errors;
+ }
+
}
Index: src/applications/nuance/query/NuanceSourceQuery.php
===================================================================
--- src/applications/nuance/query/NuanceSourceQuery.php
+++ src/applications/nuance/query/NuanceSourceQuery.php
@@ -35,7 +35,7 @@
$data = queryfx_all(
$conn_r,
- 'SELECT FROM %T %Q %Q %Q',
+ 'SELECT * FROM %T %Q %Q %Q',
$table->getTableName(),
$this->buildWhereClause($conn_r),
$this->buildOrderClause($conn_r),
Index: src/applications/nuance/source/NuancePhabricatorFormSourceDefinition.php
===================================================================
--- /dev/null
+++ src/applications/nuance/source/NuancePhabricatorFormSourceDefinition.php
@@ -0,0 +1,43 @@
+<?php
+
+final class NuancePhabricatorFormSourceDefinition
+ extends NuanceSourceDefinition {
+
+ public function getName() {
+ return pht('Phabricator Form');
+ }
+
+ public function getSourceTypeConstant() {
+ return 'phabricator-form';
+ }
+
+ public function updateItems() {
+ return null;
+ }
+
+ protected function augmentEditForm(
+ AphrontFormView $form,
+ PhabricatorApplicationTransactionValidationException $ex = null) {
+
+ /* TODO - add a box to allow for custom fields to be defined here, so that
+ * these NuanceSource objects made from this defintion can be used to
+ * capture arbitrary data */
+
+ return $form;
+ }
+
+ protected function buildTransactions(AphrontRequest $request) {
+ $transactions = parent::buildTransactions($request);
+
+ // TODO -- as above
+
+ return $transactions;
+ }
+
+ public function renderView() {
+ }
+
+ public function renderListView() {
+ }
+
+}
Index: src/applications/nuance/source/NuanceSourceDefinition.php
===================================================================
--- /dev/null
+++ src/applications/nuance/source/NuanceSourceDefinition.php
@@ -0,0 +1,274 @@
+<?php
+
+abstract class NuanceSourceDefinition extends Phobject {
+
+ private $actor;
+ private $sourceObject;
+
+ public function setActor(PhabricatorUser $actor) {
+ $this->actor = $actor;
+ return $this;
+ }
+ public function getActor() {
+ return $this->actor;
+ }
+ public function requireActor() {
+ $actor = $this->getActor();
+ if (!$actor) {
+ throw new Exception('You must "setActor()" first!');
+ }
+ return $actor;
+ }
+
+ public function setSourceObject(NuanceSource $source) {
+ $source->setType($this->getSourceTypeConstant());
+ $this->sourceObject = $source;
+ return $this;
+ }
+ public function getSourceObject() {
+ return $this->sourceObject;
+ }
+ public function requireSourceObject() {
+ $source = $this->getSourceObject();
+ if (!$source) {
+ throw new Exception('You must "setSourceObject()" first!');
+ }
+ return $source;
+ }
+
+ public static function getSelectOptions() {
+ $definitions = self::getAllDefinitions();
+
+ $options = array();
+ foreach ($definitions as $definition) {
+ $key = $definition->getSourceTypeConstant();
+ $name = $definition->getName();
+ $options[$key] = $name;
+ }
+
+ return $options;
+ }
+
+ /**
+ * 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 static function getAllDefinitions() {
+ static $definitions;
+
+ if ($definitions === null) {
+ $objects = id(new PhutilSymbolLoader())
+ ->setAncestorClass(__CLASS__)
+ ->loadObjects();
+ foreach ($objects as $definition) {
+ $key = $definition->getSourceTypeConstant();
+ $name = $definition->getName();
+ if (isset($definitions[$key])) {
+ $conflict = $definitions[$key];
+ throw new Exception(sprintf(
+ 'Defintion %s conflicts with definition %s. This is a programming '.
+ 'error.',
+ $conflict,
+ $name));
+ }
+ }
+ $definitions = $objects;
+ }
+ return $definitions;
+ }
+
+ /**
+ * A human readable string like "Twitter" or "Phabricator Form".
+ */
+ abstract public function getName();
+
+ /**
+ * This should be a any VARCHAR(32).
+ *
+ * @{method:getAllDefinitions} will throw if you choose a string that
+ * collides with another @{class:NuanceSourceDefinition} class.
+ */
+ abstract public function getSourceTypeConstant();
+
+ /**
+ * Code to create and update @{class:NuanceItem}s and
+ * @{class:NuanceRequestor}s via daemons goes here.
+ *
+ * If that does not make sense for the @{class:NuanceSource} you are
+ * defining, simply return null. For example,
+ * @{class:NuancePhabricatorFormSourceDefinition} since these are one-way
+ * contact forms.
+ */
+ abstract public function updateItems();
+
+ private function loadSourceObjectPolicies(
+ PhabricatorUser $user,
+ NuanceSource $source) {
+
+ $user = $this->requireActor();
+ $source = $this->requireSourceObject();
+ return id(new PhabricatorPolicyQuery())
+ ->setViewer($user)
+ ->setObject($source)
+ ->execute();
+ }
+
+ final public function getEditTitle() {
+ $source = $this->requireSourceObject();
+ if ($source->getPHID()) {
+ $title = pht('Edit "%s" source.', $source->getName());
+ } else {
+ $title = pht('Create a new "%s" source.', $this->getName());
+ }
+
+ return $title;
+ }
+
+ final public function buildEditLayout(AphrontRequest $request) {
+ $actor = $this->requireActor();
+ $source = $this->requireSourceObject();
+
+ $form_errors = array();
+ $error_messages = array();
+ $transactions = array();
+ $validation_exception = null;
+ if ($request->isFormPost()) {
+ $transactions = $this->buildTransactions($request);
+ try {
+ $editor = id(new NuanceSourceEditor())
+ ->setActor($actor)
+ ->setContentSourceFromRequest($request)
+ ->setContinueOnNoEffect(true)
+ ->applyTransactions($source, $transactions);
+
+ return id(new AphrontRedirectResponse())
+ ->setURI($source->getURI());
+
+ } catch (PhabricatorApplicationTransactionValidationException $ex) {
+ $validation_exception = $ex;
+ }
+
+ }
+
+ $form = $this->renderEditForm($validation_exception);
+ $layout = id(new PHUIObjectBoxView())
+ ->setHeaderText($this->getEditTitle())
+ ->setValidationException($validation_exception)
+ ->setForm($form);
+ if ($error_messages) {
+ $layout->setFormError($this->renderEditErrorView($error_messages));
+ }
+
+ return $layout;
+ }
+
+ /**
+ * Code to create a form to edit the @{class:NuanceItem} you are defining.
+ *
+ * return @{class:AphrontFormView}
+ */
+ private function renderEditForm(
+ PhabricatorApplicationTransactionValidationException $ex = null) {
+ $user = $this->requireActor();
+ $source = $this->requireSourceObject();
+ $policies = $this->loadSourceObjectPolicies($user, $source);
+ $e_name = null;
+ if ($ex) {
+ $e_name = $ex->getShortMessage(NuanceSourceTransaction::TYPE_NAME);
+ }
+
+ $form = id(new AphrontFormView())
+ ->setUser($user)
+ ->appendChild(
+ id(new AphrontFormTextControl())
+ ->setLabel(pht('Name'))
+ ->setName('name')
+ ->setError($e_name)
+ ->setValue($source->getName()))
+ ->appendChild(
+ id(new AphrontFormSelectControl())
+ ->setLabel(pht('Type'))
+ ->setName('type')
+ ->setOptions(self::getSelectOptions())
+ ->setValue($source->getType()));
+
+ $form = $this->augmentEditForm($form, $ex);
+
+ $form
+ ->appendChild(
+ id(new AphrontFormPolicyControl())
+ ->setUser($user)
+ ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
+ ->setPolicyObject($source)
+ ->setPolicies($policies)
+ ->setName('viewPolicy'))
+ ->appendChild(
+ id(new AphrontFormPolicyControl())
+ ->setUser($user)
+ ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
+ ->setPolicyObject($source)
+ ->setPolicies($policies)
+ ->setName('editPolicy'))
+ ->appendChild(
+ id(new AphrontFormSubmitControl())
+ ->addCancelButton($source->getURI())
+ ->setValue(pht('Save')));
+
+ return $form;
+ }
+
+ /**
+ * return @{class:AphrontFormView}
+ */
+ protected function augmentEditForm(
+ AphrontFormView $form,
+ PhabricatorApplicationTransactionValidationException $ex = null) {
+
+ return $form;
+ }
+
+ /**
+ * return @{class:AphrontErrorView}
+ */
+ public function renderEditErrorView(array $errors) {
+ return id(new AphrontErrorView())
+ ->setTitle(pht('Error with submission.'))
+ ->setErrors($errors);
+ }
+
+ /**
+ * Hook to build up @{class:PhabricatorTransactions}.
+ *
+ * return array $transactions
+ */
+ protected function buildTransactions(AphrontRequest $request) {
+ $transactions = array();
+
+ $transactions[] = id(new NuanceSourceTransaction())
+ ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)
+ ->setNewValue($request->getStr('editPolicy'));
+ $transactions[] = id(new NuanceSourceTransaction())
+ ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
+ ->setNewValue($request->getStr('viewPolicy'));
+ $transactions[] = id(new NuanceSourceTransaction())
+ ->setTransactionType(NuanceSourceTransaction::TYPE_NAME)
+ ->setNewvalue($request->getStr('name'));
+
+ return $transactions;
+ }
+
+ abstract public function renderView();
+
+ abstract public function renderListView();
+}
+
Index: src/applications/nuance/storage/NuanceSource.php
===================================================================
--- src/applications/nuance/storage/NuanceSource.php
+++ src/applications/nuance/storage/NuanceSource.php
@@ -47,9 +47,14 @@
$edit_policy = $app->getPolicy(
NuanceCapabilitySourceDefaultEdit::CAPABILITY);
+ $definitions = NuanceSourceDefinition::getAllDefinitions();
+ $lucky_definition = head($definitions);
+
return id(new NuanceSource())
->setViewPolicy($view_policy)
- ->setEditPolicy($edit_policy);
+ ->setEditPolicy($edit_policy)
+ ->setType($lucky_definition->getSourceTypeConstant());
+
}
public function getCapabilities() {
Index: src/applications/nuance/storage/NuanceSourceTransaction.php
===================================================================
--- src/applications/nuance/storage/NuanceSourceTransaction.php
+++ src/applications/nuance/storage/NuanceSourceTransaction.php
@@ -3,6 +3,8 @@
final class NuanceSourceTransaction
extends NuanceTransaction {
+ const TYPE_NAME = 'name-source';
+
public function getApplicationTransactionType() {
return NuancePHIDTypeSource::TYPECONST;
}
@@ -11,4 +13,27 @@
return new NuanceSourceTransactionComment();
}
+ public function getTitle() {
+ $old = $this->getOldValue();
+ $new = $this->getNewValue();
+ $author_phid = $this->getAuthorPHID();
+
+ switch ($this->getTransactionType()) {
+ case self::TYPE_NAME:
+ if ($old === null) {
+ return pht(
+ '%s created this source.',
+ $this->renderHandleLink($author_phid));
+ } else {
+ return pht(
+ '%s renamed this source from "%s" to "%s".',
+ $this->renderHandleLink($author_phid),
+ $old,
+ $new);
+ }
+ break;
+ }
+
+ }
+
}
Index: src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
===================================================================
--- src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
+++ src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
@@ -1768,6 +1768,10 @@
'type' => 'sql',
'name' => $this->getPatchPath('20131119.passphrase.sql'),
),
+ '20131120.nuancesourcetype.sql' => array(
+ 'type' => 'sql',
+ 'name' => $this->getPatchPath('20131120.nuancesourcetype.sql'),
+ ),
);
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 27, 8:37 AM (20 h, 43 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6791832
Default Alt Text
D7585.diff (26 KB)
Attached To
Mode
D7585: Nuance - federate out the design of NuanceSource via NuanceSourceDefinition
Attached
Detach File
Event Timeline
Log In to Comment