150 lines
4.2 KiB
JavaScript
150 lines
4.2 KiB
JavaScript
import JoomlaDialog from 'joomla.dialog';
|
|
|
|
/**
|
|
* @copyright (C) 2017 Open Source Matters, Inc. <https://www.joomla.org>
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
class JoomlaFieldUser extends HTMLElement {
|
|
constructor() {
|
|
super();
|
|
this.onUserSelect = '';
|
|
this.onchangeStr = '';
|
|
|
|
// Bind context
|
|
this.modalClose = this.modalClose.bind(this);
|
|
this.setValue = this.setValue.bind(this);
|
|
this.modalOpen = this.modalOpen.bind(this);
|
|
}
|
|
static get observedAttributes() {
|
|
return ['url', 'modal', 'modal-width', 'modal-height', 'modal-title', 'input', 'input-name', 'button-select'];
|
|
}
|
|
get url() {
|
|
return this.getAttribute('url');
|
|
}
|
|
set url(value) {
|
|
this.setAttribute('url', value);
|
|
}
|
|
get modalWidth() {
|
|
return this.getAttribute('modal-width');
|
|
}
|
|
set modalWidth(value) {
|
|
this.setAttribute('modal-width', value);
|
|
}
|
|
get modalTitle() {
|
|
return this.getAttribute('modal-title');
|
|
}
|
|
set modalTitle(value) {
|
|
this.setAttribute('modal-title', value);
|
|
}
|
|
get modalHeight() {
|
|
return this.getAttribute('modal-height');
|
|
}
|
|
set modalHeight(value) {
|
|
this.setAttribute('modal-height', value);
|
|
}
|
|
get inputId() {
|
|
return this.getAttribute('input');
|
|
}
|
|
set inputId(value) {
|
|
this.setAttribute('input', value);
|
|
}
|
|
get inputNameClass() {
|
|
return this.getAttribute('input-name');
|
|
}
|
|
set inputNameClass(value) {
|
|
this.setAttribute('input-name', value);
|
|
}
|
|
get buttonSelectClass() {
|
|
return this.getAttribute('button-select');
|
|
}
|
|
set buttonSelectClass(value) {
|
|
this.setAttribute('button-select', value);
|
|
}
|
|
connectedCallback() {
|
|
// Set up elements
|
|
this.input = this.querySelector(this.inputId);
|
|
this.inputName = this.querySelector(this.inputNameClass);
|
|
this.buttonSelect = this.querySelector(this.buttonSelectClass);
|
|
if (this.buttonSelect) {
|
|
this.buttonSelect.addEventListener('click', this.modalOpen.bind(this));
|
|
// this.modal.addEventListener('hide', this.removeIframe.bind(this));
|
|
|
|
// Check for onchange callback,
|
|
this.onchangeStr = this.input.getAttribute('data-onchange');
|
|
if (this.onchangeStr) {
|
|
// eslint-disable-next-line no-new-func
|
|
this.onUserSelect = new Function(this.onchangeStr);
|
|
this.input.addEventListener('change', this.onUserSelect);
|
|
}
|
|
}
|
|
}
|
|
disconnectedCallback() {
|
|
if (this.onUserSelect && this.input) {
|
|
this.input.removeEventListener('change', this.onUserSelect);
|
|
}
|
|
if (this.buttonSelect) {
|
|
this.buttonSelect.removeEventListener('click', this.modalOpen);
|
|
}
|
|
if (this.modal) {
|
|
this.modal.removeEventListener('hide', this);
|
|
}
|
|
}
|
|
|
|
// Opens the modal
|
|
modalOpen() {
|
|
// Create and show the dialog
|
|
const dialog = new JoomlaDialog({
|
|
popupType: 'iframe',
|
|
src: this.url,
|
|
textHeader: this.modalTitle,
|
|
width: this.modalWidth,
|
|
height: this.modalHeight
|
|
});
|
|
dialog.classList.add('joomla-dialog-user-field');
|
|
dialog.show();
|
|
|
|
// Wait for message
|
|
const msgListener = event => {
|
|
// Avoid cross origins
|
|
if (event.origin !== window.location.origin) return;
|
|
// Check message type
|
|
if (event.data.messageType === 'joomla:content-select') {
|
|
this.setValue(event.data.id, event.data.name);
|
|
dialog.close();
|
|
} else if (event.data.messageType === 'joomla:cancel') {
|
|
dialog.close();
|
|
}
|
|
};
|
|
window.addEventListener('message', msgListener);
|
|
dialog.addEventListener('joomla-dialog:close', () => {
|
|
window.removeEventListener('message', msgListener);
|
|
dialog.destroy();
|
|
this.dialog = null;
|
|
});
|
|
this.dialog = dialog;
|
|
}
|
|
|
|
// Closes the modal
|
|
modalClose() {
|
|
if (this.dialog) {
|
|
this.dialog.close();
|
|
}
|
|
}
|
|
|
|
// Sets the value
|
|
setValue(value, name) {
|
|
this.input.setAttribute('value', value);
|
|
this.inputName.setAttribute('value', name || value);
|
|
// trigger change event both on the input and on the custom element
|
|
this.input.dispatchEvent(new CustomEvent('change'));
|
|
this.dispatchEvent(new CustomEvent('change', {
|
|
detail: {
|
|
value,
|
|
name
|
|
},
|
|
bubbles: true
|
|
}));
|
|
}
|
|
}
|
|
customElements.define('joomla-field-user', JoomlaFieldUser);
|