Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php b/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
index 9710d6eef8..f723f1b081 100644
--- a/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
+++ b/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php
@@ -1,68 +1,68 @@
<?php
final class PhabricatorApplicationLegalpad extends PhabricatorApplication {
public function getBaseURI() {
return '/legalpad/';
}
public function getShortDescription() {
return pht('Agreements and Signatures');
}
public function getIconName() {
return 'legalpad';
}
public function getTitleGlyph() {
return "\xC2\xA9";
}
public function getFlavorText() {
return pht('With advanced signature technology.');
}
public function getApplicationGroup() {
return self::GROUP_UTILITIES;
}
public function isBeta() {
return true;
}
public function getRemarkupRules() {
return array(
new LegalpadDocumentRemarkupRule(),
);
}
public function getRoutes() {
return array(
'/L(?P<id>\d+)' => 'LegalpadDocumentSignController',
'/legalpad/' => array(
'' => 'LegalpadDocumentListController',
'(?:query/(?P<queryKey>[^/]+)/)?' => 'LegalpadDocumentListController',
'create/' => 'LegalpadDocumentEditController',
'edit/(?P<id>\d+)/' => 'LegalpadDocumentEditController',
'comment/(?P<id>\d+)/' => 'LegalpadDocumentCommentController',
'view/(?P<id>\d+)/' => 'LegalpadDocumentManageController',
'done/' => 'LegalpadDocumentDoneController',
'verify/(?P<code>[^/]+)/' =>
'LegalpadDocumentSignatureVerificationController',
- 'signatures/(?P<id>\d+)/(?:query/(?P<queryKey>[^/]+)/)?'
- => 'LegalpadDocumentSignatureListController',
+ 'signatures/(?:(?P<id>\d+)/)?(?:query/(?P<queryKey>[^/]+)/)?' =>
+ 'LegalpadDocumentSignatureListController',
'document/' => array(
'preview/' => 'PhabricatorMarkupPreviewController'),
));
}
protected function getCustomCapabilities() {
return array(
LegalpadCapabilityDefaultView::CAPABILITY => array(
),
LegalpadCapabilityDefaultEdit::CAPABILITY => array(
),
);
}
}
diff --git a/src/applications/legalpad/controller/LegalpadController.php b/src/applications/legalpad/controller/LegalpadController.php
index 1715b4c400..a438bca36e 100644
--- a/src/applications/legalpad/controller/LegalpadController.php
+++ b/src/applications/legalpad/controller/LegalpadController.php
@@ -1,29 +1,32 @@
<?php
/**
* @group legalpad
*/
abstract class LegalpadController extends PhabricatorController {
public function buildSideNav($for_app = false) {
$user = $this->getRequest()->getUser();
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
if ($for_app) {
$nav->addFilter('create/', pht('Create Document'));
}
id(new LegalpadDocumentSearchEngine())
->setViewer($user)
->addNavigationItems($nav->getMenu());
+ $nav->addLabel(pht('Signatures'));
+ $nav->addFilter('signatures/', pht('Find Signatures'));
+
return $nav;
}
public function buildApplicationMenu() {
return $this->buildSideNav(true)->getMenu();
}
}
diff --git a/src/applications/legalpad/controller/LegalpadDocumentSignatureListController.php b/src/applications/legalpad/controller/LegalpadDocumentSignatureListController.php
index 0be217813e..f7e9b4464b 100644
--- a/src/applications/legalpad/controller/LegalpadDocumentSignatureListController.php
+++ b/src/applications/legalpad/controller/LegalpadDocumentSignatureListController.php
@@ -1,68 +1,83 @@
<?php
final class LegalpadDocumentSignatureListController extends LegalpadController {
private $documentID;
private $queryKey;
private $document;
public function willProcessRequest(array $data) {
- $this->documentID = $data['id'];
+ $this->documentID = idx($data, 'id');
$this->queryKey = idx($data, 'queryKey');
}
public function processRequest() {
$request = $this->getRequest();
$user = $request->getUser();
- $document = id(new LegalpadDocumentQuery())
- ->setViewer($user)
- ->withIDs(array($this->documentID))
- ->requireCapabilities(
- array(
- PhabricatorPolicyCapability::CAN_VIEW,
- PhabricatorPolicyCapability::CAN_EDIT,
- ))
- ->executeOne();
- if (!$document) {
- return new Aphront404Response();
+ if ($this->documentID) {
+ $document = id(new LegalpadDocumentQuery())
+ ->setViewer($user)
+ ->withIDs(array($this->documentID))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ if (!$document) {
+ return new Aphront404Response();
+ }
+
+ $this->document = $document;
}
- $this->document = $document;
+ $engine = id(new LegalpadDocumentSignatureSearchEngine());
- $engine = id(new LegalpadDocumentSignatureSearchEngine())
- ->setDocument($document);
+ if ($this->document) {
+ $engine->setDocument($this->document);
+ }
$controller = id(new PhabricatorApplicationSearchController($request))
->setQueryKey($this->queryKey)
->setSearchEngine($engine)
->setNavigation($this->buildSideNav());
return $this->delegateToController($controller);
}
public function buildSideNav($for_app = false) {
$user = $this->getRequest()->getUser();
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
- id(new LegalpadDocumentSignatureSearchEngine())
- ->setViewer($user)
- ->setDocument($this->document)
- ->addNavigationItems($nav->getMenu());
+ $engine = id(new LegalpadDocumentSignatureSearchEngine())
+ ->setViewer($user);
+
+ if ($this->document) {
+ $engine->setDocument($this->document);
+ }
+
+ $engine->addNavigationItems($nav->getMenu());
return $nav;
}
public function buildApplicationCrumbs() {
$crumbs = parent::buildApplicationCrumbs();
- $crumbs->addTextCrumb(
- $this->document->getMonogram(),
- '/'.$this->document->getMonogram());
+ if ($this->document) {
+ $crumbs->addTextCrumb(
+ $this->document->getMonogram(),
+ '/'.$this->document->getMonogram());
+ } else {
+ $crumbs->addTextCrumb(
+ pht('Signatures'),
+ '/legalpad/signatures/');
+ }
return $crumbs;
}
}
diff --git a/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php b/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php
index ad76e1f334..3640181407 100644
--- a/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php
+++ b/src/applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php
@@ -1,74 +1,74 @@
<?php
/**
* @group legalpad
*/
final class PhabricatorLegalpadPHIDTypeDocument extends PhabricatorPHIDType {
const TYPECONST = 'LEGD';
public function getTypeConstant() {
return self::TYPECONST;
}
public function getTypeName() {
return pht('Legalpad Document');
}
public function newObject() {
return new LegalpadDocument();
}
protected function buildQueryForObjects(
PhabricatorObjectQuery $query,
array $phids) {
return id(new LegalpadDocumentQuery())
->withPHIDs($phids)
->needDocumentBodies(true);
}
public function loadHandles(
PhabricatorHandleQuery $query,
array $handles,
array $objects) {
foreach ($handles as $phid => $handle) {
$document = $objects[$phid];
$name = $document->getDocumentBody()->getTitle();
$handle->setName($name);
- $handle->setFullName($name);
- $handle->setURI('/legalpad/view/'.$document->getID().'/');
+ $handle->setFullName($document->getMonogram().' '.$name);
+ $handle->setURI('/'.$document->getMonogram());
}
}
public function canLoadNamedObject($name) {
return preg_match('/^L\d*[1-9]\d*$/i', $name);
}
public function loadNamedObjects(
PhabricatorObjectQuery $query,
array $names) {
$id_map = array();
foreach ($names as $name) {
$id = (int)substr($name, 1);
$id_map[$id][] = $name;
}
$objects = id(new LegalpadDocumentQuery())
->setViewer($query->getViewer())
->withIDs(array_keys($id_map))
->execute();
$results = array();
foreach ($objects as $id => $object) {
foreach (idx($id_map, $id, array()) as $name) {
$results[$name] = $object;
}
}
return $results;
}
}
diff --git a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
index b75fe0c649..83d91e8930 100644
--- a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
+++ b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
@@ -1,207 +1,255 @@
<?php
final class LegalpadDocumentSignatureSearchEngine
extends PhabricatorApplicationSearchEngine {
private $document;
public function getResultTypeDescription() {
return pht('Legalpad Signatures');
}
public function getApplicationClassName() {
return 'PhabricatorApplicationLegalpad';
}
public function setDocument(LegalpadDocument $document) {
$this->document = $document;
return $this;
}
public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery();
$saved->setParameter(
'signerPHIDs',
$this->readUsersFromRequest($request, 'signers'));
+ $saved->setParameter(
+ 'documentPHIDs',
+ $this->readPHIDsFromRequest(
+ $request,
+ 'documents',
+ array(
+ PhabricatorLegalpadPHIDTypeDocument::TYPECONST,
+ )));
+
return $saved;
}
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
$query = id(new LegalpadDocumentSignatureQuery());
$signer_phids = $saved->getParameter('signerPHIDs', array());
if ($signer_phids) {
$query->withSignerPHIDs($signer_phids);
}
if ($this->document) {
$query->withDocumentPHIDs(array($this->document->getPHID()));
+ } else {
+ $document_phids = $saved->getParameter('documentPHIDs', array());
+ if ($document_phids) {
+ $query->withDocumentPHIDs($document_phids);
+ }
}
return $query;
}
public function buildSearchForm(
AphrontFormView $form,
PhabricatorSavedQuery $saved_query) {
+ $document_phids = $saved_query->getParameter('documentPHIDs', array());
$signer_phids = $saved_query->getParameter('signerPHIDs', array());
- $phids = array_merge($signer_phids);
+ $phids = array_merge($document_phids, $signer_phids);
$handles = id(new PhabricatorHandleQuery())
->setViewer($this->requireViewer())
->withPHIDs($phids)
->execute();
+ if (!$this->document) {
+ $form
+ ->appendChild(
+ id(new AphrontFormTokenizerControl())
+ ->setDatasource('/typeahead/common/legalpaddocuments/')
+ ->setName('documents')
+ ->setLabel(pht('Documents'))
+ ->setValue(array_select_keys($handles, $document_phids)));
+ }
+
$form
->appendChild(
id(new AphrontFormTokenizerControl())
->setDatasource('/typeahead/common/users/')
->setName('signers')
->setLabel(pht('Signers'))
->setValue(array_select_keys($handles, $signer_phids)));
}
protected function getURI($path) {
if ($this->document) {
return '/legalpad/signatures/'.$this->document->getID().'/'.$path;
} else {
- throw new Exception(
- pht(
- 'Searching for signatures outside of a document context is not '.
- 'currently supported.'));
+ return '/legalpad/signatures/'.$path;
}
}
public function getBuiltinQueryNames() {
$names = array(
'all' => pht('All Signatures'),
);
return $names;
}
public function buildSavedQueryFromBuiltin($query_key) {
$query = $this->newSavedQuery();
$query->setQueryKey($query_key);
switch ($query_key) {
case 'all':
return $query;
}
return parent::buildSavedQueryFromBuiltin($query_key);
}
protected function getRequiredHandlePHIDsForResultList(
- array $documents,
+ array $signatures,
PhabricatorSavedQuery $query) {
- return mpull($documents, 'getSignerPHID');
+
+ return array_merge(
+ mpull($signatures, 'getSignerPHID'),
+ mpull($signatures, 'getDocumentPHID'));
}
protected function renderResultList(
array $signatures,
PhabricatorSavedQuery $query,
array $handles) {
assert_instances_of($signatures, 'LegalpadDocumentSignature');
$viewer = $this->requireViewer();
Javelin::initBehavior('phabricator-tooltips');
$sig_good = $this->renderIcon(
'fa-check',
null,
pht('Verified, Current'));
$sig_old = $this->renderIcon(
'fa-clock-o',
'orange',
pht('Signed Older Version'));
$sig_unverified = $this->renderIcon(
'fa-envelope',
'red',
pht('Unverified Email'));
id(new PHUIIconView())
->setIconFont('fa-envelope', 'red')
->addSigil('has-tooltip')
->setMetadata(array('tip' => pht('Unverified Email')));
$rows = array();
foreach ($signatures as $signature) {
$data = $signature->getSignatureData();
$name = idx($data, 'name');
$email = idx($data, 'email');
$document = $signature->getDocument();
if (!$signature->isVerified()) {
$sig_icon = $sig_unverified;
} else if ($signature->getDocumentVersion() != $document->getVersions()) {
$sig_icon = $sig_old;
} else {
$sig_icon = $sig_good;
}
$rows[] = array(
$sig_icon,
+ $handles[$document->getPHID()]->renderLink(),
$handles[$signature->getSignerPHID()]->renderLink(),
$name,
phutil_tag(
'a',
array(
'href' => 'mailto:'.$email,
),
$email),
phabricator_datetime($signature->getDateCreated(), $viewer),
);
}
$table = id(new AphrontTableView($rows))
->setHeaders(
array(
'',
+ pht('Document'),
pht('Account'),
pht('Name'),
pht('Email'),
pht('Signed'),
))
+ ->setColumnVisibility(
+ array(
+ true,
+
+ // Only show the "Document" column if we aren't scoped to a
+ // particular document.
+ !$this->document,
+ ))
->setColumnClasses(
array(
'',
'',
'',
+ '',
'wide',
'right',
));
$box = id(new PHUIObjectBoxView())
->setHeaderText(pht('Signatures'))
->appendChild($table);
+ if (!$this->document) {
+ $policy_notice = id(new AphrontErrorView())
+ ->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
+ ->setErrors(
+ array(
+ pht(
+ 'NOTE: You can only see your own signatures and signatures on '.
+ 'documents you have permission to edit.'),
+ ));
+ $box->setErrorView($policy_notice);
+ }
+
return $box;
}
private function renderIcon($icon, $color, $title) {
Javelin::initBehavior('phabricator-tooltips');
return array(
id(new PHUIIconView())
->setIconFont($icon, $color)
->addSigil('has-tooltip')
->setMetadata(array('tip' => $title)),
javelin_tag(
'span',
array(
'aural' => true,
),
$title),
);
}
}

File Metadata

Mime Type
text/x-diff
Expires
Mon, Jul 28, 8:48 PM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
187492
Default Alt Text
(15 KB)

Event Timeline