@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

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

Add a class to the Differential banner when unsubmitted/unsaved changes are present

Summary: Ref T12733. This adds classes for unsubmitted/unsaved changes, and lays some groundwork for additional buttons.

Test Plan:
- Added, edited, deleted comments.
- Saw bar background color update appropriately.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12733

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

+98 -30
+30 -30
resources/celerity/map.php
··· 12 12 'core.pkg.css' => 'bb7f0446', 13 13 'core.pkg.js' => '1475bd91', 14 14 'darkconsole.pkg.js' => '1f9a31bc', 15 - 'differential.pkg.css' => '9ebe4f44', 16 - 'differential.pkg.js' => '40f4acb3', 15 + 'differential.pkg.css' => 'a2755617', 16 + 'differential.pkg.js' => '5bf658f0', 17 17 'diffusion.pkg.css' => 'b93d9b8c', 18 18 'diffusion.pkg.js' => '84c8f8fd', 19 19 'favicon.ico' => '30672e08', ··· 64 64 'rsrc/css/application/dashboard/dashboard.css' => 'fe5b1869', 65 65 'rsrc/css/application/diff/inline-comment-summary.css' => '51efda3a', 66 66 'rsrc/css/application/differential/add-comment.css' => 'c47f8c40', 67 - 'rsrc/css/application/differential/changeset-view.css' => '2971e2a2', 67 + 'rsrc/css/application/differential/changeset-view.css' => '983751ee', 68 68 'rsrc/css/application/differential/core.css' => '5b7b8ff4', 69 69 'rsrc/css/application/differential/phui-inline-comment.css' => 'ffd1a542', 70 70 'rsrc/css/application/differential/revision-comment.css' => '14b8565a', ··· 391 391 'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '408bf173', 392 392 'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '453c5375', 393 393 'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => 'd4eecc63', 394 - 'rsrc/js/application/diff/DiffChangeset.js' => '3359ad02', 395 - 'rsrc/js/application/diff/DiffChangesetList.js' => 'b42eb5ff', 396 - 'rsrc/js/application/diff/DiffInline.js' => '45d37835', 394 + 'rsrc/js/application/diff/DiffChangeset.js' => '1f6748ae', 395 + 'rsrc/js/application/diff/DiffChangesetList.js' => '85abc805', 396 + 'rsrc/js/application/diff/DiffInline.js' => '1d17130f', 397 397 'rsrc/js/application/diff/behavior-preview-link.js' => '051c7832', 398 398 'rsrc/js/application/differential/behavior-comment-preview.js' => '51c5ad07', 399 399 'rsrc/js/application/differential/behavior-diff-radios.js' => 'e1ff79b1', ··· 566 566 'conpherence-thread-manager' => '4d863052', 567 567 'conpherence-transaction-css' => '85129c68', 568 568 'd3' => 'a11a5ff2', 569 - 'differential-changeset-view-css' => '2971e2a2', 569 + 'differential-changeset-view-css' => '983751ee', 570 570 'differential-core-view-css' => '5b7b8ff4', 571 571 'differential-revision-add-comment-css' => 'c47f8c40', 572 572 'differential-revision-comment-css' => '14b8565a', ··· 777 777 'phabricator-darklog' => 'c8e1ffe3', 778 778 'phabricator-darkmessage' => 'c48cccdd', 779 779 'phabricator-dashboard-css' => 'fe5b1869', 780 - 'phabricator-diff-changeset' => '3359ad02', 781 - 'phabricator-diff-changeset-list' => 'b42eb5ff', 782 - 'phabricator-diff-inline' => '45d37835', 780 + 'phabricator-diff-changeset' => '1f6748ae', 781 + 'phabricator-diff-changeset-list' => '85abc805', 782 + 'phabricator-diff-inline' => '1d17130f', 783 783 'phabricator-drag-and-drop-file-upload' => '58dea2fa', 784 784 'phabricator-draggable-list' => 'bea6e7f4', 785 785 'phabricator-fatal-config-template-css' => '8f18fa41', ··· 1019 1019 'javelin-request', 1020 1020 'javelin-uri', 1021 1021 ), 1022 + '1d17130f' => array( 1023 + 'javelin-dom', 1024 + ), 1022 1025 '1def2711' => array( 1023 1026 'javelin-install', 1024 1027 'javelin-dom', ··· 1035 1038 'javelin-uri', 1036 1039 'javelin-routable', 1037 1040 ), 1041 + '1f6748ae' => array( 1042 + 'javelin-dom', 1043 + 'javelin-util', 1044 + 'javelin-stratcom', 1045 + 'javelin-install', 1046 + 'javelin-workflow', 1047 + 'javelin-router', 1048 + 'javelin-behavior-device', 1049 + 'javelin-vector', 1050 + 'phabricator-diff-inline', 1051 + ), 1038 1052 '1f6794f6' => array( 1039 1053 'javelin-behavior', 1040 1054 'javelin-stratcom', ··· 1072 1086 'javelin-install', 1073 1087 'javelin-util', 1074 1088 ), 1075 - '2971e2a2' => array( 1076 - 'phui-inline-comment-view-css', 1077 - ), 1078 1089 '2ae077e1' => array( 1079 1090 'javelin-behavior', 1080 1091 'javelin-dom', ··· 1110 1121 'javelin-dom', 1111 1122 'javelin-workflow', 1112 1123 ), 1113 - '3359ad02' => array( 1114 - 'javelin-dom', 1115 - 'javelin-util', 1116 - 'javelin-stratcom', 1117 - 'javelin-install', 1118 - 'javelin-workflow', 1119 - 'javelin-router', 1120 - 'javelin-behavior-device', 1121 - 'javelin-vector', 1122 - 'phabricator-diff-inline', 1123 - ), 1124 1124 '358b8c04' => array( 1125 1125 'javelin-install', 1126 1126 'javelin-util', ··· 1201 1201 ), 1202 1202 '453c5375' => array( 1203 1203 'javelin-behavior', 1204 - 'javelin-dom', 1205 - ), 1206 - '45d37835' => array( 1207 1204 'javelin-dom', 1208 1205 ), 1209 1206 '469c0d9e' => array( ··· 1541 1538 'javelin-dom', 1542 1539 'javelin-stratcom', 1543 1540 ), 1541 + '85abc805' => array( 1542 + 'javelin-install', 1543 + ), 1544 1544 '85ee8ce6' => array( 1545 1545 'aphront-dialog-view-css', 1546 1546 ), ··· 1651 1651 'javelin-uri', 1652 1652 'javelin-mask', 1653 1653 'phabricator-drag-and-drop-file-upload', 1654 + ), 1655 + '983751ee' => array( 1656 + 'phui-inline-comment-view-css', 1654 1657 ), 1655 1658 '988040b4' => array( 1656 1659 'javelin-install', ··· 1817 1820 'phabricator-prefab', 1818 1821 ), 1819 1822 'b3e7d692' => array( 1820 - 'javelin-install', 1821 - ), 1822 - 'b42eb5ff' => array( 1823 1823 'javelin-install', 1824 1824 ), 1825 1825 'b59e1e96' => array(
+5
webroot/rsrc/css/application/differential/changeset-view.css
··· 408 408 .diff-banner-path { 409 409 color: {$greytext}; 410 410 } 411 + 412 + .diff-banner-has-unsaved, 413 + .diff-banner-has-unsubmitted { 414 + background: {$sh-yellowbackground}; 415 + }
+5
webroot/rsrc/js/application/diff/DiffChangeset.js
··· 679 679 return null; 680 680 }, 681 681 682 + getInlines: function() { 683 + this._rebuildAllInlines(); 684 + return this._inlines; 685 + }, 686 + 682 687 _rebuildAllInlines: function() { 683 688 var rows = JX.DOM.scry(this._node, 'tr'); 684 689 for (var ii = 0; ii < rows.length; ii++) {
+42
webroot/rsrc/js/application/diff/DiffChangesetList.js
··· 818 818 this._redrawSelection(); 819 819 this._redrawHover(); 820 820 821 + // Force a banner redraw after a resize event. Particularly, this makes 822 + // sure the inline state updates immediately after an inline edit 823 + // operation, even if the changeset itself has not changed. 824 + this._bannerChangeset = null; 825 + 821 826 this._redrawBanner(); 822 827 }, 823 828 ··· 1277 1282 JX.DOM.remove(node); 1278 1283 return; 1279 1284 } 1285 + 1286 + var changesets = this._changesets; 1287 + var unsaved = []; 1288 + var unsubmitted = []; 1289 + var undone = []; 1290 + var all = []; 1291 + 1292 + for (var ii = 0; ii < changesets.length; ii++) { 1293 + var inlines = changesets[ii].getInlines(); 1294 + for (var jj = 0; jj < inlines.length; jj++) { 1295 + var inline = inlines[jj]; 1296 + 1297 + if (inline.isDeleted()) { 1298 + continue; 1299 + } 1300 + 1301 + all.push(inline); 1302 + 1303 + if (inline.isEditing()) { 1304 + unsaved.push(inline); 1305 + } else if (inline.isDraft()) { 1306 + unsubmitted.push(inline); 1307 + } else if (!inline.isDone()) { 1308 + undone.push(inline); 1309 + } 1310 + } 1311 + } 1312 + 1313 + JX.DOM.alterClass( 1314 + node, 1315 + 'diff-banner-has-unsaved', 1316 + !!unsaved.length); 1317 + 1318 + JX.DOM.alterClass( 1319 + node, 1320 + 'diff-banner-has-unsubmitted', 1321 + !!unsubmitted.length); 1280 1322 1281 1323 var icon = new JX.PHUIXIconView() 1282 1324 .setIcon(changeset.getIcon())
+16
webroot/rsrc/js/application/diff/DiffInline.js
··· 81 81 return this; 82 82 }, 83 83 84 + isDraft: function() { 85 + return this._isDraft; 86 + }, 87 + 88 + isDone: function() { 89 + return this._isFixed; 90 + }, 91 + 92 + isEditing: function() { 93 + return this._isEditing; 94 + }, 95 + 96 + isDeleted: function() { 97 + return this._isDeleted; 98 + }, 99 + 84 100 bindToRange: function(data) { 85 101 this._displaySide = data.displaySide; 86 102 this._number = parseInt(data.number, 10);