Path: blob/master/src/applications/paste/controller/PhabricatorPasteViewController.php
12242 views
<?php12final class PhabricatorPasteViewController extends PhabricatorPasteController {34public function shouldAllowPublic() {5return true;6}78public function handleRequest(AphrontRequest $request) {9$viewer = $request->getViewer();10$id = $request->getURIData('id');1112$paste = id(new PhabricatorPasteQuery())13->setViewer($viewer)14->withIDs(array($id))15->needContent(true)16->needRawContent(true)17->executeOne();18if (!$paste) {19return new Aphront404Response();20}2122$lines = $request->getURILineRange('lines', 1000);23if ($lines) {24$map = range($lines[0], $lines[1]);25} else {26$map = array();27}2829$header = $this->buildHeaderView($paste);30$curtain = $this->buildCurtain($paste);3132$subheader = $this->buildSubheaderView($paste);33$source_code = $this->buildSourceCodeView($paste, $map);3435require_celerity_resource('paste-css');3637$monogram = $paste->getMonogram();38$crumbs = $this->buildApplicationCrumbs()39->addTextCrumb($monogram)40->setBorder(true);4142$timeline = $this->buildTransactionTimeline(43$paste,44new PhabricatorPasteTransactionQuery());4546$comment_view = id(new PhabricatorPasteEditEngine())47->setViewer($viewer)48->buildEditEngineCommentView($paste);4950$timeline->setQuoteRef($monogram);51$comment_view->setTransactionTimeline($timeline);5253$recommendation_view = $this->newDocumentRecommendationView($paste);5455$paste_view = id(new PHUITwoColumnView())56->setHeader($header)57->setSubheader($subheader)58->setMainColumn(59array(60$recommendation_view,61$source_code,62$timeline,63$comment_view,64))65->setCurtain($curtain);6667return $this->newPage()68->setTitle($paste->getFullName())69->setCrumbs($crumbs)70->setPageObjectPHIDs(71array(72$paste->getPHID(),73))74->appendChild($paste_view);75}7677private function buildHeaderView(PhabricatorPaste $paste) {78$title = (nonempty($paste->getTitle())) ?79$paste->getTitle() : pht('(An Untitled Masterwork)');8081if ($paste->isArchived()) {82$header_icon = 'fa-ban';83$header_name = pht('Archived');84$header_color = 'dark';85} else {86$header_icon = 'fa-check';87$header_name = pht('Active');88$header_color = 'bluegrey';89}9091$header = id(new PHUIHeaderView())92->setHeader($title)93->setUser($this->getRequest()->getUser())94->setStatus($header_icon, $header_color, $header_name)95->setPolicyObject($paste)96->setHeaderIcon('fa-clipboard');9798return $header;99}100101private function buildCurtain(PhabricatorPaste $paste) {102$viewer = $this->getViewer();103$curtain = $this->newCurtainView($paste);104105$can_edit = PhabricatorPolicyFilter::hasCapability(106$viewer,107$paste,108PhabricatorPolicyCapability::CAN_EDIT);109110$id = $paste->getID();111$edit_uri = $this->getApplicationURI("edit/{$id}/");112$archive_uri = $this->getApplicationURI("archive/{$id}/");113$raw_uri = $this->getApplicationURI("raw/{$id}/");114115$curtain->addAction(116id(new PhabricatorActionView())117->setName(pht('Edit Paste'))118->setIcon('fa-pencil')119->setDisabled(!$can_edit)120->setHref($edit_uri));121122if ($paste->isArchived()) {123$curtain->addAction(124id(new PhabricatorActionView())125->setName(pht('Activate Paste'))126->setIcon('fa-check')127->setDisabled(!$can_edit)128->setWorkflow($can_edit)129->setHref($archive_uri));130} else {131$curtain->addAction(132id(new PhabricatorActionView())133->setName(pht('Archive Paste'))134->setIcon('fa-ban')135->setDisabled(!$can_edit)136->setWorkflow($can_edit)137->setHref($archive_uri));138}139140$curtain->addAction(141id(new PhabricatorActionView())142->setName(pht('View Raw File'))143->setIcon('fa-file-text-o')144->setHref($raw_uri));145146return $curtain;147}148149150private function buildSubheaderView(151PhabricatorPaste $paste) {152$viewer = $this->getViewer();153154$author = $viewer->renderHandle($paste->getAuthorPHID())->render();155$date = phabricator_datetime($paste->getDateCreated(), $viewer);156$author = phutil_tag('strong', array(), $author);157158$author_info = id(new PhabricatorPeopleQuery())159->setViewer($viewer)160->withPHIDs(array($paste->getAuthorPHID()))161->needProfileImage(true)162->executeOne();163164$image_uri = $author_info->getProfileImageURI();165$image_href = '/p/'.$author_info->getUsername();166167$content = pht('Authored by %s on %s.', $author, $date);168169return id(new PHUIHeadThingView())170->setImage($image_uri)171->setImageHref($image_href)172->setContent($content);173}174175private function newDocumentRecommendationView(PhabricatorPaste $paste) {176$viewer = $this->getViewer();177178// See PHI1703. If a viewer is looking at a document in Paste which has179// a good rendering via a DocumentEngine, suggest they view the content180// in Files instead so they can see it rendered.181182$ref = id(new PhabricatorDocumentRef())183->setName($paste->getTitle())184->setData($paste->getRawContent());185186$engines = PhabricatorDocumentEngine::getEnginesForRef($viewer, $ref);187if (!$engines) {188return null;189}190191$engine = head($engines);192if (!$engine->shouldSuggestEngine($ref)) {193return null;194}195196$file = id(new PhabricatorFileQuery())197->setViewer($viewer)198->withPHIDs(array($paste->getFilePHID()))199->executeOne();200if (!$file) {201return null;202}203204$file_ref = id(new PhabricatorDocumentRef())205->setFile($file);206207$view_uri = id(new PhabricatorFileDocumentRenderingEngine())208->getRefViewURI($file_ref, $engine);209210$view_as_label = $engine->getViewAsLabel($file_ref);211212$view_as_hint = pht(213'This content can be rendered as a document in Files.');214215return id(new PHUIInfoView())216->setSeverity(PHUIInfoView::SEVERITY_NOTICE)217->addButton(218id(new PHUIButtonView())219->setTag('a')220->setText($view_as_label)221->setHref($view_uri)222->setColor('grey'))223->setErrors(224array(225$view_as_hint,226));227}228229}230231232