Skip to content

Commit cd504e3

Browse files
committed
feat: add ability to select repository from tab
1 parent ea95909 commit cd504e3

File tree

8 files changed

+82
-17
lines changed

8 files changed

+82
-17
lines changed

frontend/src/components/cme-form-view/cme-form-view.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import '../cme-repo-selector';
1717
import FormBuilder from './FormBuilder';
1818
import TemplateCompiler from './TemplateCompiler';
1919
import {CodeEditor} from '../cme-code-editor/cme-code-editor';
20+
import { RepoSelector } from '../cme-repo-selector';
2021

2122
@customElement('cme-form-view')
2223
export class FormView extends connect(store)(LitElement) {
@@ -53,6 +54,9 @@ export class FormView extends connect(store)(LitElement) {
5354
@state()
5455
private _tokenValues: {[name: string]: string | string[]} = {};
5556

57+
@query('#form-view-repo-selector')
58+
private _repoSelector!: RepoSelector;
59+
5660
private _dynamicTemplate: string[] = [];
5761
private _reduceEmptyLines = true;
5862

@@ -129,13 +133,25 @@ export class FormView extends connect(store)(LitElement) {
129133
compiler.reduceEmptyLines = this._reduceEmptyLines;
130134
const compiled = compiler.compile();
131135

136+
const {selectedRepositoryPath} = this._repoSelector;
137+
132138
if (this._amendCbChecked) {
133139
store.dispatch(confirmAmend(compiled));
134140
} else if (this._saveAndClose) {
135-
store.dispatch(copyToSCMInputBox(compiled));
141+
store.dispatch(
142+
copyToSCMInputBox({
143+
commitMessage: compiled,
144+
selectedRepositoryPath,
145+
})
146+
);
136147
store.dispatch(closeTab());
137148
} else {
138-
store.dispatch(copyToSCMInputBox(compiled));
149+
store.dispatch(
150+
copyToSCMInputBox({
151+
commitMessage: compiled,
152+
selectedRepositoryPath,
153+
})
154+
);
139155
}
140156
}
141157

@@ -204,7 +220,7 @@ export class FormView extends connect(store)(LitElement) {
204220
${formElements}
205221
</vscode-form-container>
206222
</div>
207-
<cme-repo-selector></cme-repo-selector>
223+
<cme-repo-selector id="form-view-repo-selector"></cme-repo-selector>
208224
<div class="buttons">
209225
<vscode-button
210226
id="success-button-form"

frontend/src/components/cme-repo-selector.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {LitElement, html, css, CSSResult, TemplateResult} from 'lit';
2-
import {customElement, state} from 'lit/decorators.js';
2+
import {customElement, state, property} from 'lit/decorators.js';
33
import {nothing} from 'lit';
44
import {connect} from 'pwa-helpers';
55
import '@bendera/vscode-webview-elements/dist/vscode-icon';
@@ -9,6 +9,11 @@ import store, {RootState} from '../store/store';
99

1010
@customElement('cme-repo-selector')
1111
export class RepoSelector extends connect(store)(LitElement) {
12+
@property()
13+
get selectedRepositoryPath(): string {
14+
return this._selectedRepositoryPath;
15+
}
16+
1217
@state()
1318
private _numberOfRepositories = 1;
1419

@@ -35,6 +40,18 @@ export class RepoSelector extends connect(store)(LitElement) {
3540
return fpParts[fpParts.length - 1];
3641
}
3742

43+
private _handleChange(
44+
ev: CustomEvent<{selectedIndex: number; value: string}>
45+
) {
46+
this._selectedRepositoryPath = ev.detail.value;
47+
48+
const changeEvent = new CustomEvent('cme-change', {
49+
detail: ev.detail.value,
50+
});
51+
52+
this.dispatchEvent(changeEvent);
53+
}
54+
3855
static get styles(): CSSResult {
3956
return css`
4057
.repo-info {
@@ -55,7 +72,7 @@ export class RepoSelector extends connect(store)(LitElement) {
5572
return html`<div class="repo-info">
5673
<vscode-icon name="repo"></vscode-icon>&nbsp;
5774
<b>Selected repository:</b>&nbsp;
58-
<vscode-single-select>
75+
<vscode-single-select @vsc-change=${this._handleChange}>
5976
${this._availableRepositories.map(
6077
(r) =>
6178
html`<vscode-option

frontend/src/components/cme-text-view.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {LitElement, html, css, CSSResult, nothing, TemplateResult} from 'lit';
2-
import {customElement, state} from 'lit/decorators.js';
2+
import {customElement, query, state} from 'lit/decorators.js';
33
import {connect} from 'pwa-helpers';
44
import '@bendera/vscode-webview-elements/dist/vscode-button';
55
import '@bendera/vscode-webview-elements/dist/vscode-checkbox';
@@ -17,6 +17,7 @@ import {
1717
import './cme-code-editor/cme-code-editor';
1818
import './cme-recent-commits';
1919
import './cme-repo-selector';
20+
import {RepoSelector} from './cme-repo-selector';
2021
import {triggerInputboxRerender} from './helpers';
2122

2223
@customElement('cme-text-view')
@@ -65,6 +66,9 @@ export class TextView extends connect(store)(LitElement) {
6566
@state()
6667
private _visibleLines = 10;
6768

69+
@query('#text-view-repo-selector')
70+
private _repoSelector!: RepoSelector;
71+
6872
private _staticTemplate = '';
6973
private _amendCbChecked = false;
7074

@@ -80,13 +84,19 @@ export class TextView extends connect(store)(LitElement) {
8084
}
8185

8286
private _handleSuccessButtonClick() {
87+
const {selectedRepositoryPath} = this._repoSelector;
88+
const successAction = copyToSCMInputBox({
89+
commitMessage: this._inputBoxValue,
90+
selectedRepositoryPath,
91+
});
92+
8393
if (this._amendCbChecked) {
8494
store.dispatch(confirmAmend(this._inputBoxValue));
8595
} else if (this._saveAndClose) {
86-
store.dispatch(copyToSCMInputBox(this._inputBoxValue));
96+
store.dispatch(successAction);
8797
store.dispatch(closeTab());
8898
} else {
89-
store.dispatch(copyToSCMInputBox(this._inputBoxValue));
99+
store.dispatch(successAction);
90100
}
91101
}
92102

@@ -257,7 +267,7 @@ export class TextView extends connect(store)(LitElement) {
257267
</p>
258268
</div>
259269
${this._useMonospaceEditor ? monospaceEditor : inputbox}
260-
<cme-repo-selector></cme-repo-selector>
270+
<cme-repo-selector id="text-view-repo-selector"></cme-repo-selector>
261271
<div class="buttons">
262272
<vscode-button @click="${this._handleSuccessButtonClick}"
263273
>${this._saveAndClose ? 'Save and close' : 'Save'}</vscode-button

frontend/src/store/actions.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,16 @@ export const textareaValueChanged = createAction<string>(
3434
TEXTAREA_VALUE_CHANGED
3535
);
3636
export const confirmAmend = createAction<string>(CONFIRM_AMEND);
37-
export const copyToSCMInputBox = createAction<string>(COPY_TO_SCM_INPUT_BOX);
37+
export const copyToSCMInputBox = createAction<{
38+
commitMessage: string;
39+
selectedRepositoryPath: string;
40+
}>(COPY_TO_SCM_INPUT_BOX);
3841
export const receiveRepositoryInfo = createAction<RepositoryInfo>(
3942
REPOSITORY_INFO_RECEIVED
4043
);
41-
export const updateTokenValues =
42-
createAction<{[key: string]: string}>(UPDATE_TOKEN_VALUES);
44+
export const updateTokenValues = createAction<{[key: string]: string}>(
45+
UPDATE_TOKEN_VALUES
46+
);
4347

4448
export const importConfig = createAction(IMPORT_CONFIG);
4549
export const shareableConfigChange = createAction<ShareableConfig>(

frontend/src/store/middlewares/postMessageDispatcher.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const postMessageDispatcher: Middleware = (_) => (next) => (action) => {
2727
break;
2828
case COPY_TO_SCM_INPUT_BOX:
2929
vscode.postMessage({
30+
// TODO: rename
3031
command: 'copyFromExtensionMessageBox',
3132
payload,
3233
});

frontend/src/test/components/cme-form-view/cme-form-view.test.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,12 @@ describe('cme-form-view', () => {
190190
message += '\n';
191191
message += 'BREAKING CHANGE: footer test';
192192

193-
expect(calls[0].firstArg).to.deep.equal(copyToSCMInputBox(message));
193+
expect(calls[0].firstArg).to.deep.equal(
194+
copyToSCMInputBox({
195+
commitMessage: message,
196+
selectedRepositoryPath: '',
197+
})
198+
);
194199
expect(calls[1].firstArg).to.deep.equal(closeTab());
195200
});
196201

@@ -228,7 +233,9 @@ describe('cme-form-view', () => {
228233
message += '\n';
229234
message += 'BREAKING CHANGE: footer test';
230235

231-
expect(calls[0].firstArg).to.deep.equal(copyToSCMInputBox(message));
236+
expect(calls[0].firstArg).to.deep.equal(
237+
copyToSCMInputBox({commitMessage: message, selectedRepositoryPath: ''})
238+
);
232239
expect(calls[1]).to.be.undefined;
233240
});
234241

src/commands/EditorController.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,10 @@ export default class EditorController {
106106
const { command, payload } = data;
107107

108108
switch (command) {
109+
// TODO: rename
109110
case 'copyFromExtensionMessageBox':
110-
this._git.setSCMInputBoxMessage(payload);
111+
const { commitMessage, selectedRepositoryPath } = payload;
112+
this._git.setSCMInputBoxMessage(commitMessage, selectedRepositoryPath);
111113
break;
112114
case 'closeTab':
113115
this._primaryEditorPanel?.dispose();

src/utils/GitService.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,16 @@ class GitService {
103103
return '';
104104
}
105105

106-
public setSCMInputBoxMessage(message: string): void {
107-
const repo = this.getSelectedRepository();
106+
public setSCMInputBoxMessage(message: string, repositoryPath = ''): void {
107+
let repo: Repository | undefined;
108+
109+
if (repositoryPath !== '') {
110+
repo = this.getRepositoryByPath(repositoryPath);
111+
}
112+
113+
if (!repo) {
114+
repo = this.getSelectedRepository();
115+
}
108116

109117
if (repo) {
110118
repo.inputBox.value = message;

0 commit comments

Comments
 (0)