@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
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Make minor improvements to Drydock web interface

Summary: Consolidate some code and start on lease detail pages.

Test Plan: {F22783}

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T2015

Differential Revision: https://secure.phabricator.com/D3901

+186 -36
+2
src/__phutil_library_map__.php
··· 424 424 'DrydockLease' => 'applications/drydock/storage/DrydockLease.php', 425 425 'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php', 426 426 'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php', 427 + 'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php', 427 428 'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/DrydockLocalCommandInterface.php', 428 429 'DrydockLocalHostBlueprint' => 'applications/drydock/blueprint/DrydockLocalHostBlueprint.php', 429 430 'DrydockLog' => 'applications/drydock/storage/DrydockLog.php', ··· 1657 1658 'DrydockLease' => 'DrydockDAO', 1658 1659 'DrydockLeaseListController' => 'DrydockController', 1659 1660 'DrydockLeaseStatus' => 'DrydockConstants', 1661 + 'DrydockLeaseViewController' => 'DrydockController', 1660 1662 'DrydockLocalCommandInterface' => 'DrydockCommandInterface', 1661 1663 'DrydockLocalHostBlueprint' => 'DrydockBlueprint', 1662 1664 'DrydockLog' => 'DrydockDAO',
+4 -1
src/applications/drydock/application/PhabricatorApplicationDrydock.php
··· 32 32 '' => 'DrydockResourceListController', 33 33 'resource/' => 'DrydockResourceListController', 34 34 'resource/allocate/' => 'DrydockResourceAllocateController', 35 - 'lease/' => 'DrydockLeaseListController', 35 + 'lease/' => array( 36 + '' => 'DrydockLeaseListController', 37 + '(?P<id>[1-9]\d*)/' => 'DrydockLeaseViewController', 38 + ), 36 39 'log/' => 'DrydockLogController', 37 40 ), 38 41 );
+40
src/applications/drydock/controller/DrydockController.php
··· 30 30 return $nav; 31 31 } 32 32 33 + protected function buildLogTableView(array $logs) { 34 + assert_instances_of($logs, 'DrydockLog'); 35 + 36 + $user = $this->getRequest()->getUser(); 37 + 38 + // TODO: It's probably a stretch to claim this works on mobile. 39 + 40 + $rows = array(); 41 + foreach ($logs as $log) { 42 + $rows[] = array( 43 + $log->getResourceID(), 44 + $log->getLeaseID(), 45 + phutil_escape_html($log->getMessage()), 46 + phabricator_datetime($log->getEpoch(), $user), 47 + ); 48 + } 49 + 50 + $table = new AphrontTableView($rows); 51 + $table->setHeaders( 52 + array( 53 + 'Resource', 54 + 'Lease', 55 + 'Message', 56 + 'Date', 57 + )); 58 + $table->setColumnClasses( 59 + array( 60 + '', 61 + '', 62 + 'wide', 63 + '', 64 + )); 65 + 66 + $panel = new AphrontPanelView(); 67 + $panel->setHeader('Logs'); 68 + $panel->appendChild($table); 69 + 70 + return $panel; 71 + } 72 + 33 73 }
+14 -4
src/applications/drydock/controller/DrydockLeaseListController.php
··· 9 9 $nav = $this->buildSideNav('lease'); 10 10 11 11 $pager = new AphrontPagerView(); 12 - $pager->setURI(new PhutilURI('/drydock/lease/'), 'page'); 12 + $pager->setURI(new PhutilURI('/drydock/lease/'), 'offset'); 13 + $pager->setOffset($request->getInt('offset')); 13 14 14 15 $data = id(new DrydockLease())->loadAllWhere( 15 16 '1 = 1 ORDER BY id DESC LIMIT %d, %d', ··· 32 33 foreach ($data as $lease) { 33 34 $resource = idx($resources, $lease->getResourceID()); 34 35 $rows[] = array( 35 - $lease->getID(), 36 + phutil_render_tag( 37 + 'a', 38 + array( 39 + 'href' => $this->getApplicationURI('/lease/'.$lease->getID().'/'), 40 + ), 41 + $lease->getID()), 36 42 DrydockLeaseStatus::getNameForStatus($lease->getStatus()), 43 + phutil_escape_html($lease->getResourceType()), 37 44 ($lease->getOwnerPHID() 38 45 ? $handles[$lease->getOwnerPHID()]->renderLink() 39 46 : null), ··· 50 57 array( 51 58 'ID', 52 59 'Status', 60 + 'Resource Type', 61 + 'Resource ID', 53 62 'Owner', 54 - 'Resource ID', 55 63 'Resource', 56 64 'Created', 57 65 )); ··· 61 69 '', 62 70 '', 63 71 '', 72 + '', 64 73 'wide pri', 65 74 'right', 66 75 )); ··· 75 84 return $this->buildStandardPageResponse( 76 85 $nav, 77 86 array( 78 - 'title' => 'Leases', 87 + 'device' => true, 88 + 'title' => 'Leases', 79 89 )); 80 90 81 91 }
+123
src/applications/drydock/controller/DrydockLeaseViewController.php
··· 1 + <?php 2 + 3 + /* 4 + * Copyright 2012 Facebook, Inc. 5 + * 6 + * Licensed under the Apache License, Version 2.0 (the "License"); 7 + * you may not use this file except in compliance with the License. 8 + * You may obtain a copy of the License at 9 + * 10 + * http://www.apache.org/licenses/LICENSE-2.0 11 + * 12 + * Unless required by applicable law or agreed to in writing, software 13 + * distributed under the License is distributed on an "AS IS" BASIS, 14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + * See the License for the specific language governing permissions and 16 + * limitations under the License. 17 + */ 18 + 19 + final class DrydockLeaseViewController extends DrydockController { 20 + 21 + private $id; 22 + 23 + public function willProcessRequest(array $data) { 24 + $this->id = $data['id']; 25 + } 26 + 27 + public function processRequest() { 28 + $request = $this->getRequest(); 29 + $user = $request->getUser(); 30 + 31 + $nav = $this->buildSideNav('lease'); 32 + 33 + $lease = id(new DrydockLease())->load($this->id); 34 + if (!$lease) { 35 + return new Aphront404Response(); 36 + } 37 + 38 + $title = 'Lease '.$lease->getID(); 39 + 40 + $header = id(new PhabricatorHeaderView()) 41 + ->setHeader($title); 42 + 43 + $actions = $this->buildActionListView($lease); 44 + $properties = $this->buildPropertyListView($lease); 45 + 46 + $pager = new AphrontPagerView(); 47 + $pager->setURI( 48 + new PhutilURI($this->getApplicationURI('lease/'.$lease->getID().'/')), 49 + 'offset'); 50 + $pager->setOffset($request->getInt('offset')); 51 + 52 + $logs = id(new DrydockLogQuery()) 53 + ->withLeaseIDs(array($lease->getID())) 54 + ->executeWithOffsetPager($pager); 55 + 56 + $log_table = $this->buildLogTableView($logs); 57 + $log_table->appendChild($pager); 58 + 59 + $nav->appendChild( 60 + array( 61 + $header, 62 + $actions, 63 + $properties, 64 + $log_table, 65 + )); 66 + 67 + return $this->buildApplicationPage( 68 + $nav, 69 + array( 70 + 'device' => true, 71 + 'title' => $title, 72 + )); 73 + 74 + } 75 + 76 + private function buildActionListView(DrydockLease $lease) { 77 + $view = id(new PhabricatorActionListView()) 78 + ->setUser($this->getRequest()->getUser()) 79 + ->setObject($lease); 80 + 81 + return $view; 82 + } 83 + 84 + private function buildPropertyListView(DrydockLease $lease) { 85 + $view = new PhabricatorPropertyListView(); 86 + 87 + switch ($lease->getStatus()) { 88 + case DrydockLeaseStatus::STATUS_ACTIVE: 89 + $status = pht('Active'); 90 + break; 91 + case DrydockLeaseStatus::STATUS_RELEASED: 92 + $status = pht('Released'); 93 + break; 94 + case DrydockLeaseStatus::STATUS_EXPIRED: 95 + $status = pht('Expired'); 96 + break; 97 + case DrydockLeaseStatus::STATUS_PENDING: 98 + $status = pht('Pending'); 99 + break; 100 + case DrydockLeaseStatus::STATUS_BROKEN: 101 + $status = pht('Broken'); 102 + break; 103 + default: 104 + $status = pht('Unknown'); 105 + break; 106 + } 107 + 108 + $view->addProperty( 109 + pht('Status'), 110 + $status); 111 + 112 + $view->addProperty( 113 + pht('Resource Type'), 114 + phutil_escape_html($lease->getResourceType())); 115 + 116 + $view->addProperty( 117 + pht('Resource'), 118 + phutil_escape_html($lease->getResourceID())); 119 + 120 + return $view; 121 + } 122 + 123 + }
+3 -31
src/applications/drydock/controller/DrydockLogController.php
··· 27 27 28 28 $logs = $query->executeWithOffsetPager($pager); 29 29 30 - $rows = array(); 31 - foreach ($logs as $log) { 32 - $rows[] = array( 33 - $log->getResourceID(), 34 - $log->getLeaseID(), 35 - phutil_escape_html($log->getMessage()), 36 - phabricator_datetime($log->getEpoch(), $user), 37 - ); 38 - } 39 - 40 - $table = new AphrontTableView($rows); 41 - $table->setHeaders( 42 - array( 43 - 'Resource', 44 - 'Lease', 45 - 'Message', 46 - 'Date', 47 - )); 48 - $table->setColumnClasses( 49 - array( 50 - '', 51 - '', 52 - 'wide', 53 - '', 54 - )); 30 + $table = $this->buildLogTableView($logs); 31 + $table->appendChild($pager); 55 32 56 - $panel = new AphrontPanelView(); 57 - $panel->setHeader('Drydock Logs'); 58 - $panel->appendChild($table); 59 - $panel->appendChild($pager); 60 - 61 - $nav->appendChild($panel); 33 + $nav->appendChild($table); 62 34 63 35 return $this->buildStandardPageResponse( 64 36 $nav,