1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
import React from 'dom-chef';
import select from 'select-dom';
import delegate from 'delegate-it';
import * as pageDetect from 'github-url-detection';
import * as textFieldEdit from 'text-field-edit';
import features from '.';
import concatRegex from '../helpers/concat-regex';
import onPrMergePanelOpen from '../github-events/on-pr-merge-panel-open';
const prTitleFieldSelector = '.js-issue-update [name="issue[title]"]';
const prTitleSubmitSelector = '.js-issue-update [type="submit"]';
function getCommitTitleField(): HTMLInputElement | undefined {
return select<HTMLInputElement>('.is-squashing #merge_title_field') ?? undefined;
}
function getPRNumber(): string {
return select('.gh-header-number')!.textContent!;
}
function createCommitTitle(): string {
const prTitle = select('.js-issue-title')!.textContent!.trim();
return `${prTitle} (${getPRNumber()})`;
}
function needsSubmission(): boolean {
const inputField = getCommitTitleField();
if (!inputField || inputField.value === '') {
return false;
}
// Ensure that the required fields are on the page
if (!select.exists(prTitleFieldSelector) || !select.exists(prTitleSubmitSelector)) {
features.error(__filebasename, 'Can’t update the PR title');
return false;
}
return createCommitTitle() !== inputField.value;
}
function getUI(): HTMLElement {
return select('.note.rgh-sync-pr-commit-title-note') ?? (
<p className="note rgh-sync-pr-commit-title-note">
The title of this PR will be updated to match this title. <button type="button" className="btn-link muted-link text-underline rgh-sync-pr-commit-title">Cancel</button>
</p>
);
}
function updateUI(): void {
if (needsSubmission()) {
getCommitTitleField()!.after(getUI());
} else {
getUI().remove();
}
}
function updatePRTitle(): void {
if (!needsSubmission()) {
return;
}
// Remove PR number from commit title
const prTitle = getCommitTitleField()!.value
.replace(concatRegex(/\s*\(/, getPRNumber(), /\)$/), '');
// Fill and submit title-change form
select<HTMLInputElement>(prTitleFieldSelector)!.value = prTitle;
select(prTitleSubmitSelector)!.click(); // `form.submit()` isn't sent via ajax
}
async function updateCommitTitle(event: Event): Promise<void> {
const field = getCommitTitleField();
// Only if the user hasn't already interacted with it in this session
if (field && event.type !== 'session:resume') {
textFieldEdit.set(field, createCommitTitle());
}
updateUI();
}
function disableSubmission(): void {
deinit();
getUI().remove();
}
let listeners: delegate.Subscription[];
function init(): void {
listeners = [
onPrMergePanelOpen(updateCommitTitle),
delegate(document, '#merge_title_field', 'input', updateUI),
delegate(document, 'form.js-merge-pull-request', 'submit', updatePRTitle),
delegate(document, '.rgh-sync-pr-commit-title', 'click', disableSubmission)
];
}
function deinit(): void {
for (const delegation of listeners) {
delegation.destroy();
}
listeners.length = 0;
}
void features.add(__filebasename, {
include: [
pageDetect.isPRConversation
],
init
});
|