diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index 702bc0e609..1c0fb7fb3c 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -9,13 +9,13 @@ return array(
'names' => array(
'conpherence.pkg.css' => 'ff161f2d',
'conpherence.pkg.js' => 'b5b51108',
- 'core.pkg.css' => 'ea94e844',
+ 'core.pkg.css' => 'ab24402f',
'core.pkg.js' => '1475bd91',
'darkconsole.pkg.js' => '1f9a31bc',
- 'differential.pkg.css' => 'a2755617',
- 'differential.pkg.js' => '9cab3335',
+ 'differential.pkg.css' => '1ccbf3a9',
+ 'differential.pkg.js' => 'b7504037',
'diffusion.pkg.css' => 'b93d9b8c',
- 'diffusion.pkg.js' => '84c8f8fd',
+ 'diffusion.pkg.js' => '6134c5a1',
'favicon.ico' => '30672e08',
'maniphest.pkg.css' => '4845691a',
'maniphest.pkg.js' => '5ab2753f',
@@ -25,14 +25,14 @@ return array(
'rsrc/audio/basic/tap.mp3' => 'fc2fd796',
'rsrc/audio/basic/ting.mp3' => '17660001',
'rsrc/css/aphront/aphront-bars.css' => '231ac33c',
- 'rsrc/css/aphront/dark-console.css' => '53798a6d',
+ 'rsrc/css/aphront/dark-console.css' => 'f7b071f1',
'rsrc/css/aphront/dialog-view.css' => '685c7e2d',
'rsrc/css/aphront/list-filter-view.css' => '5d6f0526',
'rsrc/css/aphront/multi-column.css' => '84cc6640',
'rsrc/css/aphront/notification.css' => '3f6c89c9',
'rsrc/css/aphront/panel-view.css' => '8427b78d',
'rsrc/css/aphront/phabricator-nav-view.css' => 'faf6a6fc',
- 'rsrc/css/aphront/table-view.css' => '34cf86b4',
+ 'rsrc/css/aphront/table-view.css' => 'a3aa6910',
'rsrc/css/aphront/tokenizer.css' => '15d5ff71',
'rsrc/css/aphront/tooltip.css' => '173b9431',
'rsrc/css/aphront/typeahead-browse.css' => '4f82e510',
@@ -64,16 +64,16 @@ return array(
'rsrc/css/application/dashboard/dashboard.css' => 'fe5b1869',
'rsrc/css/application/diff/inline-comment-summary.css' => '51efda3a',
'rsrc/css/application/differential/add-comment.css' => 'c47f8c40',
- 'rsrc/css/application/differential/changeset-view.css' => '983751ee',
+ 'rsrc/css/application/differential/changeset-view.css' => 'c3f44655',
'rsrc/css/application/differential/core.css' => '5b7b8ff4',
'rsrc/css/application/differential/phui-inline-comment.css' => 'ffd1a542',
'rsrc/css/application/differential/revision-comment.css' => '14b8565a',
'rsrc/css/application/differential/revision-history.css' => '0e8eb855',
'rsrc/css/application/differential/revision-list.css' => 'f3c47d33',
'rsrc/css/application/differential/table-of-contents.css' => 'ae4b7a55',
- 'rsrc/css/application/diffusion/diffusion-history.css' => 'de70e348',
+ 'rsrc/css/application/diffusion/diffusion-history.css' => '6870e8c1',
'rsrc/css/application/diffusion/diffusion-icons.css' => 'a6a1e2ba',
- 'rsrc/css/application/diffusion/diffusion-readme.css' => '18bd3910',
+ 'rsrc/css/application/diffusion/diffusion-readme.css' => '419dd5b6',
'rsrc/css/application/diffusion/diffusion-source.css' => '750add59',
'rsrc/css/application/feed/feed.css' => 'ecd4ec57',
'rsrc/css/application/files/global-drag-and-drop.css' => '5c1b47c2',
@@ -115,7 +115,7 @@ return array(
'rsrc/css/application/tokens/tokens.css' => '3d0f239e',
'rsrc/css/application/uiexample/example.css' => '528b19de',
'rsrc/css/core/core.css' => '23beb330',
- 'rsrc/css/core/remarkup.css' => 'd1a5e11e',
+ 'rsrc/css/core/remarkup.css' => '509fb36e',
'rsrc/css/core/syntax.css' => 'cae95e89',
'rsrc/css/core/z-index.css' => '9d8f7c4b',
'rsrc/css/diviner/diviner-shared.css' => '896f1d43',
@@ -125,8 +125,8 @@ return array(
'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82',
'rsrc/css/layout/phabricator-source-code-view.css' => '4383192f',
'rsrc/css/phui/button/phui-button-bar.css' => '39fe680c',
- 'rsrc/css/phui/button/phui-button-simple.css' => '081cfeea',
- 'rsrc/css/phui/button/phui-button.css' => '9f13ddcc',
+ 'rsrc/css/phui/button/phui-button-simple.css' => '8e1baf68',
+ 'rsrc/css/phui/button/phui-button.css' => '022581b4',
'rsrc/css/phui/calendar/phui-calendar-day.css' => '572b1893',
'rsrc/css/phui/calendar/phui-calendar-list.css' => '576be600',
'rsrc/css/phui/calendar/phui-calendar-month.css' => '8e10e92c',
@@ -135,7 +135,7 @@ return array(
'rsrc/css/phui/object-item/phui-oi-color.css' => 'cd2b9b77',
'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => '08f4ccc3',
'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '9d9685d6',
- 'rsrc/css/phui/object-item/phui-oi-list-view.css' => '43752968',
+ 'rsrc/css/phui/object-item/phui-oi-list-view.css' => 'bf094950',
'rsrc/css/phui/object-item/phui-oi-simple-ui.css' => 'a8beebea',
'rsrc/css/phui/phui-action-list.css' => 'c01858f4',
'rsrc/css/phui/phui-action-panel.css' => '91c7b835',
@@ -149,7 +149,7 @@ return array(
'rsrc/css/phui/phui-comment-panel.css' => 'f50152ad',
'rsrc/css/phui/phui-crumbs-view.css' => '6ece3bbb',
'rsrc/css/phui/phui-curtain-view.css' => '55dd0e59',
- 'rsrc/css/phui/phui-document-pro.css' => 'bb18da6b',
+ 'rsrc/css/phui/phui-document-pro.css' => '8af7ea27',
'rsrc/css/phui/phui-document-summary.css' => '9ca48bdf',
'rsrc/css/phui/phui-document.css' => 'c32e8dec',
'rsrc/css/phui/phui-feed-story.css' => '44a9c8e9',
@@ -157,7 +157,7 @@ return array(
'rsrc/css/phui/phui-form-view.css' => '6175808d',
'rsrc/css/phui/phui-form.css' => 'a5570f70',
'rsrc/css/phui/phui-head-thing.css' => 'fd311e5f',
- 'rsrc/css/phui/phui-header-view.css' => 'a3d1aecd',
+ 'rsrc/css/phui/phui-header-view.css' => 'e7de7ee2',
'rsrc/css/phui/phui-hovercard.css' => 'f0592bcf',
'rsrc/css/phui/phui-icon-set-selector.css' => '87db8fee',
'rsrc/css/phui/phui-icon.css' => '4c46b6ba',
@@ -168,14 +168,14 @@ return array(
'rsrc/css/phui/phui-lightbox.css' => '0a035e40',
'rsrc/css/phui/phui-list.css' => '12eb8ce6',
'rsrc/css/phui/phui-object-box.css' => '9cff003c',
- 'rsrc/css/phui/phui-pager.css' => '77d8a794',
+ 'rsrc/css/phui/phui-pager.css' => 'edcbc226',
'rsrc/css/phui/phui-pinboard-view.css' => '2495140e',
'rsrc/css/phui/phui-property-list-view.css' => '2dc7993f',
'rsrc/css/phui/phui-remarkup-preview.css' => '54a34863',
'rsrc/css/phui/phui-segment-bar-view.css' => 'b1d1b892',
'rsrc/css/phui/phui-spacing.css' => '042804d6',
'rsrc/css/phui/phui-status.css' => 'd5263e49',
- 'rsrc/css/phui/phui-tag-view.css' => '3fa7765e',
+ 'rsrc/css/phui/phui-tag-view.css' => '93b084cf',
'rsrc/css/phui/phui-timeline-view.css' => '313c7f22',
'rsrc/css/phui/phui-two-column-view.css' => 'ce9fa0b7',
'rsrc/css/phui/workboards/phui-workboard-color.css' => '783cdff5',
@@ -298,6 +298,8 @@ return array(
'rsrc/image/checker_dark.png' => 'd8e65881',
'rsrc/image/checker_light.png' => 'a0155918',
'rsrc/image/checker_lighter.png' => 'd5da91b6',
+ 'rsrc/image/controls/checkbox-checked.png' => 'ad6441ea',
+ 'rsrc/image/controls/checkbox-unchecked.png' => '8eb1f0ae',
'rsrc/image/d5d8e1.png' => '0c2a1497',
'rsrc/image/darkload.gif' => '1ffd3ec6',
'rsrc/image/divot.png' => '94dded62',
@@ -393,9 +395,9 @@ return array(
'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '408bf173',
'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '453c5375',
'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => 'd4eecc63',
- 'rsrc/js/application/diff/DiffChangeset.js' => 'aaaf4cb5',
- 'rsrc/js/application/diff/DiffChangesetList.js' => '85abc805',
- 'rsrc/js/application/diff/DiffInline.js' => '1d17130f',
+ 'rsrc/js/application/diff/DiffChangeset.js' => 'd498bddb',
+ 'rsrc/js/application/diff/DiffChangesetList.js' => '29bbc02c',
+ 'rsrc/js/application/diff/DiffInline.js' => '20553f71',
'rsrc/js/application/diff/behavior-preview-link.js' => '051c7832',
'rsrc/js/application/differential/behavior-comment-preview.js' => '51c5ad07',
'rsrc/js/application/differential/behavior-diff-radios.js' => 'e1ff79b1',
@@ -404,7 +406,7 @@ return array(
'rsrc/js/application/diffusion/DiffusionLocateFileSource.js' => 'c93358e3',
'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'd835b03a',
'rsrc/js/application/diffusion/behavior-commit-branches.js' => 'bdaf4d04',
- 'rsrc/js/application/diffusion/behavior-commit-graph.js' => '49ae8328',
+ 'rsrc/js/application/diffusion/behavior-commit-graph.js' => '75b83cbb',
'rsrc/js/application/diffusion/behavior-diffusion-browse-file.js' => '054a0f0b',
'rsrc/js/application/diffusion/behavior-jump-to.js' => '73d09eef',
'rsrc/js/application/diffusion/behavior-load-blame.js' => '42126667',
@@ -494,7 +496,7 @@ return array(
'rsrc/js/core/behavior-lightbox-attachments.js' => '560f41da',
'rsrc/js/core/behavior-line-linker.js' => '1499a8cb',
'rsrc/js/core/behavior-more.js' => 'a80d0378',
- 'rsrc/js/core/behavior-object-selector.js' => 'e0ec7f2f',
+ 'rsrc/js/core/behavior-object-selector.js' => '77c1f0b0',
'rsrc/js/core/behavior-oncopy.js' => '2926fff2',
'rsrc/js/core/behavior-phabricator-nav.js' => '947753e0',
'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => 'acd29eee',
@@ -526,7 +528,7 @@ return array(
'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8',
'rsrc/js/phuix/PHUIXActionView.js' => 'b3465b9b',
'rsrc/js/phuix/PHUIXAutocomplete.js' => 'f6699267',
- 'rsrc/js/phuix/PHUIXButtonView.js' => '0f13520b',
+ 'rsrc/js/phuix/PHUIXButtonView.js' => 'a37126bd',
'rsrc/js/phuix/PHUIXDropdownMenu.js' => '8018ee50',
'rsrc/js/phuix/PHUIXExample.js' => '68af71ca',
'rsrc/js/phuix/PHUIXFormControl.js' => '83e03671',
@@ -535,12 +537,12 @@ return array(
'symbols' => array(
'almanac-css' => 'dbb9b3af',
'aphront-bars' => '231ac33c',
- 'aphront-dark-console-css' => '53798a6d',
+ 'aphront-dark-console-css' => 'f7b071f1',
'aphront-dialog-view-css' => '685c7e2d',
'aphront-list-filter-view-css' => '5d6f0526',
'aphront-multi-column-view-css' => '84cc6640',
'aphront-panel-view-css' => '8427b78d',
- 'aphront-table-view-css' => '34cf86b4',
+ 'aphront-table-view-css' => 'a3aa6910',
'aphront-tokenizer-control-css' => '15d5ff71',
'aphront-tooltip-css' => '173b9431',
'aphront-typeahead-control-css' => '8a84cc7d',
@@ -560,16 +562,16 @@ return array(
'conpherence-thread-manager' => '4d863052',
'conpherence-transaction-css' => '85129c68',
'd3' => 'a11a5ff2',
- 'differential-changeset-view-css' => '983751ee',
+ 'differential-changeset-view-css' => 'c3f44655',
'differential-core-view-css' => '5b7b8ff4',
'differential-revision-add-comment-css' => 'c47f8c40',
'differential-revision-comment-css' => '14b8565a',
'differential-revision-history-css' => '0e8eb855',
'differential-revision-list-css' => 'f3c47d33',
'differential-table-of-contents-css' => 'ae4b7a55',
- 'diffusion-history-css' => 'de70e348',
+ 'diffusion-history-css' => '6870e8c1',
'diffusion-icons-css' => 'a6a1e2ba',
- 'diffusion-readme-css' => '18bd3910',
+ 'diffusion-readme-css' => '419dd5b6',
'diffusion-source-css' => '750add59',
'diviner-shared-css' => '896f1d43',
'font-fontawesome' => 'e838e088',
@@ -618,7 +620,7 @@ return array(
'javelin-behavior-differential-user-select' => 'a8d8459d',
'javelin-behavior-diffusion-browse-file' => '054a0f0b',
'javelin-behavior-diffusion-commit-branches' => 'bdaf4d04',
- 'javelin-behavior-diffusion-commit-graph' => '49ae8328',
+ 'javelin-behavior-diffusion-commit-graph' => '75b83cbb',
'javelin-behavior-diffusion-jump-to' => '73d09eef',
'javelin-behavior-diffusion-locate-file' => '6d3e1947',
'javelin-behavior-diffusion-pull-lastmodified' => 'f01586dc',
@@ -656,7 +658,7 @@ return array(
'javelin-behavior-phabricator-line-linker' => '1499a8cb',
'javelin-behavior-phabricator-nav' => '947753e0',
'javelin-behavior-phabricator-notification-example' => '8ce821c5',
- 'javelin-behavior-phabricator-object-selector' => 'e0ec7f2f',
+ 'javelin-behavior-phabricator-object-selector' => '77c1f0b0',
'javelin-behavior-phabricator-oncopy' => '2926fff2',
'javelin-behavior-phabricator-remarkup-assist' => 'acd29eee',
'javelin-behavior-phabricator-reveal-content' => '60821bc7',
@@ -772,9 +774,9 @@ return array(
'phabricator-darklog' => 'c8e1ffe3',
'phabricator-darkmessage' => 'c48cccdd',
'phabricator-dashboard-css' => 'fe5b1869',
- 'phabricator-diff-changeset' => 'aaaf4cb5',
- 'phabricator-diff-changeset-list' => '85abc805',
- 'phabricator-diff-inline' => '1d17130f',
+ 'phabricator-diff-changeset' => 'd498bddb',
+ 'phabricator-diff-changeset-list' => '29bbc02c',
+ 'phabricator-diff-inline' => '20553f71',
'phabricator-drag-and-drop-file-upload' => '58dea2fa',
'phabricator-draggable-list' => 'bea6e7f4',
'phabricator-fatal-config-template-css' => '8f18fa41',
@@ -793,7 +795,7 @@ return array(
'phabricator-object-selector-css' => '85ee8ce6',
'phabricator-phtize' => 'd254d646',
'phabricator-prefab' => 'c5af80a2',
- 'phabricator-remarkup-css' => 'd1a5e11e',
+ 'phabricator-remarkup-css' => '509fb36e',
'phabricator-search-results-css' => '8f8e08ed',
'phabricator-shaped-request' => '7cbe244b',
'phabricator-slowvote-css' => 'a94b7230',
@@ -820,8 +822,8 @@ return array(
'phui-big-info-view-css' => 'bd903741',
'phui-box-css' => '269cbc99',
'phui-button-bar-css' => '39fe680c',
- 'phui-button-css' => '9f13ddcc',
- 'phui-button-simple-css' => '081cfeea',
+ 'phui-button-css' => '022581b4',
+ 'phui-button-simple-css' => '8e1baf68',
'phui-calendar-css' => '477acfaa',
'phui-calendar-day-css' => '572b1893',
'phui-calendar-list-css' => '576be600',
@@ -834,14 +836,14 @@ return array(
'phui-curtain-view-css' => '55dd0e59',
'phui-document-summary-view-css' => '9ca48bdf',
'phui-document-view-css' => 'c32e8dec',
- 'phui-document-view-pro-css' => 'bb18da6b',
+ 'phui-document-view-pro-css' => '8af7ea27',
'phui-feed-story-css' => '44a9c8e9',
'phui-font-icon-base-css' => '870a7360',
'phui-fontkit-css' => '1320ed01',
'phui-form-css' => 'a5570f70',
'phui-form-view-css' => '6175808d',
'phui-head-thing-view-css' => 'fd311e5f',
- 'phui-header-view-css' => 'a3d1aecd',
+ 'phui-header-view-css' => 'e7de7ee2',
'phui-hovercard' => '1bd28176',
'phui-hovercard-view-css' => 'f0592bcf',
'phui-icon-set-selector-css' => '87db8fee',
@@ -858,16 +860,16 @@ return array(
'phui-oi-color-css' => 'cd2b9b77',
'phui-oi-drag-ui-css' => '08f4ccc3',
'phui-oi-flush-ui-css' => '9d9685d6',
- 'phui-oi-list-view-css' => '43752968',
+ 'phui-oi-list-view-css' => 'bf094950',
'phui-oi-simple-ui-css' => 'a8beebea',
- 'phui-pager-css' => '77d8a794',
+ 'phui-pager-css' => 'edcbc226',
'phui-pinboard-view-css' => '2495140e',
'phui-property-list-view-css' => '2dc7993f',
'phui-remarkup-preview-css' => '54a34863',
'phui-segment-bar-view-css' => 'b1d1b892',
'phui-spacing-css' => '042804d6',
'phui-status-list-view-css' => 'd5263e49',
- 'phui-tag-view-css' => '3fa7765e',
+ 'phui-tag-view-css' => '93b084cf',
'phui-theme-css' => '9f261c6b',
'phui-timeline-view-css' => '313c7f22',
'phui-two-column-view-css' => 'ce9fa0b7',
@@ -878,7 +880,7 @@ return array(
'phuix-action-list-view' => 'b5c256b8',
'phuix-action-view' => 'b3465b9b',
'phuix-autocomplete' => 'f6699267',
- 'phuix-button-view' => '0f13520b',
+ 'phuix-button-view' => 'a37126bd',
'phuix-dropdown-menu' => '8018ee50',
'phuix-form-control-view' => '83e03671',
'phuix-icon-view' => 'bff6884b',
@@ -936,9 +938,6 @@ return array(
'javelin-stratcom',
'javelin-workflow',
),
- '081cfeea' => array(
- 'phui-button-css',
- ),
'0825c27a' => array(
'javelin-behavior',
'javelin-dom',
@@ -960,10 +959,6 @@ return array(
'javelin-dom',
'javelin-router',
),
- '0f13520b' => array(
- 'javelin-install',
- 'javelin-dom',
- ),
'0f764c35' => array(
'javelin-install',
'javelin-util',
@@ -1021,9 +1016,6 @@ return array(
'javelin-request',
'javelin-uri',
),
- '1d17130f' => array(
- 'javelin-dom',
- ),
'1e911d0f' => array(
'javelin-stratcom',
'javelin-request',
@@ -1047,6 +1039,9 @@ return array(
'javelin-install',
'javelin-dom',
),
+ '20553f71' => array(
+ 'javelin-dom',
+ ),
'2290aeef' => array(
'javelin-install',
'javelin-dom',
@@ -1072,6 +1067,10 @@ return array(
'javelin-install',
'javelin-util',
),
+ '29bbc02c' => array(
+ 'javelin-install',
+ 'phuix-button-view',
+ ),
'2ae077e1' => array(
'javelin-behavior',
'javelin-dom',
@@ -1225,11 +1224,6 @@ return array(
'javelin-vector',
'javelin-stratcom',
),
- '49ae8328' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-stratcom',
- ),
'4b3c4443' => array(
'phuix-icon-view',
),
@@ -1446,6 +1440,11 @@ return array(
'javelin-install',
'javelin-workboard-card',
),
+ '75b83cbb' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-stratcom',
+ ),
'76b9fc3e' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1458,6 +1457,12 @@ return array(
'javelin-reactor',
'javelin-util',
),
+ '77c1f0b0' => array(
+ 'javelin-behavior',
+ 'javelin-dom',
+ 'javelin-request',
+ 'javelin-util',
+ ),
'782ab6e7' => array(
'javelin-behavior',
'javelin-dom',
@@ -1514,9 +1519,6 @@ return array(
'javelin-dom',
'javelin-stratcom',
),
- '85abc805' => array(
- 'javelin-install',
- ),
'85ee8ce6' => array(
'aphront-dialog-view-css',
),
@@ -1564,6 +1566,9 @@ return array(
'javelin-stratcom',
'javelin-install',
),
+ '8e1baf68' => array(
+ 'phui-button-css',
+ ),
'8ff5e24c' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1621,9 +1626,6 @@ return array(
'javelin-mask',
'phabricator-drag-and-drop-file-upload',
),
- '983751ee' => array(
- 'phui-inline-comment-view-css',
- ),
'9a6dd75c' => array(
'javelin-behavior',
'javelin-stratcom',
@@ -1657,6 +1659,10 @@ return array(
'javelin-util',
'phabricator-keyboard-shortcut',
),
+ 'a37126bd' => array(
+ 'javelin-install',
+ 'javelin-dom',
+ ),
'a3a63478' => array(
'phui-workcard-view-css',
),
@@ -1716,17 +1722,6 @@ return array(
'javelin-util',
'phabricator-prefab',
),
- 'aaaf4cb5' => array(
- 'javelin-dom',
- 'javelin-util',
- 'javelin-stratcom',
- 'javelin-install',
- 'javelin-workflow',
- 'javelin-router',
- 'javelin-behavior-device',
- 'javelin-vector',
- 'phabricator-diff-inline',
- ),
'ab2f381b' => array(
'javelin-request',
'javelin-behavior',
@@ -1877,6 +1872,9 @@ return array(
'javelin-dom',
'javelin-vector',
),
+ 'c3f44655' => array(
+ 'phui-inline-comment-view-css',
+ ),
'c420b0b9' => array(
'javelin-behavior',
'javelin-behavior-device',
@@ -1988,6 +1986,17 @@ return array(
'javelin-uri',
'javelin-util',
),
+ 'd498bddb' => array(
+ 'javelin-dom',
+ 'javelin-util',
+ 'javelin-stratcom',
+ 'javelin-install',
+ 'javelin-workflow',
+ 'javelin-router',
+ 'javelin-behavior-device',
+ 'javelin-vector',
+ 'phabricator-diff-inline',
+ ),
'd4eecc63' => array(
'javelin-behavior',
'javelin-dom',
@@ -2029,12 +2038,6 @@ return array(
'javelin-typeahead-ondemand-source',
'javelin-dom',
),
- 'e0ec7f2f' => array(
- 'javelin-behavior',
- 'javelin-dom',
- 'javelin-request',
- 'javelin-util',
- ),
'e1d25dfb' => array(
'javelin-behavior',
'javelin-stratcom',
diff --git a/resources/sql/autopatches/20170404.files.retroactive-content-hash.sql b/resources/sql/autopatches/20170404.files.retroactive-content-hash.sql
new file mode 100644
index 0000000000..7c4eb0f013
--- /dev/null
+++ b/resources/sql/autopatches/20170404.files.retroactive-content-hash.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_file.file
+ CHANGE contentHash contentHash BINARY(64);
diff --git a/resources/sql/autopatches/20170528.maniphestdupes.php b/resources/sql/autopatches/20170528.maniphestdupes.php
new file mode 100644
index 0000000000..aea8ae93d2
--- /dev/null
+++ b/resources/sql/autopatches/20170528.maniphestdupes.php
@@ -0,0 +1,68 @@
+getTransactionType();
+
+ if ($txn_type == 'mergedinto') {
+ // dupe handling as implemented in D10427, which creates a specific txn
+ $add_edges[] = array(
+ 'src' => $txn->getObjectPHID(),
+ 'dst' => $txn->getNewValue(),
+ );
+ } else if ($txn_type == 'status' && $txn->getNewValue() == 'duplicate') {
+ // dupe handling as originally implemented, which just changes the status
+ // and adds a comment
+ $src_phid = $txn->getObjectPHID();
+
+ // get all the comment transactions associated with this task
+ $viewer = PhabricatorUser::getOmnipotentUser();
+ $comment_txns = id(new ManiphestTransactionQuery())
+ ->setViewer($viewer)
+ ->withObjectPHIDs(array($src_phid))
+ ->needComments(true)
+ ->execute();
+
+ // check each comment, looking for the "Merged Into" message
+ foreach ($comment_txns as $comment_txn) {
+ if ($comment_txn->hasComment()) {
+ $comment = $comment_txn->getComment()->getContent();
+ $pattern = '/^\xE2\x9C\x98 Merged into T(\d+)\.$/';
+ $matches = array();
+
+ if (preg_match($pattern, $comment, $matches)) {
+ $dst_task = id(new ManiphestTaskQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($matches[1]))
+ ->executeOne();
+
+ if ($dst_task) {
+ $dst_phid = $dst_task->getPHID();
+ $add_edges[] = array(
+ 'src' => $src_phid,
+ 'dst' => $dst_phid,
+ );
+ }
+ }
+ }
+ }
+ }
+}
+
+if ($add_edges) {
+ foreach ($add_edges as $edge) {
+ $src_phid = $edge['src'];
+ $dst_phid = $edge['dst'];
+
+ $type = ManiphestTaskIsDuplicateOfTaskEdgeType::EDGECONST;
+ try {
+ $editor = id(new PhabricatorEdgeEditor())
+ ->addEdge($src_phid, $type, $dst_phid)
+ ->save();
+ } catch (PhabricatorEdgeCycleException $ex) {
+ // Some earlier or later merge made this invalid, just skip it.
+ }
+ }
+}
diff --git a/src/applications/almanac/controller/AlmanacController.php b/src/applications/almanac/controller/AlmanacController.php
index e4d9921660..d6d7188511 100644
--- a/src/applications/almanac/controller/AlmanacController.php
+++ b/src/applications/almanac/controller/AlmanacController.php
@@ -84,8 +84,8 @@ abstract class AlmanacController
'a',
array(
'class' => ($can_edit
- ? 'button grey small'
- : 'button grey small disabled'),
+ ? 'button button-grey small'
+ : 'button button-grey small disabled'),
'sigil' => 'workflow',
'href' => $delete_uri,
),
diff --git a/src/applications/almanac/view/AlmanacBindingTableView.php b/src/applications/almanac/view/AlmanacBindingTableView.php
index 06797c912d..746d3de5c2 100644
--- a/src/applications/almanac/view/AlmanacBindingTableView.php
+++ b/src/applications/almanac/view/AlmanacBindingTableView.php
@@ -77,7 +77,7 @@ final class AlmanacBindingTableView extends AphrontView {
phutil_tag(
'a',
array(
- 'class' => 'small grey button',
+ 'class' => 'small button button-grey',
'href' => '/almanac/binding/'.$binding->getID().'/',
),
pht('Details')),
diff --git a/src/applications/almanac/view/AlmanacInterfaceTableView.php b/src/applications/almanac/view/AlmanacInterfaceTableView.php
index f937e34f44..1fdcd0bf35 100644
--- a/src/applications/almanac/view/AlmanacInterfaceTableView.php
+++ b/src/applications/almanac/view/AlmanacInterfaceTableView.php
@@ -30,9 +30,9 @@ final class AlmanacInterfaceTableView extends AphrontView {
$can_edit = $this->getCanEdit();
if ($can_edit) {
- $button_class = 'small grey button';
+ $button_class = 'small button button-grey';
} else {
- $button_class = 'small grey button disabled';
+ $button_class = 'small button button-grey disabled';
}
$handles = $viewer->loadHandles(mpull($interfaces, 'getNetworkPHID'));
diff --git a/src/applications/audit/storage/PhabricatorAuditTransaction.php b/src/applications/audit/storage/PhabricatorAuditTransaction.php
index d09bdb76ce..ad96edb3a4 100644
--- a/src/applications/audit/storage/PhabricatorAuditTransaction.php
+++ b/src/applications/audit/storage/PhabricatorAuditTransaction.php
@@ -49,6 +49,17 @@ final class PhabricatorAuditTransaction
return $blocks;
}
+ public function getActionStrength() {
+ $type = $this->getTransactionType();
+
+ switch ($type) {
+ case self::TYPE_COMMIT:
+ return 3.0;
+ }
+
+ return parent::getActionStrength();
+ }
+
public function getRequiredHandlePHIDs() {
$phids = parent::getRequiredHandlePHIDs();
diff --git a/src/applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php b/src/applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php
index 59161d2814..fc89d310e1 100644
--- a/src/applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php
+++ b/src/applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php
@@ -60,7 +60,7 @@ final class PhabricatorConduitTokensSettingsPanel
javelin_tag(
'a',
array(
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
'href' => '/conduit/token/terminate/'.$token->getID().'/',
'sigil' => 'workflow',
),
diff --git a/src/applications/config/view/PhabricatorSetupIssueView.php b/src/applications/config/view/PhabricatorSetupIssueView.php
index 10e802eb3f..71bdb9d8dc 100644
--- a/src/applications/config/view/PhabricatorSetupIssueView.php
+++ b/src/applications/config/view/PhabricatorSetupIssueView.php
@@ -129,7 +129,7 @@ final class PhabricatorSetupIssueView extends AphrontView {
array(
'href' => '/config/unignore/'.$issue->getIssueKey().'/',
'sigil' => 'workflow',
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht('Unignore Setup Issue'));
} else {
@@ -138,7 +138,7 @@ final class PhabricatorSetupIssueView extends AphrontView {
array(
'href' => '/config/ignore/'.$issue->getIssueKey().'/',
'sigil' => 'workflow',
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht('Ignore Setup Issue'));
}
@@ -147,7 +147,7 @@ final class PhabricatorSetupIssueView extends AphrontView {
'a',
array(
'href' => '/config/issue/'.$issue->getIssueKey().'/',
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'style' => 'float: right',
),
pht('Reload Page'));
diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php
index 9d7473e159..f47e7bf1ad 100644
--- a/src/applications/conpherence/controller/ConpherenceController.php
+++ b/src/applications/conpherence/controller/ConpherenceController.php
@@ -140,7 +140,7 @@ abstract class ConpherenceController extends PhabricatorController {
'button',
array(
'type' => 'SUBMIT',
- 'class' => 'button green mlr',
+ 'class' => 'button button-green mlr',
),
pht('Join Room'));
diff --git a/src/applications/conpherence/controller/ConpherenceRoomPictureController.php b/src/applications/conpherence/controller/ConpherenceRoomPictureController.php
index 6a39481377..fbf3def9cd 100644
--- a/src/applications/conpherence/controller/ConpherenceRoomPictureController.php
+++ b/src/applications/conpherence/controller/ConpherenceRoomPictureController.php
@@ -132,7 +132,7 @@ final class ConpherenceRoomPictureController
$button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $spec['tip'],
diff --git a/src/applications/conpherence/view/ConpherenceDurableColumnView.php b/src/applications/conpherence/view/ConpherenceDurableColumnView.php
index 5d6a5eaaec..83c40aa32e 100644
--- a/src/applications/conpherence/view/ConpherenceDurableColumnView.php
+++ b/src/applications/conpherence/view/ConpherenceDurableColumnView.php
@@ -404,7 +404,7 @@ final class ConpherenceDurableColumnView extends AphrontTagView {
'a',
array(
'href' => '/conpherence/search/',
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht('Find Rooms')),
);
diff --git a/src/applications/console/plugin/DarkConsoleServicesPlugin.php b/src/applications/console/plugin/DarkConsoleServicesPlugin.php
index ea5a100550..7d779027da 100644
--- a/src/applications/console/plugin/DarkConsoleServicesPlugin.php
+++ b/src/applications/console/plugin/DarkConsoleServicesPlugin.php
@@ -170,7 +170,8 @@ final class DarkConsoleServicesPlugin extends DarkConsolePlugin {
'a',
array(
'href' => $data['analyzeURI'],
- 'class' => $data['didAnalyze'] ? 'disabled button' : 'green button',
+ 'class' => $data['didAnalyze'] ?
+ 'disabled button' : 'button button-green',
),
pht('Analyze Query Plans')),
phutil_tag('h1', array(), pht('Calls to External Services')),
diff --git a/src/applications/console/plugin/DarkConsoleXHProfPlugin.php b/src/applications/console/plugin/DarkConsoleXHProfPlugin.php
index f751cc31a5..f76b77c850 100644
--- a/src/applications/console/plugin/DarkConsoleXHProfPlugin.php
+++ b/src/applications/console/plugin/DarkConsoleXHProfPlugin.php
@@ -67,7 +67,7 @@ final class DarkConsoleXHProfPlugin extends DarkConsolePlugin {
'a',
array(
'href' => $profile_uri,
- 'class' => $run ? 'disabled button' : 'green button',
+ 'class' => $run ? 'disabled button' : 'button button-green',
),
pht('Profile Page')),
phutil_tag('h1', array(), pht('XHProf Profiler')),
diff --git a/src/applications/daemon/view/PhabricatorDaemonTasksTableView.php b/src/applications/daemon/view/PhabricatorDaemonTasksTableView.php
index 4fded0b68a..440610be25 100644
--- a/src/applications/daemon/view/PhabricatorDaemonTasksTableView.php
+++ b/src/applications/daemon/view/PhabricatorDaemonTasksTableView.php
@@ -41,7 +41,7 @@ final class PhabricatorDaemonTasksTableView extends AphrontView {
'a',
array(
'href' => '/daemon/task/'.$task->getID().'/',
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
),
pht('View Task')),
);
diff --git a/src/applications/differential/controller/DifferentialRevisionViewController.php b/src/applications/differential/controller/DifferentialRevisionViewController.php
index 769ac37e1a..69e45b377d 100644
--- a/src/applications/differential/controller/DifferentialRevisionViewController.php
+++ b/src/applications/differential/controller/DifferentialRevisionViewController.php
@@ -156,7 +156,7 @@ final class DifferentialRevisionViewController extends DifferentialController {
phutil_tag(
'a',
array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'href' => $request_uri
->alter('large', 'true')
->setFragment('toc'),
diff --git a/src/applications/differential/view/DifferentialChangesetListView.php b/src/applications/differential/view/DifferentialChangesetListView.php
index b8090b88a2..25f762ba66 100644
--- a/src/applications/differential/view/DifferentialChangesetListView.php
+++ b/src/applications/differential/view/DifferentialChangesetListView.php
@@ -174,7 +174,7 @@ final class DifferentialChangesetListView extends AphrontView {
$load = javelin_tag(
'a',
array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'href' => '#'.$uniq_id,
'sigil' => 'differential-load',
'meta' => array(
@@ -275,6 +275,10 @@ final class DifferentialChangesetListView extends AphrontView {
pht('Hide or show the current file.'),
'You must select a file to hide or show.' =>
pht('You must select a file to hide or show.'),
+
+ 'Unsaved' => pht('Unsaved'),
+ 'Unsubmitted' => pht('Unsubmitted'),
+ 'Comments' => pht('Comments'),
),
));
diff --git a/src/applications/diffusion/conduit/DiffusionSearchQueryConduitAPIMethod.php b/src/applications/diffusion/conduit/DiffusionSearchQueryConduitAPIMethod.php
index e9b8f8d15e..389f931c0f 100644
--- a/src/applications/diffusion/conduit/DiffusionSearchQueryConduitAPIMethod.php
+++ b/src/applications/diffusion/conduit/DiffusionSearchQueryConduitAPIMethod.php
@@ -57,11 +57,14 @@ final class DiffusionSearchQueryConduitAPIMethod
$results = array();
$future = $repository->getLocalCommandFuture(
// NOTE: --perl-regexp is available only with libpcre compiled in.
- 'grep --extended-regexp --null -n --no-color -e %s %s -- %s',
- $grep,
+ 'grep --extended-regexp --null -n --no-color -f - %s -- %s',
$drequest->getStableCommit(),
$path);
+ // NOTE: We're writing the pattern on stdin to avoid issues with UTF8
+ // being mangled by the shell. See T12807.
+ $future->write($grep);
+
$binary_pattern = '/Binary file [^:]*:(.+) matches/';
$lines = new LinesOfALargeExecFuture($future);
diff --git a/src/applications/diffusion/controller/DiffusionController.php b/src/applications/diffusion/controller/DiffusionController.php
index a296761bdf..52465da410 100644
--- a/src/applications/diffusion/controller/DiffusionController.php
+++ b/src/applications/diffusion/controller/DiffusionController.php
@@ -333,6 +333,7 @@ abstract class DiffusionController extends PhabricatorController {
$tag = id(new PHUITagView())
->setName($commit)
->setColor(PHUITagView::COLOR_INDIGO)
+ ->setBorder(PHUITagView::BORDER_NONE)
->setType(PHUITagView::TYPE_SHADE);
return $tag;
diff --git a/src/applications/diffusion/controller/DiffusionHistoryController.php b/src/applications/diffusion/controller/DiffusionHistoryController.php
index 8ee6c848a7..b8a1877ddf 100644
--- a/src/applications/diffusion/controller/DiffusionHistoryController.php
+++ b/src/applications/diffusion/controller/DiffusionHistoryController.php
@@ -69,7 +69,8 @@ final class DiffusionHistoryController extends DiffusionController {
return $this->newPage()
->setTitle($title)
->setCrumbs($crumbs)
- ->appendChild($view);
+ ->appendChild($view)
+ ->addClass('diffusion-history-view');
}
private function buildHeader(DiffusionRequest $drequest) {
diff --git a/src/applications/diffusion/view/DiffusionCommitListView.php b/src/applications/diffusion/view/DiffusionCommitListView.php
index f1d1ebc8e4..4d4bcc1020 100644
--- a/src/applications/diffusion/view/DiffusionCommitListView.php
+++ b/src/applications/diffusion/view/DiffusionCommitListView.php
@@ -94,18 +94,10 @@ final class DiffusionCommitListView extends AphrontView {
$handles = $viewer->loadHandles($phids);
$cur_date = 0;
- $list = null;
- $header = null;
$view = array();
foreach ($this->commits as $commit) {
- $new_date = date('Ymd', $commit->getEpoch());
- if ($cur_date != $new_date) {
- if ($list) {
- $view[] = id(new PHUIObjectBoxView())
- ->setHeader($header)
- ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
- ->setObjectList($list);
- }
+ $new_date = phabricator_date($commit->getEpoch(), $viewer);
+ if ($cur_date !== $new_date) {
$date = ucfirst(
phabricator_relative_date($commit->getEpoch(), $viewer));
$header = id(new PHUIHeaderView())
@@ -113,6 +105,11 @@ final class DiffusionCommitListView extends AphrontView {
$list = id(new PHUIObjectItemListView())
->setFlush(true)
->addClass('diffusion-history-list');
+
+ $view[] = id(new PHUIObjectBoxView())
+ ->setHeader($header)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->setObjectList($list);
}
$commit_phid = $commit->getPHID();
@@ -146,6 +143,7 @@ final class DiffusionCommitListView extends AphrontView {
->setName($commit_name)
->setType(PHUITagView::TYPE_SHADE)
->setColor(PHUITagView::COLOR_INDIGO)
+ ->setBorder(PHUITagView::BORDER_NONE)
->setSlimShady(true);
$item = id(new PHUIObjectItemView())
diff --git a/src/applications/diffusion/view/DiffusionHistoryListView.php b/src/applications/diffusion/view/DiffusionHistoryListView.php
index 533e15d644..9d6727a357 100644
--- a/src/applications/diffusion/view/DiffusionHistoryListView.php
+++ b/src/applications/diffusion/view/DiffusionHistoryListView.php
@@ -110,7 +110,7 @@ final class DiffusionHistoryListView extends DiffusionHistoryView {
->setType(PHUITagView::TYPE_SHADE)
->setColor(PHUITagView::COLOR_BLUE)
->setHref('/D'.$d_id)
- ->addClass('diffusion-differential-tag')
+ ->setBorder(PHUITagView::BORDER_NONE)
->setSlimShady(true);
}
}
@@ -155,6 +155,7 @@ final class DiffusionHistoryListView extends DiffusionHistoryView {
->setName($commit_name)
->setType(PHUITagView::TYPE_SHADE)
->setColor(PHUITagView::COLOR_INDIGO)
+ ->setBorder(PHUITagView::BORDER_NONE)
->setSlimShady(true);
$item = id(new PHUIObjectItemView())
diff --git a/src/applications/files/controller/PhabricatorFileComposeController.php b/src/applications/files/controller/PhabricatorFileComposeController.php
index 7afd99330a..b06e855617 100644
--- a/src/applications/files/controller/PhabricatorFileComposeController.php
+++ b/src/applications/files/controller/PhabricatorFileComposeController.php
@@ -82,7 +82,7 @@ final class PhabricatorFileComposeController
$buttons[] = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip compose-select-color',
'style' => 'margin: 0 8px 8px 0',
'meta' => array(
@@ -102,7 +102,7 @@ final class PhabricatorFileComposeController
$icons[] = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip compose-select-icon',
'style' => 'margin: 0 8px 8px 0',
'meta' => array(
diff --git a/src/applications/files/controller/PhabricatorFileTransformListController.php b/src/applications/files/controller/PhabricatorFileTransformListController.php
index 026f60320e..ab5322fc1a 100644
--- a/src/applications/files/controller/PhabricatorFileTransformListController.php
+++ b/src/applications/files/controller/PhabricatorFileTransformListController.php
@@ -68,7 +68,7 @@ final class PhabricatorFileTransformListController
$view_link = phutil_tag(
'a',
array(
- 'class' => 'small grey button',
+ 'class' => 'small button button-grey',
'href' => $view_href,
),
$view_text);
diff --git a/src/applications/herald/controller/HeraldRuleController.php b/src/applications/herald/controller/HeraldRuleController.php
index 74ce553f9c..0e7f6b0aa5 100644
--- a/src/applications/herald/controller/HeraldRuleController.php
+++ b/src/applications/herald/controller/HeraldRuleController.php
@@ -191,7 +191,7 @@ final class HeraldRuleController extends HeraldController {
'a',
array(
'href' => '#',
- 'class' => 'button green',
+ 'class' => 'button button-green',
'sigil' => 'create-condition',
'mustcapture' => true,
),
@@ -212,7 +212,7 @@ final class HeraldRuleController extends HeraldController {
'a',
array(
'href' => '#',
- 'class' => 'button green',
+ 'class' => 'button button-green',
'sigil' => 'create-action',
'mustcapture' => true,
),
diff --git a/src/applications/maniphest/controller/ManiphestBatchEditController.php b/src/applications/maniphest/controller/ManiphestBatchEditController.php
index 90fcda28ec..f2ec4b433f 100644
--- a/src/applications/maniphest/controller/ManiphestBatchEditController.php
+++ b/src/applications/maniphest/controller/ManiphestBatchEditController.php
@@ -173,7 +173,7 @@ final class ManiphestBatchEditController extends ManiphestController {
'a',
array(
'href' => '#',
- 'class' => 'button green',
+ 'class' => 'button button-green',
'sigil' => 'add-action',
'mustcapture' => true,
),
diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php
index 92fe703f91..ecfb723f97 100644
--- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php
+++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php
@@ -36,6 +36,7 @@ final class ManiphestTaskDetailController extends ManiphestController {
ManiphestTaskHasMockEdgeType::EDGECONST,
PhabricatorObjectMentionedByObjectEdgeType::EDGECONST,
PhabricatorObjectMentionsObjectEdgeType::EDGECONST,
+ ManiphestTaskHasDuplicateTaskEdgeType::EDGECONST,
);
$phid = $task->getPHID();
@@ -159,6 +160,7 @@ final class ManiphestTaskDetailController extends ManiphestController {
$related_tabs[] = $this->newMocksTab($task, $query);
$related_tabs[] = $this->newMentionsTab($task, $query);
+ $related_tabs[] = $this->newDuplicatesTab($task, $query);
$tab_view = null;
@@ -553,6 +555,32 @@ final class ManiphestTaskDetailController extends ManiphestController {
->appendChild($view);
}
+ private function newDuplicatesTab(
+ ManiphestTask $task,
+ PhabricatorEdgeQuery $edge_query) {
+
+ $in_type = ManiphestTaskHasDuplicateTaskEdgeType::EDGECONST;
+ $in_phids = $edge_query->getDestinationPHIDs(array(), array($in_type));
+
+ $viewer = $this->getViewer();
+ $in_handles = $viewer->loadHandles($in_phids);
+ $in_handles = $this->getCompleteHandles($in_handles);
+
+ $view = new PHUIPropertyListView();
+
+ if (!count($in_handles)) {
+ return null;
+ }
+
+ $view->addProperty(
+ pht('Duplicates Merged Here'), $in_handles->renderList());
+
+ return id(new PHUITabView())
+ ->setName(pht('Duplicates'))
+ ->setKey('duplicates')
+ ->appendChild($view);
+ }
+
private function getCompleteHandles(PhabricatorHandleList $handles) {
$phids = array();
diff --git a/src/applications/maniphest/view/ManiphestTaskResultListView.php b/src/applications/maniphest/view/ManiphestTaskResultListView.php
index 9e28e89d8d..0144df0e33 100644
--- a/src/applications/maniphest/view/ManiphestTaskResultListView.php
+++ b/src/applications/maniphest/view/ManiphestTaskResultListView.php
@@ -196,7 +196,7 @@ final class ManiphestTaskResultListView extends ManiphestView {
array(
'href' => '#',
'mustcapture' => true,
- 'class' => 'grey button',
+ 'class' => 'button button-grey',
'id' => 'batch-select-all',
),
pht('Select All'));
@@ -206,7 +206,7 @@ final class ManiphestTaskResultListView extends ManiphestView {
array(
'href' => '#',
'mustcapture' => true,
- 'class' => 'grey button',
+ 'class' => 'button button-grey',
'id' => 'batch-select-none',
),
pht('Clear Selection'));
@@ -224,7 +224,7 @@ final class ManiphestTaskResultListView extends ManiphestView {
'a',
array(
'href' => '/maniphest/export/'.$saved_query->getQueryKey().'/',
- 'class' => 'grey button',
+ 'class' => 'button button-grey',
),
pht('Export to Excel'));
diff --git a/src/applications/metamta/PhabricatorMetaMTAWorker.php b/src/applications/metamta/PhabricatorMetaMTAWorker.php
index af655f4e0f..dcc6a8dc5e 100644
--- a/src/applications/metamta/PhabricatorMetaMTAWorker.php
+++ b/src/applications/metamta/PhabricatorMetaMTAWorker.php
@@ -13,10 +13,6 @@ final class PhabricatorMetaMTAWorker
protected function doWork() {
$message = $this->loadMessage();
- if (!$message) {
- throw new PhabricatorWorkerPermanentFailureException(
- pht('Unable to load message!'));
- }
if ($message->getStatus() != PhabricatorMailOutboundStatus::STATUS_QUEUE) {
return;
@@ -32,7 +28,18 @@ final class PhabricatorMetaMTAWorker
private function loadMessage() {
$message_id = $this->getTaskData();
- return id(new PhabricatorMetaMTAMail())->load($message_id);
+ $message = id(new PhabricatorMetaMTAMail())
+ ->load($message_id);
+
+ if (!$message) {
+ throw new PhabricatorWorkerPermanentFailureException(
+ pht(
+ 'Unable to load mail message (with ID "%s") while preparing to '.
+ 'deliver it.',
+ $message_id));
+ }
+
+ return $message;
}
public function renderForDisplay(PhabricatorUser $viewer) {
diff --git a/src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php b/src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
index a2d32e3360..afde9fee23 100644
--- a/src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
+++ b/src/applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php
@@ -341,7 +341,7 @@ final class PhabricatorMetaMTAApplicationEmailPanel
$button_edit = javelin_tag(
'a',
array(
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
'href' => $uri->alter('edit', $email->getID()),
'sigil' => 'workflow',
),
@@ -350,7 +350,7 @@ final class PhabricatorMetaMTAApplicationEmailPanel
$button_remove = javelin_tag(
'a',
array(
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
'href' => $uri->alter('delete', $email->getID()),
'sigil' => 'workflow',
),
diff --git a/src/applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php b/src/applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php
index 06f26b2ee3..596f3decc9 100644
--- a/src/applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php
+++ b/src/applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php
@@ -87,7 +87,7 @@ final class PhabricatorOAuthServerAuthorizationsSettingsPanel
'a',
array(
'href' => $this->getPanelURI('?revoke='.$authorization->getID()),
- 'class' => 'small grey button',
+ 'class' => 'small button button-grey',
'sigil' => 'workflow',
),
pht('Revoke'));
diff --git a/src/applications/owners/controller/PhabricatorOwnersPathsController.php b/src/applications/owners/controller/PhabricatorOwnersPathsController.php
index b69faf5648..e5463b4cb4 100644
--- a/src/applications/owners/controller/PhabricatorOwnersPathsController.php
+++ b/src/applications/owners/controller/PhabricatorOwnersPathsController.php
@@ -124,7 +124,7 @@ final class PhabricatorOwnersPathsController
'a',
array(
'href' => '#',
- 'class' => 'button green',
+ 'class' => 'button button-green',
'sigil' => 'addpath',
'mustcapture' => true,
),
diff --git a/src/applications/passphrase/view/PassphraseCredentialControl.php b/src/applications/passphrase/view/PassphraseCredentialControl.php
index 015dce1f40..411afd6f85 100644
--- a/src/applications/passphrase/view/PassphraseCredentialControl.php
+++ b/src/applications/passphrase/view/PassphraseCredentialControl.php
@@ -113,7 +113,7 @@ final class PassphraseCredentialControl extends AphrontFormControl {
'a',
array(
'href' => '#',
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'sigil' => 'passphrase-credential-add',
'mustcapture' => true,
),
diff --git a/src/applications/people/controller/PhabricatorPeopleProfilePictureController.php b/src/applications/people/controller/PhabricatorPeopleProfilePictureController.php
index cff833aa51..5cab924255 100644
--- a/src/applications/people/controller/PhabricatorPeopleProfilePictureController.php
+++ b/src/applications/people/controller/PhabricatorPeopleProfilePictureController.php
@@ -190,7 +190,7 @@ final class PhabricatorPeopleProfilePictureController
$button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $spec['tip'],
diff --git a/src/applications/phame/controller/blog/PhameBlogProfilePictureController.php b/src/applications/phame/controller/blog/PhameBlogProfilePictureController.php
index 04b41dbb79..4e69034253 100644
--- a/src/applications/phame/controller/blog/PhameBlogProfilePictureController.php
+++ b/src/applications/phame/controller/blog/PhameBlogProfilePictureController.php
@@ -133,7 +133,7 @@ final class PhameBlogProfilePictureController
$button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $spec['tip'],
diff --git a/src/applications/pholio/view/PholioUploadedImageView.php b/src/applications/pholio/view/PholioUploadedImageView.php
index 460b54c517..e583fa687b 100644
--- a/src/applications/pholio/view/PholioUploadedImageView.php
+++ b/src/applications/pholio/view/PholioUploadedImageView.php
@@ -120,7 +120,7 @@ final class PholioUploadedImageView extends AphrontView {
return javelin_tag(
'a',
array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'sigil' => 'pholio-drop-remove',
),
'X');
diff --git a/src/applications/phortune/controller/cart/PhortuneCartCheckoutController.php b/src/applications/phortune/controller/cart/PhortuneCartCheckoutController.php
index fdc19dae44..dd611ecb7b 100644
--- a/src/applications/phortune/controller/cart/PhortuneCartCheckoutController.php
+++ b/src/applications/phortune/controller/cart/PhortuneCartCheckoutController.php
@@ -152,7 +152,7 @@ final class PhortuneCartCheckoutController
$new_method = javelin_tag(
'a',
array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'href' => $payment_method_uri,
),
pht('Add New Payment Method'));
diff --git a/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php b/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php
index 469887172f..cbd122f682 100644
--- a/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php
+++ b/src/applications/phortune/controller/merchant/PhortuneMerchantPictureController.php
@@ -133,7 +133,7 @@ final class PhortuneMerchantPictureController
$button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $spec['tip'],
diff --git a/src/applications/phortune/controller/subscription/PhortuneSubscriptionEditController.php b/src/applications/phortune/controller/subscription/PhortuneSubscriptionEditController.php
index 7af8aa3456..185bbdbcc6 100644
--- a/src/applications/phortune/controller/subscription/PhortuneSubscriptionEditController.php
+++ b/src/applications/phortune/controller/subscription/PhortuneSubscriptionEditController.php
@@ -123,7 +123,7 @@ final class PhortuneSubscriptionEditController extends PhortuneController {
'a',
array(
'href' => $uri,
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht('Add Payment Method...'));
diff --git a/src/applications/phortune/view/PhortuneOrderTableView.php b/src/applications/phortune/view/PhortuneOrderTableView.php
index a2e492c5be..435f5151d0 100644
--- a/src/applications/phortune/view/PhortuneOrderTableView.php
+++ b/src/applications/phortune/view/PhortuneOrderTableView.php
@@ -101,7 +101,7 @@ final class PhortuneOrderTableView extends AphrontView {
'a',
array(
'href' => $cart->getCheckoutURI(),
- 'class' => 'small green button',
+ 'class' => 'small button button-green',
),
pht('Pay Now')),
);
diff --git a/src/applications/phriction/controller/PhrictionDiffController.php b/src/applications/phriction/controller/PhrictionDiffController.php
index 8ae9618bbd..b66a3b3094 100644
--- a/src/applications/phriction/controller/PhrictionDiffController.php
+++ b/src/applications/phriction/controller/PhrictionDiffController.php
@@ -103,7 +103,7 @@ final class PhrictionDiffController extends PhrictionController {
'a',
array(
'href' => $uri->alter('l', $l - 1)->alter('r', $r - 1),
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht("\xC2\xAB Previous Change"));
} else {
@@ -111,7 +111,7 @@ final class PhrictionDiffController extends PhrictionController {
'a',
array(
'href' => '#',
- 'class' => 'button grey disabled',
+ 'class' => 'button button-grey disabled',
),
pht('Original Change'));
}
@@ -122,7 +122,7 @@ final class PhrictionDiffController extends PhrictionController {
'a',
array(
'href' => $uri->alter('l', $l + 1)->alter('r', $r + 1),
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht("Next Change \xC2\xBB"));
} else {
@@ -130,7 +130,7 @@ final class PhrictionDiffController extends PhrictionController {
'a',
array(
'href' => '#',
- 'class' => 'button grey disabled',
+ 'class' => 'button button-grey disabled',
),
pht('Most Recent Change'));
}
@@ -200,7 +200,7 @@ final class PhrictionDiffController extends PhrictionController {
'a',
array(
'href' => '/phriction/edit/'.$document_id.'/',
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht('Edit Current Version'));
}
@@ -210,7 +210,7 @@ final class PhrictionDiffController extends PhrictionController {
'a',
array(
'href' => '/phriction/edit/'.$document_id.'/?revert='.$version,
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
),
pht('Revert to Version %s...', $version));
}
diff --git a/src/applications/policy/controller/PhabricatorPolicyEditController.php b/src/applications/policy/controller/PhabricatorPolicyEditController.php
index 75701cc748..f211aa754d 100644
--- a/src/applications/policy/controller/PhabricatorPolicyEditController.php
+++ b/src/applications/policy/controller/PhabricatorPolicyEditController.php
@@ -199,7 +199,7 @@ final class PhabricatorPolicyEditController
'a',
array(
'href' => '#',
- 'class' => 'button green',
+ 'class' => 'button button-green',
'sigil' => 'create-rule',
'mustcapture' => true,
),
diff --git a/src/applications/project/controller/PhabricatorProjectBoardBackgroundController.php b/src/applications/project/controller/PhabricatorProjectBoardBackgroundController.php
index be4049bb73..b229f59ecb 100644
--- a/src/applications/project/controller/PhabricatorProjectBoardBackgroundController.php
+++ b/src/applications/project/controller/PhabricatorProjectBoardBackgroundController.php
@@ -138,7 +138,7 @@ final class PhabricatorProjectBoardBackgroundController
$button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $option['name'],
diff --git a/src/applications/project/controller/PhabricatorProjectEditPictureController.php b/src/applications/project/controller/PhabricatorProjectEditPictureController.php
index 95d3bbd855..5060d0a203 100644
--- a/src/applications/project/controller/PhabricatorProjectEditPictureController.php
+++ b/src/applications/project/controller/PhabricatorProjectEditPictureController.php
@@ -134,7 +134,7 @@ final class PhabricatorProjectEditPictureController
$button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $spec['tip'],
@@ -285,7 +285,7 @@ final class PhabricatorProjectEditPictureController
$default_button = javelin_tag(
'button',
array(
- 'class' => 'grey profile-image-button',
+ 'class' => 'button-grey profile-image-button',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => pht('Use Icon and Color'),
diff --git a/src/applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php b/src/applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php
index 31249985e4..d628341dea 100644
--- a/src/applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php
+++ b/src/applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php
@@ -63,7 +63,7 @@ final class PhabricatorEmailAddressesSettingsPanel
$button_verify = javelin_tag(
'a',
array(
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
'href' => $uri->alter('verify', $email->getID()),
'sigil' => 'workflow',
),
@@ -72,7 +72,7 @@ final class PhabricatorEmailAddressesSettingsPanel
$button_make_primary = javelin_tag(
'a',
array(
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
'href' => $uri->alter('primary', $email->getID()),
'sigil' => 'workflow',
),
@@ -81,7 +81,7 @@ final class PhabricatorEmailAddressesSettingsPanel
$button_remove = javelin_tag(
'a',
array(
- 'class' => 'button small grey',
+ 'class' => 'button small button-grey',
'href' => $uri->alter('delete', $email->getID()),
'sigil' => 'workflow',
),
diff --git a/src/applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php b/src/applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php
index 77eb1c55d5..8f1a5c643c 100644
--- a/src/applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php
+++ b/src/applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php
@@ -69,7 +69,7 @@ final class PhabricatorMultiFactorSettingsPanel
array(
'href' => $this->getPanelURI('?delete='.$factor->getID()),
'sigil' => 'workflow',
- 'class' => 'small grey button',
+ 'class' => 'small button button-grey',
),
pht('Remove')),
);
diff --git a/src/applications/settings/panel/PhabricatorSessionsSettingsPanel.php b/src/applications/settings/panel/PhabricatorSessionsSettingsPanel.php
index a468ed53d0..e643f2ee08 100644
--- a/src/applications/settings/panel/PhabricatorSessionsSettingsPanel.php
+++ b/src/applications/settings/panel/PhabricatorSessionsSettingsPanel.php
@@ -58,7 +58,7 @@ final class PhabricatorSessionsSettingsPanel extends PhabricatorSettingsPanel {
$button = phutil_tag(
'a',
array(
- 'class' => 'small grey button disabled',
+ 'class' => 'small button button-grey disabled',
),
pht('Current'));
} else {
@@ -67,7 +67,7 @@ final class PhabricatorSessionsSettingsPanel extends PhabricatorSettingsPanel {
'a',
array(
'href' => '/auth/session/terminate/'.$session->getID().'/',
- 'class' => 'small grey button',
+ 'class' => 'small button button-grey',
'sigil' => 'workflow',
),
pht('Terminate'));
diff --git a/src/applications/settings/panel/PhabricatorTokensSettingsPanel.php b/src/applications/settings/panel/PhabricatorTokensSettingsPanel.php
index d2e0be4a53..c2659d5226 100644
--- a/src/applications/settings/panel/PhabricatorTokensSettingsPanel.php
+++ b/src/applications/settings/panel/PhabricatorTokensSettingsPanel.php
@@ -30,7 +30,7 @@ final class PhabricatorTokensSettingsPanel extends PhabricatorSettingsPanel {
'a',
array(
'href' => '/auth/token/revoke/'.$token->getID().'/',
- 'class' => 'small grey button',
+ 'class' => 'small button button-grey',
'sigil' => 'workflow',
),
pht('Revoke'));
@@ -38,7 +38,7 @@ final class PhabricatorTokensSettingsPanel extends PhabricatorSettingsPanel {
$button = javelin_tag(
'a',
array(
- 'class' => 'small grey button disabled',
+ 'class' => 'small button button-grey disabled',
),
pht('Revoke'));
}
diff --git a/src/applications/uiexample/examples/PHUIBoxExample.php b/src/applications/uiexample/examples/PHUIBoxExample.php
index 4a551de707..f77ac3afd4 100644
--- a/src/applications/uiexample/examples/PHUIBoxExample.php
+++ b/src/applications/uiexample/examples/PHUIBoxExample.php
@@ -68,21 +68,10 @@ final class PHUIBoxExample extends PhabricatorUIExample {
->setText(pht('Such Wow'))
->addClass(PHUI::MARGIN_SMALL_RIGHT);
- $badge1 = id(new PHUIBadgeMiniView())
- ->setIcon('fa-bug')
- ->setHeader(pht('Bugmeister'));
-
- $badge2 = id(new PHUIBadgeMiniView())
- ->setIcon('fa-heart')
- ->setHeader(pht('Funder'))
- ->setQuality(PhabricatorBadgesQuality::UNCOMMON);
-
$header = id(new PHUIHeaderView())
->setHeader(pht('Fancy Box'))
->addActionLink($button)
- ->setSubheader(pht('Much Features'))
- ->addBadge($badge1)
- ->addBadge($badge2);
+ ->setSubheader(pht('Much Features'));
$obj4 = id(new PHUIObjectBoxView())
->setHeader($header)
@@ -116,7 +105,9 @@ final class PHUIBoxExample extends PhabricatorUIExample {
return phutil_tag(
'div',
- array(),
+ array(
+ 'class' => 'ml',
+ ),
array(
$head1,
$wrap1,
diff --git a/src/applications/uiexample/examples/PHUIButtonExample.php b/src/applications/uiexample/examples/PHUIButtonExample.php
index aed5d5bf08..fe58123f03 100644
--- a/src/applications/uiexample/examples/PHUIButtonExample.php
+++ b/src/applications/uiexample/examples/PHUIButtonExample.php
@@ -16,63 +16,11 @@ final class PHUIButtonExample extends PhabricatorUIExample {
$request = $this->getRequest();
$user = $request->getUser();
- $colors = array('', 'green', 'grey', 'disabled');
- $sizes = array('', 'small');
- $tags = array('a', 'button');
-
- // phutil_tag
-
- $column = array();
- foreach ($tags as $tag) {
- foreach ($colors as $color) {
- foreach ($sizes as $key => $size) {
- $class = implode(' ', array($color, $size));
-
- if ($tag == 'a') {
- $class .= ' button';
- }
-
- $column[$key][] = phutil_tag(
- $tag,
- array(
- 'class' => $class,
- ),
- phutil_utf8_ucwords($size.' '.$color.' '.$tag));
-
- $column[$key][] = hsprintf('
');
- }
- }
- }
-
- $column3 = array();
- foreach ($colors as $color) {
- $caret = phutil_tag('span', array('class' => 'caret'), '');
- $column3[] = phutil_tag(
- 'a',
- array(
- 'class' => $color.' button dropdown',
- ),
- array(
- phutil_utf8_ucwords($color.' Dropdown'),
- $caret,
- ));
- $column3[] = hsprintf('
');
- }
-
- $layout1 = id(new AphrontMultiColumnView())
- ->addColumn($column[0])
- ->addColumn($column[1])
- ->addColumn($column3)
- ->setFluidLayout(true)
- ->setGutter(AphrontMultiColumnView::GUTTER_MEDIUM);
-
// PHUIButtonView
-
$colors = array(
null,
PHUIButtonView::GREEN,
PHUIButtonView::GREY,
- PHUIButtonView::DISABLED,
);
$sizes = array(null, PHUIButtonView::SMALL);
$column = array();
@@ -223,24 +171,21 @@ final class PHUIButtonExample extends PhabricatorUIExample {
// Set it and forget it
- $head1 = id(new PHUIHeaderView())
- ->setHeader('phutil_tag');
-
$head2 = id(new PHUIHeaderView())
- ->setHeader('PHUIButtonView');
+ ->setHeader('PHUIButtonView')
+ ->addClass('ml');
$head3 = id(new PHUIHeaderView())
- ->setHeader(pht('Icon Buttons'));
+ ->setHeader(pht('Icon Buttons'))
+ ->addClass('ml');
$head4 = id(new PHUIHeaderView())
- ->setHeader(pht('Simple Buttons'));
+ ->setHeader(pht('Simple Buttons'))
+ ->addClass('ml');
$head5 = id(new PHUIHeaderView())
- ->setHeader(pht('Big Icon Buttons'));
-
- $wrap1 = id(new PHUIBoxView())
- ->appendChild($layout1)
- ->addMargin(PHUI::MARGIN_LARGE);
+ ->setHeader(pht('Big Icon Buttons'))
+ ->addClass('ml');
$wrap2 = id(new PHUIBoxView())
->appendChild($layout2)
@@ -259,8 +204,6 @@ final class PHUIButtonExample extends PhabricatorUIExample {
->addMargin(PHUI::MARGIN_LARGE);
return array(
- $head1,
- $wrap1,
$head2,
$wrap2,
$head3,
diff --git a/src/applications/uiexample/examples/PHUIColorPalletteExample.php b/src/applications/uiexample/examples/PHUIColorPalletteExample.php
index a8910b930d..ea8ac538be 100644
--- a/src/applications/uiexample/examples/PHUIColorPalletteExample.php
+++ b/src/applications/uiexample/examples/PHUIColorPalletteExample.php
@@ -101,7 +101,7 @@ final class PHUIColorPalletteExample extends PhabricatorUIExample {
'a',
array(
'href' => 'http://color.hailpixel.com/#'.implode(',', $url),
- 'class' => 'button grey mlb',
+ 'class' => 'button button-grey mlb',
),
pht('Color Palette'));
diff --git a/src/applications/uiexample/examples/PHUIHovercardUIExample.php b/src/applications/uiexample/examples/PHUIHovercardUIExample.php
index 8cdec56d68..b88fdc6639 100644
--- a/src/applications/uiexample/examples/PHUIHovercardUIExample.php
+++ b/src/applications/uiexample/examples/PHUIHovercardUIExample.php
@@ -55,14 +55,6 @@ final class PHUIHovercardUIExample extends PhabricatorUIExample {
->addTag($tag));
$elements[] = $panel;
- $badge1 = id(new PHUIBadgeMiniView())
- ->setIcon('fa-book')
- ->setHeader(pht('Documenter'));
-
- $badge2 = id(new PHUIBadgeMiniView())
- ->setIcon('fa-star')
- ->setHeader(pht('Contributor'));
-
$user_handle = $this->createBasicDummyHandle(
'gwashington',
PhabricatorPeopleUserPHIDType::TYPECONST,
@@ -75,8 +67,6 @@ final class PHUIHovercardUIExample extends PhabricatorUIExample {
->addField(pht('Status'), pht('Available'))
->addField(pht('Member since'), '30. February 1750')
->addAction(pht('Send a Message'), '/dev/null')
- ->addBadge($badge1)
- ->addBadge($badge2)
->setUser($user));
$elements[] = $panel;
diff --git a/src/applications/uiexample/examples/PhabricatorNotificationUIExample.php b/src/applications/uiexample/examples/PhabricatorNotificationUIExample.php
index 5d15d884cc..4f39df6065 100644
--- a/src/applications/uiexample/examples/PhabricatorNotificationUIExample.php
+++ b/src/applications/uiexample/examples/PhabricatorNotificationUIExample.php
@@ -24,7 +24,7 @@ final class PhabricatorNotificationUIExample extends PhabricatorUIExample {
'a',
array(
'sigil' => 'notification-example',
- 'class' => 'button green',
+ 'class' => 'button button-green',
),
pht('Show Notification'));
diff --git a/src/infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php b/src/infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php
index 57a69843a4..c2276843db 100644
--- a/src/infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php
+++ b/src/infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php
@@ -23,11 +23,15 @@ final class PhabricatorTaskmasterDaemon extends PhabricatorDaemon {
$ex = $task->getExecutionException();
if ($ex) {
if ($ex instanceof PhabricatorWorkerPermanentFailureException) {
- $this->log(
+ // NOTE: Make sure these reach the daemon log, even when not
+ // running in "phd.verbose" mode. See T12803 for discussion.
+ $log_exception = new PhutilProxyException(
pht(
- 'Task %d was cancelled: %s',
- $id,
- $ex->getMessage()));
+ 'Task "%s" encountered a permanent failure and was '.
+ 'cancelled.',
+ $id),
+ $ex);
+ phlog($log_exception);
} else if ($ex instanceof PhabricatorWorkerYieldException) {
$this->log(pht('Task %s yielded.', $id));
} else {
diff --git a/src/infrastructure/diff/view/PHUIDiffInlineCommentDetailView.php b/src/infrastructure/diff/view/PHUIDiffInlineCommentDetailView.php
index a42efa932a..46853e185c 100644
--- a/src/infrastructure/diff/view/PHUIDiffInlineCommentDetailView.php
+++ b/src/infrastructure/diff/view/PHUIDiffInlineCommentDetailView.php
@@ -107,6 +107,11 @@ final class PHUIDiffInlineCommentDetailView
break;
}
+ $is_synthetic = false;
+ if ($inline->getSyntheticAuthor()) {
+ $is_synthetic = true;
+ }
+
$metadata = array(
'id' => $inline->getID(),
'phid' => $inline->getPHID(),
@@ -120,6 +125,7 @@ final class PHUIDiffInlineCommentDetailView
'isDraft' => $inline->isDraft(),
'isFixed' => $is_fixed,
'isGhost' => $inline->getIsGhost(),
+ 'isSynthetic' => $is_synthetic,
);
$sigil = 'differential-inline-comment';
@@ -136,11 +142,6 @@ final class PHUIDiffInlineCommentDetailView
$links = array();
- $is_synthetic = false;
- if ($inline->getSyntheticAuthor()) {
- $is_synthetic = true;
- }
-
$draft_text = null;
if (!$is_synthetic) {
// This display is controlled by CSS
diff --git a/src/view/AphrontDialogView.php b/src/view/AphrontDialogView.php
index 4616393813..12bec92843 100644
--- a/src/view/AphrontDialogView.php
+++ b/src/view/AphrontDialogView.php
@@ -248,7 +248,7 @@ final class AphrontDialogView
'a',
array(
'href' => $this->cancelURI,
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'name' => '__cancel__',
'sigil' => 'jx-workflow-button',
'meta' => $meta,
diff --git a/src/view/form/control/AphrontFormPolicyControl.php b/src/view/form/control/AphrontFormPolicyControl.php
index 6f343bf00e..0b0e608048 100644
--- a/src/view/form/control/AphrontFormPolicyControl.php
+++ b/src/view/form/control/AphrontFormPolicyControl.php
@@ -324,7 +324,8 @@ final class AphrontFormPolicyControl extends AphrontFormControl {
javelin_tag(
'a',
array(
- 'class' => 'grey button dropdown has-icon has-text policy-control',
+ 'class' => 'button button-grey dropdown has-icon has-text '.
+ 'policy-control',
'href' => '#',
'mustcapture' => true,
'sigil' => 'policy-control',
diff --git a/src/view/form/control/PHUIFormIconSetControl.php b/src/view/form/control/PHUIFormIconSetControl.php
index 459bff08fa..96b1ad99b8 100644
--- a/src/view/form/control/PHUIFormIconSetControl.php
+++ b/src/view/form/control/PHUIFormIconSetControl.php
@@ -30,7 +30,7 @@ final class PHUIFormIconSetControl
$classes = array();
$classes[] = 'button';
- $classes[] = 'grey';
+ $classes[] = 'button-grey';
if ($is_disabled) {
$classes[] = 'disabled';
diff --git a/src/view/layout/AphrontListFilterView.php b/src/view/layout/AphrontListFilterView.php
index 7a6be9c3d2..f764964934 100644
--- a/src/view/layout/AphrontListFilterView.php
+++ b/src/view/layout/AphrontListFilterView.php
@@ -44,7 +44,7 @@ final class AphrontListFilterView extends AphrontView {
$hide_action = javelin_tag(
'a',
array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'sigil' => 'reveal-content',
'id' => $hide_action_id,
'href' => $this->showHideHref,
@@ -65,7 +65,7 @@ final class AphrontListFilterView extends AphrontView {
$show_action = javelin_tag(
'a',
array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'sigil' => 'reveal-content',
'style' => 'display: none;',
'href' => '#',
diff --git a/src/view/phui/PHUIButtonView.php b/src/view/phui/PHUIButtonView.php
index 2e269bd9af..10ce5b5876 100644
--- a/src/view/phui/PHUIButtonView.php
+++ b/src/view/phui/PHUIButtonView.php
@@ -4,6 +4,7 @@ final class PHUIButtonView extends AphrontTagView {
const GREEN = 'green';
const GREY = 'grey';
+ const BLUE = 'blue';
const DISABLED = 'disabled';
const SMALL = 'small';
@@ -159,7 +160,7 @@ final class PHUIButtonView extends AphrontTagView {
$classes[] = 'button';
if ($this->color) {
- $classes[] = $this->color;
+ $classes[] = 'button-'.$this->color;
}
if ($this->size) {
@@ -188,10 +189,10 @@ final class PHUIButtonView extends AphrontTagView {
switch ($this->getButtonType()) {
case self::BUTTONTYPE_DEFAULT:
- // Nothing special for default buttons.
+ $classes[] = 'phui-button-default';
break;
case self::BUTTONTYPE_SIMPLE:
- $classes[] = 'simple';
+ $classes[] = 'phui-button-simple';
break;
}
diff --git a/src/view/phui/PHUIHeaderView.php b/src/view/phui/PHUIHeaderView.php
index ab576c64d5..dc836f3d3a 100644
--- a/src/view/phui/PHUIHeaderView.php
+++ b/src/view/phui/PHUIHeaderView.php
@@ -21,7 +21,6 @@ final class PHUIHeaderView extends AphrontTagView {
private $policyObject;
private $epoch;
private $actionItems = array();
- private $badges = array();
private $href;
private $actionList;
private $actionListID;
@@ -46,11 +45,6 @@ final class PHUIHeaderView extends AphrontTagView {
return $this;
}
- public function addBadge(PHUIBadgeMiniView $badge) {
- $this->badges[] = $badge;
- return $this;
- }
-
public function setImage($uri) {
$this->image = $uri;
return $this;
@@ -341,21 +335,13 @@ final class PHUIHeaderView extends AphrontTagView {
$header_content,
));
- if ($this->subheader || $this->badges) {
- $badges = null;
- if ($this->badges) {
- $badges = new PHUIBadgeBoxView();
- $badges->addItems($this->badges);
- $badges->setCollapsed(true);
- }
-
+ if ($this->subheader) {
$left[] = phutil_tag(
'div',
array(
'class' => 'phui-header-subheader',
),
array(
- $badges,
$this->subheader,
));
}
diff --git a/src/view/phui/PHUIHovercardView.php b/src/view/phui/PHUIHovercardView.php
index b99fc8153e..f6cfc45a35 100644
--- a/src/view/phui/PHUIHovercardView.php
+++ b/src/view/phui/PHUIHovercardView.php
@@ -173,7 +173,7 @@ final class PHUIHovercardView extends AphrontTagView {
foreach ($this->actions as $action) {
$options = array(
- 'class' => 'button grey',
+ 'class' => 'button button-grey',
'href' => $action['uri'],
);
diff --git a/src/view/phui/PHUITagView.php b/src/view/phui/PHUITagView.php
index 1811f8f1a9..292246c4a7 100644
--- a/src/view/phui/PHUITagView.php
+++ b/src/view/phui/PHUITagView.php
@@ -28,6 +28,8 @@ final class PHUITagView extends AphrontTagView {
const COLOR_OBJECT = 'object';
const COLOR_PERSON = 'person';
+ const BORDER_NONE = 'border-none';
+
private $type;
private $href;
private $name;
@@ -40,6 +42,7 @@ final class PHUITagView extends AphrontTagView {
private $icon;
private $shade;
private $slimShady;
+ private $border;
public function setType($type) {
$this->type = $type;
@@ -104,6 +107,11 @@ final class PHUITagView extends AphrontTagView {
return $this;
}
+ public function setBorder($border) {
+ $this->border = $border;
+ return $this;
+ }
+
public function setIcon($icon) {
$this->icon = $icon;
return $this;
@@ -142,6 +150,10 @@ final class PHUITagView extends AphrontTagView {
$classes[] = 'phui-tag-icon-view';
}
+ if ($this->border) {
+ $classes[] = 'phui-tag-'.$this->border;
+ }
+
if ($this->phid) {
Javelin::initBehavior('phui-hovercards');
diff --git a/webroot/rsrc/css/aphront/dark-console.css b/webroot/rsrc/css/aphront/dark-console.css
index e1ddc5a16d..81e888ba46 100644
--- a/webroot/rsrc/css/aphront/dark-console.css
+++ b/webroot/rsrc/css/aphront/dark-console.css
@@ -3,12 +3,12 @@
*/
.dark-console {
- background: #444444;
- color: #eeeeee;
- width: 100%;
- font-family: "Verdana";
- font-size: 11px;
- position: relative;
+ background: #444444;
+ color: #eeeeee;
+ width: 100%;
+ font-family: "Verdana";
+ font-size: 11px;
+ position: relative;
}
.dark-console a {
@@ -74,6 +74,7 @@
.dark-console-requests a.dark-console-request:hover,
.dark-console-tabs a.dark-console-tab:hover {
background: #1188cc;
+ text-decoration: none;
}
.dark-console-tabs a.dark-console-tab {
@@ -107,6 +108,12 @@
.dark-console .aphront-table-view td {
font-size: 11px;
+ color: #eee;
+}
+
+.dark-console .aphront-table-view tr:hover,
+.dark-console .aphront-table-view tr.alt:hover {
+ background: #333;
}
.dark-console .aphront-table-view td.header {
diff --git a/webroot/rsrc/css/aphront/table-view.css b/webroot/rsrc/css/aphront/table-view.css
index 2de08095dd..2238f5a041 100644
--- a/webroot/rsrc/css/aphront/table-view.css
+++ b/webroot/rsrc/css/aphront/table-view.css
@@ -24,7 +24,6 @@
.aphront-table-notice {
padding: 12px 16px;
- font-size: {$normalfontsize};
color: {$darkbluetext};
border-bottom: 1px solid {$thinblueborder};
}
@@ -37,9 +36,16 @@
background: {$lightgreybackground};
}
+.device-desktop .aphront-table-view tr:hover {
+ background: {$bluebackground};
+}
+
+.device-desktop .aphront-table-view tr.no-data:hover {
+ background: inherit;
+}
+
.aphront-table-view th {
font-weight: bold;
- font-size: {$normalfontsize};
white-space: nowrap;
color: {$bluetext};
text-shadow: 0 1px 0 white;
@@ -78,6 +84,7 @@ th.aphront-table-view-sortable-selected {
.aphront-table-view td {
white-space: nowrap;
vertical-align: middle;
+ color: {$darkbluetext};
}
.aphront-table-down-sort {
@@ -115,12 +122,10 @@ th.aphront-table-view-sortable-selected {
.aphront-table-view th {
padding: 8px 10px;
- font-size: {$normalfontsize};
}
.aphront-table-view td {
padding: 8px 10px;
- font-size: {$smallerfontsize};
}
.device-tablet .aphront-table-view td,
@@ -128,22 +133,12 @@ th.aphront-table-view-sortable-selected {
padding: 6px;
}
-.device-tablet .aphront-table-view td + td,
-.device-phone .aphront-table-view td + td {
- padding-left: 0px;
-}
-
.device-tablet .aphront-table-view th,
.device-phone .aphront-table-view th {
padding: 6px;
overflow: hidden;
}
-.device-tablet .aphront-table-view th + th,
-.device-phone .aphront-table-view th + th {
- padding-left: 0px;
-}
-
.aphront-table-view td.sorted-column {
background: {$lightbluebackground};
}
@@ -196,7 +191,7 @@ th.aphront-table-view-sortable-selected {
}
.aphront-table-view td.wrap {
- white-space: normal;
+ white-space: normal;
}
.aphront-table-view td.prewrap {
@@ -282,7 +277,6 @@ span.single-display-line-content {
text-align: center;
color: {$lightgreytext};
font-style: italic;
- font-size: {$normalfontsize};
}
.aphront-table-view td.thumb img {
diff --git a/webroot/rsrc/css/application/differential/changeset-view.css b/webroot/rsrc/css/application/differential/changeset-view.css
index f1be2b5f99..33dcea1213 100644
--- a/webroot/rsrc/css/application/differential/changeset-view.css
+++ b/webroot/rsrc/css/application/differential/changeset-view.css
@@ -413,3 +413,7 @@ tr.differential-inline-loading {
.diff-banner-has-unsubmitted {
background: {$sh-yellowbackground};
}
+
+.diff-banner-buttons {
+ float: right;
+}
diff --git a/webroot/rsrc/css/application/diffusion/diffusion-history.css b/webroot/rsrc/css/application/diffusion/diffusion-history.css
index fd22f9b1a5..2d0aea3b10 100644
--- a/webroot/rsrc/css/application/diffusion/diffusion-history.css
+++ b/webroot/rsrc/css/application/diffusion/diffusion-history.css
@@ -2,19 +2,13 @@
* @provides diffusion-history-css
*/
+/* - List Styles ------------------------------------------------------------*/
+
.diffusion-history-list .phui-oi-link {
color: #000;
font-size: {$biggerfontsize};
}
-.diffusion-history-list .phui-oi-attribute .phui-tag-core {
- border-color: transparent;
-}
-
-.diffusion-history-list .phui-oi-attribute .phui-tag-indigo a {
- color: {$indigo};
-}
-
.diffusion-history-message {
background-color: {$bluebackground};
padding: 16px;
@@ -36,7 +30,53 @@
margin-left: 4px;
}
-a.phui-tag-view:hover.diffusion-differential-tag .phui-tag-core {
- border-color: transparent;
- text-decoration: underline;
+
+/* - Phone Style ------------------------------------------------------------*/
+
+.device-phone.diffusion-history-view .phui-two-column-view
+ .phui-two-column-footer .phui-object-box {
+ border-color: {$thinblueborder};
+}
+
+.device-phone.diffusion-history-view .phui-two-column-view
+ .phui-two-column-footer .phui-header-view {
+ text-align: center;
+}
+
+.device-phone.diffusion-history-view .phui-two-column-content {
+ padding: 0;
+ margin: 0 -4px;
+}
+
+.device-phone.diffusion-history-view .phui-oi-attribute-spacer {
+ display: none;
+}
+
+.device-phone.diffusion-history-view .phui-oi-attribute {
+ display: block;
+ margin: 0 0 4px 0;
+}
+
+.device-phone.diffusion-history-view .phui-oi-image {
+ height: 36px;
+ width: 36px;
+ margin-top: 10px;
+}
+
+.device-phone.diffusion-history-view .phui-oi-with-image .phui-oi-content-box {
+ margin-left: 44px;
+}
+
+.device-phone.diffusion-history-view .phui-oi-col2.phui-oi-side-column {
+ padding-bottom: 10px;
+}
+
+.device-phone.diffusion-history-view .diffusion-history-list .button.has-icon
+ .phui-button-text {
+ margin: 0;
+}
+
+.device-phone.diffusion-history-view .diffusion-history-list .button.has-icon
+ .phui-icon-view {
+ display: none;
}
diff --git a/webroot/rsrc/css/application/diffusion/diffusion-readme.css b/webroot/rsrc/css/application/diffusion/diffusion-readme.css
index b8e20af5cb..0dd5cdd858 100644
--- a/webroot/rsrc/css/application/diffusion/diffusion-readme.css
+++ b/webroot/rsrc/css/application/diffusion/diffusion-readme.css
@@ -14,6 +14,10 @@
padding: 24px 32px;
}
+.device .diffusion-readme-view .phui-document-container {
+ padding: 8px 16px;
+}
+
.diffusion-readme-view .phabricator-remarkup-toc {
display: none;
}
diff --git a/webroot/rsrc/css/core/remarkup.css b/webroot/rsrc/css/core/remarkup.css
index 0c07c145a8..98529b9434 100644
--- a/webroot/rsrc/css/core/remarkup.css
+++ b/webroot/rsrc/css/core/remarkup.css
@@ -122,17 +122,38 @@
.phabricator-remarkup .remarkup-list-with-checkmarks .remarkup-checked-item,
.phabricator-remarkup .remarkup-list-with-checkmarks .remarkup-unchecked-item {
list-style: none;
- margin-left: -18px;
+ margin-left: -20px;
+ position: relative;
+ padding-left: 22px;
}
.phabricator-remarkup .remarkup-list-with-checkmarks input {
- margin-right: 4px;
- opacity: 1;
+ display: none;
+}
+
+.phabricator-remarkup .remarkup-list-with-checkmarks
+ .remarkup-list-item::before {
+ height: 16px;
+ width: 16px;
+ background-size: 16px;
+ display: inline-block;
+ content: '';
+ position: absolute;
+ top: 3px;
+ left: 0;
+}
+
+.remarkup-list-with-checkmarks .remarkup-checked-item::before {
+ background-image: url(rsrc/image/controls/checkbox-checked.png);
+}
+
+.remarkup-list-with-checkmarks .remarkup-unchecked-item::before {
+ background-image: url(rsrc/image/controls/checkbox-unchecked.png);
}
.phabricator-remarkup .remarkup-list-with-checkmarks .remarkup-checked-item {
- text-decoration: line-through;
color: {$lightgreytext};
+ text-decoration: line-through;
}
.phabricator-remarkup ul.remarkup-list ol.remarkup-list,
diff --git a/webroot/rsrc/css/phui/button/phui-button-simple.css b/webroot/rsrc/css/phui/button/phui-button-simple.css
index fa0a8d11b2..4bc6daee23 100644
--- a/webroot/rsrc/css/phui/button/phui-button-simple.css
+++ b/webroot/rsrc/css/phui/button/phui-button-simple.css
@@ -6,55 +6,55 @@
/* - Basic -------------------------------------------------------------------*/
-button.simple,
-input[type="submit"].simple,
-a.simple,
-a.simple:visited {
+button.phui-button-simple,
+input[type="submit"].phui-button-simple,
+a.phui-button-simple,
+a.phui-button-simple:visited {
background: #fff;
color: {$bluetext};
border: 1px solid {$lightblueborder};
}
-button.simple .phui-icon-view,
-input[type="submit"].simple .phui-icon-view,
-a.simple .phui-icon-view,
-a.simple:visited .phui-icon-view {
+button.phui-button-simple .phui-icon-view,
+input[type="submit"].phui-button-simple .phui-icon-view,
+a.phui-button-simple .phui-icon-view,
+a.phui-button-simple:visited .phui-icon-view {
color: {$lightbluetext};
}
-a.button.simple:hover,
-button.simple:hover {
+a.button.phui-button-simple:hover,
+button.phui-button-simple:hover {
border-color: {$blueborder};
background-image: none;
background-color: #fff;
transition: 0s;
}
-a.simple.current {
+a.phui-button-simple.current {
background: {$lightblue};
}
/* - Red --------------------------------------------------------------------*/
-button.simple.red,
-input[type="submit"].simple.red,
-a.simple.red,
-a.simple.red:visited {
+button.phui-button-simple.button-red,
+input[type="submit"].phui-button-simple.button-red,
+a.phui-button-simple.button-red,
+a.phui-button-simple.button-red:visited {
background: {$sh-redbackground};
color: {$redtext};
border: 1px solid {$sh-redborder};
}
-button.simple.red .phui-icon-view,
-input[type="submit"].simple.red .phui-icon-view,
-a.simple.red .phui-icon-view,
-a.simple.red:visited .phui-icon-view {
+button.phui-button-simple.button-red .phui-icon-view,
+input[type="submit"].phui-button-simple.button-red .phui-icon-view,
+a.phui-button-simple.button-red .phui-icon-view,
+a.phui-button-simple.button-red:visited .phui-icon-view {
color: {$redtext};
}
-a.button.simple.red:hover,
-button.simple.red:hover {
+a.button.phui-button-simple.button-red:hover,
+button.phui-button-simple.button-red:hover {
border-color: {$sh-redtext};
background-image: none;
background-color: {$sh-redbackground};
@@ -63,24 +63,24 @@ button.simple.red:hover {
/* - Green ------------------------------------------------------------------*/
-button.simple.green,
-input[type="submit"].simple.green,
-a.simple.green,
-a.simple.green:visited {
+button.phui-button-simple.button-green,
+input[type="submit"].phui-button-simple.button-green,
+a.phui-button-simple.button-green,
+a.phui-button-simple.button-green:visited {
background: {$sh-greenbackground};
color: {$greentext};
border: 1px solid {$sh-greenborder};
}
-button.simple.green .phui-icon-view,
-input[type="submit"].simple.green .phui-icon-view,
-a.simple.green .phui-icon-view,
-a.simple.green:visited .phui-icon-view {
+button.phui-button-simple.button-green .phui-icon-view,
+input[type="submit"].phui-button-simple.button-green .phui-icon-view,
+a.phui-button-simple.button-green .phui-icon-view,
+a.phui-button-simple.button-green:visited .phui-icon-view {
color: {$greentext};
}
-a.button.simple.green:hover,
-button.simple.green:hover {
+a.button.phui-button-simple.button-green:hover,
+button.phui-button-simple.button-green:hover {
border-color: {$sh-greentext};
background-image: none;
background-color: {$sh-greenbackground};
@@ -89,24 +89,24 @@ button.simple.green:hover {
/* - Yellow -----------------------------------------------------------------*/
-button.simple.yellow,
-input[type="submit"].simple.yellow,
-a.simple.yellow,
-a.simple.yellow:visited {
+button.phui-button-simple.button-yellow,
+input[type="submit"].phui-button-simple.button-yellow,
+a.phui-button-simple.button-yellow,
+a.phui-button-simple.button-yellow:visited {
background-color: {$sh-yellowbackground};
color: {$sh-yellowtext};
border: 1px solid {$sh-yellowborder};
}
-button.simple.yellow .phui-icon-view,
-input[type="submit"].simple.yellow .phui-icon-view,
-a.simple.yellow .phui-icon-view,
-a.simple.yellow:visited .phui-icon-view {
+button.phui-button-simple.button-yellow .phui-icon-view,
+input[type="submit"].phui-button-simple.button-yellow .phui-icon-view,
+a.phui-button-simple.button-yellow .phui-icon-view,
+a.phui-button-simple.button-yellow:visited .phui-icon-view {
color: {$sh-yellowicon};
}
-a.button.simple.yellow:hover,
-button.simple.yellow:hover {
+a.button.phui-button-simple.button-yellow:hover,
+button.phui-button-simple.button-yellow:hover {
border-color: {$sh-yellowtext};
background-image: none;
background-color: {$sh-yellowbackground};
@@ -116,16 +116,16 @@ button.simple.yellow:hover {
/* - Misc -------------------------------------------------------------------*/
-a.button.simple .phui-icon-view {
+a.button.phui-button-simple .phui-icon-view {
border: none;
}
-a.button.simple.phuix-dropdown-open {
+a.button.phui-button-simple.phuix-dropdown-open {
background-color: #fff;
color: {$blue};
box-shadow: none;
}
-a.button.simple.phuix-dropdown-open:hover .phui-icon-view {
+a.button.phui-button-simple.phuix-dropdown-open:hover .phui-icon-view {
color: {$blue};
}
diff --git a/webroot/rsrc/css/phui/button/phui-button.css b/webroot/rsrc/css/phui/button/phui-button.css
index d8183febd2..69718808c3 100644
--- a/webroot/rsrc/css/phui/button/phui-button.css
+++ b/webroot/rsrc/css/phui/button/phui-button.css
@@ -49,13 +49,13 @@ input[type="submit"] {
button .phui-icon-view,
a.button .phui-icon-view,
-button.green .phui-icon-view,
-a.button.green .phui-icon-view {
+button.button-green .phui-icon-view,
+a.button.button-green .phui-icon-view {
color: white;
}
-button.grey .phui-icon-view,
-a.button.grey .phui-icon-view {
+button.button-grey .phui-icon-view,
+a.button.button-grey .phui-icon-view {
color: {$darkbluetext};
}
@@ -68,18 +68,18 @@ a.icon:visited {
text-indent: 29px;
}
-button.green,
-a.green.button,
-a.green.button:visited {
+button.button-green,
+a.button-green.button,
+a.button-green.button:visited {
background-color: {$green};
border-color: {$green};
background-image: linear-gradient(to bottom, #23BB5B, #139543);
}
-button.grey,
-input[type="submit"].grey,
-a.grey,
-a.grey:visited {
+button.button-grey,
+input[type="submit"].button-grey,
+a.button-grey,
+a.button-grey:visited {
background-color: #F7F7F9;
background-image: linear-gradient(to bottom, #ffffff, #f1f0f1);
border: 1px solid rgba({$alphablue}, 0.3);
@@ -108,15 +108,15 @@ button:hover {
transition: 0.1s;
}
-a.button.grey:hover,
-button.grey:hover {
+a.button.button-grey:hover,
+button.button-grey:hover {
background-image: linear-gradient(to bottom, #ffffff, #eeebec);
border-color: rgba({$alphablue}, 0.4);
transition: 0.1s;
}
-a.button.green:hover,
-button.green:hover {
+a.button.button-green:hover,
+button.button-green:hover {
border-color: #127336;
background-color: #0DAD48;
background-image: linear-gradient(to bottom, #23BB5B, #178841);
@@ -244,7 +244,7 @@ a.policy-control .phui-button-text {
margin-top: 6px;
}
-.grey.dropdown .caret {
+.button-grey.dropdown .caret {
border-top-color: #000;
}
diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css b/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css
index f6d1589a9a..5ddedfa24a 100644
--- a/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css
+++ b/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css
@@ -426,7 +426,7 @@ ul.phui-oi-icons {
}
.phui-oi.phui-oi-disabled .phui-oi-attribute,
-.phui-oi.phui-oi-disabled .phui-oi-attribute .phui-icon-view {
+.phui-oi.phui-oi-disabled .phui-oi-attribute > .phui-icon-view {
color: {$lightgreytext};
}
diff --git a/webroot/rsrc/css/phui/phui-document-pro.css b/webroot/rsrc/css/phui/phui-document-pro.css
index a4c05a0ecd..60b5106154 100644
--- a/webroot/rsrc/css/phui/phui-document-pro.css
+++ b/webroot/rsrc/css/phui/phui-document-pro.css
@@ -64,21 +64,13 @@ body.printable {
.phui-document-view-pro .phui-document-toc {
position: absolute;
top: 34px;
- left: -36px;
+ left: -44px;
}
.printable .phui-document-view-pro a.phui-document-toc {
display: none;
}
-a.button.phui-document-toc {
- display: inline-block;
- height: 16px;
- width: 20px;
- padding-left: 8px;
- padding-right: 8px;
-}
-
.phui-document-view-pro .phui-document-toc-list {
margin: 8px;
border: 1px solid {$lightgreyborder};
@@ -105,12 +97,7 @@ a.button.phui-document-toc {
}
.phui-document-toc-open .phui-document-toc {
- background-color: {$blue};
- border-color: {$blue};
-}
-
-.phui-document-toc-open .phui-document-toc .phui-icon-view {
- color: #fff;
+ border-color: {$blueborder};
}
.phui-document-view-pro .phui-document-toc-content {
diff --git a/webroot/rsrc/css/phui/phui-header-view.css b/webroot/rsrc/css/phui/phui-header-view.css
index 470e821544..87df1d0fc5 100644
--- a/webroot/rsrc/css/phui/phui-header-view.css
+++ b/webroot/rsrc/css/phui/phui-header-view.css
@@ -120,7 +120,7 @@ body .phui-header-shell.phui-bleed-header
.device-phone .phui-header-action-link .phui-button-text {
visibility: hidden;
width: 0;
- margin-left: 4px;
+ margin-left: 8px;
}
.device-phone .phui-header-action-link.button .phui-icon-view {
@@ -307,14 +307,6 @@ body .phui-header-shell.phui-bleed-header
text-decoration: underline;
}
-.phui-header-subheader .phui-badge-flex-view {
- display: inline;
- margin-right: 4px;
-}
-
-.phui-header-subheader .phui-badge-flex-view:after {
- display: inline;
-}
/*** Profile Header ***********************************************************/
diff --git a/webroot/rsrc/css/phui/phui-pager.css b/webroot/rsrc/css/phui/phui-pager.css
index 590b8514ce..462ef2ad22 100644
--- a/webroot/rsrc/css/phui/phui-pager.css
+++ b/webroot/rsrc/css/phui/phui-pager.css
@@ -6,3 +6,9 @@
clear: both;
text-align: center;
}
+
+.phui-pager-view a.button.current,
+.phui-pager-view a.button.current:hover {
+ border-color: {$sh-orangetext};
+ color: {$sh-orangetext};
+}
diff --git a/webroot/rsrc/css/phui/phui-tag-view.css b/webroot/rsrc/css/phui/phui-tag-view.css
index 56b5badf8d..885b20c12b 100644
--- a/webroot/rsrc/css/phui/phui-tag-view.css
+++ b/webroot/rsrc/css/phui/phui-tag-view.css
@@ -154,6 +154,15 @@ a.phui-tag-view:hover
margin: 0 4px 2px 0;
}
+.phui-tag-view.phui-tag-border-none .phui-tag-core {
+ border-color: transparent;
+}
+
+a.phui-tag-view:hover.phui-tag-border-none .phui-tag-core {
+ border-color: transparent !important;
+ text-decoration: underline;
+}
+
/* - Shaded Tags ---------------------------------------------------------------
diff --git a/webroot/rsrc/image/controls/checkbox-checked.png b/webroot/rsrc/image/controls/checkbox-checked.png
new file mode 100644
index 0000000000..9e93e82a37
Binary files /dev/null and b/webroot/rsrc/image/controls/checkbox-checked.png differ
diff --git a/webroot/rsrc/image/controls/checkbox-unchecked.png b/webroot/rsrc/image/controls/checkbox-unchecked.png
new file mode 100644
index 0000000000..e60350d770
Binary files /dev/null and b/webroot/rsrc/image/controls/checkbox-unchecked.png differ
diff --git a/webroot/rsrc/js/application/diff/DiffChangeset.js b/webroot/rsrc/js/application/diff/DiffChangeset.js
index b5ebe4ce70..c697ba5a6c 100644
--- a/webroot/rsrc/js/application/diff/DiffChangeset.js
+++ b/webroot/rsrc/js/application/diff/DiffChangeset.js
@@ -403,6 +403,8 @@ JX.install('DiffChangeset', {
block.items.push(rows[ii]);
}
+ var last_inline = null;
+ var last_inline_item = null;
for (ii = 0; ii < blocks.length; ii++) {
block = blocks[ii];
@@ -422,16 +424,43 @@ JX.install('DiffChangeset', {
for (var jj = 0; jj < block.items.length; jj++) {
var inline = this.getInlineForRow(block.items[jj]);
- items.push({
+ // When comments are being edited, they have a hidden row with
+ // the actual comment and then a visible row with the editor.
+
+ // In this case, we only want to generate one item, but it should
+ // use the editor as a scroll target. To accomplish this, check if
+ // this row has the same inline as the previous row. If so, update
+ // the last item to use this row's nodes.
+
+ if (inline === last_inline) {
+ last_inline_item.nodes.begin = block.items[jj];
+ last_inline_item.nodes.end = block.items[jj];
+ continue;
+ } else {
+ last_inline = inline;
+ }
+
+ var is_saved = (!inline.isDraft() && !inline.isEditing());
+
+ last_inline_item = {
type: block.type,
changeset: this,
target: inline,
hidden: inline.isHidden(),
+ deleted: !inline.getID() && !inline.isEditing(),
nodes: {
begin: block.items[jj],
end: block.items[jj]
+ },
+ attributes: {
+ unsaved: inline.isEditing(),
+ unsubmitted: inline.isDraft(),
+ undone: (is_saved && !inline.isDone()),
+ done: (is_saved && inline.isDone())
}
- });
+ };
+
+ items.push(last_inline_item);
}
}
}
diff --git a/webroot/rsrc/js/application/diff/DiffChangesetList.js b/webroot/rsrc/js/application/diff/DiffChangesetList.js
index b79f05296e..b476b8c168 100644
--- a/webroot/rsrc/js/application/diff/DiffChangesetList.js
+++ b/webroot/rsrc/js/application/diff/DiffChangesetList.js
@@ -1,6 +1,7 @@
/**
* @provides phabricator-diff-changeset-list
* @requires javelin-install
+ * phuix-button-view
* @javelin
*/
@@ -111,6 +112,10 @@ JX.install('DiffChangesetList', {
_rangeTarget: null,
_bannerNode: null,
+ _unsavedButton: null,
+ _unsubmittedButton: null,
+ _doneButton: null,
+ _doneMode: null,
sleep: function() {
this._asleep = true;
@@ -258,7 +263,13 @@ JX.install('DiffChangesetList', {
_installJumpKey: function(key, label, delta, filter, show_hidden) {
filter = filter || null;
- var handler = JX.bind(this, this._onjumpkey, delta, filter, show_hidden);
+
+ var options = {
+ filter: filter,
+ hidden: show_hidden
+ };
+
+ var handler = JX.bind(this, this._onjumpkey, delta, options);
return this._installKey(key, label, handler);
},
@@ -440,9 +451,14 @@ JX.install('DiffChangesetList', {
.show();
},
- _onjumpkey: function(delta, filter, show_hidden, manager) {
+ _onjumpkey: function(delta, options) {
var state = this._getSelectionState();
+ var filter = options.filter || null;
+ var hidden = options.hidden || false;
+ var wrap = options.wrap || false;
+ var attribute = options.attribute || null;
+
var cursor = state.cursor;
var items = state.items;
@@ -452,6 +468,7 @@ JX.install('DiffChangesetList', {
return;
}
+ var did_wrap = false;
while (true) {
if (cursor === null) {
cursor = 0;
@@ -464,9 +481,22 @@ JX.install('DiffChangesetList', {
return;
}
- // If we've gone forward off the end of the list, bail out.
+ // If we've gone forward off the end of the list, figure out where we
+ // should end up.
if (cursor >= items.length) {
- return;
+ if (!wrap) {
+ // If we aren't wrapping around, we're done.
+ return;
+ }
+
+ if (did_wrap) {
+ // If we're already wrapped around, we're done.
+ return;
+ }
+
+ // Otherwise, wrap the cursor back to the top.
+ cursor = 0;
+ did_wrap = true;
}
// If we're selecting things of a particular type (like only files)
@@ -479,17 +509,31 @@ JX.install('DiffChangesetList', {
// If the item is hidden, don't select it when iterating with jump
// keys. It can still potentially be selected in other ways.
- if (!show_hidden) {
+ if (!hidden) {
if (items[cursor].hidden) {
continue;
}
}
+ // If the item has been deleted, don't select it when iterating. The
+ // cursor may remain on it until it is removed.
+ if (items[cursor].deleted) {
+ continue;
+ }
+
+ // If we're selecting things with a particular attribute, like
+ // "unsaved", skip items without the attribute.
+ if (attribute !== null) {
+ if (!(items[cursor].attributes || {})[attribute]) {
+ continue;
+ }
+ }
+
// Otherwise, we've found a valid item to select.
break;
}
- this._setSelectionState(items[cursor], manager);
+ this._setSelectionState(items[cursor], true);
},
_getSelectionState: function() {
@@ -512,24 +556,34 @@ JX.install('DiffChangesetList', {
};
},
- _setSelectionState: function(item, manager) {
+ _setSelectionState: function(item, scroll) {
this._cursorItem = item;
- this._redrawSelection(manager, true);
+ this._redrawSelection(scroll);
return this;
},
- _redrawSelection: function(manager, scroll) {
+ _redrawSelection: function(scroll) {
var cursor = this._cursorItem;
if (!cursor) {
this.setFocus(null);
return;
}
+ // If this item has been removed from the document (for example: create
+ // a new empty comment, then use the "Unsaved" button to select it, then
+ // cancel it), we can still keep the cursor here but do not want to show
+ // a selection reticle over an invisible node.
+ if (cursor.deleted) {
+ this.setFocus(null);
+ return;
+ }
+
this.setFocus(cursor.nodes.begin, cursor.nodes.end);
- if (manager && scroll) {
- manager.scrollTo(cursor.nodes.begin);
+ if (scroll) {
+ var pos = JX.$V(cursor.nodes.begin);
+ JX.DOM.scrollToPosition(0, pos.y - 60);
}
return this;
@@ -546,7 +600,7 @@ JX.install('DiffChangesetList', {
var state = this._getSelectionState();
if (state.cursor !== null) {
- this._setSelectionState(state.items[state.cursor]);
+ this._setSelectionState(state.items[state.cursor], false);
}
},
@@ -858,7 +912,7 @@ JX.install('DiffChangesetList', {
if (selection.cursor !== null) {
item = selection.items[selection.cursor];
if (item.target === inline) {
- this._setSelectionState(null);
+ this._setSelectionState(null, false);
return;
}
}
@@ -870,7 +924,7 @@ JX.install('DiffChangesetList', {
for (var ii = 0; ii < items.length; ii++) {
item = items[ii];
if (item.target === inline) {
- this._setSelectionState(item);
+ this._setSelectionState(item, false);
}
}
},
@@ -1287,7 +1341,7 @@ JX.install('DiffChangesetList', {
var unsaved = [];
var unsubmitted = [];
var undone = [];
- var all = [];
+ var done = [];
for (var ii = 0; ii < changesets.length; ii++) {
var inlines = changesets[ii].getInlines();
@@ -1298,14 +1352,22 @@ JX.install('DiffChangesetList', {
continue;
}
- all.push(inline);
+ if (inline.isSynthetic()) {
+ continue;
+ }
if (inline.isEditing()) {
unsaved.push(inline);
+ } else if (!inline.getID()) {
+ // These are new comments which have been cancelled, and do not
+ // count as anything.
+ continue;
} else if (inline.isDraft()) {
unsubmitted.push(inline);
} else if (!inline.isDone()) {
undone.push(inline);
+ } else {
+ done.push(inline);
}
}
}
@@ -1320,14 +1382,173 @@ JX.install('DiffChangesetList', {
'diff-banner-has-unsubmitted',
!!unsubmitted.length);
+ var pht = this.getTranslations();
+ var unsaved_button = this._getUnsavedButton();
+ var unsubmitted_button = this._getUnsubmittedButton();
+ var done_button = this._getDoneButton();
+
+ if (unsaved.length) {
+ unsaved_button.setText(unsaved.length + ' ' + pht('Unsaved'));
+ JX.DOM.show(unsaved_button.getNode());
+ } else {
+ JX.DOM.hide(unsaved_button.getNode());
+ }
+
+ if (unsubmitted.length) {
+ unsubmitted_button.setText(
+ unsubmitted.length + ' ' + pht('Unsubmitted'));
+ JX.DOM.show(unsubmitted_button.getNode());
+ } else {
+ JX.DOM.hide(unsubmitted_button.getNode());
+ }
+
+ if (done.length || undone.length) {
+ // If you haven't marked any comments as "Done", we just show text
+ // like "3 Comments". If you've marked at least one done, we show
+ // "1 / 3 Comments".
+
+ var done_text;
+ if (done.length) {
+ done_text = [
+ done.length,
+ ' / ',
+ (done.length + undone.length),
+ ' ',
+ pht('Comments')
+ ];
+ } else {
+ done_text = [
+ undone.length,
+ ' ',
+ pht('Comments')
+ ];
+ }
+
+ done_button.setText(done_text);
+
+ JX.DOM.show(done_button.getNode());
+
+ // If any comments are not marked "Done", this cycles through the
+ // missing comments. Otherwise, it cycles through all the saved
+ // comments.
+ if (undone.length) {
+ this._doneMode = 'undone';
+ } else {
+ this._doneMode = 'done';
+ }
+
+ } else {
+ JX.DOM.hide(done_button.getNode());
+ }
+
+ var path_view = [icon, ' ', changeset.getDisplayPath()];
+
+ var buttons_attrs = {
+ className: 'diff-banner-buttons'
+ };
+
+ var buttons_list = [
+ unsaved_button.getNode(),
+ unsubmitted_button.getNode(),
+ done_button.getNode()
+ ];
+
+ var buttons_view = JX.$N('div', buttons_attrs, buttons_list);
+
var icon = new JX.PHUIXIconView()
.setIcon(changeset.getIcon())
.getNode();
- JX.DOM.setContent(node, [icon, ' ', changeset.getDisplayPath()]);
+ JX.DOM.setContent(node, [buttons_view, path_view]);
document.body.appendChild(node);
},
+ _getUnsavedButton: function() {
+ if (!this._unsavedButton) {
+ var button = new JX.PHUIXButtonView()
+ .setIcon('fa-commenting-o')
+ .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE);
+
+ var node = button.getNode();
+
+ var onunsaved = JX.bind(this, this._onunsavedclick);
+ JX.DOM.listen(node, 'click', null, onunsaved);
+
+ this._unsavedButton = button;
+ }
+
+ return this._unsavedButton;
+ },
+
+ _getUnsubmittedButton: function() {
+ if (!this._unsubmittedButton) {
+ var button = new JX.PHUIXButtonView()
+ .setIcon('fa-comment-o')
+ .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE);
+
+ var node = button.getNode();
+
+ var onunsubmitted = JX.bind(this, this._onunsubmittedclick);
+ JX.DOM.listen(node, 'click', null, onunsubmitted);
+
+ this._unsubmittedButton = button;
+ }
+
+ return this._unsubmittedButton;
+ },
+
+ _getDoneButton: function() {
+ if (!this._doneButton) {
+ var button = new JX.PHUIXButtonView()
+ .setIcon('fa-comment')
+ .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE);
+
+ var node = button.getNode();
+
+ var ondone = JX.bind(this, this._ondoneclick);
+ JX.DOM.listen(node, 'click', null, ondone);
+
+ this._doneButton = button;
+ }
+
+ return this._doneButton;
+ },
+ _onunsavedclick: function(e) {
+ e.kill();
+
+ var options = {
+ filter: 'comment',
+ wrap: true,
+ attribute: 'unsaved'
+ };
+
+ this._onjumpkey(1, options);
+ },
+
+ _onunsubmittedclick: function(e) {
+ e.kill();
+
+ var options = {
+ filter: 'comment',
+ wrap: true,
+ attribute: 'unsubmitted'
+ };
+
+ this._onjumpkey(1, options);
+ },
+
+ _ondoneclick: function(e) {
+ e.kill();
+
+ var options = {
+ filter: 'comment',
+ wrap: true,
+ attribute: this._doneMode
+ };
+
+ this._onjumpkey(1, options);
+ },
+
_getBannerNode: function() {
if (!this._bannerNode) {
var attributes = {
diff --git a/webroot/rsrc/js/application/diff/DiffInline.js b/webroot/rsrc/js/application/diff/DiffInline.js
index 6d897c27ae..baee53a7a4 100644
--- a/webroot/rsrc/js/application/diff/DiffInline.js
+++ b/webroot/rsrc/js/application/diff/DiffInline.js
@@ -34,6 +34,7 @@ JX.install('DiffInline', {
_isFixed: null,
_isEditing: false,
_isNew: false,
+ _isSynthetic: false,
bindToRow: function(row) {
this._row = row;
@@ -71,6 +72,7 @@ JX.install('DiffInline', {
this._isDraft = data.isDraft;
this._isFixed = data.isFixed;
this._isGhost = data.isGhost;
+ this._isSynthetic = data.isSynthetic;
this._changesetID = data.changesetID;
this._isNew = false;
@@ -97,6 +99,10 @@ JX.install('DiffInline', {
return this._isDeleted;
},
+ isSynthetic: function() {
+ return this._isSynthetic;
+ },
+
bindToRange: function(data) {
this._displaySide = data.displaySide;
this._number = parseInt(data.number, 10);
diff --git a/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js b/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js
index 317a132240..309f972324 100644
--- a/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js
+++ b/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js
@@ -53,7 +53,7 @@ JX.behavior('diffusion-commit-graph', function(config) {
return (col * cell) + (cell / 2);
};
- var h = 32;
+ var h = 34;
var w = cell * config.count;
var canvas = JX.$N('canvas', {width: w, height: h});
diff --git a/webroot/rsrc/js/core/behavior-object-selector.js b/webroot/rsrc/js/core/behavior-object-selector.js
index 686f0f8820..722cfdd562 100644
--- a/webroot/rsrc/js/core/behavior-object-selector.js
+++ b/webroot/rsrc/js/core/behavior-object-selector.js
@@ -137,7 +137,9 @@ JX.behavior('phabricator-object-selector', function(config) {
var select_object_button = JX.$N(
'a',
- {href: '#', sigil: 'object-attacher', className: 'button small grey'},
+ {href: '#',
+ sigil: 'object-attacher',
+ className: 'button small button-grey'},
attach ? 'Select' : 'Remove');
var cells = [
diff --git a/webroot/rsrc/js/phuix/PHUIXButtonView.js b/webroot/rsrc/js/phuix/PHUIXButtonView.js
index 67b59f24f1..e87db88fe4 100644
--- a/webroot/rsrc/js/phuix/PHUIXButtonView.js
+++ b/webroot/rsrc/js/phuix/PHUIXButtonView.js
@@ -35,10 +35,10 @@ JX.install('PHUIXButtonView', {
var node = this.getNode();
if (this._color) {
- JX.DOM.alterClass(node, this._color, false);
+ JX.DOM.alterClass(node, 'button-' + this._color, false);
}
this._color = color;
- JX.DOM.alterClass(node, this._color, true);
+ JX.DOM.alterClass(node, 'button-' + this._color, true);
return this;
},
@@ -50,13 +50,14 @@ JX.install('PHUIXButtonView', {
var node = this.getNode();
var is_simple = (this._buttonType == self.BUTTONTYPE_SIMPLE);
- JX.DOM.alterClass(node, 'simple', is_simple);
+ JX.DOM.alterClass(node, 'phui-button-simple', is_simple);
return this;
},
setText: function(text) {
JX.DOM.setContent(this._getTextNode(), text);
+ this._redraw();
return this;
},