From daf633137ec08e6f5647a6f8bb0b02d5dce58ef9 Mon Sep 17 00:00:00 2001 From: Flo Edelmann Date: Fri, 3 Jul 2020 00:29:52 +0200 Subject: Rename `discussion` → `conversation` (#3308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/features/batch-open-conversations.tsx | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 source/features/batch-open-conversations.tsx (limited to 'source/features/batch-open-conversations.tsx') diff --git a/source/features/batch-open-conversations.tsx b/source/features/batch-open-conversations.tsx new file mode 100644 index 00000000..c5f5b17b --- /dev/null +++ b/source/features/batch-open-conversations.tsx @@ -0,0 +1,79 @@ +import React from 'dom-chef'; +import select from 'select-dom'; +import delegate from 'delegate-it'; +import elementReady from 'element-ready'; +import * as pageDetect from 'github-url-detection'; + +import features from '.'; + +const confirmationRequiredCount = 10; + +function getUrlFromItem(checkbox: Element): string { + return checkbox + .closest('.js-issue-row')! + .querySelector('.js-navigation-open')! + .href; +} + +function openIssues(): void { + const modifier = pageDetect.isGlobalConversationList() ? '' : ' + div '; + const issues = select.all([ + `#js-issues-toolbar.triage-mode ${modifier} [name="issues[]"]:checked`, // Get checked checkboxes + `#js-issues-toolbar:not(.triage-mode) ${modifier} .js-issue-row` // Or all items + ]); + + if ( + issues.length >= confirmationRequiredCount && + !confirm(`This will open ${issues.length} new tabs. Continue?`) + ) { + return; + } + + void browser.runtime.sendMessage({ + openUrls: issues.map(getUrlFromItem) + }); +} + +async function init(): Promise { + if (!await elementReady('.js-issue-row + .js-issue-row')) { + return false; + } + + delegate(document, '.rgh-batch-open-issues', 'click', openIssues); + + // Add button to open all visible conversations + select('.table-list-header-toggle:not(.states)')?.prepend( + + ); + + // Add button to open selected conversations + const triageFiltersBar = select('.table-list-triage > .text-gray'); + if (triageFiltersBar) { + triageFiltersBar.classList.add('table-list-header-toggle'); // Handles link :hover style + triageFiltersBar.append( + + ); + } +} + +void features.add({ + id: __filebasename, + description: 'Adds a button to open multiple conversations at once in your repos.', + screenshot: 'https://user-images.githubusercontent.com/1402241/38084752-4820b0d8-3378-11e8-868c-a1582b16f915.gif' +}, { + include: [ + pageDetect.isConversationList + ], + waitForDomReady: false, + init +}); -- cgit v1.2.3