| // Copyright 2019 The Chromium Authors |
| // 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 {SHARED_STYLES} from 'shared/shared-styles'; |
| import './mr-edit-field.js'; |
| |
| /** |
| * `<mr-edit-status>` |
| * |
| * Editing form for either an approval or the overall issue. |
| * |
| */ |
| export class MrEditStatus extends LitElement { |
| /** @override */ |
| static get styles() { |
| return [ |
| SHARED_STYLES, |
| css` |
| :host { |
| width: 100%; |
| } |
| select { |
| width: var(--mr-edit-field-width); |
| padding: var(--mr-edit-field-padding); |
| } |
| .grid-input { |
| margin-top: 8px; |
| display: grid; |
| grid-gap: var(--mr-input-grid-gap); |
| grid-template-columns: auto 1fr; |
| } |
| .grid-input[hidden] { |
| display: none; |
| } |
| label { |
| font-weight: bold; |
| word-wrap: break-word; |
| text-align: left; |
| } |
| #mergedIntoInput { |
| width: 160px; |
| } |
| `, |
| ]; |
| } |
| |
| /** @override */ |
| render() { |
| return html` |
| <select |
| @change=${this._selectChangeHandler} |
| aria-label="Status" |
| id="statusInput" |
| > |
| ${this._statusesGrouped.map((group) => html` |
| <optgroup label=${group.name} ?hidden=${!group.name}> |
| ${group.statuses.map((item) => html` |
| <option |
| value=${item.status} |
| .selected=${this.status === item.status} |
| > |
| ${item.status} |
| ${item.docstring ? `= ${item.docstring}` : ''} |
| </option> |
| `)} |
| </optgroup> |
| |
| ${!group.name ? html` |
| ${group.statuses.map((item) => html` |
| <option |
| value=${item.status} |
| .selected=${this.status === item.status} |
| > |
| ${item.status} |
| ${item.docstring ? `= ${item.docstring}` : ''} |
| </option> |
| `)} |
| ` : ''} |
| `)} |
| </select> |
| |
| <div class="grid-input" ?hidden=${!this._showMergedInto}> |
| <label for="mergedIntoInput" id="mergedIntoLabel">Merged into:</label> |
| <input |
| id="mergedIntoInput" |
| value=${this.mergedInto || ''} |
| @change=${this._changeHandler} |
| ></input> |
| </div>`; |
| } |
| |
| /** @override */ |
| static get properties() { |
| return { |
| initialStatus: {type: String}, |
| status: {type: String}, |
| statuses: {type: Array}, |
| isApproval: {type: Boolean}, |
| mergedInto: {type: String}, |
| }; |
| } |
| |
| /** @override */ |
| update(changedProperties) { |
| if (changedProperties.has('initialStatus')) { |
| this.status = this.initialStatus; |
| } |
| super.update(changedProperties); |
| } |
| |
| get _showMergedInto() { |
| const status = this.status || this.initialStatus; |
| return (status === 'Duplicate'); |
| } |
| |
| get _statusesGrouped() { |
| const statuses = this.statuses; |
| const isApproval = this.isApproval; |
| if (!statuses) return []; |
| if (isApproval) { |
| return [{statuses: statuses}]; |
| } |
| return [ |
| { |
| name: 'Open', |
| statuses: statuses.filter((s) => s.meansOpen), |
| }, |
| { |
| name: 'Closed', |
| statuses: statuses.filter((s) => !s.meansOpen), |
| }, |
| ]; |
| } |
| |
| async reset() { |
| await this.updateComplete; |
| const mergedIntoInput = this.shadowRoot.querySelector('#mergedIntoInput'); |
| if (mergedIntoInput) { |
| mergedIntoInput.value = this.mergedInto || ''; |
| } |
| this.status = this.initialStatus; |
| } |
| |
| get delta() { |
| const result = {}; |
| |
| if (this.status !== this.initialStatus) { |
| result['status'] = this.status; |
| } |
| |
| if (this._showMergedInto) { |
| const newMergedInto = this.shadowRoot.querySelector( |
| '#mergedIntoInput').value; |
| if (newMergedInto !== this.mergedInto) { |
| result['mergedInto'] = newMergedInto; |
| } |
| } else if (this.initialStatus === 'Duplicate') { |
| result['mergedInto'] = ''; |
| } |
| |
| return result; |
| } |
| |
| _selectChangeHandler(e) { |
| const statusInput = e.target; |
| this.status = statusInput.value; |
| this._changeHandler(e); |
| } |
| |
| /** |
| * @param {Event} e |
| * @fires CustomEvent#change |
| * @private |
| */ |
| _changeHandler(e) { |
| this.dispatchEvent(new CustomEvent('change')); |
| } |
| } |
| |
| customElements.define('mr-edit-status', MrEditStatus); |