@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 203 lines 5.8 kB view raw
1<?php 2 3final class PhabricatorMacroViewController 4 extends PhabricatorMacroController { 5 6 public function shouldAllowPublic() { 7 return true; 8 } 9 10 public function handleRequest(AphrontRequest $request) { 11 $viewer = $request->getViewer(); 12 $id = $request->getURIData('id'); 13 14 $macro = id(new PhabricatorMacroQuery()) 15 ->setViewer($viewer) 16 ->withIDs(array($id)) 17 ->needFiles(true) 18 ->executeOne(); 19 if (!$macro) { 20 return new Aphront404Response(); 21 } 22 23 $title_short = pht('Macro "%s"', $macro->getName()); 24 $title_long = pht('Image Macro "%s"', $macro->getName()); 25 26 $curtain = $this->buildCurtain($macro); 27 $subheader = $this->buildSubheaderView($macro); 28 $file = $this->buildFileView($macro); 29 $details = $this->buildPropertySectionView($macro); 30 31 $crumbs = $this->buildApplicationCrumbs(); 32 $crumbs->addTextCrumb($macro->getName()); 33 $crumbs->setBorder(true); 34 35 $timeline = $this->buildTransactionTimeline( 36 $macro, 37 new PhabricatorMacroTransactionQuery()); 38 39 $comment_form = $this->buildCommentForm($macro, $timeline); 40 41 $header = id(new PHUIHeaderView()) 42 ->setUser($viewer) 43 ->setPolicyObject($macro) 44 ->setHeader($macro->getName()) 45 ->setHeaderIcon('fa-file-image-o'); 46 47 if (!$macro->getIsDisabled()) { 48 $header->setStatus('fa-check', 'bluegrey', pht('Active')); 49 } else { 50 $header->setStatus('fa-ban', 'indigo', pht('Archived')); 51 } 52 53 $view = id(new PHUITwoColumnView()) 54 ->setHeader($header) 55 ->setSubheader($subheader) 56 ->setCurtain($curtain) 57 ->setMainColumn(array( 58 $timeline, 59 $comment_form, 60 )) 61 ->addPropertySection(pht('Macro'), $file) 62 ->addPropertySection(pht('Details'), $details); 63 64 return $this->newPage() 65 ->setTitle($title_short) 66 ->setCrumbs($crumbs) 67 ->setPageObjectPHIDs(array($macro->getPHID())) 68 ->appendChild($view); 69 } 70 71 private function buildCommentForm( 72 PhabricatorFileImageMacro $macro, $timeline) { 73 $viewer = $this->getViewer(); 74 75 return id(new PhabricatorMacroEditEngine()) 76 ->setViewer($viewer) 77 ->buildEditEngineCommentView($macro) 78 ->setTransactionTimeline($timeline); 79 } 80 81 private function buildCurtain( 82 PhabricatorFileImageMacro $macro) { 83 $can_manage = $this->hasApplicationCapability( 84 PhabricatorMacroManageCapability::CAPABILITY); 85 86 $curtain = $this->newCurtainView($macro); 87 88 $curtain->addAction( 89 id(new PhabricatorActionView()) 90 ->setName(pht('Edit Macro')) 91 ->setHref($this->getApplicationURI('/edit/'.$macro->getID().'/')) 92 ->setDisabled(!$can_manage) 93 ->setWorkflow(!$can_manage) 94 ->setIcon('fa-pencil')); 95 96 $curtain->addAction( 97 id(new PhabricatorActionView()) 98 ->setName(pht('Edit Audio')) 99 ->setHref($this->getApplicationURI('/audio/'.$macro->getID().'/')) 100 ->setDisabled(!$can_manage) 101 ->setWorkflow(!$can_manage) 102 ->setIcon('fa-music')); 103 104 if ($macro->getIsDisabled()) { 105 $curtain->addAction( 106 id(new PhabricatorActionView()) 107 ->setName(pht('Activate Macro')) 108 ->setHref($this->getApplicationURI('/disable/'.$macro->getID().'/')) 109 ->setWorkflow(true) 110 ->setDisabled(!$can_manage) 111 ->setIcon('fa-check')); 112 } else { 113 $curtain->addAction( 114 id(new PhabricatorActionView()) 115 ->setName(pht('Archive Macro')) 116 ->setHref($this->getApplicationURI('/disable/'.$macro->getID().'/')) 117 ->setWorkflow(true) 118 ->setDisabled(!$can_manage) 119 ->setIcon('fa-ban')); 120 } 121 122 return $curtain; 123 } 124 125 private function buildSubheaderView( 126 PhabricatorFileImageMacro $macro) { 127 $viewer = $this->getViewer(); 128 129 $author_phid = $macro->getAuthorPHID(); 130 131 $author = $viewer->renderHandle($author_phid)->render(); 132 $date = phabricator_datetime($macro->getDateCreated(), $viewer); 133 $author = phutil_tag('strong', array(), $author); 134 135 $handles = $viewer->loadHandles(array($author_phid)); 136 $image_uri = $handles[$author_phid]->getImageURI(); 137 $image_href = $handles[$author_phid]->getURI(); 138 139 if (!$date) { 140 $content = pht( 141 'Masterfully imagined by %s in ages long past.', $author); 142 } else { 143 $content = pht('Masterfully imagined by %s on %s.', $author, $date); 144 } 145 146 return id(new PHUIHeadThingView()) 147 ->setImage($image_uri) 148 ->setImageHref($image_href) 149 ->setContent($content); 150 } 151 152 private function buildPropertySectionView( 153 PhabricatorFileImageMacro $macro) { 154 $viewer = $this->getViewer(); 155 156 $view = id(new PHUIPropertyListView()) 157 ->setUser($viewer); 158 159 switch ($macro->getAudioBehavior()) { 160 case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_ONCE: 161 $view->addProperty(pht('Audio Behavior'), pht('Play Once')); 162 break; 163 case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_LOOP: 164 $view->addProperty(pht('Audio Behavior'), pht('Loop')); 165 break; 166 } 167 168 $audio_phid = $macro->getAudioPHID(); 169 if ($audio_phid) { 170 $view->addProperty( 171 pht('Audio'), 172 $viewer->renderHandle($audio_phid)); 173 } 174 175 if ($view->hasAnyProperties()) { 176 return $view; 177 } 178 179 return null; 180 } 181 182 private function buildFileView( 183 PhabricatorFileImageMacro $macro) { 184 $viewer = $this->getViewer(); 185 186 $view = id(new PHUIPropertyListView()) 187 ->setUser($viewer); 188 189 $file = $macro->getFile(); 190 if ($file) { 191 $view->addImageContent( 192 phutil_tag( 193 'img', 194 array( 195 'src' => $file->getViewURI(), 196 'class' => 'phabricator-image-macro-hero', 197 ))); 198 return $view; 199 } 200 return null; 201 } 202 203}