Show any edit weblinks in place of EDIT button
https://imgur.com/a/R9YPanV
Change-Id: Ib0b1f5cd59998f290694ca4437da2cfdef755a5e
diff --git a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts
index fa81103..baf0bb5 100644
--- a/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts
+++ b/polygerrit-ui/app/elements/core/gr-navigation/gr-navigation.ts
@@ -359,6 +359,13 @@
commit?: CommitId;
options?: GenerateWebLinksOptions;
}
+export interface GenerateWebLinksEditParameters {
+ type: WeblinkType.EDIT;
+ repo: RepoName;
+ commit: CommitId;
+ file: string;
+ options?: GenerateWebLinksOptions;
+}
export interface GenerateWebLinksFileParameters {
type: WeblinkType.FILE;
repo: RepoName;
@@ -375,11 +382,13 @@
export type GenerateWebLinksParameters =
| GenerateWebLinksPatchsetParameters
+ | GenerateWebLinksEditParameters
| GenerateWebLinksFileParameters
| GenerateWebLinksChangeParameters;
export type NavigateCallback = (target: string, redirect?: boolean) => void;
export type GenerateUrlCallback = (params: GenerateUrlParameters) => string;
+// TODO: Refactor to return only GeneratedWebLink[]
export type GenerateWebLinksCallback = (
params: GenerateWebLinksParameters
) => GeneratedWebLink[] | GeneratedWebLink;
@@ -413,6 +422,7 @@
export enum WeblinkType {
CHANGE = 'change',
+ EDIT = 'edit',
FILE = 'file',
PATCHSET = 'patchset',
}
@@ -889,6 +899,24 @@
return this._getUrlFor({view: GerritView.SETTINGS});
},
+ getEditWebLinks(
+ repo: RepoName,
+ commit: CommitId,
+ file: string,
+ options?: GenerateWebLinksOptions
+ ): GeneratedWebLink[] {
+ const params: GenerateWebLinksEditParameters = {
+ type: WeblinkType.EDIT,
+ repo,
+ commit,
+ file,
+ };
+ if (options) {
+ params.options = options;
+ }
+ return ([] as GeneratedWebLink[]).concat(this._generateWeblinks(params));
+ },
+
getFileWebLinks(
repo: RepoName,
commit: CommitId,
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
index 4aefc16..27708ab 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
@@ -33,6 +33,7 @@
GenerateUrlRepoViewParameters,
GenerateUrlSearchViewParameters,
GenerateWebLinksChangeParameters,
+ GenerateWebLinksEditParameters,
GenerateWebLinksFileParameters,
GenerateWebLinksParameters,
GenerateWebLinksPatchsetParameters,
@@ -382,6 +383,8 @@
params: GenerateWebLinksParameters
): GeneratedWebLink[] | GeneratedWebLink {
switch (params.type) {
+ case WeblinkType.EDIT:
+ return this._getEditWebLinks(params);
case WeblinkType.FILE:
return this._getFileWebLinks(params);
case WeblinkType.CHANGE:
@@ -457,6 +460,10 @@
);
}
+ _getEditWebLinks(params: GenerateWebLinksEditParameters): GeneratedWebLink[] {
+ return params.options?.weblinks || [];
+ }
+
_getFileWebLinks(params: GenerateWebLinksFileParameters): GeneratedWebLink[] {
return params.options?.weblinks || [];
}
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
index 6f34067..09e9d7c 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host.ts
@@ -18,7 +18,10 @@
import '../gr-diff/gr-diff';
import {PolymerElement} from '@polymer/polymer/polymer-element';
import {htmlTemplate} from './gr-diff-host_html';
-import {GerritNav} from '../../core/gr-navigation/gr-navigation';
+import {
+ GerritNav,
+ GeneratedWebLink,
+} from '../../core/gr-navigation/gr-navigation';
import {
getLine,
getRange,
@@ -188,6 +191,9 @@
commitRange?: CommitRange;
@property({type: Object, notify: true})
+ editWeblinks?: GeneratedWebLink[];
+
+ @property({type: Object, notify: true})
filesWeblinks: FilesWebLinks | {} = {};
@property({type: Boolean, reflectToAttribute: true})
@@ -372,6 +378,7 @@
// Not waiting for coverage ranges intentionally as
// plugin loading should not block the content rendering
+ this.editWeblinks = this._getEditWeblinks(diff);
this.filesWeblinks = this._getFilesWeblinks(diff);
this.diff = diff;
const event = (await waitForEventOnce(this, 'render')) as CustomEvent;
@@ -487,6 +494,16 @@
});
}
+ _getEditWeblinks(diff: DiffInfo) {
+ if (!this.projectName || !this.commitRange || !this.path) return undefined;
+ return GerritNav.getEditWebLinks(
+ this.projectName,
+ this.commitRange.baseCommit,
+ this.path,
+ {weblinks: diff?.edit_web_links}
+ );
+ }
+
_getFilesWeblinks(diff: DiffInfo) {
if (!this.projectName || !this.commitRange || !this.path) return {};
return {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js
index 5e1b5ff..6c96e34 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-host/gr-diff-host_test.js
@@ -211,7 +211,7 @@
assert.isTrue(cancelStub.called);
});
- test('reload() loads files weblinks', () => {
+ test('reload() loads files weblinks', async () => {
element.change = createChange();
const weblinksStub = sinon.stub(GerritNav, '_generateWeblinks')
.returns({name: 'stubb', url: '#s'});
@@ -222,28 +222,40 @@
element.path = 'test-path';
element.commitRange = {baseCommit: 'test-base', commit: 'test-commit'};
element.patchRange = {};
- return element.reload().then(() => {
- assert.isTrue(weblinksStub.calledTwice);
- assert.isTrue(weblinksStub.firstCall.calledWith({
- commit: 'test-base',
- file: 'test-path',
- options: {
- weblinks: undefined,
- },
- repo: 'test-project',
- type: GerritNav.WeblinkType.FILE}));
- assert.isTrue(weblinksStub.secondCall.calledWith({
- commit: 'test-commit',
- file: 'test-path',
- options: {
- weblinks: undefined,
- },
- repo: 'test-project',
- type: GerritNav.WeblinkType.FILE}));
- assert.deepEqual(element.filesWeblinks, {
- meta_a: [{name: 'stubb', url: '#s'}],
- meta_b: [{name: 'stubb', url: '#s'}],
- });
+
+ await element.reload();
+
+ assert.equal(weblinksStub.callCount, 3);
+ assert.deepEqual(weblinksStub.firstCall.args[0], {
+ commit: 'test-base',
+ file: 'test-path',
+ options: {
+ weblinks: undefined,
+ },
+ repo: 'test-project',
+ type: GerritNav.WeblinkType.EDIT});
+ assert.deepEqual(element.editWeblinks, [{
+ name: 'stubb', url: '#s',
+ }]);
+ assert.deepEqual(weblinksStub.secondCall.args[0], {
+ commit: 'test-base',
+ file: 'test-path',
+ options: {
+ weblinks: undefined,
+ },
+ repo: 'test-project',
+ type: GerritNav.WeblinkType.FILE});
+ assert.deepEqual(weblinksStub.thirdCall.args[0], {
+ commit: 'test-commit',
+ file: 'test-path',
+ options: {
+ weblinks: undefined,
+ },
+ repo: 'test-project',
+ type: GerritNav.WeblinkType.FILE});
+ assert.deepEqual(element.filesWeblinks, {
+ meta_a: [{name: 'stubb', url: '#s'}],
+ meta_b: [{name: 'stubb', url: '#s'}],
});
});
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
index 8ead181..829597d 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.ts
@@ -37,7 +37,10 @@
KeyboardShortcutMixin,
Shortcut,
} from '../../../mixins/keyboard-shortcut-mixin/keyboard-shortcut-mixin';
-import {GerritNav} from '../../core/gr-navigation/gr-navigation';
+import {
+ GeneratedWebLink,
+ GerritNav,
+} from '../../core/gr-navigation/gr-navigation';
import {appContext} from '../../../services/app-context';
import {
computeAllPatchSets,
@@ -226,6 +229,9 @@
_isImageDiff?: boolean;
@property({type: Object})
+ _editWeblinks?: GeneratedWebLink[];
+
+ @property({type: Object})
_filesWeblinks?: FilesWebLinks;
@property({type: Object})
@@ -1785,10 +1791,19 @@
_computeCanEdit(
loggedIn?: boolean,
+ editWeblinks?: GeneratedWebLink[],
changeChangeRecord?: PolymerDeepPropertyChange<ChangeInfo, ChangeInfo>
) {
if (!changeChangeRecord?.base) return false;
- return loggedIn && changeIsOpen(changeChangeRecord.base);
+ return (
+ loggedIn &&
+ changeIsOpen(changeChangeRecord.base) &&
+ (!editWeblinks || editWeblinks.length === 0)
+ );
+ }
+
+ _computeShowEditLinks(editWeblinks?: GeneratedWebLink[]) {
+ return !!editWeblinks && editWeblinks.length > 0;
}
/**
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts
index 0412779..63bf74e 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_html.ts
@@ -316,7 +316,10 @@
_isBlameLoading)]]</gr-button
>
</span>
- <template is="dom-if" if="[[_computeCanEdit(_loggedIn, _change.*)]]">
+ <template
+ is="dom-if"
+ if="[[_computeCanEdit(_loggedIn, _editWeblinks, _change.*)]]"
+ >
<span class="separator"></span>
<span class="editButton">
<gr-button
@@ -327,6 +330,12 @@
>
</span>
</template>
+ <template is="dom-if" if="[[_computeShowEditLinks(_editWeblinks)]]">
+ <span class="separator"></span>
+ <template is="dom-repeat" items="[[_editWeblinks]]" as="weblink">
+ <a target="_blank" href$="[[weblink.url]]">[[weblink.name]]</a>
+ </template>
+ </template>
<span class="separator"></span>
<div class$="diffModeSelector [[_computeModeSelectHideClass(_diff)]]">
<span>Diff view:</span>
@@ -390,6 +399,7 @@
hidden=""
hidden$="[[_loading]]"
is-image-diff="{{_isImageDiff}}"
+ edit-weblinks="{{_editWeblinks}}"
files-weblinks="{{_filesWeblinks}}"
diff="{{_diff}}"
change-num="[[_changeNum]]"