@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.

Convert Differential to new layout

Summary:
First pass at converting Differential, I likely have some buggy-poos but thought I'd toss this up now in case very bad bugs present.

To do:
- Need to put status back on Hovercards
- "Diff Detail" probably needs a better design

Test Plan: Looking at lots of diffs, admittedly I dont have harbormaster, etc, running locally. Checked Diffusion for Table of Content changes on small and large commits.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

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

+361 -377
+15 -15
resources/celerity/map.php
··· 7 7 */ 8 8 return array( 9 9 'names' => array( 10 - 'core.pkg.css' => '9c8e888d', 10 + 'core.pkg.css' => 'c6ad5231', 11 11 'core.pkg.js' => '7d8faf57', 12 12 'darkconsole.pkg.js' => 'e7393ebb', 13 - 'differential.pkg.css' => '7d0a63a7', 13 + 'differential.pkg.css' => '7ba78475', 14 14 'differential.pkg.js' => 'd0cd0df6', 15 15 'diffusion.pkg.css' => 'f45955ed', 16 16 'diffusion.pkg.js' => '3a9a8bfa', ··· 57 57 'rsrc/css/application/dashboard/dashboard.css' => 'eb458607', 58 58 'rsrc/css/application/diff/inline-comment-summary.css' => '51efda3a', 59 59 'rsrc/css/application/differential/add-comment.css' => 'c47f8c40', 60 - 'rsrc/css/application/differential/changeset-view.css' => 'b6b0d1bb', 61 - 'rsrc/css/application/differential/core.css' => '7ac3cabc', 60 + 'rsrc/css/application/differential/changeset-view.css' => '3e3b0b76', 61 + 'rsrc/css/application/differential/core.css' => '5b7b8ff4', 62 62 'rsrc/css/application/differential/phui-inline-comment.css' => '5953c28e', 63 63 'rsrc/css/application/differential/revision-comment.css' => '14b8565a', 64 64 'rsrc/css/application/differential/revision-history.css' => '0e8eb855', ··· 123 123 'rsrc/css/phui/phui-action-panel.css' => '91c7b835', 124 124 'rsrc/css/phui/phui-badge.css' => 'f25c3476', 125 125 'rsrc/css/phui/phui-big-info-view.css' => 'bd903741', 126 - 'rsrc/css/phui/phui-box.css' => '3830ab21', 126 + 'rsrc/css/phui/phui-box.css' => '06153ae3', 127 127 'rsrc/css/phui/phui-button.css' => 'a64a8de6', 128 128 'rsrc/css/phui/phui-chart.css' => '6bf6f78e', 129 129 'rsrc/css/phui/phui-crumbs-view.css' => '79d536e5', ··· 144 144 'rsrc/css/phui/phui-info-panel.css' => '27ea50a1', 145 145 'rsrc/css/phui/phui-info-view.css' => '6d7c3509', 146 146 'rsrc/css/phui/phui-list.css' => '9da2aa00', 147 - 'rsrc/css/phui/phui-object-box.css' => '91628842', 147 + 'rsrc/css/phui/phui-object-box.css' => '6b487c57', 148 148 'rsrc/css/phui/phui-object-item-list-view.css' => '18b2ce8e', 149 149 'rsrc/css/phui/phui-pager.css' => 'bea33d23', 150 150 'rsrc/css/phui/phui-pinboard-view.css' => '2495140e', ··· 156 156 'rsrc/css/phui/phui-status.css' => '37309046', 157 157 'rsrc/css/phui/phui-tag-view.css' => '6bbd83e2', 158 158 'rsrc/css/phui/phui-timeline-view.css' => 'a0173eba', 159 - 'rsrc/css/phui/phui-two-column-view.css' => 'e6bf86b6', 159 + 'rsrc/css/phui/phui-two-column-view.css' => '61dd6d38', 160 160 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'ac6fe6a7', 161 161 'rsrc/css/phui/workboards/phui-workboard.css' => 'e6d89647', 162 162 'rsrc/css/phui/workboards/phui-workcard.css' => '3646fb96', ··· 545 545 'conpherence-update-css' => 'faf6be09', 546 546 'conpherence-widget-pane-css' => '775eaaba', 547 547 'd3' => 'a11a5ff2', 548 - 'differential-changeset-view-css' => 'b6b0d1bb', 549 - 'differential-core-view-css' => '7ac3cabc', 548 + 'differential-changeset-view-css' => '3e3b0b76', 549 + 'differential-core-view-css' => '5b7b8ff4', 550 550 'differential-inline-comment-editor' => '64a5550f', 551 551 'differential-revision-add-comment-css' => 'c47f8c40', 552 552 'differential-revision-comment-css' => '14b8565a', ··· 805 805 'phui-action-panel-css' => '91c7b835', 806 806 'phui-badge-view-css' => 'f25c3476', 807 807 'phui-big-info-view-css' => 'bd903741', 808 - 'phui-box-css' => '3830ab21', 808 + 'phui-box-css' => '06153ae3', 809 809 'phui-button-css' => 'a64a8de6', 810 810 'phui-calendar-css' => 'ccabe893', 811 811 'phui-calendar-day-css' => 'd1cf6f93', ··· 833 833 'phui-info-view-css' => '6d7c3509', 834 834 'phui-inline-comment-view-css' => '5953c28e', 835 835 'phui-list-view-css' => '9da2aa00', 836 - 'phui-object-box-css' => '91628842', 836 + 'phui-object-box-css' => '6b487c57', 837 837 'phui-object-item-list-view-css' => '18b2ce8e', 838 838 'phui-pager-css' => 'bea33d23', 839 839 'phui-pinboard-view-css' => '2495140e', ··· 846 846 'phui-tag-view-css' => '6bbd83e2', 847 847 'phui-theme-css' => '027ba77e', 848 848 'phui-timeline-view-css' => 'a0173eba', 849 - 'phui-two-column-view-css' => 'e6bf86b6', 849 + 'phui-two-column-view-css' => '61dd6d38', 850 850 'phui-workboard-color-css' => 'ac6fe6a7', 851 851 'phui-workboard-view-css' => 'e6d89647', 852 852 'phui-workcard-view-css' => '3646fb96', ··· 1123 1123 'javelin-workflow', 1124 1124 'javelin-util', 1125 1125 'javelin-uri', 1126 + ), 1127 + '3e3b0b76' => array( 1128 + 'phui-inline-comment-view-css', 1126 1129 ), 1127 1130 '3f5d6dbf' => array( 1128 1131 'javelin-behavior', ··· 1790 1793 'javelin-dom', 1791 1794 'javelin-json', 1792 1795 'phabricator-draggable-list', 1793 - ), 1794 - 'b6b0d1bb' => array( 1795 - 'phui-inline-comment-view-css', 1796 1796 ), 1797 1797 'bae58312' => array( 1798 1798 'javelin-install',
-4
src/__phutil_library_map__.php
··· 473 473 'DifferentialParseCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialParseCommitMessageConduitAPIMethod.php', 474 474 'DifferentialParseRenderTestCase' => 'applications/differential/__tests__/DifferentialParseRenderTestCase.php', 475 475 'DifferentialPathField' => 'applications/differential/customfield/DifferentialPathField.php', 476 - 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', 477 476 'DifferentialProjectReviewersField' => 'applications/differential/customfield/DifferentialProjectReviewersField.php', 478 477 'DifferentialProjectsField' => 'applications/differential/customfield/DifferentialProjectsField.php', 479 478 'DifferentialQueryConduitAPIMethod' => 'applications/differential/conduit/DifferentialQueryConduitAPIMethod.php', ··· 508 507 'DifferentialRevisionControlSystem' => 'applications/differential/constants/DifferentialRevisionControlSystem.php', 509 508 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependedOnByRevisionEdgeType.php', 510 509 'DifferentialRevisionDependsOnRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependsOnRevisionEdgeType.php', 511 - 'DifferentialRevisionDetailView' => 'applications/differential/view/DifferentialRevisionDetailView.php', 512 510 'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php', 513 511 'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php', 514 512 'DifferentialRevisionHasCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionHasCommitEdgeType.php', ··· 4580 4578 'DifferentialParseCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod', 4581 4579 'DifferentialParseRenderTestCase' => 'PhabricatorTestCase', 4582 4580 'DifferentialPathField' => 'DifferentialCustomField', 4583 - 'DifferentialPrimaryPaneView' => 'AphrontView', 4584 4581 'DifferentialProjectReviewersField' => 'DifferentialCustomField', 4585 4582 'DifferentialProjectsField' => 'DifferentialCoreCustomField', 4586 4583 'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod', ··· 4630 4627 'DifferentialRevisionControlSystem' => 'Phobject', 4631 4628 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'PhabricatorEdgeType', 4632 4629 'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType', 4633 - 'DifferentialRevisionDetailView' => 'AphrontView', 4634 4630 'DifferentialRevisionEditController' => 'DifferentialController', 4635 4631 'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine', 4636 4632 'DifferentialRevisionHasCommitEdgeType' => 'PhabricatorEdgeType',
+2 -1
src/applications/differential/controller/DifferentialController.php
··· 28 28 $viewer = $this->getViewer(); 29 29 30 30 $toc_view = id(new PHUIDiffTableOfContentsListView()) 31 - ->setUser($viewer); 31 + ->setUser($viewer) 32 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); 32 33 33 34 $have_owners = PhabricatorApplication::isClassInstalledForViewer( 34 35 'PhabricatorOwnersApplication',
+233 -179
src/applications/differential/controller/DifferentialRevisionViewController.php
··· 40 40 $revision->attachActiveDiff(last($diffs)); 41 41 42 42 $diff_vs = $request->getInt('vs'); 43 - 44 43 $target_id = $request->getInt('id'); 45 44 $target = idx($diffs, $target_id, end($diffs)); 46 45 ··· 210 209 $commits_for_links = array(); 211 210 } 212 211 213 - $revision_detail = id(new DifferentialRevisionDetailView()) 214 - ->setUser($viewer) 215 - ->setRevision($revision) 216 - ->setDiff(end($diffs)) 217 - ->setCustomFields($field_list) 218 - ->setURI($request->getRequestURI()); 219 - 220 - $actions = $this->getRevisionActions($revision); 212 + $header = $this->buildHeader($revision); 213 + $subheader = $this->buildSubheaderView($revision); 214 + $details = $this->buildDetails($revision, $field_list); 215 + $curtain = $this->buildCurtain($revision); 221 216 222 217 $whitespace = $request->getStr( 223 218 'whitespace', ··· 232 227 $symbol_indexes = array(); 233 228 } 234 229 235 - $revision_detail->setActions($actions); 236 - $revision_detail->setUser($viewer); 237 - 238 - $revision_detail_box = $revision_detail->render(); 239 - 240 230 $revision_warnings = $this->buildRevisionWarnings( 241 231 $revision, 242 232 $field_list, 243 233 $warning_handle_map, 244 234 $handles); 235 + $info_view = null; 245 236 if ($revision_warnings) { 246 - $revision_warnings = id(new PHUIInfoView()) 237 + $info_view = id(new PHUIInfoView()) 247 238 ->setSeverity(PHUIInfoView::SEVERITY_WARNING) 248 239 ->setErrors($revision_warnings); 249 - $revision_detail_box->setInfoView($revision_warnings); 250 240 } 251 241 252 242 $detail_diffs = array_select_keys( ··· 277 267 $comment_view->setQuoteTargetID('comment-content'); 278 268 } 279 269 280 - $wrap_id = celerity_generate_unique_node_id(); 281 - $comment_view = phutil_tag( 282 - 'div', 283 - array( 284 - 'id' => $wrap_id, 285 - ), 286 - $comment_view); 270 + $changeset_view = id(new DifferentialChangesetListView()) 271 + ->setChangesets($changesets) 272 + ->setVisibleChangesets($visible_changesets) 273 + ->setStandaloneURI('/differential/changeset/') 274 + ->setRawFileURIs( 275 + '/differential/changeset/?view=old', 276 + '/differential/changeset/?view=new') 277 + ->setUser($viewer) 278 + ->setDiff($target) 279 + ->setRenderingReferences($rendering_references) 280 + ->setVsMap($vs_map) 281 + ->setWhitespace($whitespace) 282 + ->setSymbolIndexes($symbol_indexes) 283 + ->setTitle(pht('Diff %s', $target->getID())) 284 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); 287 285 288 - $changeset_view = new DifferentialChangesetListView(); 289 - $changeset_view->setChangesets($changesets); 290 - $changeset_view->setVisibleChangesets($visible_changesets); 286 + if ($repository) { 287 + $changeset_view->setRepository($repository); 288 + } 291 289 292 290 if (!$viewer_is_anonymous) { 293 291 $changeset_view->setInlineCommentControllerURI( 294 292 '/differential/comment/inline/edit/'.$revision->getID().'/'); 295 293 } 296 294 297 - $changeset_view->setStandaloneURI('/differential/changeset/'); 298 - $changeset_view->setRawFileURIs( 299 - '/differential/changeset/?view=old', 300 - '/differential/changeset/?view=new'); 301 - 302 - $changeset_view->setUser($viewer); 303 - $changeset_view->setDiff($target); 304 - $changeset_view->setRenderingReferences($rendering_references); 305 - $changeset_view->setVsMap($vs_map); 306 - $changeset_view->setWhitespace($whitespace); 307 - if ($repository) { 308 - $changeset_view->setRepository($repository); 309 - } 310 - $changeset_view->setSymbolIndexes($symbol_indexes); 311 - $changeset_view->setTitle(pht('Diff %s', $target->getID())); 312 - 313 295 $diff_history = id(new DifferentialRevisionUpdateHistoryView()) 314 296 ->setUser($viewer) 315 297 ->setDiffs($diffs) ··· 344 326 345 327 $comment_form = null; 346 328 if (!$viewer_is_anonymous) { 347 - $draft = id(new PhabricatorDraft())->loadOneWhere( 348 - 'authorPHID = %s AND draftKey = %s', 349 - $viewer->getPHID(), 350 - 'differential-comment-'.$revision->getID()); 351 - 352 - $reviewers = array(); 353 - $ccs = array(); 354 - if ($draft) { 355 - $reviewers = idx($draft->getMetadata(), 'reviewers', array()); 356 - $ccs = idx($draft->getMetadata(), 'ccs', array()); 357 - if ($reviewers || $ccs) { 358 - $handles = $this->loadViewerHandles(array_merge($reviewers, $ccs)); 359 - $reviewers = array_select_keys($handles, $reviewers); 360 - $ccs = array_select_keys($handles, $ccs); 361 - } 362 - } 363 - 364 - $comment_form = new DifferentialAddCommentView(); 365 - $comment_form->setRevision($revision); 366 - 367 - $review_warnings = array(); 368 - foreach ($field_list->getFields() as $field) { 369 - $review_warnings[] = $field->getWarningsForDetailView(); 370 - } 371 - $review_warnings = array_mergev($review_warnings); 372 - 373 - if ($review_warnings) { 374 - $review_warnings_panel = id(new PHUIInfoView()) 375 - ->setSeverity(PHUIInfoView::SEVERITY_WARNING) 376 - ->setErrors($review_warnings); 377 - $comment_form->setInfoView($review_warnings_panel); 378 - } 379 - 380 - $comment_form->setActions($this->getRevisionCommentActions($revision)); 381 - $action_uri = $this->getApplicationURI( 382 - 'comment/save/'.$revision->getID().'/'); 383 - 384 - $comment_form->setActionURI($action_uri); 385 - $comment_form->setUser($viewer); 386 - $comment_form->setDraft($draft); 387 - $comment_form->setReviewers(mpull($reviewers, 'getFullName', 'getPHID')); 388 - $comment_form->setCCs(mpull($ccs, 'getFullName', 'getPHID')); 389 - 390 - // TODO: This just makes the "Z" key work. Generalize this and remove 391 - // it at some point. 392 - $comment_form = phutil_tag( 393 - 'div', 394 - array( 395 - 'class' => 'differential-add-comment-panel', 396 - ), 397 - $comment_form); 329 + $comment_form = $this->buildCommentForm($revision, $field_list); 398 330 } 399 331 400 - $pane_id = celerity_generate_unique_node_id(); 401 - Javelin::initBehavior( 402 - 'differential-keyboard-navigation', 403 - array( 404 - 'haunt' => $pane_id, 405 - )); 406 - Javelin::initBehavior('differential-user-select'); 407 - 408 - $page_pane = id(new DifferentialPrimaryPaneView()) 409 - ->setID($pane_id) 410 - ->appendChild($comment_view); 411 - 412 332 $signatures = DifferentialRequiredSignaturesField::loadForRevision( 413 333 $revision); 414 334 $missing_signatures = false; ··· 418 338 } 419 339 } 420 340 341 + $footer = array(); 342 + $signature_message = null; 421 343 if ($missing_signatures) { 422 344 $signature_message = id(new PHUIInfoView()) 423 - ->setErrors( 424 - array( 425 - array( 426 - phutil_tag('strong', array(), pht('Content Hidden:')), 427 - ' ', 428 - pht( 429 - 'The content of this revision is hidden until the author has '. 430 - 'signed all of the required legal agreements.'), 431 - ), 432 - )); 433 - $page_pane->appendChild($signature_message); 345 + ->setTitle(pht('Content Hidden')) 346 + ->appendChild( 347 + pht( 348 + 'The content of this revision is hidden until the author has '. 349 + 'signed all of the required legal agreements.')); 434 350 } else { 435 - $page_pane->appendChild( 351 + $footer[] = 436 352 array( 437 353 $diff_history, 438 354 $warning, ··· 440 356 $toc_view, 441 357 $other_view, 442 358 $changeset_view, 443 - )); 359 + ); 444 360 } 445 361 446 362 if ($comment_form) { 447 - $page_pane->appendChild($comment_form); 363 + $footer[] = $comment_form; 448 364 } else { 449 365 // TODO: For now, just use this to get "Login to Comment". 450 - $page_pane->appendChild( 451 - id(new PhabricatorApplicationTransactionCommentView()) 452 - ->setUser($viewer) 453 - ->setRequestURI($request->getRequestURI())); 366 + $footer[] = id(new PhabricatorApplicationTransactionCommentView()) 367 + ->setUser($viewer) 368 + ->setRequestURI($request->getRequestURI()); 454 369 } 455 370 456 371 $object_id = 'D'.$revision->getID(); 457 - 458 372 $operations_box = $this->buildOperationsBox($revision); 459 373 460 - $content = array( 461 - $operations_box, 462 - $revision_detail_box, 463 - $diff_detail_box, 464 - $unit_box, 465 - $page_pane, 466 - ); 467 - 468 374 $crumbs = $this->buildApplicationCrumbs(); 469 375 $crumbs->addTextCrumb($object_id, '/'.$object_id); 376 + $crumbs->setBorder(true); 470 377 471 378 $prefs = $viewer->loadPreferences(); 472 - 473 379 $pref_filetree = PhabricatorUserPreferences::PREFERENCE_DIFF_FILETREE; 380 + $nav = null; 474 381 if ($prefs->getPreference($pref_filetree)) { 475 382 $collapsed = $prefs->getPreference( 476 383 PhabricatorUserPreferences::PREFERENCE_NAV_COLLAPSED, ··· 481 388 ->setBaseURI(new PhutilURI('/D'.$revision->getID())) 482 389 ->setCollapsed((bool)$collapsed) 483 390 ->build($changesets); 484 - } else { 485 - $nav = null; 486 391 } 487 392 488 - $page = $this->newPage() 393 + // Haunt Mode 394 + $pane_id = celerity_generate_unique_node_id(); 395 + Javelin::initBehavior( 396 + 'differential-keyboard-navigation', 397 + array( 398 + 'haunt' => $pane_id, 399 + )); 400 + Javelin::initBehavior('differential-user-select'); 401 + 402 + $view = id(new PHUITwoColumnView()) 403 + ->setHeader($header) 404 + ->setSubheader($subheader) 405 + ->setCurtain($curtain) 406 + ->setID($pane_id) 407 + ->setMainColumn(array( 408 + $operations_box, 409 + $info_view, 410 + $details, 411 + $diff_detail_box, 412 + $unit_box, 413 + $comment_view, 414 + $signature_message, 415 + )) 416 + ->setFooter($footer); 417 + 418 + $page = $this->newPage() 489 419 ->setTitle($object_id.' '.$revision->getTitle()) 490 420 ->setCrumbs($crumbs) 491 421 ->setPageObjectPHIDs(array($revision->getPHID())) 492 - ->appendChild($content); 422 + ->appendChild($view); 493 423 494 424 if ($nav) { 495 425 $page->setNavigation($nav); ··· 498 428 return $page; 499 429 } 500 430 501 - private function getRevisionActions(DifferentialRevision $revision) { 502 - $viewer = $this->getRequest()->getUser(); 431 + private function buildHeader(DifferentialRevision $revision) { 432 + $view = id(new PHUIHeaderView()) 433 + ->setHeader($revision->getTitle($revision)) 434 + ->setUser($this->getViewer()) 435 + ->setPolicyObject($revision) 436 + ->setHeaderIcon('fa-cog'); 437 + 438 + $status = $revision->getStatus(); 439 + $status_name = 440 + DifferentialRevisionStatus::renderFullDescription($status); 441 + 442 + $view->addProperty(PHUIHeaderView::PROPERTY_STATUS, $status_name); 443 + 444 + return $view; 445 + } 446 + 447 + private function buildSubheaderView(DifferentialRevision $revision) { 448 + $viewer = $this->getViewer(); 449 + 450 + $author_phid = $revision->getAuthorPHID(); 451 + 452 + $author = $viewer->renderHandle($author_phid)->render(); 453 + $date = phabricator_datetime($revision->getDateCreated(), $viewer); 454 + $author = phutil_tag('strong', array(), $author); 455 + 456 + $handles = $viewer->loadHandles(array($author_phid)); 457 + $image_uri = $handles[$author_phid]->getImageURI(); 458 + $image_href = $handles[$author_phid]->getURI(); 459 + 460 + $content = pht('Authored by %s on %s.', $author, $date); 461 + 462 + return id(new PHUIHeadThingView()) 463 + ->setImage($image_uri) 464 + ->setImageHref($image_href) 465 + ->setContent($content); 466 + } 467 + 468 + private function buildDetails( 469 + DifferentialRevision $revision, 470 + $custom_fields) { 471 + $viewer = $this->getViewer(); 472 + $properties = id(new PHUIPropertyListView()) 473 + ->setUser($viewer); 474 + 475 + if ($custom_fields) { 476 + $custom_fields->appendFieldsToPropertyList( 477 + $revision, 478 + $viewer, 479 + $properties); 480 + } 481 + 482 + $header = id(new PHUIHeaderView()) 483 + ->setHeader(pht('DETAILS')); 484 + 485 + return id(new PHUIObjectBoxView()) 486 + ->setHeader($header) 487 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 488 + ->appendChild($properties); 489 + } 490 + 491 + private function buildCurtain(DifferentialRevision $revision) { 492 + $viewer = $this->getViewer(); 503 493 $revision_id = $revision->getID(); 504 494 $revision_phid = $revision->getPHID(); 495 + $curtain = $this->newCurtainView($revision); 505 496 506 497 $can_edit = PhabricatorPolicyFilter::hasCapability( 507 498 $viewer, 508 499 $revision, 509 500 PhabricatorPolicyCapability::CAN_EDIT); 510 501 511 - $actions = array(); 502 + $curtain->addAction( 503 + id(new PhabricatorActionView()) 504 + ->setIcon('fa-pencil') 505 + ->setHref("/differential/revision/edit/{$revision_id}/") 506 + ->setName(pht('Edit Revision')) 507 + ->setDisabled(!$can_edit) 508 + ->setWorkflow(!$can_edit)); 512 509 513 - $actions[] = id(new PhabricatorActionView()) 514 - ->setIcon('fa-pencil') 515 - ->setHref("/differential/revision/edit/{$revision_id}/") 516 - ->setName(pht('Edit Revision')) 517 - ->setDisabled(!$can_edit) 518 - ->setWorkflow(!$can_edit); 519 - 520 - $actions[] = id(new PhabricatorActionView()) 521 - ->setIcon('fa-upload') 522 - ->setHref("/differential/revision/update/{$revision_id}/") 523 - ->setName(pht('Update Diff')) 524 - ->setDisabled(!$can_edit) 525 - ->setWorkflow(!$can_edit); 510 + $curtain->addAction( 511 + id(new PhabricatorActionView()) 512 + ->setIcon('fa-upload') 513 + ->setHref("/differential/revision/update/{$revision_id}/") 514 + ->setName(pht('Update Diff')) 515 + ->setDisabled(!$can_edit) 516 + ->setWorkflow(!$can_edit)); 526 517 527 518 $this->requireResource('phabricator-object-selector-css'); 528 519 $this->requireResource('javelin-behavior-phabricator-object-selector'); 529 520 530 - $actions[] = id(new PhabricatorActionView()) 531 - ->setIcon('fa-link') 532 - ->setName(pht('Edit Dependencies')) 533 - ->setHref("/search/attach/{$revision_phid}/DREV/dependencies/") 534 - ->setWorkflow(true) 535 - ->setDisabled(!$can_edit); 521 + $curtain->addAction( 522 + id(new PhabricatorActionView()) 523 + ->setIcon('fa-link') 524 + ->setName(pht('Edit Dependencies')) 525 + ->setHref("/search/attach/{$revision_phid}/DREV/dependencies/") 526 + ->setWorkflow(true) 527 + ->setDisabled(!$can_edit)); 536 528 537 529 $maniphest = 'PhabricatorManiphestApplication'; 538 530 if (PhabricatorApplication::isClassInstalled($maniphest)) { 539 - $actions[] = id(new PhabricatorActionView()) 540 - ->setIcon('fa-anchor') 541 - ->setName(pht('Edit Maniphest Tasks')) 542 - ->setHref("/search/attach/{$revision_phid}/TASK/") 543 - ->setWorkflow(true) 544 - ->setDisabled(!$can_edit); 531 + $curtain->addAction( 532 + id(new PhabricatorActionView()) 533 + ->setIcon('fa-anchor') 534 + ->setName(pht('Edit Maniphest Tasks')) 535 + ->setHref("/search/attach/{$revision_phid}/TASK/") 536 + ->setWorkflow(true) 537 + ->setDisabled(!$can_edit)); 545 538 } 546 539 547 540 $request_uri = $this->getRequest()->getRequestURI(); 548 - $actions[] = id(new PhabricatorActionView()) 549 - ->setIcon('fa-download') 550 - ->setName(pht('Download Raw Diff')) 551 - ->setHref($request_uri->alter('download', 'true')); 541 + $curtain->addAction( 542 + id(new PhabricatorActionView()) 543 + ->setIcon('fa-download') 544 + ->setName(pht('Download Raw Diff')) 545 + ->setHref($request_uri->alter('download', 'true'))); 546 + 547 + return $curtain; 548 + } 549 + 550 + private function buildCommentForm( 551 + DifferentialRevision $revision, 552 + $field_list) { 553 + 554 + $viewer = $this->getViewer(); 555 + 556 + $draft = id(new PhabricatorDraft())->loadOneWhere( 557 + 'authorPHID = %s AND draftKey = %s', 558 + $viewer->getPHID(), 559 + 'differential-comment-'.$revision->getID()); 560 + 561 + $reviewers = array(); 562 + $ccs = array(); 563 + if ($draft) { 564 + $reviewers = idx($draft->getMetadata(), 'reviewers', array()); 565 + $ccs = idx($draft->getMetadata(), 'ccs', array()); 566 + if ($reviewers || $ccs) { 567 + $handles = $this->loadViewerHandles(array_merge($reviewers, $ccs)); 568 + $reviewers = array_select_keys($handles, $reviewers); 569 + $ccs = array_select_keys($handles, $ccs); 570 + } 571 + } 572 + 573 + $comment_form = id(new DifferentialAddCommentView()) 574 + ->setRevision($revision); 575 + 576 + $review_warnings = array(); 577 + foreach ($field_list->getFields() as $field) { 578 + $review_warnings[] = $field->getWarningsForDetailView(); 579 + } 580 + $review_warnings = array_mergev($review_warnings); 581 + 582 + if ($review_warnings) { 583 + $review_warnings_panel = id(new PHUIInfoView()) 584 + ->setSeverity(PHUIInfoView::SEVERITY_WARNING) 585 + ->setErrors($review_warnings); 586 + $comment_form->setInfoView($review_warnings_panel); 587 + } 552 588 553 - return $actions; 589 + $action_uri = $this->getApplicationURI( 590 + 'comment/save/'.$revision->getID().'/'); 591 + 592 + $comment_form->setActions($this->getRevisionCommentActions($revision)) 593 + ->setActionURI($action_uri) 594 + ->setUser($viewer) 595 + ->setDraft($draft) 596 + ->setReviewers(mpull($reviewers, 'getFullName', 'getPHID')) 597 + ->setCCs(mpull($ccs, 'getFullName', 'getPHID')); 598 + 599 + // TODO: This just makes the "Z" key work. Generalize this and remove 600 + // it at some point. 601 + $comment_form = phutil_tag( 602 + 'div', 603 + array( 604 + 'class' => 'differential-add-comment-panel', 605 + ), 606 + $comment_form); 607 + return $comment_form; 554 608 } 555 609 556 610 private function getRevisionCommentActions(DifferentialRevision $revision) { ··· 558 612 DifferentialAction::ACTION_COMMENT => true, 559 613 ); 560 614 561 - $viewer = $this->getRequest()->getUser(); 615 + $viewer = $this->getViewer(); 562 616 $viewer_phid = $viewer->getPHID(); 563 617 $viewer_is_owner = ($viewer_phid == $revision->getAuthorPHID()); 564 618 $viewer_is_reviewer = in_array($viewer_phid, $revision->getReviewers()); ··· 814 868 $viewer = $this->getViewer(); 815 869 816 870 $header = id(new PHUIHeaderView()) 817 - ->setHeader(pht('Recent Similar Open Revisions')); 871 + ->setHeader(pht('Recent Similar Revisions')); 818 872 819 873 $view = id(new DifferentialRevisionListView()) 820 874 ->setHeader($header) 821 875 ->setRevisions($revisions) 876 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 822 877 ->setUser($viewer); 823 878 824 879 $phids = $view->getRequiredHandlePHIDs(); ··· 845 900 assert_instances_of($changesets, 'DifferentialChangeset'); 846 901 assert_instances_of($vs_changesets, 'DifferentialChangeset'); 847 902 848 - $viewer = $this->getRequest()->getUser(); 903 + $viewer = $this->getViewer(); 849 904 850 905 id(new DifferentialHunkQuery()) 851 906 ->setViewer($viewer) ··· 978 1033 } 979 1034 980 1035 $box = id(new PHUIObjectBoxView()) 981 - ->setHeaderText(pht('Diff Detail')) 1036 + ->setHeaderText(pht('DIFF DETAIL')) 1037 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 982 1038 ->setUser($viewer); 983 1039 984 1040 $last_tab = null; ··· 1061 1117 } 1062 1118 1063 1119 $box_view = id(new PHUIObjectBoxView()) 1064 - ->setHeaderText(pht('Active Operations')); 1120 + ->setHeaderText(pht('ACTIVE OPERATIONS')) 1121 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); 1065 1122 1066 1123 return id(new DrydockRepositoryOperationStatusView()) 1067 1124 ->setUser($viewer) ··· 1075 1132 $viewer = $this->getViewer(); 1076 1133 1077 1134 if (!$diff->getUnitMessages()) { 1078 - return null; 1079 - } 1080 - 1081 - if (!$diff->getBuildable()) { 1082 1135 return null; 1083 1136 } 1084 1137 ··· 1109 1162 ->setBuildable($diff->getBuildable()) 1110 1163 ->setUnitMessages($diff->getUnitMessages()) 1111 1164 ->setLimit(5) 1165 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 1112 1166 ->setShowViewAll(true); 1113 1167 } 1114 1168
+1 -1
src/applications/differential/customfield/DifferentialAuthorField.php
··· 20 20 } 21 21 22 22 public function shouldAppearInPropertyView() { 23 - return true; 23 + return false; 24 24 } 25 25 26 26 public function renderPropertyViewLabel() {
-2
src/applications/differential/engineextension/DifferentialHovercardEngineExtension.php
··· 70 70 $hovercard->addField(pht('Summary'), $summary); 71 71 } 72 72 73 - $tag = DifferentialRevisionDetailView::renderTagForRevision($revision); 74 - $hovercard->addTag($tag); 75 73 } 76 74 77 75 }
+1 -1
src/applications/differential/view/DifferentialAddCommentView.php
··· 163 163 $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); 164 164 $header_text = $is_serious 165 165 ? pht('Add Comment') 166 - : pht('Leap Into Action'); 166 + : pht('Leap Into Action!'); 167 167 168 168 $header = id(new PHUIHeaderView()) 169 169 ->setHeader($header_text);
+7
src/applications/differential/view/DifferentialChangesetListView.php
··· 8 8 private $inlineURI; 9 9 private $renderURI = '/differential/changeset/'; 10 10 private $whitespace; 11 + private $background; 11 12 12 13 private $standaloneURI; 13 14 private $leftRawFileURI; ··· 109 110 public function setRawFileURIs($l, $r) { 110 111 $this->leftRawFileURI = $l; 111 112 $this->rightRawFileURI = $r; 113 + return $this; 114 + } 115 + 116 + public function setBackground($background) { 117 + $this->background = $background; 112 118 return $this; 113 119 } 114 120 ··· 254 260 $object_box = id(new PHUIObjectBoxView()) 255 261 ->setHeader($header) 256 262 ->setCollapsed(true) 263 + ->setBackground($this->background) 257 264 ->appendChild($content); 258 265 259 266 return $object_box;
+1
src/applications/differential/view/DifferentialLocalCommitsView.php
··· 127 127 128 128 return id(new PHUIObjectBoxView()) 129 129 ->setHeaderText(pht('Local Commits')) 130 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 130 131 ->setTable($table); 131 132 } 132 133
-23
src/applications/differential/view/DifferentialPrimaryPaneView.php
··· 1 - <?php 2 - 3 - final class DifferentialPrimaryPaneView extends AphrontView { 4 - 5 - private $id; 6 - 7 - public function setID($id) { 8 - $this->id = $id; 9 - return $this; 10 - } 11 - 12 - public function render() { 13 - 14 - return phutil_tag( 15 - 'div', 16 - array( 17 - 'class' => 'differential-primary-pane', 18 - 'id' => $this->id, 19 - ), 20 - $this->renderChildren()); 21 - } 22 - 23 - }
-121
src/applications/differential/view/DifferentialRevisionDetailView.php
··· 1 - <?php 2 - 3 - final class DifferentialRevisionDetailView extends AphrontView { 4 - 5 - private $revision; 6 - private $actions; 7 - private $customFields; 8 - private $diff; 9 - private $uri; 10 - private $actionList; 11 - 12 - public function setURI($uri) { 13 - $this->uri = $uri; 14 - return $this; 15 - } 16 - public function getURI() { 17 - return $this->uri; 18 - } 19 - 20 - public function setDiff(DifferentialDiff $diff) { 21 - $this->diff = $diff; 22 - return $this; 23 - } 24 - private function getDiff() { 25 - return $this->diff; 26 - } 27 - 28 - public function setRevision(DifferentialRevision $revision) { 29 - $this->revision = $revision; 30 - return $this; 31 - } 32 - 33 - public function setActions(array $actions) { 34 - $this->actions = $actions; 35 - return $this; 36 - } 37 - private function getActions() { 38 - return $this->actions; 39 - } 40 - 41 - public function setActionList(PhabricatorActionListView $list) { 42 - $this->actionList = $list; 43 - return $this; 44 - } 45 - 46 - public function getActionList() { 47 - return $this->actionList; 48 - } 49 - 50 - public function setCustomFields(PhabricatorCustomFieldList $list) { 51 - $this->customFields = $list; 52 - return $this; 53 - } 54 - 55 - public function render() { 56 - 57 - $this->requireResource('differential-core-view-css'); 58 - 59 - $revision = $this->revision; 60 - $user = $this->getUser(); 61 - 62 - $header = $this->renderHeader($revision); 63 - 64 - $actions = id(new PhabricatorActionListView()) 65 - ->setUser($user) 66 - ->setObject($revision); 67 - foreach ($this->getActions() as $action) { 68 - $actions->addAction($action); 69 - } 70 - 71 - $properties = id(new PHUIPropertyListView()) 72 - ->setUser($user) 73 - ->setObject($revision); 74 - 75 - $properties->setHasKeyboardShortcuts(true); 76 - $properties->setActionList($actions); 77 - $this->setActionList($actions); 78 - 79 - $field_list = $this->customFields; 80 - if ($field_list) { 81 - $field_list->appendFieldsToPropertyList( 82 - $revision, 83 - $user, 84 - $properties); 85 - } 86 - 87 - $object_box = id(new PHUIObjectBoxView()) 88 - ->setHeader($header) 89 - ->addPropertyList($properties); 90 - 91 - return $object_box; 92 - } 93 - 94 - private function renderHeader(DifferentialRevision $revision) { 95 - $view = id(new PHUIHeaderView()) 96 - ->setHeader($revision->getTitle($revision)) 97 - ->setUser($this->getUser()) 98 - ->setPolicyObject($revision); 99 - 100 - $status = $revision->getStatus(); 101 - $status_name = 102 - DifferentialRevisionStatus::renderFullDescription($status); 103 - 104 - $view->addProperty(PHUIHeaderView::PROPERTY_STATUS, $status_name); 105 - 106 - return $view; 107 - } 108 - 109 - public static function renderTagForRevision( 110 - DifferentialRevision $revision) { 111 - 112 - $status = $revision->getStatus(); 113 - $status_name = 114 - ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status); 115 - 116 - return id(new PHUITagView()) 117 - ->setType(PHUITagView::TYPE_STATE) 118 - ->setName($status_name); 119 - } 120 - 121 - }
+7
src/applications/differential/view/DifferentialRevisionListView.php
··· 11 11 private $header; 12 12 private $noDataString; 13 13 private $noBox; 14 + private $background = null; 14 15 15 16 public function setNoDataString($no_data_string) { 16 17 $this->noDataString = $no_data_string; ··· 35 36 36 37 public function setNoBox($box) { 37 38 $this->noBox = $box; 39 + return $this; 40 + } 41 + 42 + public function setBackground($background) { 43 + $this->background = $background; 38 44 return $this; 39 45 } 40 46 ··· 192 198 if ($this->header && !$this->noBox) { 193 199 $list->setFlush(true); 194 200 $list = id(new PHUIObjectBoxView()) 201 + ->setBackground($this->background) 195 202 ->setObjectList($list); 196 203 197 204 if ($this->header instanceof PHUIHeaderView) {
+1 -1
src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php
··· 305 305 306 306 return id(new PHUIObjectBoxView()) 307 307 ->setHeaderText(pht('Revision Update History')) 308 - ->setFlush(true) 308 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 309 309 ->setTable($content); 310 310 } 311 311
+19 -15
src/applications/diffusion/controller/DiffusionCommitController.php
··· 214 214 // changes inline even if there are more than the soft limit. 215 215 $show_all_details = $request->getBool('show_all'); 216 216 217 - $change_panel = new PHUIObjectBoxView(); 218 - $header = new PHUIHeaderView(); 219 - $header->setHeader(pht('Changes (%s)', new PhutilNumber($count))); 220 - $change_panel->setID('toc'); 217 + $header = id(new PHUIHeaderView()) 218 + ->setHeader(pht('Changes (%s)', new PhutilNumber($count))); 221 219 220 + $warning_view = null; 222 221 if ($count > self::CHANGES_LIMIT && !$show_all_details) { 223 - 224 222 $button = id(new PHUIButtonView()) 225 223 ->setText(pht('Show All Changes')) 226 224 ->setHref('?show_all=true') ··· 230 228 $warning_view = id(new PHUIInfoView()) 231 229 ->setSeverity(PHUIInfoView::SEVERITY_WARNING) 232 230 ->setTitle(pht('Very Large Commit')) 231 + ->addButton($button) 233 232 ->appendChild( 234 233 pht('This commit is very large. Load each file individually.')); 235 - 236 - $change_panel->setInfoView($warning_view); 237 - $header->addActionLink($button); 238 234 } 239 235 240 236 $changesets = DiffusionPathChange::convertToDifferentialChangesets( ··· 244 240 // TODO: This table and panel shouldn't really be separate, but we need 245 241 // to clean up the "Load All Files" interaction first. 246 242 $change_table = $this->buildTableOfContents( 247 - $changesets); 243 + $changesets, 244 + $header, 245 + $warning_view); 248 246 249 - $change_panel->setTable($change_table); 250 - $change_panel->setHeader($header); 251 - 252 - $content[] = $change_panel; 247 + $content[] = $change_table; 253 248 254 249 $vcs = $repository->getVersionControlSystem(); 255 250 switch ($vcs) { ··· 1017 1012 return $parser->processCorpus($corpus); 1018 1013 } 1019 1014 1020 - private function buildTableOfContents(array $changesets) { 1015 + private function buildTableOfContents( 1016 + array $changesets, 1017 + $header, 1018 + $info_view) { 1019 + 1021 1020 $drequest = $this->getDiffusionRequest(); 1022 1021 $viewer = $this->getViewer(); 1023 1022 1024 1023 $toc_view = id(new PHUIDiffTableOfContentsListView()) 1025 - ->setUser($viewer); 1024 + ->setUser($viewer) 1025 + ->setHeader($header); 1026 + 1027 + if ($info_view) { 1028 + $toc_view->setInfoView($info_view); 1029 + } 1026 1030 1027 1031 // TODO: This is hacky, we just want access to the linkX() methods on 1028 1032 // DiffusionView.
+17 -2
src/applications/harbormaster/view/HarbormasterUnitSummaryView.php
··· 7 7 private $limit; 8 8 private $excuse; 9 9 private $showViewAll; 10 + private $background; 10 11 11 12 public function setBuildable(HarbormasterBuildable $buildable) { 12 13 $this->buildable = $buildable; ··· 33 34 return $this; 34 35 } 35 36 37 + public function setBackground($background) { 38 + $this->background = $background; 39 + return $this; 40 + } 41 + 36 42 public function render() { 37 43 $messages = $this->messages; 38 44 $buildable = $this->buildable; ··· 54 60 $tag_icon = 'fa-ban'; 55 61 } 56 62 63 + $tag = id(new PHUITagView()) 64 + ->setType(PHUITagView::TYPE_SHADE) 65 + ->setShade($tag_color) 66 + ->setIcon($tag_icon) 67 + ->setName($tag_text); 68 + 57 69 $header = id(new PHUIHeaderView()) 58 - ->setHeader(pht('Unit Tests')) 59 - ->setStatus($tag_icon, $tag_color, $tag_text); 70 + ->setHeader(array(pht('Unit Tests'), $tag)); 60 71 61 72 if ($this->showViewAll) { 62 73 $view_all = id(new PHUIButtonView()) ··· 97 108 } 98 109 99 110 $box->setTable($table); 111 + 112 + if ($this->background) { 113 + $box->setBackground($this->background); 114 + } 100 115 101 116 return $box; 102 117 }
+33 -2
src/infrastructure/diff/view/PHUIDiffTableOfContentsListView.php
··· 4 4 5 5 private $items = array(); 6 6 private $authorityPackages; 7 + private $header; 8 + private $infoView; 9 + private $background; 7 10 8 11 public function addItem(PHUIDiffTableOfContentsItemView $item) { 9 12 $this->items[] = $item; ··· 18 21 19 22 public function getAuthorityPackages() { 20 23 return $this->authorityPackages; 24 + } 25 + 26 + public function setBackground($background) { 27 + $this->background = $background; 28 + return $this; 29 + } 30 + 31 + public function setHeader(PHUIHeaderView $header) { 32 + $this->header = $header; 33 + return $this; 34 + } 35 + 36 + public function setInfoView(PHUIInfoView $infoview) { 37 + $this->infoView = $infoview; 38 + return $this; 21 39 } 22 40 23 41 public function render() { ··· 142 160 ->setAnchorName('toc') 143 161 ->setNavigationMarker(true); 144 162 145 - return id(new PHUIObjectBoxView()) 146 - ->setHeaderText(pht('Table of Contents')) 163 + $header = id(new PHUIHeaderView()) 164 + ->setHeader(pht('Table of Contents')); 165 + 166 + if ($this->header) { 167 + $header = $this->header; 168 + } 169 + 170 + $box = id(new PHUIObjectBoxView()) 171 + ->setHeader($header) 172 + ->setBackground($this->background) 147 173 ->setTable($table) 148 174 ->appendChild($anchor) 149 175 ->appendChild($buttons); 176 + 177 + if ($this->infoView) { 178 + $box->setInfoView($this->infoView); 179 + } 180 + return $box; 150 181 } 151 182 152 183 }
+7 -3
webroot/rsrc/css/application/differential/changeset-view.css
··· 6 6 .differential-changeset { 7 7 position: relative; 8 8 margin: 0; 9 - padding-top: 32px; 9 + padding-top: 16px; 10 10 overflow-x: auto; 11 11 12 12 /* Fixes what seems to be a layout bug in Firefox which causes scrollbars, ··· 265 265 266 266 .differential-changeset h1 { 267 267 font-size: {$biggestfontsize}; 268 - padding: 2px 0 12px 12px; 268 + padding: 2px 0 20px 12px; 269 269 line-height: 20px; 270 270 color: #000; 271 271 } ··· 322 322 323 323 .differential-changeset-buttons { 324 324 float: right; 325 - margin-right: 8px; 325 + margin-right: 12px; 326 326 } 327 327 328 328 .device-phone .differential-changeset-buttons { ··· 362 362 tr.differential-inline-loading { 363 363 opacity: 0.5; 364 364 } 365 + 366 + .differential-review-stage { 367 + position: relative; 368 + }
+5 -1
webroot/rsrc/css/application/differential/core.css
··· 3 3 */ 4 4 5 5 .differential-primary-pane { 6 - margin-bottom: 32px; 6 + margin-top: -20px; 7 7 } 8 8 9 9 .differential-panel { ··· 23 23 -ms-user-select: none; 24 24 user-select: none; 25 25 } 26 + 27 + .differential-content-hidden { 28 + margin: 0 0 24px 0; 29 + }
-4
webroot/rsrc/css/phui/phui-box.css
··· 66 66 padding: 0; 67 67 } 68 68 69 - .phui-box.phui-box-blue-property .phui-header-header { 70 - text-transform: uppercase; 71 - } 72 - 73 69 .phui-box.phui-box-blue-property .phui-header-header .phui-header-icon { 74 70 margin-right: 6px; 75 71 }
+10
webroot/rsrc/css/phui/phui-object-box.css
··· 52 52 margin: 8px 8px 0 8px; 53 53 } 54 54 55 + .phui-object-box .phui-header-header .phui-tag-view { 56 + margin-left: 8px; 57 + } 58 + 59 + .phui-object-box .phui-header-header .phui-tag-core { 60 + border-color: transparent; 61 + padding: 1px 6px; 62 + font-size: {$normalfontsize}; 63 + } 64 + 55 65 /* - Object Box Colors ------------------------------------------------------ */ 56 66 57 67 .phui-box-border.phui-object-box-green {
+2 -2
webroot/rsrc/css/phui/phui-two-column-view.css
··· 182 182 183 183 /* Info View */ 184 184 185 - .phui-two-column-view .phui-two-column-content .phui-info-view { 185 + .phui-two-column-view .phui-two-column-row .phui-info-view { 186 186 margin: 0 0 20px 0; 187 187 padding: 16px; 188 188 } 189 189 190 - .phui-two-column-view .phui-two-column-content .phui-object-box 190 + .phui-two-column-view .phui-two-column-row .phui-object-box 191 191 .phui-info-view { 192 192 margin: 0; 193 193 }