@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 recaptime-dev/main 170 lines 5.1 kB view raw
1<?php 2 3final class PhabricatorAuthMessageViewController 4 extends PhabricatorAuthMessageController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $this->getViewer(); 8 9 $this->requireApplicationCapability( 10 AuthManageProvidersCapability::CAPABILITY); 11 12 // The "id" in the URI may either be an actual storage record ID (if a 13 // message has already been created) or a message type key (for a message 14 // type which does not have a record yet). 15 16 // This flow allows messages which have not been set yet to have a detail 17 // page (so users can get detailed information about the message and see 18 // any default value). 19 20 $id = $request->getURIData('id'); 21 if (ctype_digit($id)) { 22 $message = id(new PhabricatorAuthMessageQuery()) 23 ->setViewer($viewer) 24 ->withIDs(array($id)) 25 ->executeOne(); 26 if (!$message) { 27 return new Aphront404Response(); 28 } 29 } else { 30 $types = PhabricatorAuthMessageType::getAllMessageTypes(); 31 if (!isset($types[$id])) { 32 return new Aphront404Response(); 33 } 34 35 // If this message type already has a storage record, redirect to the 36 // canonical page for the record. 37 $message = id(new PhabricatorAuthMessageQuery()) 38 ->setViewer($viewer) 39 ->withMessageKeys(array($id)) 40 ->executeOne(); 41 if ($message) { 42 $message_uri = $message->getURI(); 43 return id(new AphrontRedirectResponse())->setURI($message_uri); 44 } 45 46 // Otherwise, create an empty placeholder message object with the 47 // appropriate message type. 48 $message = PhabricatorAuthMessage::initializeNewMessage($types[$id]); 49 } 50 51 $crumbs = $this->buildApplicationCrumbs() 52 ->addTextCrumb($message->getMessageType()->getDisplayName()) 53 ->setBorder(true); 54 55 $header = $this->buildHeaderView($message); 56 $properties = $this->buildPropertiesView($message); 57 $curtain = $this->buildCurtain($message); 58 59 if ($message->getID()) { 60 $timeline = $this->buildTransactionTimeline( 61 $message, 62 new PhabricatorAuthMessageTransactionQuery()); 63 $timeline->setShouldTerminate(true); 64 } else { 65 $timeline = null; 66 } 67 68 $view = id(new PHUITwoColumnView()) 69 ->setHeader($header) 70 ->setCurtain($curtain) 71 ->setMainColumn( 72 array( 73 $timeline, 74 )) 75 ->addPropertySection(pht('Details'), $properties); 76 77 return $this->newPage() 78 ->setTitle($message->getMessageTypeDisplayName()) 79 ->setCrumbs($crumbs) 80 ->setPageObjectPHIDs( 81 array( 82 $message->getPHID(), 83 )) 84 ->appendChild($view); 85 } 86 87 private function buildHeaderView(PhabricatorAuthMessage $message) { 88 $viewer = $this->getViewer(); 89 90 $view = id(new PHUIHeaderView()) 91 ->setViewer($viewer) 92 ->setHeader($message->getMessageTypeDisplayName()); 93 94 return $view; 95 } 96 97 private function buildPropertiesView(PhabricatorAuthMessage $message) { 98 $viewer = $this->getViewer(); 99 100 $message_type = $message->getMessageType(); 101 102 $view = id(new PHUIPropertyListView()) 103 ->setViewer($viewer); 104 105 $full_description = $message_type->getFullDescription(); 106 if (phutil_nonempty_string($full_description)) { 107 $view->addTextContent(new PHUIRemarkupView($viewer, $full_description)); 108 } else { 109 $short_description = $message_type->getShortDescription(); 110 $view->addProperty(pht('Description'), $short_description); 111 } 112 113 $message_text = $message->getMessageText(); 114 if (phutil_nonempty_string($message_text)) { 115 $view->addSectionHeader( 116 pht('Message Preview'), 117 PHUIPropertyListView::ICON_SUMMARY); 118 119 $view->addTextContent(new PHUIRemarkupView($viewer, $message_text)); 120 } 121 122 $default_text = $message_type->getDefaultMessageText(); 123 if (phutil_nonempty_string($default_text)) { 124 $view->addSectionHeader( 125 pht('Default Message'), 126 PHUIPropertyListView::ICON_SUMMARY); 127 128 $view->addTextContent(new PHUIRemarkupView($viewer, $default_text)); 129 } 130 131 return $view; 132 } 133 134 private function buildCurtain(PhabricatorAuthMessage $message) { 135 $viewer = $this->getViewer(); 136 $id = $message->getID(); 137 138 $can_edit = PhabricatorPolicyFilter::hasCapability( 139 $viewer, 140 $message, 141 PhabricatorPolicyCapability::CAN_EDIT); 142 143 if ($id) { 144 $edit_uri = urisprintf('message/edit/%s/', $id); 145 $edit_name = pht('Edit Message'); 146 } else { 147 $edit_uri = urisprintf('message/edit/'); 148 $params = array( 149 'messageKey' => $message->getMessageKey(), 150 ); 151 $edit_uri = new PhutilURI($edit_uri, $params); 152 153 $edit_name = pht('Customize Message'); 154 } 155 $edit_uri = $this->getApplicationURI($edit_uri); 156 157 $curtain = $this->newCurtainView($message); 158 159 $curtain->addAction( 160 id(new PhabricatorActionView()) 161 ->setName($edit_name) 162 ->setIcon('fa-pencil') 163 ->setHref($edit_uri) 164 ->setDisabled(!$can_edit) 165 ->setWorkflow(!$can_edit)); 166 167 return $curtain; 168 } 169 170}