blob: 2a2a48707182f83b8787d906affff49637ef876a [file] [log] [blame]
// 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 {assert} from 'chrome://resources/js/assert.m.js';
import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
/** @type {!HTMLTemplateElement} */
const htmlTemplate = html`{__html_template__}`;
/**
* FilesMessage.
*/
export class FilesMessage extends HTMLElement {
constructor() {
super();
// Create element content.
const fragment = htmlTemplate.content.cloneNode(true);
this.attachShadow({mode: 'open'}).appendChild(fragment);
/**
* FilesMessage visual signals user callback.
* @private @type {!function(*)}
*/
this.signal_ = console.log;
}
/**
* Sets |this| properties (even its HTMLElement properties) from an object.
* @param {!Object} object Settable property name/value pairs.
* @public
*/
setContent(object) {
Object.assign(this, object);
}
/**
* Sets the FilesMessage user visual signals callback.
* @param {?function(*)} signal
* @public
*/
setSignalCallback(signal) {
this.signal_ = signal || console.log;
}
/**
* DOM connected.
* @private
*/
connectedCallback() {
this.onclick = this.onClicked_.bind(this);
}
/**
* Handles Polymer 'click' events from our sub-elements and emits visual
* signals to the |signal_| callback if needed.
* @param {?Event} event
* @private
*/
onClicked_(event) {
event.stopImmediatePropagation();
event.preventDefault();
let id = assert(event.target.id);
if (id === 'icon' || id === 'close') {
id = event.target.getAttribute('iron-icon');
} else if (event.target === this) {
return; // Ignore main element clicks.
}
this.signal_(id);
}
/**
* Returns FilesMessage sub-element by |id|.
* @param {string} id
* @return {!HTMLElement}
* @private
*/
getShadowElement_(id) {
return assert(this.shadowRoot.getElementById(id));
}
/**
* Sets icon type, aria-label. Hides icon if |type| falsey. Note aria role
* and tabindex are reset here since 'set info' also calls 'set icon'.
* @param {?{
* icon:string,
* label:?string,
* }} type
* @public
*/
set icon(type) {
const element = this.getShadowElement_('icon');
element.setAttribute('role', 'button');
if (type) {
element.setAttribute('aria-label', type.label || '');
element.setAttribute('iron-icon', type.icon);
element.setAttribute('tabindex', '0');
element.onclick = this.onclick;
} else {
element.removeAttribute('iron-icon'); // hide
element.onclick = null;
}
}
/**
* Sets icon info type, aria-label. The icon is shown, non-clickable.
* @param {?{
* icon:string,
* label:?string,
* }} type
* @public
*/
set info(type) {
this.icon = type; // Set icon property first.
const element = this.getShadowElement_('icon');
element.setAttribute('role', 'img');
element.removeAttribute('tabindex');
element.onclick = null;
}
/**
* Sets the text message.
* @param {?string} text
* @public
*/
set message(text) {
const element = this.getShadowElement_('text');
element.setAttribute('aria-label', text || '');
}
/**
* Sets dismiss button text. Hides dismiss button if |text| falsey.
* @param {?string} text
* @public
*/
set dismiss(text) {
const element = this.getShadowElement_('dismiss');
if (text) {
element.setAttribute('aria-label', text);
element.onclick = this.onclick;
} else {
element.removeAttribute('aria-label'); // hide
element.onclick = null;
}
}
/**
* Sets action button text. Hides action button if |text| falsey.
* @param {?string} text
* @public
*/
set action(text) {
const element = this.getShadowElement_('action');
if (text) {
element.setAttribute('aria-label', text);
element.onclick = this.onclick;
} else {
element.removeAttribute('aria-label'); // hide
element.onclick = null;
}
}
/**
* Sets close icon type, aria-label. Hides close icon if |type| falsey.
* @param {?{
* label:?string,
* }} type
* @public
*/
set close(type) {
const element = this.getShadowElement_('close');
if (type) {
element.setAttribute('aria-label', type.label || '');
element.setAttribute('iron-icon', 'cr:close');
element.onclick = this.onclick;
} else {
element.removeAttribute('iron-icon'); // hide
element.onclick = null;
}
}
}
customElements.define('files-message', FilesMessage);
//# sourceURL=//ui/file_manager/file_manager/foreground/elements/files_message.js