| // 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); |