diff --git a/administrator/components/com_media/resources/scripts/components/browser/browser.vue b/administrator/components/com_media/resources/scripts/components/browser/browser.vue
index 485c7389fbfc2..841869cc9cd2c 100644
--- a/administrator/components/com_media/resources/scripts/components/browser/browser.vue
+++ b/administrator/components/com_media/resources/scripts/components/browser/browser.vue
@@ -107,6 +107,22 @@
const clickedOutside = notClickedBrowserItems && notClickedInfobar && !clickedDelete;
if (clickedOutside) {
this.$store.commit(types.UNSELECT_ALL_BROWSER_ITEMS);
+
+ window.parent.document.dispatchEvent(
+ new CustomEvent(
+ 'onMediaFileSelected',
+ {
+ "bubbles": true,
+ "cancelable": false,
+ "detail": {
+ path: '',
+ thumb: false,
+ fileType: false,
+ extension: false,
+ }
+ }
+ )
+ );
}
},
diff --git a/administrator/components/com_media/resources/scripts/components/browser/items/item.js b/administrator/components/com_media/resources/scripts/components/browser/items/item.js
index f2c71251fa70c..3d63e7986a2f8 100644
--- a/administrator/components/com_media/resources/scripts/components/browser/items/item.js
+++ b/administrator/components/com_media/resources/scripts/components/browser/items/item.js
@@ -81,24 +81,22 @@ export default {
* @param event
*/
handleClick(event) {
- let path = false;
- const data = {
- path: path,
- thumb: false,
- fileType: this.item.mime_type ? this.item.mime_type : false,
- extension: this.item.extension ? this.item.extension : false,
- };
-
- if (this.item.type === 'file') {
- data.path = this.item.path;
- data.thumb = this.item.thumb ? this.item.thumb : false;
-
- const ev = new CustomEvent('onMediaFileSelected', {
- "bubbles": true,
- "cancelable": false,
- "detail": data
- });
- window.parent.document.dispatchEvent(ev);
+ if (this.item.path && this.item.type === 'file') {
+ window.parent.document.dispatchEvent(
+ new CustomEvent(
+ 'onMediaFileSelected',
+ {
+ "bubbles": true,
+ "cancelable": false,
+ "detail": {
+ path: this.item.path,
+ thumb: this.item.thumb,
+ fileType: this.item.mime_type ? this.item.mime_type : false,
+ extension: this.item.extension ? this.item.extension : false,
+ },
+ }
+ )
+ );
}
// Handle clicks when the item was not selected
@@ -129,7 +127,9 @@ export default {
},
render: function (createElement) {
- return createElement('div', {
+ return createElement(
+ 'div',
+ {
'class': {
'media-browser-item': true,
selected: this.isSelected(),
@@ -143,12 +143,15 @@ export default {
},
},
[
- createElement(this.itemType(), {
- props: {
- item: this.item,
- focused: this.focused,
- },
- })
+ createElement(
+ this.itemType(),
+ {
+ props: {
+ item: this.item,
+ focused: this.focused,
+ },
+ }
+ )
]
);
}
diff --git a/build/media_source/system/js/fields/joomla-field-media.w-c.es6.js b/build/media_source/system/js/fields/joomla-field-media.w-c.es6.js
index 36c5e24ccd972..7221bc81299f3 100644
--- a/build/media_source/system/js/fields/joomla-field-media.w-c.es6.js
+++ b/build/media_source/system/js/fields/joomla-field-media.w-c.es6.js
@@ -1,32 +1,32 @@
-((Joomla) => {
+((customElements, Joomla) => {
if (!Joomla) {
throw new Error('Joomla API is not properly initiated');
}
- Joomla.selectedFile = {};
+ let selectedFile = {};
window.document.addEventListener('onMediaFileSelected', (e) => {
- Joomla.selectedFile = e.detail;
+ selectedFile = e.detail;
});
- Joomla.doIt = (resp, editor, fieldClass) => {
+ const execTransform = (resp, editor, fieldClass) => {
if (resp.success === true) {
if (resp.data[0].url) {
if (/local-/.test(resp.data[0].adapter)) {
const { rootFull } = Joomla.getOptions('system.paths');
// eslint-disable-next-line prefer-destructuring
- Joomla.selectedFile.url = resp.data[0].url.split(rootFull)[1];
+ selectedFile.url = resp.data[0].url.split(rootFull)[1];
if (resp.data[0].thumb_path) {
- Joomla.selectedFile.thumb = resp.data[0].thumb_path;
+ selectedFile.thumb = resp.data[0].thumb_path;
} else {
- Joomla.selectedFile.thumb = false;
+ selectedFile.thumb = false;
}
} else if (resp.data[0].thumb_path) {
- Joomla.selectedFile.thumb = resp.data[0].thumb_path;
+ selectedFile.thumb = resp.data[0].thumb_path;
}
} else {
- Joomla.selectedFile.url = false;
+ selectedFile.url = false;
}
const isElement = (o) => (
@@ -34,13 +34,13 @@
: o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string'
);
- if (Joomla.selectedFile.url) {
+ if (selectedFile.url) {
if (!isElement(editor) && (typeof editor !== 'object')) {
- Joomla.editors.instances[editor].replaceSelection(``);
+ Joomla.editors.instances[editor].replaceSelection(``);
} else if (!isElement(editor) && (typeof editor === 'object' && editor.id)) {
- window.parent.Joomla.editors.instances[editor.id].replaceSelection(``);
+ window.parent.Joomla.editors.instances[editor.id].replaceSelection(``);
} else {
- editor.value = Joomla.selectedFile.url;
+ editor.value = selectedFile.url;
fieldClass.updatePreview();
}
}
@@ -54,7 +54,13 @@
*
* @returns {void}
*/
- Joomla.getImage = (data, editor, fieldClass) => new Promise((resolve, reject) => {
+ const fetchImageDetails = (data, editor, fieldClass) => new Promise((resolve, reject) => {
+ if (!data || (typeof data === 'object' && (!data.path || data.path === ''))) {
+ selectedFile = {};
+ reject(new Error('Nothing selected'));
+ return;
+ }
+
const apiBaseUrl = `${Joomla.getOptions('system.paths').rootFull}administrator/index.php?option=com_media&format=json`;
Joomla.request({
@@ -64,17 +70,14 @@
headers: { 'Content-Type': 'application/json' },
onSuccess: (response) => {
const resp = JSON.parse(response);
- resolve(Joomla.doIt(resp, editor, fieldClass));
+ resolve(execTransform(resp, editor, fieldClass));
},
- onError: () => {
- reject();
+ onError: (err) => {
+ reject(err);
},
});
});
-})(Joomla);
-
-((customElements, Joomla) => {
class JoomlaFieldMedia extends HTMLElement {
constructor() {
super();
@@ -192,9 +195,15 @@
modalClose() {
const input = this.querySelector(this.input);
- Joomla.getImage(Joomla.selectedFile, input, this);
- Joomla.Modal.getCurrent().close();
+ fetchImageDetails(selectedFile, input, this)
+ .then(() => { Joomla.Modal.getCurrent().close(); })
+ .catch(() => {
+ Joomla.Modal.getCurrent().close();
+ Joomla.renderMessages({
+ error: [Joomla.Text._('JLIB_APPLICATION_ERROR_SERVER')],
+ });
+ });
}
setValue(value) {
diff --git a/layouts/joomla/form/field/media.php b/layouts/joomla/form/field/media.php
index 311d4a5432214..d230192be281a 100644
--- a/layouts/joomla/form/field/media.php
+++ b/layouts/joomla/form/field/media.php
@@ -118,6 +118,7 @@
->useStyle('webcomponent.field-media')
->useScript('webcomponent.field-media');
+Text::script('JLIB_APPLICATION_ERROR_SERVER');
?>