From 4bc3f3aa213de18d89c32df454957752400f249f Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Mon, 6 May 2019 16:45:23 +0800 Subject: [PATCH] Add `clean-sidebar` feature (#2011) --- readme.md | 1 + source/content.ts | 1 + source/features/clean-sidebar.css | 9 +++ source/features/clean-sidebar.tsx | 97 +++++++++++++++++++++++++++++++ source/features/hide-tips.css | 5 -- 5 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 source/features/clean-sidebar.css create mode 100644 source/features/clean-sidebar.tsx 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 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.css b/source/features/clean-sidebar.css new file mode 100644 index 00000000000..417703dfd42 --- /dev/null +++ b/source/features/clean-sidebar.css @@ -0,0 +1,9 @@ +/* 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/clean-sidebar.tsx b/source/features/clean-sidebar.tsx new file mode 100644 index 00000000000..c1990a61b99 --- /dev/null +++ b/source/features/clean-sidebar.tsx @@ -0,0 +1,97 @@ +/* +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'; +import observeEl from '../libs/simplified-element-observer'; +import {isPR} from '../libs/page-detect'; + +let canEditSidebar = false; + +// 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) { + list.remove(); + section.classList.add('rgh-clean-sidebar'); + } else { + section.remove(); + } + + return true; + } + + return false; +} + +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) { + 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} + ); + assignees.closest('.discussion-sidebar-item')!.classList.add('rgh-clean-sidebar'); + } + } + + // Reviewers + if (isPR()) { + cleanSection('[aria-label="Select reviewers"] > .css-truncate'); + } + + // Labels + if (!cleanSection('.js-issue-labels') && !canEditSidebar) { + select('.sidebar-labels div.discussion-sidebar-heading')!.remove(); + } + + // Projects + cleanSection('.sidebar-projects'); + + // Milestones + const milestones = select('.sidebar-milestone')!; + const milestonesInfo = milestones.lastChild!.lastChild!; + if (milestonesInfo.textContent!.trim() === 'No milestone') { + if (canEditSidebar) { + milestonesInfo.remove(); + milestones.classList.add('rgh-clean-sidebar'); + } else { + milestones.remove(); + } + } + + // Notifications + select('.sidebar-notifications .discussion-sidebar-heading')!.remove(); +} + +function init(): void { + canEditSidebar = select.exists('.sidebar-labels .octicon-gear'); + clean(); + observeEl('.discussion-sidebar', clean); +} + +features.add({ + id: 'link-to-file-in-file-history', + include: [ + features.isIssue, + features.isPRConversation + ], + load: features.onAjaxedPages, + init +}); 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;