Skip to content

Commit 3997a58

Browse files
Copilotalexr00
andcommitted
Add change template icon button next to Description when using template setting
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 7fe6164 commit 3997a58

File tree

6 files changed

+36
-12
lines changed

6 files changed

+36
-12
lines changed

common/views.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export interface CreateParamsNew {
130130

131131
creating: boolean;
132132
reviewing: boolean;
133+
usingTemplate: boolean;
133134
}
134135

135136
export interface ChooseRemoteAndBranchArgs {

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,12 @@
145145
"type": "string",
146146
"enum": [
147147
"template",
148-
"templatePrompt",
149148
"commit",
150149
"none",
151150
"Copilot"
152151
],
153152
"enumDescriptions": [
154153
"%githubPullRequests.pullRequestDescription.template%",
155-
"%githubPullRequests.pullRequestDescription.templatePrompt%",
156154
"%githubPullRequests.pullRequestDescription.commit%",
157155
"%githubPullRequests.pullRequestDescription.none%",
158156
"%githubPullRequests.pullRequestDescription.copilot%"

package.nls.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"description": "Pull Request and Issue Provider for GitHub",
44
"githubPullRequests.pullRequestDescription.description": "The description used when creating pull requests.",
55
"githubPullRequests.pullRequestDescription.template": "Use a pull request template and commit description, or just use the commit description if no templates were found",
6-
"githubPullRequests.pullRequestDescription.templatePrompt": "Prompt to select from available pull request templates when multiple templates exist, otherwise use the first template",
76
"githubPullRequests.pullRequestDescription.commit": "Use the latest commit message only",
87
"githubPullRequests.pullRequestDescription.none": "Do not have a default description",
98
"githubPullRequests.pullRequestDescription.copilot": "Generate a pull request title and description from GitHub Copilot. Requires that the GitHub Copilot extension is installed and authenticated. Will fall back to `commit` if Copilot is not set up.",

src/github/createPRViewProvider.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ export abstract class BaseCreatePullRequestViewProvider<T extends BasePullReques
219219
commands.setContext(contexts.CREATE_PR_PERMISSIONS, viewerPermission);
220220

221221
const useCopilot: boolean = !!this.getTitleAndDescriptionProvider('Copilot') && (vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<'commit' | 'template' | 'none' | 'Copilot'>(PULL_REQUEST_DESCRIPTION) === 'Copilot');
222+
const usingTemplate: boolean = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<'commit' | 'template' | 'none' | 'Copilot'>(PULL_REQUEST_DESCRIPTION) === 'template';
222223
const defaultTitleAndDescriptionProvider = this.getTitleAndDescriptionProvider()?.title;
223224
if (defaultTitleAndDescriptionProvider) {
224225
/* __GDPR__
@@ -255,7 +256,8 @@ export abstract class BaseCreatePullRequestViewProvider<T extends BasePullReques
255256
initializeWithGeneratedTitleAndDescription: useCopilot,
256257
preReviewState: PreReviewState.None,
257258
preReviewer: preReviewer?.title,
258-
reviewing: false
259+
reviewing: false,
260+
usingTemplate
259261
};
260262

261263
return params;
@@ -682,7 +684,7 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
682684
protected async getTitleAndDescription(compareBranch: Branch, baseBranch: string): Promise<{ title: string, description: string }> {
683685
let title: string = '';
684686
let description: string = '';
685-
const descrptionSource = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<'commit' | 'template' | 'templatePrompt' | 'none' | 'Copilot'>(PULL_REQUEST_DESCRIPTION);
687+
const descrptionSource = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<'commit' | 'template' | 'none' | 'Copilot'>(PULL_REQUEST_DESCRIPTION);
686688
if (descrptionSource === 'none') {
687689
return { title, description };
688690
}
@@ -699,7 +701,7 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
699701
const [totalCommits, lastCommit, pullRequestTemplate] = await Promise.all([
700702
this.getTotalGitHubCommits(compareBranch, baseBranch),
701703
name ? titleAndBodyFrom(promiseWithTimeout(this._folderRepositoryManager.getTipCommitMessage(name), 5000)) : undefined,
702-
descrptionSource === 'template' ? this._folderRepositoryManager.getPullRequestTemplateBody(this.model.baseOwner) : (descrptionSource === 'templatePrompt' ? this.getPullRequestTemplate() : undefined)
704+
descrptionSource === 'template' ? this.getPullRequestTemplate() : undefined
703705
]);
704706
const totalNonMergeCommits = totalCommits?.filter(commit => commit.parents.length < 2);
705707

@@ -757,14 +759,20 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
757759
}
758760

759761
private async getPullRequestTemplate(): Promise<string | undefined> {
762+
return this._folderRepositoryManager.getPullRequestTemplateBody(this.model.baseOwner);
763+
}
764+
765+
private async changeTemplate(message: IRequestMessage<any>): Promise<void> {
760766
const templates = await this._folderRepositoryManager.getAllPullRequestTemplates(this.model.baseOwner);
761767

762768
if (!templates || templates.length === 0) {
763-
return undefined;
769+
vscode.window.showInformationMessage(vscode.l10n.t('No pull request templates found'));
770+
return this._replyMessage(message, undefined);
764771
}
765772

766773
if (templates.length === 1) {
767-
return templates[0];
774+
vscode.window.showInformationMessage(vscode.l10n.t('Only one template is available'));
775+
return this._replyMessage(message, undefined);
768776
}
769777

770778
// Multiple templates exist - show quick pick
@@ -785,7 +793,10 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
785793
}
786794
);
787795

788-
return selectedTemplate?.template;
796+
if (selectedTemplate) {
797+
return this._replyMessage(message, { description: selectedTemplate.template });
798+
}
799+
return this._replyMessage(message, undefined);
789800
}
790801

791802
protected async detectBaseMetadata(defaultCompareBranch: Branch): Promise<BaseBranchMetadata | undefined> {
@@ -1359,6 +1370,9 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
13591370
case 'pr.cancelGenerateTitleAndDescription':
13601371
return this.cancelGenerateTitleAndDescription();
13611372

1373+
case 'pr.changeTemplate':
1374+
return this.changeTemplate(message);
1375+
13621376
case 'pr.preReview':
13631377
return this.preReview(message);
13641378

webviews/common/createContextNew.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ const defaultCreateParams: CreateParamsNew = {
3434
baseHasMergeQueue: false,
3535
preReviewState: PreReviewState.None,
3636
preReviewer: undefined,
37-
reviewing: false
37+
reviewing: false,
38+
usingTemplate: false
3839
};
3940

4041
export class CreatePRContextNew {

webviews/createPullRequestViewNew/app.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import PullRequestContextNew from '../common/createContextNew';
1212
import { ErrorBoundary } from '../common/errorBoundary';
1313
import { LabelCreate } from '../common/label';
1414
import { ContextDropdown } from '../components/contextDropdown';
15-
import { accountIcon, feedbackIcon, gitCompareIcon, milestoneIcon, prMergeIcon, projectIcon, sparkleIcon, stopCircleIcon, tagIcon } from '../components/icon';
15+
import { accountIcon, editIcon, feedbackIcon, gitCompareIcon, milestoneIcon, prMergeIcon, projectIcon, sparkleIcon, stopCircleIcon, tagIcon } from '../components/icon';
1616
import { Avatar } from '../components/user';
1717

1818
type CreateMethod = 'create-draft' | 'create' | 'create-automerge-squash' | 'create-automerge-rebase' | 'create-automerge-merge';
@@ -178,6 +178,13 @@ export function main() {
178178
setGeneratingTitle(false);
179179
}
180180

181+
async function changeTemplate() {
182+
const result = await ctx.postMessage({ command: 'pr.changeTemplate' });
183+
if (result && result.description) {
184+
ctx.updateState({ pendingDescription: result.description });
185+
}
186+
}
187+
181188

182189
if (!ctx.initialized) {
183190
ctx.initialize();
@@ -325,7 +332,11 @@ export function main() {
325332
: null}
326333
</div>
327334

328-
<label htmlFor='description' className='input-title'>Description</label>
335+
<div className='group-title'>
336+
<label htmlFor='description' className='input-title'>Description</label>
337+
{ctx.createParams.usingTemplate ?
338+
<a title='Change template' className={`title-action icon-button${isBusy || !ctx.initialized ? ' disabled' : ''}`} onClick={() => changeTemplate()} tabIndex={0}>{editIcon}</a> : null}
339+
</div>
329340
<div className='group-description'>
330341
<textarea
331342
id='description'

0 commit comments

Comments
 (0)