Merge "Submit Requirements - reply dialog"
diff --git a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
index a496be5..760e211 100644
--- a/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
+++ b/polygerrit-ui/app/elements/change/gr-label-scores/gr-label-scores.ts
@@ -33,9 +33,10 @@
LabelValuesMap,
} from '../gr-label-score-row/gr-label-score-row';
import {appContext} from '../../../services/app-context';
-import {labelCompare} from '../../../utils/label-util';
+import {getTriggerVotes, labelCompare} from '../../../utils/label-util';
import {Execution} from '../../../constants/reporting';
import {ChangeStatus} from '../../../constants/constants';
+import {KnownExperimentId} from '../../../services/flags/flags';
@customElement('gr-label-scores')
export class GrLabelScores extends LitElement {
@@ -50,6 +51,8 @@
private readonly reporting = appContext.reportingService;
+ private readonly flagsService = appContext.flagsService;
+
static override get styles() {
return [
css`
@@ -72,26 +75,74 @@
gr-label-score-row.no-access {
display: none;
}
+ .heading-3 {
+ padding-left: var(--spacing-xl);
+ margin-bottom: var(--spacing-m);
+ margin-top: var(--spacing-l);
+ }
+ .heading-3:first-of-type {
+ margin-top: 0;
+ }
`,
];
}
override render() {
+ if (this.flagsService.isEnabled(KnownExperimentId.SUBMIT_REQUIREMENTS_UI)) {
+ return this.renderNewSubmitRequirements();
+ } else {
+ return this.renderOldSubmitRequirements();
+ }
+ }
+
+ private renderOldSubmitRequirements() {
const labels = this._computeLabels();
+ return html`${this.renderLabels(labels)}${this.renderErrorMessages()}`;
+ }
+
+ private renderNewSubmitRequirements() {
+ return html`${this.renderSubmitReqsLabels()}${this.renderTriggerVotes()}
+ ${this.renderErrorMessages()}`;
+ }
+
+ private renderSubmitReqsLabels() {
+ const triggerVotes = getTriggerVotes(this.change);
+ const labels = this._computeLabels().filter(
+ label => !triggerVotes.includes(label.name)
+ );
+ if (!labels.length) return;
+ return html`<h3 class="heading-3">Submit requirements votes</h3>
+ ${this.renderLabels(labels)}`;
+ }
+
+ private renderTriggerVotes() {
+ const triggerVotes = getTriggerVotes(this.change);
+ const labels = this._computeLabels().filter(label =>
+ triggerVotes.includes(label.name)
+ );
+ if (!labels.length) return;
+ return html`<h3 class="heading-3">Trigger Votes</h3>
+ ${this.renderLabels(labels)}`;
+ }
+
+ private renderLabels(labels: Label[]) {
const labelValues = this._computeColumns();
return html`<div class="scoresTable">
- ${labels.map(
- label => html`<gr-label-score-row
- class="${this.computeLabelAccessClass(label.name)}"
- .label="${label}"
- .name="${label.name}"
- .labels="${this.change?.labels}"
- .permittedLabels="${this.permittedLabels}"
- .labelValues="${labelValues}"
- ></gr-label-score-row>`
- )}
- </div>
- <div
+ ${labels.map(
+ label => html`<gr-label-score-row
+ class="${this.computeLabelAccessClass(label.name)}"
+ .label="${label}"
+ .name="${label.name}"
+ .labels="${this.change?.labels}"
+ .permittedLabels="${this.permittedLabels}"
+ .labelValues="${labelValues}"
+ ></gr-label-score-row>`
+ )}
+ </div>`;
+ }
+
+ private renderErrorMessages() {
+ return html`<div
class="mergedMessage"
?hidden=${this.change?.status !== ChangeStatus.MERGED}
>
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
index 2f3e1e2..2992923 100644
--- a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
@@ -29,11 +29,11 @@
SubmitRequirementResultInfo,
SubmitRequirementStatus,
} from '../../../api/rest-api';
-import {unique} from '../../../utils/common-util';
import {
extractAssociatedLabels,
getAllUniqueApprovals,
getRequirements,
+ getTriggerVotes,
hasNeutralStatus,
hasVotes,
iconForStatus,
@@ -192,7 +192,7 @@
></gr-submit-requirement-hovercard>
`
)}
- ${this.renderTriggerVotes(submit_requirements)}`;
+ ${this.renderTriggerVotes()}`;
}
renderStatus(status: SubmitRequirementStatus) {
@@ -267,15 +267,11 @@
return;
}
- renderTriggerVotes(submitReqs: SubmitRequirementResultInfo[]) {
+ renderTriggerVotes() {
const labels = this.change?.labels ?? {};
- const allLabels = Object.keys(labels);
- const labelAssociatedWithSubmitReqs = submitReqs
- .flatMap(req => extractAssociatedLabels(req))
- .filter(unique);
- const triggerVotes = allLabels
- .filter(label => !labelAssociatedWithSubmitReqs.includes(label))
- .filter(label => hasVotes(labels[label]));
+ const triggerVotes = getTriggerVotes(this.change).filter(label =>
+ hasVotes(labels[label])
+ );
if (!triggerVotes.length) return;
return html`<h3 class="metadata-title heading-3">Trigger Votes</h3>
<section class="trigger-votes">
diff --git a/polygerrit-ui/app/utils/label-util.ts b/polygerrit-ui/app/utils/label-util.ts
index 0fd4ca4..1a48a7b 100644
--- a/polygerrit-ui/app/utils/label-util.ts
+++ b/polygerrit-ui/app/utils/label-util.ts
@@ -287,3 +287,14 @@
);
return priorityRequirementList.concat(nonPriorityRequirements);
}
+
+export function getTriggerVotes(change?: ParsedChangeInfo | ChangeInfo) {
+ const allLabels = Object.keys(change?.labels ?? {});
+ const submitReqs = getRequirements(change);
+ const labelAssociatedWithSubmitReqs = submitReqs
+ .flatMap(req => extractAssociatedLabels(req))
+ .filter(unique);
+ return allLabels.filter(
+ label => !labelAssociatedWithSubmitReqs.includes(label)
+ );
+}
diff --git a/polygerrit-ui/app/utils/label-util_test.ts b/polygerrit-ui/app/utils/label-util_test.ts
index 6af883b..142c607 100644
--- a/polygerrit-ui/app/utils/label-util_test.ts
+++ b/polygerrit-ui/app/utils/label-util_test.ts
@@ -25,6 +25,7 @@
getVotingRange,
getVotingRangeOrDefault,
getRequirements,
+ getTriggerVotes,
hasNeutralStatus,
labelCompare,
LabelStatus,
@@ -42,6 +43,7 @@
createChange,
createSubmitRequirementExpressionInfo,
createSubmitRequirementResultInfo,
+ createDetailedLabelInfo,
} from '../test/test-data-generators';
import {
SubmitRequirementResultInfo,
@@ -319,4 +321,36 @@
assert.deepEqual(getRequirements(change), [requirement]);
});
});
+
+ suite('getTriggerVotes()', () => {
+ test('no requirements', () => {
+ const triggerVote = 'Trigger-Vote';
+ const change = {
+ ...createChange(),
+ labels: {
+ [triggerVote]: createDetailedLabelInfo(),
+ },
+ };
+ assert.deepEqual(getTriggerVotes(change), [triggerVote]);
+ });
+ test('no trigger votes, all labels associated with sub requirement', () => {
+ const triggerVote = 'Trigger-Vote';
+ const change = {
+ ...createChange(),
+ submit_requirements: [
+ {
+ ...createSubmitRequirementResultInfo(),
+ submittability_expression_result: {
+ ...createSubmitRequirementExpressionInfo(),
+ expression: `label:${triggerVote}=MAX`,
+ },
+ },
+ ],
+ labels: {
+ [triggerVote]: createDetailedLabelInfo(),
+ },
+ };
+ assert.deepEqual(getTriggerVotes(change), []);
+ });
+ });
});