Path: blob/master/src/applications/files/engineextension/PhabricatorFilesCurtainExtension.php
12242 views
<?php12final class PhabricatorFilesCurtainExtension3extends PHUICurtainExtension {45const EXTENSIONKEY = 'files.files';67public function shouldEnableForObject($object) {8return true;9}1011public function getExtensionApplication() {12return new PhabricatorFilesApplication();13}1415public function buildCurtainPanel($object) {16$viewer = $this->getViewer();1718$attachment_table = new PhabricatorFileAttachment();19$attachment_conn = $attachment_table->establishConnection('r');2021$exact_limit = 100;22$visible_limit = 8;2324$attachments = id(new PhabricatorFileAttachmentQuery())25->setViewer($viewer)26->withObjectPHIDs(array($object->getPHID()))27->setLimit($exact_limit + 1)28->needFiles(true)29->execute();3031$visible_attachments = array_slice($attachments, 0, $visible_limit, true);32$visible_phids = mpull($visible_attachments, 'getFilePHID');3334$handles = $viewer->loadHandles($visible_phids);3536$ref_list = id(new PHUICurtainObjectRefListView())37->setViewer($viewer)38->setEmptyMessage(pht('None'));3940$view_capability = PhabricatorPolicyCapability::CAN_VIEW;41$object_policies = PhabricatorPolicyQuery::loadPolicies(42$viewer,43$object);44$object_policy = idx($object_policies, $view_capability);4546foreach ($visible_attachments as $attachment) {47$file_phid = $attachment->getFilePHID();48$handle = $handles[$file_phid];4950$ref = $ref_list->newObjectRefView()51->setHandle($handle);5253$file = $attachment->getFile();54if (!$file) {55// ...56} else {57if (!$attachment->isPolicyAttachment()) {58$file_policies = PhabricatorPolicyQuery::loadPolicies(59$viewer,60$file);61$file_policy = idx($file_policies, $view_capability);6263if ($object_policy->isStrongerThanOrEqualTo($file_policy)) {64// The file is not attached to the object, but the file policy65// allows anyone who can see the object to see the file too, so66// there is no material problem with the file not being attached.67} else {68$attach_uri = urisprintf(69'/file/ui/curtain/attach/%s/%s/',70$object->getPHID(),71$file->getPHID());7273$attached_link = javelin_tag(74'a',75array(76'href' => $attach_uri,77'sigil' => 'workflow',78),79pht('File Not Attached'));8081$ref->setExiled(82true,83$attached_link);84}85}86}8788$epoch = $attachment->getDateCreated();89$ref->setEpoch($epoch);90}9192$show_all = (count($visible_attachments) < count($attachments));93if ($show_all) {94$view_all_uri = urisprintf(95'/file/ui/curtain/list/%s/',96$object->getPHID());9798$loaded_count = count($attachments);99if ($loaded_count > $exact_limit) {100$link_text = pht('View All Files');101} else {102$link_text = pht('View All %d Files', new PhutilNumber($loaded_count));103}104105$ref_list->newTailLink()106->setURI($view_all_uri)107->setText($link_text)108->setWorkflow(true);109}110111return $this->newPanel()112->setHeaderText(pht('Referenced Files'))113->setOrder(15000)114->appendChild($ref_list);115}116117118}119120121