
The code was assuming that you are on the change page, but you can also change the attention set from a hovercard in a dashboard row, so we need generic reload behavior. So we have added a 'reload' event to the app that can be fired from anywhere and would trigger reloading the current page. Change-Id: Ia2c2a46119351cb4bc7cf6218005dcd13bfc5681
179 lines
5.9 KiB
JavaScript
179 lines
5.9 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright (C) 2020 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import '@polymer/iron-icon/iron-icon.js';
|
|
import '../../../styles/shared-styles.js';
|
|
import '../gr-avatar/gr-avatar.js';
|
|
import '../gr-button/gr-button.js';
|
|
import '../gr-rest-api-interface/gr-rest-api-interface.js';
|
|
import {hovercardBehaviorMixin} from '../gr-hovercard/gr-hovercard-behavior.js';
|
|
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
|
|
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
|
|
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
|
|
import {htmlTemplate} from './gr-hovercard-account_html.js';
|
|
import {appContext} from '../../../services/app-context.js';
|
|
|
|
/** @extends PolymerElement */
|
|
class GrHovercardAccount extends GestureEventListeners(
|
|
hovercardBehaviorMixin(LegacyElementMixin(
|
|
PolymerElement))) {
|
|
static get template() { return htmlTemplate; }
|
|
|
|
static get is() { return 'gr-hovercard-account'; }
|
|
|
|
static get properties() {
|
|
return {
|
|
/**
|
|
* This is an AccountInfo response object.
|
|
*/
|
|
account: Object,
|
|
_selfAccount: Object,
|
|
/**
|
|
* Optional ChangeInfo object, typically comes from the change page or
|
|
* from a row in a list of search results. This is needed for some change
|
|
* related features like adding the user as a reviewer.
|
|
*/
|
|
change: Object,
|
|
/**
|
|
* Explains which labels the user can vote on and which score they can
|
|
* give.
|
|
*/
|
|
voteableText: String,
|
|
/**
|
|
* Should attention set related features be shown in the component? Note
|
|
* that the information whether the user is in the attention set or not is
|
|
* part of the ChangeInfo object in the change property.
|
|
*/
|
|
highlightAttention: {
|
|
type: Boolean,
|
|
value: false,
|
|
},
|
|
/**
|
|
* This is a ServerInfo response object.
|
|
*/
|
|
_config: {
|
|
type: Object,
|
|
value: null,
|
|
},
|
|
};
|
|
}
|
|
|
|
constructor() {
|
|
super();
|
|
this.reporting = appContext.reportingService;
|
|
}
|
|
|
|
attached() {
|
|
super.attached();
|
|
this.$.restAPI.getConfig().then(config => {
|
|
this._config = config;
|
|
});
|
|
this.$.restAPI.getAccount().then(account => {
|
|
this._selfAccount = account;
|
|
});
|
|
}
|
|
|
|
_computeText(account, selfAccount) {
|
|
if (!account || !selfAccount) return '';
|
|
return account._account_id === selfAccount._account_id ? 'Your' : 'Their';
|
|
}
|
|
|
|
get isAttentionSetEnabled() {
|
|
return !!this._config && !!this._config.change
|
|
&& !!this._config.change.enable_attention_set
|
|
&& !!this.highlightAttention && !!this.change && !!this.account;
|
|
}
|
|
|
|
get hasAttention() {
|
|
if (!this.isAttentionSetEnabled || !this.change.attention_set) return false;
|
|
return this.change.attention_set.hasOwnProperty(this.account._account_id);
|
|
}
|
|
|
|
_computeShowLabelNeedsAttention(config, highlightAttention, account, change) {
|
|
return this.isAttentionSetEnabled && this.hasAttention;
|
|
}
|
|
|
|
_computeShowActionAddToAttentionSet(config, highlightAttn, account, change) {
|
|
return this.isAttentionSetEnabled && !this.hasAttention;
|
|
}
|
|
|
|
_computeShowActionRemoveFromAttentionSet(config, highlightAttention, account,
|
|
change) {
|
|
return this.isAttentionSetEnabled && this.hasAttention;
|
|
}
|
|
|
|
_handleClickAddToAttentionSet(e) {
|
|
this.dispatchEvent(new CustomEvent('show-alert', {
|
|
detail: {
|
|
message: 'Adding user to attention set. Will be reloading ...',
|
|
dismissOnNavigation: true,
|
|
},
|
|
composed: true,
|
|
bubbles: true,
|
|
}));
|
|
this.reporting.reportInteraction('attention-hovercard-add',
|
|
this._reportingDetails());
|
|
this.$.restAPI.addToAttentionSet(this.change._number,
|
|
this.account._account_id, 'manually added').then(obj => {
|
|
this.dispatchEventThroughTarget('hide-alert');
|
|
this.dispatchEventThroughTarget('reload');
|
|
});
|
|
this.hide();
|
|
}
|
|
|
|
_handleClickRemoveFromAttentionSet(e) {
|
|
this.dispatchEvent(new CustomEvent('show-alert', {
|
|
detail: {
|
|
message: 'Removing user from attention set. Will be reloading ...',
|
|
dismissOnNavigation: true,
|
|
},
|
|
composed: true,
|
|
bubbles: true,
|
|
}));
|
|
this.reporting.reportInteraction('attention-hovercard-remove',
|
|
this._reportingDetails());
|
|
this.$.restAPI.removeFromAttentionSet(this.change._number,
|
|
this.account._account_id, 'manually removed').then(obj => {
|
|
this.dispatchEventThroughTarget('hide-alert');
|
|
this.dispatchEventThroughTarget('reload');
|
|
});
|
|
this.hide();
|
|
}
|
|
|
|
_reportingDetails() {
|
|
const targetId = this.account._account_id;
|
|
const ownerId = (this.change && this.change.owner
|
|
&& this.change.owner._account_id) || -1;
|
|
const selfId = (this._selfAccount && this._selfAccount._account_id) || -1;
|
|
const reviewers = (
|
|
this.change && this.change.reviewers && this.change.reviewers.REVIEWER ?
|
|
[...this.change.reviewers.REVIEWER] : []);
|
|
const reviewerIds = reviewers
|
|
.map(r => r._account_id)
|
|
.filter(rId => rId !== ownerId);
|
|
return {
|
|
actionByOwner: selfId === ownerId,
|
|
actionByReviewer: reviewerIds.includes(selfId),
|
|
targetIsOwner: targetId === ownerId,
|
|
targetIsReviewer: reviewerIds.includes(targetId),
|
|
targetIsSelf: targetId === selfId,
|
|
};
|
|
}
|
|
}
|
|
|
|
customElements.define(GrHovercardAccount.is, GrHovercardAccount);
|