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; },