mirror of
https://we.phorge.it/source/phorge.git
synced 2025-03-31 22:48:16 +02:00
Allow contact numbers to be enabled and disabled
Summary: Depends on D20008. Ref T920. Continue fleshing out contact number behaviors. Test Plan: - Enabled and disabled a contact number. - Saw list, detail views reflect change. - Added number X, disabled it, added it again (allowed), enabled the disabled one ("already in use" exception). Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T920 Differential Revision: https://secure.phabricator.com/D20010
This commit is contained in:
parent
c4244aa177
commit
12203762b7
6 changed files with 197 additions and 1 deletions
|
@ -2201,12 +2201,14 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorAuthConfirmLinkController' => 'applications/auth/controller/PhabricatorAuthConfirmLinkController.php',
|
'PhabricatorAuthConfirmLinkController' => 'applications/auth/controller/PhabricatorAuthConfirmLinkController.php',
|
||||||
'PhabricatorAuthContactNumber' => 'applications/auth/storage/PhabricatorAuthContactNumber.php',
|
'PhabricatorAuthContactNumber' => 'applications/auth/storage/PhabricatorAuthContactNumber.php',
|
||||||
'PhabricatorAuthContactNumberController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberController.php',
|
'PhabricatorAuthContactNumberController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberController.php',
|
||||||
|
'PhabricatorAuthContactNumberDisableController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberDisableController.php',
|
||||||
'PhabricatorAuthContactNumberEditController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberEditController.php',
|
'PhabricatorAuthContactNumberEditController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberEditController.php',
|
||||||
'PhabricatorAuthContactNumberEditEngine' => 'applications/auth/editor/PhabricatorAuthContactNumberEditEngine.php',
|
'PhabricatorAuthContactNumberEditEngine' => 'applications/auth/editor/PhabricatorAuthContactNumberEditEngine.php',
|
||||||
'PhabricatorAuthContactNumberEditor' => 'applications/auth/editor/PhabricatorAuthContactNumberEditor.php',
|
'PhabricatorAuthContactNumberEditor' => 'applications/auth/editor/PhabricatorAuthContactNumberEditor.php',
|
||||||
'PhabricatorAuthContactNumberNumberTransaction' => 'applications/auth/xaction/PhabricatorAuthContactNumberNumberTransaction.php',
|
'PhabricatorAuthContactNumberNumberTransaction' => 'applications/auth/xaction/PhabricatorAuthContactNumberNumberTransaction.php',
|
||||||
'PhabricatorAuthContactNumberPHIDType' => 'applications/auth/phid/PhabricatorAuthContactNumberPHIDType.php',
|
'PhabricatorAuthContactNumberPHIDType' => 'applications/auth/phid/PhabricatorAuthContactNumberPHIDType.php',
|
||||||
'PhabricatorAuthContactNumberQuery' => 'applications/auth/query/PhabricatorAuthContactNumberQuery.php',
|
'PhabricatorAuthContactNumberQuery' => 'applications/auth/query/PhabricatorAuthContactNumberQuery.php',
|
||||||
|
'PhabricatorAuthContactNumberStatusTransaction' => 'applications/auth/xaction/PhabricatorAuthContactNumberStatusTransaction.php',
|
||||||
'PhabricatorAuthContactNumberTransaction' => 'applications/auth/storage/PhabricatorAuthContactNumberTransaction.php',
|
'PhabricatorAuthContactNumberTransaction' => 'applications/auth/storage/PhabricatorAuthContactNumberTransaction.php',
|
||||||
'PhabricatorAuthContactNumberTransactionQuery' => 'applications/auth/query/PhabricatorAuthContactNumberTransactionQuery.php',
|
'PhabricatorAuthContactNumberTransactionQuery' => 'applications/auth/query/PhabricatorAuthContactNumberTransactionQuery.php',
|
||||||
'PhabricatorAuthContactNumberTransactionType' => 'applications/auth/xaction/PhabricatorAuthContactNumberTransactionType.php',
|
'PhabricatorAuthContactNumberTransactionType' => 'applications/auth/xaction/PhabricatorAuthContactNumberTransactionType.php',
|
||||||
|
@ -7904,12 +7906,14 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorDestructibleInterface',
|
'PhabricatorDestructibleInterface',
|
||||||
),
|
),
|
||||||
'PhabricatorAuthContactNumberController' => 'PhabricatorAuthController',
|
'PhabricatorAuthContactNumberController' => 'PhabricatorAuthController',
|
||||||
|
'PhabricatorAuthContactNumberDisableController' => 'PhabricatorAuthContactNumberController',
|
||||||
'PhabricatorAuthContactNumberEditController' => 'PhabricatorAuthContactNumberController',
|
'PhabricatorAuthContactNumberEditController' => 'PhabricatorAuthContactNumberController',
|
||||||
'PhabricatorAuthContactNumberEditEngine' => 'PhabricatorEditEngine',
|
'PhabricatorAuthContactNumberEditEngine' => 'PhabricatorEditEngine',
|
||||||
'PhabricatorAuthContactNumberEditor' => 'PhabricatorApplicationTransactionEditor',
|
'PhabricatorAuthContactNumberEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||||
'PhabricatorAuthContactNumberNumberTransaction' => 'PhabricatorAuthContactNumberTransactionType',
|
'PhabricatorAuthContactNumberNumberTransaction' => 'PhabricatorAuthContactNumberTransactionType',
|
||||||
'PhabricatorAuthContactNumberPHIDType' => 'PhabricatorPHIDType',
|
'PhabricatorAuthContactNumberPHIDType' => 'PhabricatorPHIDType',
|
||||||
'PhabricatorAuthContactNumberQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhabricatorAuthContactNumberQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
|
'PhabricatorAuthContactNumberStatusTransaction' => 'PhabricatorAuthContactNumberTransactionType',
|
||||||
'PhabricatorAuthContactNumberTransaction' => 'PhabricatorModularTransaction',
|
'PhabricatorAuthContactNumberTransaction' => 'PhabricatorModularTransaction',
|
||||||
'PhabricatorAuthContactNumberTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
'PhabricatorAuthContactNumberTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||||
'PhabricatorAuthContactNumberTransactionType' => 'PhabricatorModularTransactionType',
|
'PhabricatorAuthContactNumberTransactionType' => 'PhabricatorModularTransactionType',
|
||||||
|
|
|
@ -111,6 +111,8 @@ final class PhabricatorAuthApplication extends PhabricatorApplication {
|
||||||
'PhabricatorAuthContactNumberEditController',
|
'PhabricatorAuthContactNumberEditController',
|
||||||
'(?P<id>[1-9]\d*)/' =>
|
'(?P<id>[1-9]\d*)/' =>
|
||||||
'PhabricatorAuthContactNumberViewController',
|
'PhabricatorAuthContactNumberViewController',
|
||||||
|
'(?P<action>disable|enable)/(?P<id>[1-9]\d*)/' =>
|
||||||
|
'PhabricatorAuthContactNumberDisableController',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorAuthContactNumberDisableController
|
||||||
|
extends PhabricatorAuthContactNumberController {
|
||||||
|
|
||||||
|
public function handleRequest(AphrontRequest $request) {
|
||||||
|
$viewer = $request->getViewer();
|
||||||
|
$id = $request->getURIData('id');
|
||||||
|
|
||||||
|
$number = id(new PhabricatorAuthContactNumberQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withIDs(array($id))
|
||||||
|
->requireCapabilities(
|
||||||
|
array(
|
||||||
|
PhabricatorPolicyCapability::CAN_VIEW,
|
||||||
|
PhabricatorPolicyCapability::CAN_EDIT,
|
||||||
|
))
|
||||||
|
->executeOne();
|
||||||
|
if (!$number) {
|
||||||
|
return new Aphront404Response();
|
||||||
|
}
|
||||||
|
|
||||||
|
$is_disable = ($request->getURIData('action') == 'disable');
|
||||||
|
$id = $number->getID();
|
||||||
|
$cancel_uri = $number->getURI();
|
||||||
|
|
||||||
|
if ($request->isFormPost()) {
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
if ($is_disable) {
|
||||||
|
$new_status = PhabricatorAuthContactNumber::STATUS_DISABLED;
|
||||||
|
} else {
|
||||||
|
$new_status = PhabricatorAuthContactNumber::STATUS_ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
$xactions[] = id(new PhabricatorAuthContactNumberTransaction())
|
||||||
|
->setTransactionType(
|
||||||
|
PhabricatorAuthContactNumberStatusTransaction::TRANSACTIONTYPE)
|
||||||
|
->setNewValue($new_status);
|
||||||
|
|
||||||
|
$editor = id(new PhabricatorAuthContactNumberEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->setContinueOnNoEffect(true)
|
||||||
|
->setContinueOnMissingFields(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$editor->applyTransactions($number, $xactions);
|
||||||
|
} catch (PhabricatorApplicationTransactionValidationException $ex) {
|
||||||
|
// This happens when you enable a number which collides with another
|
||||||
|
// number.
|
||||||
|
return $this->newDialog()
|
||||||
|
->setTitle(pht('Changing Status Failed'))
|
||||||
|
->setValidationException($ex)
|
||||||
|
->addCancelButton($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())->setURI($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
$number_display = phutil_tag(
|
||||||
|
'strong',
|
||||||
|
array(),
|
||||||
|
$number->getDisplayName());
|
||||||
|
|
||||||
|
if ($is_disable) {
|
||||||
|
$title = pht('Disable Contact Number');
|
||||||
|
$body = pht(
|
||||||
|
'Disable the contact number %s?',
|
||||||
|
$number_display);
|
||||||
|
$button = pht('Disable Number');
|
||||||
|
} else {
|
||||||
|
$title = pht('Enable Contact Number');
|
||||||
|
$body = pht(
|
||||||
|
'Enable the contact number %s?',
|
||||||
|
$number_display);
|
||||||
|
$button = pht('Enable Number');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->newDialog()
|
||||||
|
->setTitle($title)
|
||||||
|
->appendParagraph($body)
|
||||||
|
->addSubmitButton($button)
|
||||||
|
->addCancelButton($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -54,6 +54,10 @@ final class PhabricatorAuthContactNumberViewController
|
||||||
->setHeader($number->getObjectName())
|
->setHeader($number->getObjectName())
|
||||||
->setPolicyObject($number);
|
->setPolicyObject($number);
|
||||||
|
|
||||||
|
if ($number->isDisabled()) {
|
||||||
|
$view->setStatus('fa-ban', 'red', pht('Disabled'));
|
||||||
|
}
|
||||||
|
|
||||||
return $view;
|
return $view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +96,24 @@ final class PhabricatorAuthContactNumberViewController
|
||||||
->setDisabled(!$can_edit)
|
->setDisabled(!$can_edit)
|
||||||
->setWorkflow(!$can_edit));
|
->setWorkflow(!$can_edit));
|
||||||
|
|
||||||
|
|
||||||
|
if ($number->isDisabled()) {
|
||||||
|
$disable_uri = $this->getApplicationURI("contact/enable/{$id}/");
|
||||||
|
$disable_name = pht('Enable Contact Number');
|
||||||
|
$disable_icon = 'fa-check';
|
||||||
|
} else {
|
||||||
|
$disable_uri = $this->getApplicationURI("contact/disable/{$id}/");
|
||||||
|
$disable_name = pht('Disable Contact Number');
|
||||||
|
$disable_icon = 'fa-ban';
|
||||||
|
}
|
||||||
|
|
||||||
|
$curtain->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName($disable_name)
|
||||||
|
->setIcon($disable_icon)
|
||||||
|
->setHref($disable_uri)
|
||||||
|
->setWorkflow(true));
|
||||||
|
|
||||||
return $curtain;
|
return $curtain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,10 +93,32 @@ final class PhabricatorAuthContactNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save() {
|
public function save() {
|
||||||
$this->uniqueKey = $this->newUniqueKey();
|
// We require that active contact numbers be unique, but it's okay to
|
||||||
|
// disable a number and then reuse it somewhere else.
|
||||||
|
if ($this->isDisabled()) {
|
||||||
|
$this->uniqueKey = null;
|
||||||
|
} else {
|
||||||
|
$this->uniqueKey = $this->newUniqueKey();
|
||||||
|
}
|
||||||
|
|
||||||
return parent::save();
|
return parent::save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getStatusNameMap() {
|
||||||
|
return ipull(self::getStatusPropertyMap(), 'name');
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getStatusPropertyMap() {
|
||||||
|
return array(
|
||||||
|
self::STATUS_ACTIVE => array(
|
||||||
|
'name' => pht('Active'),
|
||||||
|
),
|
||||||
|
self::STATUS_DISABLED => array(
|
||||||
|
'name' => pht('Disabled'),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorAuthContactNumberStatusTransaction
|
||||||
|
extends PhabricatorAuthContactNumberTransactionType {
|
||||||
|
|
||||||
|
const TRANSACTIONTYPE = 'status';
|
||||||
|
|
||||||
|
public function generateOldValue($object) {
|
||||||
|
return $object->getStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function applyInternalEffects($object, $value) {
|
||||||
|
$object->setStatus($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle() {
|
||||||
|
$new = $this->getNewValue();
|
||||||
|
|
||||||
|
if ($new === PhabricatorAuthContactNumber::STATUS_DISABLED) {
|
||||||
|
return pht(
|
||||||
|
'%s disabled this contact number.',
|
||||||
|
$this->renderAuthor());
|
||||||
|
} else {
|
||||||
|
return pht(
|
||||||
|
'%s enabled this contact number.',
|
||||||
|
$this->renderAuthor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function validateTransactions($object, array $xactions) {
|
||||||
|
$errors = array();
|
||||||
|
|
||||||
|
$map = PhabricatorAuthContactNumber::getStatusNameMap();
|
||||||
|
|
||||||
|
foreach ($xactions as $xaction) {
|
||||||
|
$new_value = $xaction->getNewValue();
|
||||||
|
|
||||||
|
if (!isset($map[$new_value])) {
|
||||||
|
$errors[] = $this->newInvalidError(
|
||||||
|
pht(
|
||||||
|
'Status ("%s") is not a valid contact number status. Valid '.
|
||||||
|
'status constants are: %s.',
|
||||||
|
$new_value,
|
||||||
|
implode(', ', array_keys($map))),
|
||||||
|
$xaction);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: Enabling a contact number may cause us to collide with another
|
||||||
|
// active contact number. However, there might also be a transaction in
|
||||||
|
// this group that changes the number itself. Since we can't easily
|
||||||
|
// predict if we'll collide or not, just let the duplicate key logic
|
||||||
|
// handle it when we do.
|
||||||
|
}
|
||||||
|
|
||||||
|
return $errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue