blob: af558a43b6428b8051132a3dca514e7d7da61afd [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {LitElement, html, css} from 'lit-element';
import {connectStore} from 'reducers/base.js';
import * as issueV0 from 'reducers/issueV0.js';
import * as userV0 from 'reducers/userV0.js';
import {arrayToEnglish} from 'shared/helpers.js';
/**
* `<mr-restriction-indicator>`
*
* Display for showing whether an issue is restricted.
*
*/
export class MrRestrictionIndicator extends connectStore(LitElement) {
/** @override */
static get styles() {
return css`
:host {
width: 100%;
margin-top: 0;
background-color: var(--monorail-metadata-toggled-bg);
border-bottom: var(--chops-normal-border);
font-size: var(--chops-main-font-size);
padding: 0.25em 8px;
box-sizing: border-box;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
}
:host([showWarning]) {
background-color: var(--chops-red-700);
color: var(--chops-white);
font-weight: bold;
}
:host([showWarning]) i {
color: var(--chops-white);
}
:host([hidden]) {
display: none;
}
i.material-icons {
color: var(--chops-primary-icon-color);
font-size: var(--chops-icon-font-size);
}
.lock-icon {
margin-right: 4px;
}
i.warning-icon {
margin-right: 4px;
}
i[hidden] {
display: none;
}
`;
}
/** @override */
render() {
return html`
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet">
<i
class="lock-icon material-icons"
icon="lock"
?hidden=${!this._restrictionText}
title=${this._restrictionText}
>
lock
</i>
<i
class="warning-icon material-icons"
icon="warning"
?hidden=${!this.showWarning}
title=${this._warningText}
>
warning
</i>
${this._combinedText}
`;
}
/** @override */
static get properties() {
return {
restrictions: Object,
prefs: Object,
hidden: {
type: Boolean,
reflect: true,
},
showWarning: {
type: Boolean,
reflect: true,
},
};
}
/** @override */
constructor() {
super();
this.hidden = true;
this.showWarning = false;
this.prefs = {};
}
/** @override */
stateChanged(state) {
this.restrictions = issueV0.restrictions(state);
this.prefs = userV0.prefs(state);
}
/** @override */
update(changedProperties) {
if (changedProperties.has('prefs') ||
changedProperties.has('restrictions')) {
this.hidden = !this._combinedText;
this.showWarning = !!this._warningText;
}
super.update(changedProperties);
}
/**
* Checks if the user should see a corp mode warning about an issue being
* public.
* @return {string}
*/
get _warningText() {
const {restrictions, prefs} = this;
if (!prefs) return '';
if (!restrictions) return '';
if ('view' in restrictions && restrictions['view'].length) return '';
if (prefs.get('public_issue_notice')) {
return 'Public issue: Please do not post confidential information.';
}
return '';
}
/**
* Gets either corp mode or restricted issue text depending on which
* is relevant to the issue.
* @return {string}
*/
get _combinedText() {
if (this._warningText) return this._warningText;
return this._restrictionText;
}
/**
* Computes the text to show users on a restricted issue.
* @return {string}
*/
get _restrictionText() {
const {restrictions} = this;
if (!restrictions) return;
if ('view' in restrictions && restrictions['view'].length) {
return `Only users with ${arrayToEnglish(restrictions['view'])
} permission or issue reporter may view.`;
} else if ('edit' in restrictions && restrictions['edit'].length) {
return `Only users with ${arrayToEnglish(restrictions['edit'])
} permission may edit.`;
} else if ('comment' in restrictions && restrictions['comment'].length) {
return `Only users with ${arrayToEnglish(restrictions['comment'])
} permission or issue reporter may comment.`;
}
return '';
}
}
customElements.define('mr-restriction-indicator', MrRestrictionIndicator);