From 0222b385156bfd639879d326692ad8360e1e12c6 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 03:28:17 +0800 Subject: [PATCH 01/10] Add `clean-sidebar` feature --- source/content.ts | 1 + source/features/clean-sidebar.tsx | 85 +++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 source/features/clean-sidebar.tsx diff --git a/source/content.ts b/source/content.ts index 6943c7d3fb5..f2b4449c291 100644 --- a/source/content.ts +++ b/source/content.ts @@ -100,6 +100,7 @@ import './features/filter-pr-by-build-status'; import './features/edit-files-faster'; import './features/hide-disabled-milestone-sorter'; import './features/link-to-file-in-file-history'; +import './features/clean-sidebar'; import './features/scrollable-code-and-blockquote.css'; import './features/center-reactions-popup.css'; diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx new file mode 100644 index 00000000000..776a8aaa6b9 --- /dev/null +++ b/source/features/clean-sidebar.tsx @@ -0,0 +1,85 @@ +/* +Hide all empty sections (or just their "empty" label) in discussion sidebar +*/ + +import React from 'dom-chef'; +import select from 'select-dom'; +import features from '../libs/features'; + +function init(): void { + const canEditSidebar = select.exists('.discussion-sidebar .octicon-gear'); + + // Reviewers + const reviewers = select('[aria-label="Select reviewers"] > .css-truncate')!; + if (reviewers.children.length === 0) { + if (canEditSidebar) { + reviewers.remove(); + } else { + reviewers.closest('.discussion-sidebar-item')!.remove(); + } + } + + // Assignees + const assignees = select('.js-issue-assignees')!; + if (assignees.children.length === 0) { + assignees.closest('.discussion-sidebar-item')!.remove(); + } else { + const assignYourself = select('.js-issue-assign-self'); + if (assignYourself) { + (assignYourself.previousSibling as ChildNode).remove(); // Drop "No one — " + select('[aria-label="Select assignees"] summary')!.append( + – {assignYourself} + ); + } + } + + // Labels + const labels = select('.js-issue-labels')!; + if (labels.children.length === 0) { + if (canEditSidebar) { + labels.remove(); + } else { + labels.closest('.discussion-sidebar-item')!.remove(); + } + } else if (!canEditSidebar) { + select('.sidebar-labels div.discussion-sidebar-heading')!.remove(); + } + + // Projects + const projects = select('.sidebar-projects')!; + if (projects.children.length === 0) { + if (canEditSidebar) { + projects.remove(); + } else { + projects.closest('.discussion-sidebar-item')!.remove(); + } + } + + // Milestones + const milestones = select('.sidebar-milestone')!; + if (!select.exists('.milestone-name', milestones)) { + if (canEditSidebar) { + const lastTextNode = milestones.lastChild!.lastChild!; + if (lastTextNode.textContent!.trim() === 'No milestone') { + lastTextNode.remove(); + } else { + throw new Error('Refined GitHub: milestones in sidebar could not be hidden'); + } + } else { + milestones.closest('.discussion-sidebar-item')!.remove(); + } + } + + // Notifications + select('.sidebar-notifications .discussion-sidebar-heading')!.remove(); +} + +features.add({ + id: 'link-to-file-in-file-history', + include: [ + features.isIssue, + features.isPRConversation + ], + load: features.onAjaxedPages, + init +}); From 9b2d1fef3112509cfa5a04fcc0425f4439f1fc9c Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 03:42:17 +0800 Subject: [PATCH 02/10] Add support for ajaxed sidebar --- source/features/clean-sidebar.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index 776a8aaa6b9..e880cf9e250 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -5,8 +5,9 @@ Hide all empty sections (or just their "empty" label) in discussion sidebar import React from 'dom-chef'; import select from 'select-dom'; import features from '../libs/features'; +import observeEl from '../libs/simplified-element-observer'; -function init(): void { +function clean(): void { const canEditSidebar = select.exists('.discussion-sidebar .octicon-gear'); // Reviewers @@ -74,6 +75,11 @@ function init(): void { select('.sidebar-notifications .discussion-sidebar-heading')!.remove(); } +function init(): void { + clean(); + observeEl('.discussion-sidebar', clean); +} + features.add({ id: 'link-to-file-in-file-history', include: [ From ceeca8d39466240b471516dd488a84f5cbc7a1c3 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 03:57:14 +0800 Subject: [PATCH 03/10] Deduplicate code --- source/features/clean-sidebar.tsx | 47 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index e880cf9e250..9a6288bff48 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -7,19 +7,26 @@ import select from 'select-dom'; import features from '../libs/features'; import observeEl from '../libs/simplified-element-observer'; -function clean(): void { - const canEditSidebar = select.exists('.discussion-sidebar .octicon-gear'); +let canEditSidebar = false; - // Reviewers - const reviewers = select('[aria-label="Select reviewers"] > .css-truncate')!; - if (reviewers.children.length === 0) { +// Selector points to element containing list of elements or "No labels" text +function cleanSection(selector: string): boolean { + const list = select(selector)!; + if (list.children.length === 0) { + const section = list.closest('.discussion-sidebar-item')!; if (canEditSidebar) { - reviewers.remove(); + list.remove(); } else { - reviewers.closest('.discussion-sidebar-item')!.remove(); + section.remove(); } + + return true; } + return false; +} + +function clean(): void { // Assignees const assignees = select('.js-issue-assignees')!; if (assignees.children.length === 0) { @@ -34,27 +41,18 @@ function clean(): void { } } + // Reviewers + if (isPR()) { + cleanSection('[aria-label="Select reviewers"] > .css-truncate'); + } + // Labels - const labels = select('.js-issue-labels')!; - if (labels.children.length === 0) { - if (canEditSidebar) { - labels.remove(); - } else { - labels.closest('.discussion-sidebar-item')!.remove(); - } - } else if (!canEditSidebar) { + if (!cleanSection('.js-issue-labels') && !canEditSidebar) { select('.sidebar-labels div.discussion-sidebar-heading')!.remove(); } // Projects - const projects = select('.sidebar-projects')!; - if (projects.children.length === 0) { - if (canEditSidebar) { - projects.remove(); - } else { - projects.closest('.discussion-sidebar-item')!.remove(); - } - } + cleanSection('.sidebar-projects'); // Milestones const milestones = select('.sidebar-milestone')!; @@ -67,7 +65,7 @@ function clean(): void { throw new Error('Refined GitHub: milestones in sidebar could not be hidden'); } } else { - milestones.closest('.discussion-sidebar-item')!.remove(); + milestones.remove(); } } @@ -76,6 +74,7 @@ function clean(): void { } function init(): void { + canEditSidebar = select.exists('.discussion-sidebar .octicon-gear'); clean(); observeEl('.discussion-sidebar', clean); } From 166901080639d3cd115e7163704fd078ef301903 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 04:03:00 +0800 Subject: [PATCH 04/10] Avoid errors on duplicate runs on the same content --- source/features/clean-sidebar.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index 9a6288bff48..86adc88dce4 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -6,6 +6,7 @@ import React from 'dom-chef'; import select from 'select-dom'; import features from '../libs/features'; import observeEl from '../libs/simplified-element-observer'; +import {isPR} from '../libs/page-detect'; let canEditSidebar = false; @@ -27,6 +28,12 @@ function cleanSection(selector: string): boolean { } function clean(): void { + if (select.exists('.rgh-clean-sidebar')) { + return; + } + + select('#partial-discussion-sidebar')!.classList.add('rgh-clean-sidebar'); + // Assignees const assignees = select('.js-issue-assignees')!; if (assignees.children.length === 0) { From b8172bf365c489622719cf4b2452e92591e82b50 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 04:08:09 +0800 Subject: [PATCH 05/10] Adjust spacing --- source/features/clean-sidebar.css | 3 +++ source/features/clean-sidebar.tsx | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 source/features/clean-sidebar.css diff --git a/source/features/clean-sidebar.css b/source/features/clean-sidebar.css new file mode 100644 index 00000000000..5458889c4b4 --- /dev/null +++ b/source/features/clean-sidebar.css @@ -0,0 +1,3 @@ +.rgh-clean-sidebar { + margin-bottom: -5px; +} diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index 86adc88dce4..19c29eacb83 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -2,6 +2,7 @@ Hide all empty sections (or just their "empty" label) in discussion sidebar */ +import './clean-sidebar.css'; import React from 'dom-chef'; import select from 'select-dom'; import features from '../libs/features'; @@ -17,6 +18,7 @@ function cleanSection(selector: string): boolean { const section = list.closest('.discussion-sidebar-item')!; if (canEditSidebar) { list.remove(); + section.classList.add('rgh-clean-sidebar'); } else { section.remove(); } @@ -68,6 +70,7 @@ function clean(): void { const lastTextNode = milestones.lastChild!.lastChild!; if (lastTextNode.textContent!.trim() === 'No milestone') { lastTextNode.remove(); + milestones.classList.add('rgh-clean-sidebar'); } else { throw new Error('Refined GitHub: milestones in sidebar could not be hidden'); } From ae883c65d79cb7f0bfc742ecc247db1db0aa9168 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 04:19:50 +0800 Subject: [PATCH 06/10] CSS fixes --- source/features/clean-sidebar.css | 8 +++++++- source/features/hide-tips.css | 5 ----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/source/features/clean-sidebar.css b/source/features/clean-sidebar.css index 5458889c4b4..417703dfd42 100644 --- a/source/features/clean-sidebar.css +++ b/source/features/clean-sidebar.css @@ -1,3 +1,9 @@ -.rgh-clean-sidebar { +/* Adjust spacing of empty sections */ +.discussion-sidebar-item.rgh-clean-sidebar { margin-bottom: -5px; } + +/* Remove message under the `Unsubscribe` button */ +.sidebar-notifications .reason { + display: none !important; +} diff --git a/source/features/hide-tips.css b/source/features/hide-tips.css index 7071df716a4..429b4eae4ff 100644 --- a/source/features/hide-tips.css +++ b/source/features/hide-tips.css @@ -28,11 +28,6 @@ a.tabnav-extra[href$='mastering-markdown/'] { display: none !important; } -/* Remove message under the `Unsubscribe` button */ -.sidebar-notifications .reason { - display: none !important; -} - /* Remove Marketplace marketing box on PRs */ .js-marketplace-callout-container { display: none !important; From cc24a4e9ab2a6206e722cf07522c418f4f7359de Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 04:19:54 +0800 Subject: [PATCH 07/10] Update readme.md --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 0513391add4..fd98354fc4e 100644 --- a/readme.md +++ b/readme.md @@ -158,6 +158,7 @@ GitHub Enterprise is also supported. More info in the options. - [Forks and watchers counters are hidden.](https://user-images.githubusercontent.com/1402241/53681077-f3328b80-3d1e-11e9-9e29-2cb017141769.png) - [Diff signs are hidden.](https://user-images.githubusercontent.com/1402241/54807718-149cec80-4cb9-11e9-869c-e265863211e3.png) - [Hide milestone sorter UI if you don’t have permission to use it.](https://user-images.githubusercontent.com/7753001/56913933-738a2880-6ae5-11e9-9d13-1973cbbf5df0.png) +- [Empty sections in the issue/PRs sidebar are hidden.](https://user-images.githubusercontent.com/1402241/57199809-20691780-6fb6-11e9-9672-1ad3f9e1b827.png) ### UI improvements From 8eaf87f3f56fe5385abacebbf32d5f612346175b Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 16:19:21 +0800 Subject: [PATCH 08/10] Change editability permission detection --- source/features/clean-sidebar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index 19c29eacb83..2cda829dde2 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -84,7 +84,7 @@ function clean(): void { } function init(): void { - canEditSidebar = select.exists('.discussion-sidebar .octicon-gear'); + canEditSidebar = select.exists('.sidebar-labels .octicon-gear'); clean(); observeEl('.discussion-sidebar', clean); } From 7d02962811316f41b15d91c6e9be9db4aeccc66d Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 16:42:07 +0800 Subject: [PATCH 09/10] Adjust spacing in Assignees --- source/features/clean-sidebar.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index 2cda829dde2..68c322cc04b 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -47,6 +47,7 @@ function clean(): void { select('[aria-label="Select assignees"] summary')!.append( – {assignYourself} ); + assignees.closest('.discussion-sidebar-item')!.classList.add('rgh-clean-sidebar'); } } From 4f3eaf73428dc998cea57a092013cd2a862d3b84 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 16:42:12 +0800 Subject: [PATCH 10/10] Adjust spacing in Milestones --- source/features/clean-sidebar.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/source/features/clean-sidebar.tsx b/source/features/clean-sidebar.tsx index 68c322cc04b..c1990a61b99 100644 --- a/source/features/clean-sidebar.tsx +++ b/source/features/clean-sidebar.tsx @@ -66,15 +66,11 @@ function clean(): void { // Milestones const milestones = select('.sidebar-milestone')!; - if (!select.exists('.milestone-name', milestones)) { + const milestonesInfo = milestones.lastChild!.lastChild!; + if (milestonesInfo.textContent!.trim() === 'No milestone') { if (canEditSidebar) { - const lastTextNode = milestones.lastChild!.lastChild!; - if (lastTextNode.textContent!.trim() === 'No milestone') { - lastTextNode.remove(); - milestones.classList.add('rgh-clean-sidebar'); - } else { - throw new Error('Refined GitHub: milestones in sidebar could not be hidden'); - } + milestonesInfo.remove(); + milestones.classList.add('rgh-clean-sidebar'); } else { milestones.remove(); }