blob: f1bdeeb5cce4d300cf7c792a88acb2265795397e [file] [log] [blame]
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +02001import '@material/web/formfield/formfield.js';
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +01002import '@material/web/switch/switch.js';
3import '@material/web/textfield/outlined-text-field.js';
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +02004
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +01005import {css, html, LitElement} from 'lit';
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +02006import {createRef, ref} from 'lit/directives/ref.js';
7
8import {CCApi} from '../../../../common/api.js';
9import * as pb from '../../../proto/main_pb.js';
10
11export default class WFActionReplyWithCR extends LitElement {
12 static properties = {
13 action: {type: Object},
14 readOnly: {type: Boolean},
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010015 _importerWindow: {type: Object, state: true},
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020016 };
17
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010018 static styles = css`
19 .form-line {
20 display: flex;
21 flex-direction: row;
22 align-items: center;
23 margin-block: 1em;
24 gap: .5rem;
25 }
26 `;
27
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020028 cannedResponseRef = createRef();
29 subscribeRef = createRef();
30 markAsAnswerRef = createRef();
31
32 constructor() {
33 super();
34 this.action = new pb.workflows.Action.ReplyWithCRAction;
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010035 this._importerWindow = undefined;
36
37 window.addEventListener('message', e => {
38 if (e.source === this._importerWindow &&
39 e.data?.action === 'importCannedResponse') {
40 this._cannedResponseIdString = e.data?.cannedResponseId;
41 this._importerWindow?.close?.();
42 }
43 });
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020044 }
45
46 render() {
47 return html`
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010048 <div class="form-line">
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020049 <md-outlined-text-field ${ref(this.cannedResponseRef)}
50 type="number"
51 label="Canned response ID"
52 required
53 value=${this._cannedResponseIdString}
54 ?readonly=${this.readOnly}
55 @input=${this._cannedResponseIdChanged}>
56 </md-outlined-text-field>
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010057 <md-outlined-button
58 icon="more"
59 label="Select CR"
60 @click=${this._openCRImporter}>
61 </md-outlined-button>
62 </div>
63 <div class="form-line">
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020064 <md-formfield label="Subscribe to thread">
65 <md-switch ${ref(this.subscribeRef)}
66 ?selected=${this.subscribe}
67 ?disabled=${this.readOnly}
68 @click=${this._subscribeChanged}/>
69 </md-formfield>
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010070 </div>
71 <div class="form-line">
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020072 <md-formfield label="Mark as answer">
73 <md-switch ${ref(this.markAsAnswerRef)}
74 ?selected=${this.markAsAnswer}
75 ?disabled=${this.readOnly}
76 @click=${this._markAsAnswerChanged}/>
77 </md-formfield>
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010078 </div>
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020079 `;
80 }
81
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +010082 disconnectedCallback() {
83 super.disconnectedCallback();
84 this._importerWindow?.close?.();
85 }
86
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020087 checkValidity() {
88 return this.cannedResponseRef.value.reportValidity();
89 }
90
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020091 _dispatchUpdateEvent() {
92 // Request an update for this component
93 this.requestUpdate();
94
95 // Transmit to other components that the action has changed
96 const e = new Event(
97 'replywithcr-action-updated', {bubbles: true, composed: true});
98 this.renderRoot.dispatchEvent(e);
99 }
100
101 _cannedResponseIdChanged() {
102 this._cannedResponseIdString = this.cannedResponseRef.value.value;
103 }
104
105 _subscribeChanged() {
106 this.subscribe = this.subscribeRef.value.selected;
107 }
108
109 _markAsAnswerChanged() {
110 this.markAsAnswer = this.markAsAnswerRef.value.selected;
111 }
112
Adrià Vilanova Martíneze0d65f22022-11-06 18:49:35 +0100113 _openCRImporter() {
114 if (!(this._importerWindow?.closed ?? true))
115 this._importerWindow?.close?.();
116
117 this._importerWindow = window.open(
118 'https://support.google.com/s/community/cannedresponses?TWPTImportToWorkflow&TWPTSelectedId=' +
119 encodeURIComponent(this._cannedResponseIdString),
120 '', 'popup,width=720,height=540');
121 }
122
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +0200123 get cannedResponseId() {
124 return this.action.getCannedResponseId() ?? 0;
125 }
126
127 set cannedResponseId(value) {
128 this.action.setCannedResponseId(value);
129 this._dispatchUpdateEvent();
130 }
131
132 get _cannedResponseIdString() {
133 let id = this.cannedResponseId;
134 if (id == 0) return '';
135 return id.toString();
136 }
137
138 set _cannedResponseIdString(value) {
139 this.cannedResponseId = parseInt(value);
140 }
141
142 get subscribe() {
143 return this.action.getSubscribe();
144 }
145
146 set subscribe(value) {
147 this.action.setSubscribe(value);
148 this._dispatchUpdateEvent();
149 }
150
151 get markAsAnswer() {
152 return this.action.getMarkAsAnswer();
153 }
154
155 set markAsAnswer(value) {
156 this.action.setMarkAsAnswer(value);
157 this._dispatchUpdateEvent();
158 }
159}
160window.customElements.define('wf-action-reply-with-cr', WFActionReplyWithCR);