Merge "Implement filtering and lazy loading of checks"
diff --git a/java/com/google/gerrit/extensions/common/ActionInfo.java b/java/com/google/gerrit/extensions/common/ActionInfo.java
index 6ab80b2..8039949 100644
--- a/java/com/google/gerrit/extensions/common/ActionInfo.java
+++ b/java/com/google/gerrit/extensions/common/ActionInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.common;
import com.google.gerrit.extensions.webui.UiAction;
+import java.util.Objects;
/**
* Representation of an action in the REST API.
@@ -55,4 +56,21 @@
title = d.getTitle();
enabled = d.isEnabled() ? true : null;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ActionInfo) {
+ ActionInfo actionInfo = (ActionInfo) o;
+ return Objects.equals(method, actionInfo.method)
+ && Objects.equals(label, actionInfo.label)
+ && Objects.equals(title, actionInfo.title)
+ && Objects.equals(enabled, actionInfo.enabled);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(method, label, title, enabled);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/ApprovalInfo.java b/java/com/google/gerrit/extensions/common/ApprovalInfo.java
index f95ddff..bf72e83 100644
--- a/java/com/google/gerrit/extensions/common/ApprovalInfo.java
+++ b/java/com/google/gerrit/extensions/common/ApprovalInfo.java
@@ -16,6 +16,7 @@
import com.google.gerrit.common.Nullable;
import java.sql.Timestamp;
+import java.util.Objects;
/**
* Representation of an approval in the REST API.
@@ -71,4 +72,23 @@
this.date = date;
this.tag = tag;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ApprovalInfo) {
+ ApprovalInfo approvalInfo = (ApprovalInfo) o;
+ return super.equals(o)
+ && Objects.equals(tag, approvalInfo.tag)
+ && Objects.equals(value, approvalInfo.value)
+ && Objects.equals(date, approvalInfo.date)
+ && Objects.equals(postSubmit, approvalInfo.postSubmit)
+ && Objects.equals(permittedVotingRange, approvalInfo.permittedVotingRange);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), tag, value, date, postSubmit, permittedVotingRange);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/AttentionSetInfo.java b/java/com/google/gerrit/extensions/common/AttentionSetInfo.java
index f29d32b..490d394 100644
--- a/java/com/google/gerrit/extensions/common/AttentionSetInfo.java
+++ b/java/com/google/gerrit/extensions/common/AttentionSetInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.common;
import java.sql.Timestamp;
+import java.util.Objects;
/**
* Represents a single user included in the attention set. Used in the API. See {@link
@@ -36,4 +37,20 @@
this.lastUpdate = lastUpdate;
this.reason = reason;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof AttentionSetInfo) {
+ AttentionSetInfo attentionSetInfo = (AttentionSetInfo) o;
+ return Objects.equals(account, attentionSetInfo.account)
+ && Objects.equals(lastUpdate, attentionSetInfo.lastUpdate)
+ && Objects.equals(reason, attentionSetInfo.reason);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(account, lastUpdate, reason);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/AvatarInfo.java b/java/com/google/gerrit/extensions/common/AvatarInfo.java
index 75665a8..b620ac2 100644
--- a/java/com/google/gerrit/extensions/common/AvatarInfo.java
+++ b/java/com/google/gerrit/extensions/common/AvatarInfo.java
@@ -14,6 +14,8 @@
package com.google.gerrit.extensions.common;
+import java.util.Objects;
+
/**
* Representation of an avatar in the REST API.
*
@@ -38,4 +40,20 @@
/** The width of the avatar image in pixels. */
public Integer width;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof AvatarInfo) {
+ AvatarInfo avatarInfo = (AvatarInfo) o;
+ return Objects.equals(url, avatarInfo.url)
+ && Objects.equals(height, avatarInfo.height)
+ && Objects.equals(width, avatarInfo.width);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(url, height, width);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/FetchInfo.java b/java/com/google/gerrit/extensions/common/FetchInfo.java
index eda84b1..472dba2 100644
--- a/java/com/google/gerrit/extensions/common/FetchInfo.java
+++ b/java/com/google/gerrit/extensions/common/FetchInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.common;
import java.util.Map;
+import java.util.Objects;
public class FetchInfo {
public String url;
@@ -25,4 +26,20 @@
this.url = url;
this.ref = ref;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof FetchInfo) {
+ FetchInfo fetchInfo = (FetchInfo) o;
+ return Objects.equals(url, fetchInfo.url)
+ && Objects.equals(ref, fetchInfo.ref)
+ && Objects.equals(commands, fetchInfo.commands);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(url, ref, commands);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/GpgKeyInfo.java b/java/com/google/gerrit/extensions/common/GpgKeyInfo.java
index 7a5c15b..d656f22 100644
--- a/java/com/google/gerrit/extensions/common/GpgKeyInfo.java
+++ b/java/com/google/gerrit/extensions/common/GpgKeyInfo.java
@@ -15,6 +15,7 @@
package com.google.gerrit.extensions.common;
import java.util.List;
+import java.util.Objects;
public class GpgKeyInfo {
/**
@@ -43,4 +44,22 @@
public Status status;
public List<String> problems;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof GpgKeyInfo) {
+ GpgKeyInfo gpgKeyInfo = (GpgKeyInfo) o;
+ return Objects.equals(id, gpgKeyInfo.id)
+ && Objects.equals(fingerprint, gpgKeyInfo.fingerprint)
+ && Objects.equals(userIds, gpgKeyInfo.userIds)
+ && Objects.equals(status, gpgKeyInfo.status)
+ && Objects.equals(problems, gpgKeyInfo.problems);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, fingerprint, userIds, status, problems);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/LabelInfo.java b/java/com/google/gerrit/extensions/common/LabelInfo.java
index 76dd93d..44bcdaf 100644
--- a/java/com/google/gerrit/extensions/common/LabelInfo.java
+++ b/java/com/google/gerrit/extensions/common/LabelInfo.java
@@ -16,6 +16,7 @@
import java.util.List;
import java.util.Map;
+import java.util.Objects;
public class LabelInfo {
public AccountInfo approved;
@@ -30,4 +31,37 @@
public Short defaultValue;
public Boolean optional;
public Boolean blocking;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof LabelInfo) {
+ LabelInfo labelInfo = (LabelInfo) o;
+ return Objects.equals(approved, labelInfo.approved)
+ && Objects.equals(rejected, labelInfo.rejected)
+ && Objects.equals(recommended, labelInfo.recommended)
+ && Objects.equals(disliked, labelInfo.disliked)
+ && Objects.equals(all, labelInfo.all)
+ && Objects.equals(values, labelInfo.values)
+ && Objects.equals(value, labelInfo.value)
+ && Objects.equals(defaultValue, labelInfo.defaultValue)
+ && Objects.equals(optional, labelInfo.optional)
+ && Objects.equals(blocking, labelInfo.blocking);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ approved,
+ rejected,
+ recommended,
+ disliked,
+ all,
+ values,
+ value,
+ defaultValue,
+ optional,
+ blocking);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java b/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java
index 69bfa2c..e2b1c36 100644
--- a/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java
+++ b/java/com/google/gerrit/extensions/common/PluginDefinedInfo.java
@@ -14,7 +14,24 @@
package com.google.gerrit.extensions.common;
+import java.util.Objects;
+
public class PluginDefinedInfo {
public String name;
public String message;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof PluginDefinedInfo) {
+ PluginDefinedInfo pluginDefinedInfo = (PluginDefinedInfo) o;
+ return Objects.equals(name, pluginDefinedInfo.name)
+ && Objects.equals(message, pluginDefinedInfo.message);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, message);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/PushCertificateInfo.java b/java/com/google/gerrit/extensions/common/PushCertificateInfo.java
index 9eed808..199dbd1 100644
--- a/java/com/google/gerrit/extensions/common/PushCertificateInfo.java
+++ b/java/com/google/gerrit/extensions/common/PushCertificateInfo.java
@@ -14,7 +14,24 @@
package com.google.gerrit.extensions.common;
+import java.util.Objects;
+
public class PushCertificateInfo {
public String certificate;
public GpgKeyInfo key;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof PushCertificateInfo) {
+ PushCertificateInfo pushCertificateInfo = (PushCertificateInfo) o;
+ return Objects.equals(certificate, pushCertificateInfo.certificate)
+ && Objects.equals(key, pushCertificateInfo.key);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(certificate, key);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java b/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
index eccdc64..37e1ceb 100644
--- a/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
+++ b/java/com/google/gerrit/extensions/common/ReviewerUpdateInfo.java
@@ -16,10 +16,28 @@
import com.google.gerrit.extensions.client.ReviewerState;
import java.sql.Timestamp;
+import java.util.Objects;
public class ReviewerUpdateInfo {
public Timestamp updated;
public AccountInfo updatedBy;
public AccountInfo reviewer;
public ReviewerState state;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ReviewerUpdateInfo) {
+ ReviewerUpdateInfo reviewerUpdateInfo = (ReviewerUpdateInfo) o;
+ return Objects.equals(updated, reviewerUpdateInfo.updated)
+ && Objects.equals(updatedBy, reviewerUpdateInfo.updatedBy)
+ && Objects.equals(reviewer, reviewerUpdateInfo.reviewer)
+ && Objects.equals(state, reviewerUpdateInfo.state);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(updated, updatedBy, reviewer, state);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/RevisionInfo.java b/java/com/google/gerrit/extensions/common/RevisionInfo.java
index f262901..ea61f31 100644
--- a/java/com/google/gerrit/extensions/common/RevisionInfo.java
+++ b/java/com/google/gerrit/extensions/common/RevisionInfo.java
@@ -17,6 +17,7 @@
import com.google.gerrit.extensions.client.ChangeKind;
import java.sql.Timestamp;
import java.util.Map;
+import java.util.Objects;
public class RevisionInfo {
// ActionJson#copy(List, RevisionInfo) must be adapted if new fields are added that are not
@@ -34,4 +35,43 @@
public String commitWithFooters;
public PushCertificateInfo pushCertificate;
public String description;
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof RevisionInfo) {
+ RevisionInfo revisionInfo = (RevisionInfo) o;
+ return isCurrent == revisionInfo.isCurrent
+ && Objects.equals(kind, revisionInfo.kind)
+ && _number == revisionInfo._number
+ && Objects.equals(created, revisionInfo.created)
+ && Objects.equals(uploader, revisionInfo.uploader)
+ && Objects.equals(ref, revisionInfo.ref)
+ && Objects.equals(fetch, revisionInfo.fetch)
+ && Objects.equals(commit, revisionInfo.commit)
+ && Objects.equals(files, revisionInfo.files)
+ && Objects.equals(actions, revisionInfo.actions)
+ && Objects.equals(commitWithFooters, revisionInfo.commitWithFooters)
+ && Objects.equals(pushCertificate, revisionInfo.pushCertificate)
+ && Objects.equals(description, revisionInfo.description);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ isCurrent,
+ kind,
+ _number,
+ created,
+ uploader,
+ ref,
+ fetch,
+ commit,
+ files,
+ actions,
+ commitWithFooters,
+ pushCertificate,
+ description);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/TrackingIdInfo.java b/java/com/google/gerrit/extensions/common/TrackingIdInfo.java
index 0c5ed68..d9b8e22 100644
--- a/java/com/google/gerrit/extensions/common/TrackingIdInfo.java
+++ b/java/com/google/gerrit/extensions/common/TrackingIdInfo.java
@@ -14,6 +14,8 @@
package com.google.gerrit.extensions.common;
+import java.util.Objects;
+
public class TrackingIdInfo {
public String system;
public String id;
@@ -22,4 +24,18 @@
this.system = system;
this.id = id;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof TrackingIdInfo) {
+ TrackingIdInfo trackingIdInfo = (TrackingIdInfo) o;
+ return Objects.equals(system, trackingIdInfo.system) && Objects.equals(id, trackingIdInfo.id);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(system, id);
+ }
}
diff --git a/java/com/google/gerrit/extensions/common/VotingRangeInfo.java b/java/com/google/gerrit/extensions/common/VotingRangeInfo.java
index 5c35a49..2f7e9e4 100644
--- a/java/com/google/gerrit/extensions/common/VotingRangeInfo.java
+++ b/java/com/google/gerrit/extensions/common/VotingRangeInfo.java
@@ -14,6 +14,8 @@
package com.google.gerrit.extensions.common;
+import java.util.Objects;
+
public class VotingRangeInfo {
public int min;
public int max;
@@ -22,4 +24,18 @@
this.min = min;
this.max = max;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof VotingRangeInfo) {
+ VotingRangeInfo votingRangeInfo = (VotingRangeInfo) o;
+ return min == votingRangeInfo.min && max == votingRangeInfo.max;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(min, max);
+ }
}
diff --git a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_html.ts b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_html.ts
index f172ccc..e02b337 100644
--- a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements_html.ts
@@ -99,6 +99,9 @@
padding-left: 0;
}
</style>
+ <template is="dom-if" if="[[_isNewChangeSummaryUiEnabled]]">
+ <h3 class="metadata-title">Submit requirements</h3>
+ </template>
<template is="dom-repeat" items="[[_requirements]]">
<gr-endpoint-decorator
class="submit-requirement-endpoints"
@@ -126,9 +129,6 @@
</div>
</gr-endpoint-decorator>
</template>
- <template is="dom-if" if="[[_isNewChangeSummaryUiEnabled]]">
- <h3 class="metadata-title">Submit requirements</h3>
- </template>
<template is="dom-repeat" items="[[_requiredLabels]]">
<section>
<div class="title">
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
index 304939c..3d7646f 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -2313,6 +2313,7 @@
return response;
});
}
+ // TODO: use returned Promise
this.getRelatedChangesListExperimental()?.reload(
relatedChangesPromise
);
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts
index 11f0fd3..e921979 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list-experimental/gr-related-changes-list-experimental.ts
@@ -16,9 +16,12 @@
*/
import {html, nothing} from 'lit-html';
import './gr-related-change';
+import '../../plugins/gr-endpoint-decorator/gr-endpoint-decorator';
+import '../../plugins/gr-endpoint-param/gr-endpoint-param';
+import '../../plugins/gr-endpoint-slot/gr-endpoint-slot';
import {classMap} from 'lit-html/directives/class-map';
import {GrLitElement} from '../../lit/gr-lit-element';
-import {customElement, property, css} from 'lit-element';
+import {customElement, property, css, internalProperty} from 'lit-element';
import {sharedStyles} from '../../../styles/shared-styles';
import {
SubmittedTogetherInfo,
@@ -32,7 +35,11 @@
import {ParsedChangeInfo} from '../../../types/types';
import {GerritNav} from '../../core/gr-navigation/gr-navigation';
import {pluralize} from '../../../utils/string-util';
-import {getRevisionKey, isChangeInfo} from '../../../utils/change-util';
+import {
+ changeIsOpen,
+ getRevisionKey,
+ isChangeInfo,
+} from '../../../utils/change-util';
/** What is the maximum number of shown changes in collapsed list? */
const MAX_CHANGES_WHEN_COLLAPSED = 3;
@@ -46,13 +53,25 @@
patchNum?: PatchSetNum;
@property()
- _submittedTogether?: SubmittedTogetherInfo = {
+ mergeable?: boolean;
+
+ @internalProperty()
+ submittedTogether?: SubmittedTogetherInfo = {
changes: [],
non_visible_changes: 0,
};
- @property()
- _relatedResponse?: RelatedChangesInfo = {changes: []};
+ @internalProperty()
+ relatedChanges: RelatedChangeAndCommitInfo[] = [];
+
+ @internalProperty()
+ conflictingChanges: ChangeInfo[] = [];
+
+ @internalProperty()
+ cherryPickChanges: ChangeInfo[] = [];
+
+ @internalProperty()
+ sameTopicChanges: ChangeInfo[] = [];
private readonly restApiService = appContext.restApiService;
@@ -62,6 +81,7 @@
css`
.note {
color: var(--error-text-color);
+ margin-left: 1.2em;
}
section {
margin-bottom: var(--spacing-m);
@@ -71,27 +91,26 @@
}
render() {
- const relatedChanges = this._relatedResponse?.changes ?? [];
let showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
- relatedChanges.length,
- relatedChanges.findIndex(relatedChange =>
+ this.relatedChanges.length,
+ this.relatedChanges.findIndex(relatedChange =>
this._changesEqual(relatedChange, this.change)
)
);
const connectedRevisions = this._computeConnectedRevisions(
this.change,
this.patchNum,
- relatedChanges
+ this.relatedChanges
);
const relatedChangeSection = html` <section
class="relatedChanges"
- ?hidden=${!relatedChanges.length}
+ ?hidden=${!this.relatedChanges.length}
>
<gr-related-collapse
title="Relation chain"
- .length=${relatedChanges.length}
+ .length=${this.relatedChanges.length}
>
- ${relatedChanges.map(
+ ${this.relatedChanges.map(
(change, index) =>
html`<gr-related-change
class="${classMap({
@@ -114,9 +133,9 @@
</gr-related-collapse>
</section>`;
- const submittedTogetherChanges = this._submittedTogether?.changes ?? [];
+ const submittedTogetherChanges = this.submittedTogether?.changes ?? [];
const countNonVisibleChanges =
- this._submittedTogether?.non_visible_changes ?? 0;
+ this.submittedTogether?.non_visible_changes ?? 0;
showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
submittedTogetherChanges.length,
submittedTogetherChanges.findIndex(relatedChange =>
@@ -126,7 +145,7 @@
const submittedTogetherSection = html`<section
id="submittedTogether"
?hidden=${!submittedTogetherChanges?.length &&
- !this._submittedTogether?.non_visible_changes}
+ !this.submittedTogether?.non_visible_changes}
>
<gr-related-collapse
title="Submitted together"
@@ -155,11 +174,106 @@
</div>
</section>`;
- return html`${relatedChangeSection}${submittedTogetherSection}`;
+ showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
+ this.sameTopicChanges.length,
+ -1
+ );
+ const sameTopicSection = html`<section
+ id="sameTopic"
+ ?hidden=${!this.sameTopicChanges?.length}
+ >
+ <gr-related-collapse
+ title="Same topic"
+ .length=${this.sameTopicChanges.length}
+ >
+ ${this.sameTopicChanges.map(
+ (change, index) =>
+ html`<gr-related-change
+ class="${classMap({
+ ['show-when-collapsed']: showWhenCollapsedPredicate(index),
+ })}"
+ .change="${change}"
+ .href="${GerritNav.getUrlForChangeById(
+ change._number,
+ change.project
+ )}"
+ >${change.project}: ${change.branch}:
+ ${change.subject}</gr-related-change
+ >`
+ )}
+ </gr-related-collapse>
+ </section>`;
+
+ showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
+ this.conflictingChanges.length,
+ -1
+ );
+ const mergeConflictsSection = html`<section
+ id="mergeConflicts"
+ ?hidden=${!this.conflictingChanges?.length}
+ >
+ <gr-related-collapse
+ title="Merge conflicts"
+ .length=${this.conflictingChanges.length}
+ >
+ ${this.conflictingChanges.map(
+ (change, index) =>
+ html`<gr-related-change
+ class="${classMap({
+ ['show-when-collapsed']: showWhenCollapsedPredicate(index),
+ })}"
+ .change="${change}"
+ .href="${GerritNav.getUrlForChangeById(
+ change._number,
+ change.project
+ )}"
+ >${change.subject}</gr-related-change
+ >`
+ )}
+ </gr-related-collapse>
+ </section>`;
+
+ showWhenCollapsedPredicate = this.showWhenCollapsedPredicateFactory(
+ this.cherryPickChanges.length,
+ -1
+ );
+ const cherryPicksSection = html`<section
+ id="cherryPicks"
+ ?hidden=${!this.cherryPickChanges?.length}
+ >
+ <gr-related-collapse
+ title="Cherry picks"
+ .length=${this.cherryPickChanges.length}
+ >
+ ${this.cherryPickChanges.map(
+ (change, index) =>
+ html`<gr-related-change
+ class="${classMap({
+ ['show-when-collapsed']: showWhenCollapsedPredicate(index),
+ })}"
+ .change="${change}"
+ .href="${GerritNav.getUrlForChangeById(
+ change._number,
+ change.project
+ )}"
+ >${change.branch}: ${change.subject}</gr-related-change
+ >`
+ )}
+ </gr-related-collapse>
+ </section>`;
+
+ return html`<gr-endpoint-decorator name="related-changes-section">
+ <gr-endpoint-param name="change" value="[[change]]"></gr-endpoint-param>
+ <gr-endpoint-slot name="top"></gr-endpoint-slot>
+ ${relatedChangeSection} ${submittedTogetherSection} ${sameTopicSection}
+ ${mergeConflictsSection} ${cherryPicksSection}
+ <gr-endpoint-slot name="bottom"></gr-endpoint-slot>
+ </gr-endpoint-decorator>`;
}
showWhenCollapsedPredicateFactory(length: number, highlightIndex: number) {
return (index: number) => {
+ if (highlightIndex === -1) return index < MAX_CHANGES_WHEN_COLLAPSED;
if (highlightIndex === 0) return index <= MAX_CHANGES_WHEN_COLLAPSED - 1;
if (highlightIndex === length - 1)
return index >= length - MAX_CHANGES_WHEN_COLLAPSED;
@@ -171,21 +285,60 @@
}
reload(getRelatedChanges?: Promise<RelatedChangesInfo | undefined>) {
- if (!this.change) return Promise.reject(new Error('change missing'));
+ const change = this.change;
+ if (!change) return Promise.reject(new Error('change missing'));
+ if (!this.patchNum) return Promise.reject(new Error('patchNum missing'));
+ if (!getRelatedChanges) {
+ getRelatedChanges = this.restApiService.getRelatedChanges(
+ change._number,
+ this.patchNum
+ );
+ }
const promises: Array<Promise<void>> = [
+ getRelatedChanges.then(response => {
+ if (!response) {
+ throw new Error('getRelatedChanges returned undefined response');
+ }
+ this.relatedChanges = response?.changes ?? [];
+ }),
this.restApiService
- .getChangesSubmittedTogether(this.change._number)
+ .getChangesSubmittedTogether(change._number)
.then(response => {
- this._submittedTogether = response;
+ this.submittedTogether = response;
+ }),
+ this.restApiService
+ .getChangeCherryPicks(change.project, change.change_id, change._number)
+ .then(response => {
+ this.cherryPickChanges = response || [];
}),
];
- if (getRelatedChanges) {
+
+ // Get conflicts if change is open and is mergeable.
+ // Mergeable is output of restApiServict.getMergeable from gr-change-view
+ if (changeIsOpen(change) && this.mergeable) {
promises.push(
- getRelatedChanges.then(response => {
- if (!response) {
- throw new Error('getRelatedChanges returned undefined response');
+ this.restApiService
+ .getChangeConflicts(change._number)
+ .then(response => {
+ this.conflictingChanges = response ?? [];
+ })
+ );
+ }
+ if (change.topic) {
+ const changeTopic = change.topic;
+ promises.push(
+ this.restApiService.getConfig().then(config => {
+ if (config && !config.change.submit_whole_topic) {
+ return this.restApiService
+ .getChangesWithSameTopic(changeTopic, change._number)
+ .then(response => {
+ if (changeTopic === this.change?.topic) {
+ this.sameTopicChanges = response ?? [];
+ }
+ });
}
- this._relatedResponse = response;
+ this.sameTopicChanges = [];
+ return Promise.resolve();
})
);
}
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts
index 8cb0638..9941fa9 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list_html.ts
@@ -193,6 +193,7 @@
href$="[[_computeChangeURL(change._number, change.project)]]"
class$="[[_computeLinkClass(change)]]"
title$="[[change.subject]]"
+ on-click="_reportClick"
>
[[change.subject]]
</a>
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts
index 95252cf..a3d038d 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts
@@ -120,12 +120,8 @@
* Don't forget to also call disposeLayer().
*/
createLayer(path: string, changeNum: number) {
- if (!this.annotationCallback) return undefined;
- const annotationLayer = new AnnotationLayer(
- path,
- changeNum,
- this.annotationCallback
- );
+ const callbackFn = this.annotationCallback || (() => {});
+ const annotationLayer = new AnnotationLayer(path, changeNum, callbackFn);
this.annotationLayers.push(annotationLayer);
return annotationLayer;
}