/**
* @module modules/file-browser
*/
import type { IDialog, IFileBrowser } from 'jodit/types';
import { Dom } from 'jodit/core/dom';
import { attr, error } from 'jodit/core/helpers';
import { makeContextMenu } from 'jodit/modules/file-browser/factories';
import { Icon } from 'jodit/core/ui';
import { elementToItem, getItem } from '../listeners/native-listeners';
import { openImageEditor } from '../../image-editor/image-editor';
import { elementsMap } from 'jodit/modules/file-browser/builders/elements-map';
import { loadTree } from 'jodit/modules/file-browser/fetch/load-tree';
import { deleteFile } from 'jodit/modules/file-browser/fetch/delete-file';
const CLASS_PREVIEW = 'jodit-filebrowser-preview',
preview_tpl_next = (next = 'next', right = 'right'): string =>
`
` +
'' +
Icon.get('angle-' + right) +
'';
export default (self: IFileBrowser): ((e: DragEvent) => boolean | void) => {
if (!self.o.contextMenu) {
return () => {};
}
const contextmenu = makeContextMenu(self);
return (e: DragEvent): boolean | void => {
const a = getItem(e.target, self.container);
if (!a) {
return;
}
let item: HTMLElement = a;
const opt = self.options,
ga = (key: string): string => attr(item, key) || '';
self.async.setTimeout(() => {
const selectedItem = elementToItem(a, elementsMap(self));
if (!selectedItem) {
return;
}
self.state.activeElements = [selectedItem];
contextmenu.show(e.clientX, e.clientY, [
ga('data-is-file') !== '1' &&
opt.editImage &&
(self.dataProvider.canI('ImageResize') ||
self.dataProvider.canI('ImageCrop'))
? {
icon: 'pencil',
title: 'Edit',
exec: (): Promise
=>
openImageEditor.call(
self,
ga('href'),
ga('data-name'),
ga('data-path'),
ga('data-source')
)
}
: false,
self.dataProvider.canI('FileRename')
? {
icon: 'italic',
title: 'Rename',
exec: (): void => {
self.e.fire(
'fileRename.filebrowser',
ga('data-name'),
ga('data-path'),
ga('data-source')
);
}
}
: false,
self.dataProvider.canI('FileRemove')
? {
icon: 'bin',
title: 'Delete',
exec: async (): Promise => {
try {
await deleteFile(
self,
ga('data-name'),
ga('data-source')
);
} catch (e: any) {
return self.status(e);
}
self.state.activeElements = [];
return loadTree(self).catch(self.status);
}
}
: false,
opt.preview
? {
icon: 'eye',
title: 'Preview',
exec: (): void => {
const preview = self.dlg({
buttons: ['fullsize', 'dialog.close']
}),
temp_content = self.c.div(
CLASS_PREVIEW,
''
),
preview_box = self.c.div(
CLASS_PREVIEW + '__box'
),
next = self.c.fromHTML(preview_tpl_next()),
prev = self.c.fromHTML(
preview_tpl_next('prev', 'left')
),
addLoadHandler = (src: string): void => {
const image = self.c.element('img');
image.setAttribute('src', src);
const onload = (): void => {
if (self.isInDestruct) {
return;
}
self.e.off(image, 'load');
Dom.detach(temp_content);
if (opt.showPreviewNavigation) {
if (
Dom.prevWithClass(
item,
self.files.getFullElName(
'item'
)
)
) {
temp_content.appendChild(
prev
);
}
if (
Dom.nextWithClass(
item,
self.files.getFullElName(
'item'
)
)
) {
temp_content.appendChild(
next
);
}
}
temp_content.appendChild(
preview_box
);
preview_box.appendChild(image);
preview.setPosition();
self?.events?.fire(
'previewOpenedAndLoaded'
);
};
self.e.on(image, 'load', onload);
if (image.complete) {
onload();
}
};
self.e.on(
[next, prev],
'click',
function (this: HTMLElement) {
if (this === next) {
item = Dom.nextWithClass(
item,
self.files.getFullElName('item')
) as HTMLElement;
} else {
item = Dom.prevWithClass(
item,
self.files.getFullElName('item')
) as HTMLElement;
}
if (!item) {
throw error('Need element');
}
Dom.detach(temp_content);
Dom.detach(preview_box);
temp_content.innerHTML =
'';
addLoadHandler(ga('href'));
}
);
self.e.on('beforeDestruct', () => {
preview.destruct();
});
preview.container.classList.add(
CLASS_PREVIEW + '__dialog'
);
preview.setContent(temp_content);
preview.setPosition();
preview.open();
addLoadHandler(ga('href'));
self.events
.on('beforeDestruct', () => {
preview.destruct();
})
.fire('previewOpened');
}
}
: false,
{
icon: 'upload',
title: 'Download',
exec: (): void => {
const url = ga('href');
if (url) {
self.ow.open(url);
}
}
}
]);
}, self.defaultTimeout);
self.e
.on('beforeClose', () => contextmenu.close())
.on('beforeDestruct', () => contextmenu.destruct());
e.stopPropagation();
e.preventDefault();
return false;
};
};