Path: blob/master/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
13450 views
<?php12final class LegalpadDocumentSignatureSearchEngine3extends PhabricatorApplicationSearchEngine {45private $document;67public function getResultTypeDescription() {8return pht('Legalpad Signatures');9}1011public function getApplicationClassName() {12return 'PhabricatorLegalpadApplication';13}1415public function setDocument(LegalpadDocument $document) {16$this->document = $document;17return $this;18}1920public function buildSavedQueryFromRequest(AphrontRequest $request) {21$saved = new PhabricatorSavedQuery();2223$saved->setParameter(24'signerPHIDs',25$this->readUsersFromRequest($request, 'signers'));2627$saved->setParameter(28'documentPHIDs',29$this->readPHIDsFromRequest(30$request,31'documents',32array(33PhabricatorLegalpadDocumentPHIDType::TYPECONST,34)));3536$saved->setParameter('nameContains', $request->getStr('nameContains'));37$saved->setParameter('emailContains', $request->getStr('emailContains'));3839return $saved;40}4142public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {43$query = id(new LegalpadDocumentSignatureQuery());4445$signer_phids = $saved->getParameter('signerPHIDs', array());46if ($signer_phids) {47$query->withSignerPHIDs($signer_phids);48}4950if ($this->document) {51$query->withDocumentPHIDs(array($this->document->getPHID()));52} else {53$document_phids = $saved->getParameter('documentPHIDs', array());54if ($document_phids) {55$query->withDocumentPHIDs($document_phids);56}57}5859$name_contains = $saved->getParameter('nameContains');60if (strlen($name_contains)) {61$query->withNameContains($name_contains);62}6364$email_contains = $saved->getParameter('emailContains');65if (strlen($email_contains)) {66$query->withEmailContains($email_contains);67}6869return $query;70}7172public function buildSearchForm(73AphrontFormView $form,74PhabricatorSavedQuery $saved_query) {7576$document_phids = $saved_query->getParameter('documentPHIDs', array());77$signer_phids = $saved_query->getParameter('signerPHIDs', array());7879if (!$this->document) {80$form81->appendControl(82id(new AphrontFormTokenizerControl())83->setDatasource(new LegalpadDocumentDatasource())84->setName('documents')85->setLabel(pht('Documents'))86->setValue($document_phids));87}8889$name_contains = $saved_query->getParameter('nameContains', '');90$email_contains = $saved_query->getParameter('emailContains', '');9192$form93->appendControl(94id(new AphrontFormTokenizerControl())95->setDatasource(new PhabricatorPeopleDatasource())96->setName('signers')97->setLabel(pht('Signers'))98->setValue($signer_phids))99->appendChild(100id(new AphrontFormTextControl())101->setLabel(pht('Name Contains'))102->setName('nameContains')103->setValue($name_contains))104->appendChild(105id(new AphrontFormTextControl())106->setLabel(pht('Email Contains'))107->setName('emailContains')108->setValue($email_contains));109}110111protected function getURI($path) {112if ($this->document) {113return '/legalpad/signatures/'.$this->document->getID().'/'.$path;114} else {115return '/legalpad/signatures/'.$path;116}117}118119protected function getBuiltinQueryNames() {120$names = array(121'all' => pht('All Signatures'),122);123124return $names;125}126127public function buildSavedQueryFromBuiltin($query_key) {128129$query = $this->newSavedQuery();130$query->setQueryKey($query_key);131132switch ($query_key) {133case 'all':134return $query;135}136137return parent::buildSavedQueryFromBuiltin($query_key);138}139140protected function getRequiredHandlePHIDsForResultList(141array $signatures,142PhabricatorSavedQuery $query) {143144return array_merge(145mpull($signatures, 'getSignerPHID'),146mpull($signatures, 'getDocumentPHID'));147}148149protected function renderResultList(150array $signatures,151PhabricatorSavedQuery $query,152array $handles) {153assert_instances_of($signatures, 'LegalpadDocumentSignature');154155$viewer = $this->requireViewer();156157Javelin::initBehavior('phabricator-tooltips');158159$sig_good = $this->renderIcon(160'fa-check',161null,162pht('Verified, Current'));163164$sig_corp = $this->renderIcon(165'fa-building-o',166null,167pht('Verified, Corporate'));168169$sig_old = $this->renderIcon(170'fa-clock-o',171'orange',172pht('Signed Older Version'));173174$sig_unverified = $this->renderIcon(175'fa-envelope',176'red',177pht('Unverified Email'));178179$sig_exemption = $this->renderIcon(180'fa-asterisk',181'indigo',182pht('Exemption'));183184id(new PHUIIconView())185->setIcon('fa-envelope', 'red')186->addSigil('has-tooltip')187->setMetadata(array('tip' => pht('Unverified Email')));188189$type_corporate = LegalpadDocument::SIGNATURE_TYPE_CORPORATION;190191$rows = array();192foreach ($signatures as $signature) {193$name = $signature->getSignerName();194$email = $signature->getSignerEmail();195196$document = $signature->getDocument();197198if ($signature->getIsExemption()) {199$sig_icon = $sig_exemption;200} else if (!$signature->isVerified()) {201$sig_icon = $sig_unverified;202} else if ($signature->getDocumentVersion() != $document->getVersions()) {203$sig_icon = $sig_old;204} else if ($signature->getSignatureType() == $type_corporate) {205$sig_icon = $sig_corp;206} else {207$sig_icon = $sig_good;208}209210$signature_href = $this->getApplicationURI(211'signature/'.$signature->getID().'/');212213$sig_icon = javelin_tag(214'a',215array(216'href' => $signature_href,217'sigil' => 'workflow',218),219$sig_icon);220221$signer_phid = $signature->getSignerPHID();222223$rows[] = array(224$sig_icon,225$handles[$document->getPHID()]->renderLink(),226$signer_phid227? $handles[$signer_phid]->renderLink()228: phutil_tag('em', array(), pht('None')),229$name,230phutil_tag(231'a',232array(233'href' => 'mailto:'.$email,234),235$email),236phabricator_datetime($signature->getDateCreated(), $viewer),237);238}239240$table = id(new AphrontTableView($rows))241->setNoDataString(pht('No signatures match the query.'))242->setHeaders(243array(244'',245pht('Document'),246pht('Account'),247pht('Name'),248pht('Email'),249pht('Signed'),250))251->setColumnVisibility(252array(253true,254255// Only show the "Document" column if we aren't scoped to a256// particular document.257!$this->document,258))259->setColumnClasses(260array(261'',262'',263'',264'',265'wide',266'right',267));268269$button = null;270if ($this->document) {271$document_id = $this->document->getID();272273$button = id(new PHUIButtonView())274->setText(pht('Add Exemption'))275->setTag('a')276->setHref($this->getApplicationURI('addsignature/'.$document_id.'/'))277->setWorkflow(true)278->setIcon('fa-pencil');279}280281if (!$this->document) {282$table->setNotice(283pht('NOTE: You can only see your own signatures and signatures on '.284'documents you have permission to edit.'));285}286287$result = new PhabricatorApplicationSearchResultView();288$result->setTable($table);289if ($button) {290$result->addAction($button);291}292293return $result;294295}296297private function renderIcon($icon, $color, $title) {298Javelin::initBehavior('phabricator-tooltips');299300return array(301id(new PHUIIconView())302->setIcon($icon, $color)303->addSigil('has-tooltip')304->setMetadata(array('tip' => $title)),305javelin_tag(306'span',307array(308'aural' => true,309),310$title),311);312}313314}315316317