1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 16:22:43 +01:00

Allow users to search for signatures by name and email substrings

Summary:
Ref T3116. In the case of anonymous signers, there's no way to do a quick way to check if someone has signed a doc since you can't query by their (nonexistent) external account ID.

Move "name" and "email" to first-class columns and let the engine search for them.

Test Plan: Searched for signatures with name and email fragments.

Reviewers: btrahan, chad

Reviewed By: chad

Subscribers: epriestley

Maniphest Tasks: T3116

Differential Revision: https://secure.phabricator.com/D9776
This commit is contained in:
epriestley 2014-06-29 07:51:03 -07:00
parent 94926698e0
commit ffc1b5c26a
6 changed files with 93 additions and 9 deletions

View file

@ -0,0 +1,7 @@
ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature
ADD signerName VARCHAR(255) NOT NULL COLLATE utf8_general_ci
AFTER signerPHID;
ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature
ADD signerEmail VARCHAR(255) NOT NULL COLLATE utf8_general_ci
AFTER signerName;

View file

@ -0,0 +1,17 @@
<?php
$table = new LegalpadDocumentSignature();
$conn_w = $table->establishConnection('w');
foreach (new LiskMigrationIterator($table) as $signature) {
echo pht("Updating Legalpad signature %d...\n", $signature->getID());
$data = $signature->getSignatureData();
queryfx(
$conn_w,
'UPDATE %T SET signerName = %s, signerEmail = %s WHERE id = %d',
$table->getTableName(),
(string)idx($data, 'name'),
(string)idx($data, 'email'),
$signature->getID());
}

View file

@ -82,6 +82,8 @@ final class LegalpadDocumentSignController extends LegalpadController {
->setSignerPHID($signer_phid)
->setDocumentPHID($document->getPHID())
->setDocumentVersion($document->getVersions())
->setSignerName((string)idx($signature_data, 'name'))
->setSignerEmail((string)idx($signature_data, 'email'))
->setSignatureData($signature_data);
// If the user is logged in, show a notice that they haven't signed.
@ -118,11 +120,13 @@ final class LegalpadDocumentSignController extends LegalpadController {
if ($request->isFormOrHisecPost() && !$has_signed) {
// Require two-factor auth to sign legal documents.
$engine = new PhabricatorAuthSessionEngine();
$engine->requireHighSecuritySession(
$viewer,
$request,
'/'.$document->getMonogram());
if ($viewer->isLoggedIn()) {
$engine = new PhabricatorAuthSessionEngine();
$engine->requireHighSecuritySession(
$viewer,
$request,
'/'.$document->getMonogram());
}
$name = $request->getStr('name');
$agree = $request->getExists('agree');
@ -157,6 +161,8 @@ final class LegalpadDocumentSignController extends LegalpadController {
}
$signature_data['email'] = $email;
$signature->setSignerName((string)idx($signature_data, 'name'));
$signature->setSignerEmail((string)idx($signature_data, 'email'));
$signature->setSignatureData($signature_data);
if (!$agree) {

View file

@ -8,6 +8,8 @@ final class LegalpadDocumentSignatureQuery
private $signerPHIDs;
private $documentVersions;
private $secretKeys;
private $nameContains;
private $emailContains;
public function withIDs(array $ids) {
$this->ids = $ids;
@ -34,6 +36,16 @@ final class LegalpadDocumentSignatureQuery
return $this;
}
public function withNameContains($text) {
$this->nameContains = $text;
return $this;
}
public function withEmailContains($text) {
$this->emailContains = $text;
return $this;
}
protected function loadPage() {
$table = new LegalpadDocumentSignature();
$conn_r = $table->establishConnection('r');
@ -114,6 +126,20 @@ final class LegalpadDocumentSignatureQuery
$this->secretKeys);
}
if ($this->nameContains !== null) {
$where[] = qsprintf(
$conn_r,
'signerName LIKE %~',
$this->nameContains);
}
if ($this->emailContains !== null) {
$where[] = qsprintf(
$conn_r,
'signerEmail LIKE %~',
$this->emailContains);
}
return $this->formatWhereClause($where);
}

View file

@ -34,6 +34,9 @@ final class LegalpadDocumentSignatureSearchEngine
PhabricatorLegalpadPHIDTypeDocument::TYPECONST,
)));
$saved->setParameter('nameContains', $request->getStr('nameContains'));
$saved->setParameter('emailContains', $request->getStr('emailContains'));
return $saved;
}
@ -54,6 +57,16 @@ final class LegalpadDocumentSignatureSearchEngine
}
}
$name_contains = $saved->getParameter('nameContains');
if (strlen($name_contains)) {
$query->withNameContains($name_contains);
}
$email_contains = $saved->getParameter('emailContains');
if (strlen($email_contains)) {
$query->withEmailContains($email_contains);
}
return $query;
}
@ -80,13 +93,26 @@ final class LegalpadDocumentSignatureSearchEngine
->setValue(array_select_keys($handles, $document_phids)));
}
$name_contains = $saved_query->getParameter('nameContains', '');
$email_contains = $saved_query->getParameter('emailContains', '');
$form
->appendChild(
id(new AphrontFormTokenizerControl())
->setDatasource('/typeahead/common/users/')
->setName('signers')
->setLabel(pht('Signers'))
->setValue(array_select_keys($handles, $signer_phids)));
->setValue(array_select_keys($handles, $signer_phids)))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Name Contains'))
->setName('nameContains')
->setValue($name_contains))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Email Contains'))
->setName('emailContains')
->setValue($email_contains));
}
protected function getURI($path) {
@ -159,9 +185,8 @@ final class LegalpadDocumentSignatureSearchEngine
$rows = array();
foreach ($signatures as $signature) {
$data = $signature->getSignatureData();
$name = idx($data, 'name');
$email = idx($data, 'email');
$name = $signature->getSignerName();
$email = $signature->getSignerEmail();
$document = $signature->getDocument();
@ -189,6 +214,7 @@ final class LegalpadDocumentSignatureSearchEngine
}
$table = id(new AphrontTableView($rows))
->setNoDataString(pht('No signatures match the query.'))
->setHeaders(
array(
'',

View file

@ -10,6 +10,8 @@ final class LegalpadDocumentSignature
protected $documentPHID;
protected $documentVersion;
protected $signerPHID;
protected $signerName;
protected $signerEmail;
protected $signatureData = array();
protected $verified;
protected $secretKey;