blob: 318a33b61e5beaf50a7144f403dfd150a9c78b67 [file] [log] [blame]
Frank Borden0c804282022-02-28 18:21:43 +01001/**
2 * @license
3 * Copyright 2022 Google LLC
4 * SPDX-License-Identifier: Apache-2.0
5 */
Frank Bordenc47f3952022-03-01 15:21:39 +01006import {css, html, LitElement, nothing} from 'lit';
Frank Borden42c1a452022-08-11 16:27:20 +02007import {customElement, state} from 'lit/decorators.js';
Frank Bordenc47f3952022-03-01 15:21:39 +01008import {bulkActionsModelToken} from '../../../models/bulk-actions/bulk-actions-model';
9import {resolve} from '../../../models/dependency';
10import {pluralize} from '../../../utils/string-util';
11import {subscribe} from '../../lit/subscription-controller';
Frank Borden0c804282022-02-28 18:21:43 +010012import '../../shared/gr-button/gr-button';
Frank Bordenabdd2d82022-03-23 11:50:43 +010013import '../gr-change-list-reviewer-flow/gr-change-list-reviewer-flow';
Dhruv Srivastava6918d4a2022-03-15 17:18:29 +053014import '../gr-change-list-bulk-vote-flow/gr-change-list-bulk-vote-flow';
Frank Bordend61e2be2022-03-31 17:31:17 +020015import '../gr-change-list-topic-flow/gr-change-list-topic-flow';
Frank Bordenfbe57cb2022-05-10 15:59:49 +020016import '../gr-change-list-hashtag-flow/gr-change-list-hashtag-flow';
Frank Borden0c804282022-02-28 18:21:43 +010017
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')
23export class GrChangeListActionBar extends LitElement {
24 static override get styles() {
25 return css`
26 :host {
27 display: contents;
28 }
Frank Bordenbddb94d2022-06-10 12:46:50 +020029 td {
30 padding: 0;
31 }
Frank Borden0c804282022-02-28 18:21:43 +010032 .container {
33 display: flex;
Frank Bordenc47f3952022-03-01 15:21:39 +010034 justify-content: space-between;
35 align-items: center;
36 }
Dhruve29d4222022-05-31 13:10:07 +010037 .actionButtons {
38 margin-right: var(--spacing-l);
39 }
Frank Borden0c804282022-02-28 18:21:43 +010040 `;
41 }
42
Frank Bordenc47f3952022-03-01 15:21:39 +010043 @state()
44 private numSelected = 0;
45
46 private readonly getBulkActionsModel = resolve(this, bulkActionsModelToken);
47
Chris Poucet5ec77f02022-05-12 11:25:21 +020048 constructor() {
49 super();
Frank Bordenc47f3952022-03-01 15:21:39 +010050 subscribe(
51 this,
Chris Poucet5ec77f02022-05-12 11:25:21 +020052 () => this.getBulkActionsModel().selectedChangeNums$,
Frank Bordenc47f3952022-03-01 15:21:39 +010053 selectedChangeNums => (this.numSelected = selectedChangeNums.length)
54 );
55 }
56
Frank Borden0c804282022-02-28 18:21:43 +010057 override render() {
Frank Bordenc47f3952022-03-01 15:21:39 +010058 const numSelectedLabel = `${pluralize(
59 this.numSelected,
60 'change'
61 )} selected`;
Frank Borden0c804282022-02-28 18:21:43 +010062 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 Bordenc47f3952022-03-01 15:21:39 +010070 <div class="selectionInfo">
71 ${this.numSelected
72 ? html`<span>${numSelectedLabel}</span>`
73 : nothing}
74 </div>
75 <div class="actionButtons">
Dhruv Srivastava0c95d7c2022-03-30 17:04:52 +020076 <gr-change-list-bulk-vote-flow></gr-change-list-bulk-vote-flow>
Frank Bordend61e2be2022-03-31 17:31:17 +020077 <gr-change-list-topic-flow></gr-change-list-topic-flow>
Frank Bordenfbe57cb2022-05-10 15:59:49 +020078 <gr-change-list-hashtag-flow></gr-change-list-hashtag-flow>
Frank Bordenabdd2d82022-03-23 11:50:43 +010079 <gr-change-list-reviewer-flow></gr-change-list-reviewer-flow>
Frank Bordenc47f3952022-03-01 15:21:39 +010080 </div>
Frank Borden0c804282022-02-28 18:21:43 +010081 </div>
82 </td>
83 `;
84 }
Frank Borden0c804282022-02-28 18:21:43 +010085}
86
87declare global {
88 interface HTMLElementTagNameMap {
89 'gr-change-list-action-bar': GrChangeListActionBar;
90 }
91}