Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 1 | /** |
| 2 | * @license |
| 3 | * Copyright 2022 Google LLC |
| 4 | * SPDX-License-Identifier: Apache-2.0 |
| 5 | */ |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 6 | import {css, html, LitElement, nothing} from 'lit'; |
Frank Borden | 42c1a45 | 2022-08-11 16:27:20 +0200 | [diff] [blame] | 7 | import {customElement, state} from 'lit/decorators.js'; |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 8 | import {bulkActionsModelToken} from '../../../models/bulk-actions/bulk-actions-model'; |
| 9 | import {resolve} from '../../../models/dependency'; |
| 10 | import {pluralize} from '../../../utils/string-util'; |
| 11 | import {subscribe} from '../../lit/subscription-controller'; |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 12 | import '../../shared/gr-button/gr-button'; |
Frank Borden | abdd2d8 | 2022-03-23 11:50:43 +0100 | [diff] [blame] | 13 | import '../gr-change-list-reviewer-flow/gr-change-list-reviewer-flow'; |
Dhruv Srivastava | 6918d4a | 2022-03-15 17:18:29 +0530 | [diff] [blame] | 14 | import '../gr-change-list-bulk-vote-flow/gr-change-list-bulk-vote-flow'; |
Frank Borden | d61e2be | 2022-03-31 17:31:17 +0200 | [diff] [blame] | 15 | import '../gr-change-list-topic-flow/gr-change-list-topic-flow'; |
Frank Borden | fbe57cb | 2022-05-10 15:59:49 +0200 | [diff] [blame] | 16 | import '../gr-change-list-hashtag-flow/gr-change-list-hashtag-flow'; |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 17 | |
| 18 | /** |
| 19 | * An action bar for the top of a <gr-change-list-section> element. Assumes it |
| 20 | * will be used inside a <tr> element. |
| 21 | */ |
| 22 | @customElement('gr-change-list-action-bar') |
| 23 | export class GrChangeListActionBar extends LitElement { |
| 24 | static override get styles() { |
| 25 | return css` |
| 26 | :host { |
| 27 | display: contents; |
| 28 | } |
Frank Borden | bddb94d | 2022-06-10 12:46:50 +0200 | [diff] [blame] | 29 | td { |
| 30 | padding: 0; |
| 31 | } |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 32 | .container { |
| 33 | display: flex; |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 34 | justify-content: space-between; |
| 35 | align-items: center; |
| 36 | } |
Dhruv | e29d422 | 2022-05-31 13:10:07 +0100 | [diff] [blame] | 37 | .actionButtons { |
| 38 | margin-right: var(--spacing-l); |
| 39 | } |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 40 | `; |
| 41 | } |
| 42 | |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 43 | @state() |
| 44 | private numSelected = 0; |
| 45 | |
| 46 | private readonly getBulkActionsModel = resolve(this, bulkActionsModelToken); |
| 47 | |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 48 | constructor() { |
| 49 | super(); |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 50 | subscribe( |
| 51 | this, |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 52 | () => this.getBulkActionsModel().selectedChangeNums$, |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 53 | selectedChangeNums => (this.numSelected = selectedChangeNums.length) |
| 54 | ); |
| 55 | } |
| 56 | |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 57 | override render() { |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 58 | const numSelectedLabel = `${pluralize( |
| 59 | this.numSelected, |
| 60 | 'change' |
| 61 | )} selected`; |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 62 | return html` |
| 63 | <!-- |
| 64 | 500 chosen to be more than the actual number of columns but less than |
| 65 | 1000 where the browser apparently decides it is an error and reverts |
| 66 | back to colspan="1" |
| 67 | --> |
| 68 | <td colspan="500"> |
| 69 | <div class="container"> |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 70 | <div class="selectionInfo"> |
| 71 | ${this.numSelected |
| 72 | ? html`<span>${numSelectedLabel}</span>` |
| 73 | : nothing} |
| 74 | </div> |
| 75 | <div class="actionButtons"> |
Dhruv Srivastava | 0c95d7c | 2022-03-30 17:04:52 +0200 | [diff] [blame] | 76 | <gr-change-list-bulk-vote-flow></gr-change-list-bulk-vote-flow> |
Frank Borden | d61e2be | 2022-03-31 17:31:17 +0200 | [diff] [blame] | 77 | <gr-change-list-topic-flow></gr-change-list-topic-flow> |
Frank Borden | fbe57cb | 2022-05-10 15:59:49 +0200 | [diff] [blame] | 78 | <gr-change-list-hashtag-flow></gr-change-list-hashtag-flow> |
Frank Borden | abdd2d8 | 2022-03-23 11:50:43 +0100 | [diff] [blame] | 79 | <gr-change-list-reviewer-flow></gr-change-list-reviewer-flow> |
Frank Borden | c47f395 | 2022-03-01 15:21:39 +0100 | [diff] [blame] | 80 | </div> |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 81 | </div> |
| 82 | </td> |
| 83 | `; |
| 84 | } |
Frank Borden | 0c80428 | 2022-02-28 18:21:43 +0100 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | declare global { |
| 88 | interface HTMLElementTagNameMap { |
| 89 | 'gr-change-list-action-bar': GrChangeListActionBar; |
| 90 | } |
| 91 | } |