mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2024-11-28 03:23:52 -06:00
Fix SonarQube code smells for PgTree directory.
This commit is contained in:
parent
8be65ceb7b
commit
6d5b1673e6
@ -39,7 +39,7 @@ export class FileTreeItem extends React.Component<IItemRendererXProps & IItemRen
|
|||||||
public static readonly renderHeight: number = 24;
|
public static readonly renderHeight: number = 24;
|
||||||
private static readonly itemIdToRefMap: Map<number, HTMLDivElement> = new Map();
|
private static readonly itemIdToRefMap: Map<number, HTMLDivElement> = new Map();
|
||||||
private static readonly refToItemIdMap: Map<number, HTMLDivElement> = new Map();
|
private static readonly refToItemIdMap: Map<number, HTMLDivElement> = new Map();
|
||||||
private fileTreeEvent: IFileTreeXTriggerEvents;
|
private readonly fileTreeEvent: IFileTreeXTriggerEvents;
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
@ -119,7 +119,7 @@ export class FileTreeItem extends React.Component<IItemRendererXProps & IItemRen
|
|||||||
this.setActiveFile(this.props.item);
|
this.setActiveFile(this.props.item);
|
||||||
}
|
}
|
||||||
|
|
||||||
private setActiveFile = async (FileOrDir): Promise<void> => {
|
private readonly setActiveFile = async (FileOrDir): Promise<void> => {
|
||||||
this.props.changeDirectoryCount(FileOrDir.parent);
|
this.props.changeDirectoryCount(FileOrDir.parent);
|
||||||
if(FileOrDir._loaded !== true) {
|
if(FileOrDir._loaded !== true) {
|
||||||
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'added', FileOrDir);
|
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'added', FileOrDir);
|
||||||
@ -142,7 +142,7 @@ export class FileTreeItem extends React.Component<IItemRendererXProps & IItemRen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleDivRef = (r: HTMLDivElement) => {
|
private readonly handleDivRef = (r: HTMLDivElement) => {
|
||||||
if (r === null) {
|
if (r === null) {
|
||||||
FileTreeItem.itemIdToRefMap.delete(this.props.item.id);
|
FileTreeItem.itemIdToRefMap.delete(this.props.item.id);
|
||||||
} else {
|
} else {
|
||||||
@ -151,42 +151,42 @@ export class FileTreeItem extends React.Component<IItemRendererXProps & IItemRen
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleContextMenu = (ev: React.MouseEvent) => {
|
private readonly handleContextMenu = (ev: React.MouseEvent) => {
|
||||||
const { item, itemType, onContextMenu } = this.props;
|
const { item, itemType, onContextMenu } = this.props;
|
||||||
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
||||||
onContextMenu(ev, item as FileOrDir);
|
onContextMenu(ev, item as FileOrDir);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleClick = (ev: React.MouseEvent) => {
|
private readonly handleClick = (ev: React.MouseEvent) => {
|
||||||
const { item, itemType, onClick } = this.props;
|
const { item, itemType, onClick } = this.props;
|
||||||
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
||||||
onClick(ev, item as FileEntry, itemType);
|
onClick(ev, item as FileEntry, itemType);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleDoubleClick = (ev: React.MouseEvent) => {
|
private readonly handleDoubleClick = (ev: React.MouseEvent) => {
|
||||||
const { item, itemType, onDoubleClick } = this.props;
|
const { item, itemType, onDoubleClick } = this.props;
|
||||||
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
||||||
onDoubleClick(ev, item as FileEntry, itemType);
|
onDoubleClick(ev, item as FileEntry, itemType);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleMouseEnter = (ev: React.MouseEvent) => {
|
private readonly handleMouseEnter = (ev: React.MouseEvent) => {
|
||||||
const { item, itemType, onMouseEnter } = this.props;
|
const { item, itemType, onMouseEnter } = this.props;
|
||||||
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
||||||
onMouseEnter?.(ev, item as FileEntry);
|
onMouseEnter?.(ev, item as FileEntry);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleMouseLeave = (ev: React.MouseEvent) => {
|
private readonly handleMouseLeave = (ev: React.MouseEvent) => {
|
||||||
const { item, itemType, onMouseLeave } = this.props;
|
const { item, itemType, onMouseLeave } = this.props;
|
||||||
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
||||||
onMouseLeave?.(ev, item as FileEntry);
|
onMouseLeave?.(ev, item as FileEntry);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleDragStartItem = (e: React.DragEvent) => {
|
private readonly handleDragStartItem = (e: React.DragEvent) => {
|
||||||
const { item, itemType, events } = this.props;
|
const { item, itemType, events } = this.props;
|
||||||
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
if (itemType === ItemType.File || itemType === ItemType.Directory) {
|
||||||
const ref = FileTreeItem.itemIdToRefMap.get(item.id);
|
const ref = FileTreeItem.itemIdToRefMap.get(item.id);
|
||||||
|
@ -20,17 +20,17 @@ import AutoSizer from 'react-virtualized-auto-sizer';
|
|||||||
|
|
||||||
export class FileTreeX extends React.Component<IFileTreeXProps> {
|
export class FileTreeX extends React.Component<IFileTreeXProps> {
|
||||||
private fileTreeHandle: IFileTreeXHandle;
|
private fileTreeHandle: IFileTreeXHandle;
|
||||||
private activeFileDec: Decoration;
|
private readonly activeFileDec: Decoration;
|
||||||
private pseudoActiveFileDec: Decoration;
|
private readonly pseudoActiveFileDec: Decoration;
|
||||||
private activeFile: FileOrDir;
|
private activeFile: FileOrDir;
|
||||||
private pseudoActiveFile: FileOrDir;
|
private pseudoActiveFile: FileOrDir;
|
||||||
private wrapperRef: React.RefObject<HTMLDivElement> = React.createRef();
|
private readonly wrapperRef: React.RefObject<HTMLDivElement> = React.createRef();
|
||||||
private events: Notificar<FileTreeXEvent>;
|
private readonly events: Notificar<FileTreeXEvent>;
|
||||||
private disposables: DisposablesComposite;
|
private readonly disposables: DisposablesComposite;
|
||||||
private keyboardHotkeys: KeyboardHotkeys;
|
private keyboardHotkeys: KeyboardHotkeys;
|
||||||
private fileTreeEvent: IFileTreeXTriggerEvents;
|
private fileTreeEvent: IFileTreeXTriggerEvents;
|
||||||
private hoverTimeoutId: React.RefObject<number|null> = React.createRef<number|null>();
|
private readonly hoverTimeoutId: React.RefObject<number|null> = React.createRef<number|null>();
|
||||||
private hoverDispatchId: React.RefObject<number|null> = React.createRef<number|null>();
|
private readonly hoverDispatchId: React.RefObject<number|null> = React.createRef<number|null>();
|
||||||
constructor(props: IFileTreeXProps) {
|
constructor(props: IFileTreeXProps) {
|
||||||
super(props);
|
super(props);
|
||||||
this.events = new Notificar();
|
this.events = new Notificar();
|
||||||
@ -98,11 +98,11 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
this.disposables.dispose();
|
this.disposables.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleTreeEvent = () => {
|
private readonly handleTreeEvent = () => {
|
||||||
this.fileTreeEvent = this.props.onEvent;
|
this.fileTreeEvent = this.props.onEvent;
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleTreeReady = (handle: IFileTreeHandle) => {
|
private readonly handleTreeReady = (handle: IFileTreeHandle) => {
|
||||||
const { onReady, model } = this.props;
|
const { onReady, model } = this.props;
|
||||||
const scrollDiv = this.wrapperRef.current?.querySelector('div')?.querySelector('div');
|
const scrollDiv = this.wrapperRef.current?.querySelector('div')?.querySelector('div');
|
||||||
if(this.props.onScroll) {
|
if(this.props.onScroll) {
|
||||||
@ -169,7 +169,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private onItemMouseEnter = (ev: React.MouseEvent, item: FileEntry | Directory) => {
|
private readonly onItemMouseEnter = (ev: React.MouseEvent, item: FileEntry | Directory) => {
|
||||||
clearTimeout(this.hoverDispatchId.current??undefined);
|
clearTimeout(this.hoverDispatchId.current??undefined);
|
||||||
(this.hoverDispatchId as any).current = setTimeout(()=>{
|
(this.hoverDispatchId as any).current = setTimeout(()=>{
|
||||||
clearTimeout(this.hoverTimeoutId.current??undefined);
|
clearTimeout(this.hoverTimeoutId.current??undefined);
|
||||||
@ -177,7 +177,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}, 500);
|
}, 500);
|
||||||
};
|
};
|
||||||
|
|
||||||
private onItemMouseLeave = (ev: React.MouseEvent) => {
|
private readonly onItemMouseLeave = (ev: React.MouseEvent) => {
|
||||||
clearTimeout(this.hoverTimeoutId.current??undefined);
|
clearTimeout(this.hoverTimeoutId.current??undefined);
|
||||||
clearTimeout(this.hoverDispatchId.current??undefined);
|
clearTimeout(this.hoverDispatchId.current??undefined);
|
||||||
(this.hoverTimeoutId as any).current = setTimeout(()=>{
|
(this.hoverTimeoutId as any).current = setTimeout(()=>{
|
||||||
@ -185,7 +185,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}, 100);
|
}, 100);
|
||||||
};
|
};
|
||||||
|
|
||||||
private setActiveFile = async (fileOrDirOrPath: FileOrDir | string, ensureVisible, align): Promise<void> => {
|
private readonly setActiveFile = async (fileOrDirOrPath: FileOrDir | string, ensureVisible, align): Promise<void> => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -202,13 +202,13 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'selected', fileH);
|
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'selected', fileH);
|
||||||
|
|
||||||
if (fileH && ensureVisible === true) {
|
if (fileH && ensureVisible === true) {
|
||||||
const alignTree = align !== undefined && align !== null ? align : 'auto';
|
const alignTree = align ?? 'auto';
|
||||||
await this.fileTreeHandle.ensureVisible(fileH, alignTree);
|
await this.fileTreeHandle.ensureVisible(fileH, alignTree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private ensureVisible = async (fileOrDirOrPath: FileOrDir | string): Promise<void> => {
|
private readonly ensureVisible = async (fileOrDirOrPath: FileOrDir | string): Promise<void> => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -218,7 +218,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private deSelectActiveFile = async (fileOrDirOrPath: FileOrDir | string): Promise<void> => {
|
private readonly deSelectActiveFile = async (fileOrDirOrPath: FileOrDir | string): Promise<void> => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -230,7 +230,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private setPseudoActiveFile = async (fileOrDirOrPath: FileOrDir | string): Promise<void> => {
|
private readonly setPseudoActiveFile = async (fileOrDirOrPath: FileOrDir | string): Promise<void> => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -251,7 +251,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'selected', fileH);
|
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'selected', fileH);
|
||||||
};
|
};
|
||||||
|
|
||||||
private create = async (parentDir, itemData): Promise<void> => {
|
private readonly create = async (parentDir, itemData): Promise<void> => {
|
||||||
if (parentDir == undefined || parentDir == null) {
|
if (parentDir == undefined || parentDir == null) {
|
||||||
parentDir = this.props.model.root;
|
parentDir = this.props.model.root;
|
||||||
}
|
}
|
||||||
@ -281,13 +281,13 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
return newItem;
|
return newItem;
|
||||||
};
|
};
|
||||||
|
|
||||||
private update = async (item, itemData): Promise<void> => {
|
private readonly update = async (item, itemData): Promise<void> => {
|
||||||
item._metadata.data = itemData;
|
item._metadata.data = itemData;
|
||||||
await this.props.update(item.path, itemData);
|
await this.props.update(item.path, itemData);
|
||||||
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'updated', item);
|
this.events.dispatch(FileTreeXEvent.onTreeEvents, window.event, 'updated', item);
|
||||||
};
|
};
|
||||||
|
|
||||||
private refresh = async (item): Promise<void> => {
|
private readonly refresh = async (item): Promise<void> => {
|
||||||
const isOpen = item.isExpanded;
|
const isOpen = item.isExpanded;
|
||||||
if (item.children && item.children.length > 0) {
|
if (item.children && item.children.length > 0) {
|
||||||
for(const entry of item.children) {
|
for(const entry of item.children) {
|
||||||
@ -312,7 +312,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private unload = async (item): Promise<void> => {
|
private readonly unload = async (item): Promise<void> => {
|
||||||
const isOpen = item.isExpanded;
|
const isOpen = item.isExpanded;
|
||||||
if (item.children && item.children.length > 0) {
|
if (item.children && item.children.length > 0) {
|
||||||
for(const entry of item.children) {
|
for(const entry of item.children) {
|
||||||
@ -325,7 +325,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private remove = async (item): Promise<void> => {
|
private readonly remove = async (item): Promise<void> => {
|
||||||
const {remove, model } = this.props;
|
const {remove, model } = this.props;
|
||||||
const path = item.path;
|
const path = item.path;
|
||||||
await remove(path, false);
|
await remove(path, false);
|
||||||
@ -346,7 +346,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private first = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly first = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -359,7 +359,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
private parent = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly parent = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -372,7 +372,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private hasParent = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly hasParent = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -384,7 +384,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
private children = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly children = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -397,7 +397,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private isOpen = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly isOpen = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -409,7 +409,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
private isClosed = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly isClosed = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -421,7 +421,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
private itemData = async (fileOrDirOrPath: FileOrDir | string) => {
|
private readonly itemData = async (fileOrDirOrPath: FileOrDir | string) => {
|
||||||
const fileH = typeof fileOrDirOrPath === 'string'
|
const fileH = typeof fileOrDirOrPath === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
? await this.fileTreeHandle.getFileHandle(fileOrDirOrPath)
|
||||||
: fileOrDirOrPath;
|
: fileOrDirOrPath;
|
||||||
@ -433,7 +433,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
private setLabel = async(pathOrDir: string | Directory, label: string): Promise<void> => {
|
private readonly setLabel = async(pathOrDir: string | Directory, label: string): Promise<void> => {
|
||||||
const dir = typeof pathOrDir === 'string'
|
const dir = typeof pathOrDir === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
||||||
: pathOrDir;
|
: pathOrDir;
|
||||||
@ -454,7 +454,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private changeDirectoryCount = async(pathOrDir: string | Directory): Promise<void> => {
|
private readonly changeDirectoryCount = async(pathOrDir: string | Directory): Promise<void> => {
|
||||||
const dir = typeof pathOrDir === 'string'
|
const dir = typeof pathOrDir === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
||||||
: pathOrDir;
|
: pathOrDir;
|
||||||
@ -474,7 +474,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private closeDir = async (pathOrDir: string | Directory) => {
|
private readonly closeDir = async (pathOrDir: string | Directory) => {
|
||||||
const dir = typeof pathOrDir === 'string'
|
const dir = typeof pathOrDir === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
||||||
: pathOrDir;
|
: pathOrDir;
|
||||||
@ -488,7 +488,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private toggleDirectory = async (pathOrDir: string | Directory) => {
|
private readonly toggleDirectory = async (pathOrDir: string | Directory) => {
|
||||||
const dir = typeof pathOrDir === 'string'
|
const dir = typeof pathOrDir === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
||||||
: pathOrDir;
|
: pathOrDir;
|
||||||
@ -517,7 +517,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private addIcon = async (pathOrDir: string | Directory, icon) => {
|
private readonly addIcon = async (pathOrDir: string | Directory, icon) => {
|
||||||
const dir = typeof pathOrDir === 'string'
|
const dir = typeof pathOrDir === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
||||||
: pathOrDir;
|
: pathOrDir;
|
||||||
@ -530,7 +530,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private addCssClass = async (pathOrDir: string | Directory, cssClass) => {
|
private readonly addCssClass = async (pathOrDir: string | Directory, cssClass) => {
|
||||||
const dir = typeof pathOrDir === 'string'
|
const dir = typeof pathOrDir === 'string'
|
||||||
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
? await this.fileTreeHandle.getFileHandle(pathOrDir)
|
||||||
: pathOrDir;
|
: pathOrDir;
|
||||||
@ -546,25 +546,25 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private showLoader = (ref: HTMLDivElement) => {
|
private readonly showLoader = (ref: HTMLDivElement) => {
|
||||||
// get label ref and add loading class
|
// get label ref and add loading class
|
||||||
ref.style.background = 'none';
|
ref.style.background = 'none';
|
||||||
const label$ = ref.querySelector('i.directory-toggle') as HTMLDivElement;
|
const label$ = ref.querySelector('i.directory-toggle') as HTMLDivElement;
|
||||||
if (label$) label$.classList.add('loading');
|
if (label$) label$.classList.add('loading');
|
||||||
};
|
};
|
||||||
|
|
||||||
private hideLoader = (ref: HTMLDivElement) => {
|
private readonly hideLoader = (ref: HTMLDivElement) => {
|
||||||
// remove loading class.
|
// remove loading class.
|
||||||
ref.style.background = 'none';
|
ref.style.background = 'none';
|
||||||
const label$ = ref.querySelector('i.directory-toggle') as HTMLDivElement;
|
const label$ = ref.querySelector('i.directory-toggle') as HTMLDivElement;
|
||||||
if (label$) label$.classList.remove('loading');
|
if (label$) label$.classList.remove('loading');
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleBlur = () => {
|
private readonly handleBlur = () => {
|
||||||
this.events.dispatch(FileTreeXEvent.OnBlur);
|
this.events.dispatch(FileTreeXEvent.OnBlur);
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleItemClicked = async (ev: React.MouseEvent, item: FileOrDir, type: ItemType) => {
|
private readonly handleItemClicked = async (ev: React.MouseEvent, item: FileOrDir, type: ItemType) => {
|
||||||
if (type === ItemType.Directory && ev.target.className.includes('directory-toggle')) {
|
if (type === ItemType.Directory && ev.target.className.includes('directory-toggle')) {
|
||||||
await this.toggleDirectory(item as Directory);
|
await this.toggleDirectory(item as Directory);
|
||||||
}
|
}
|
||||||
@ -572,42 +572,42 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleItemDoubleClicked = async (ev: React.MouseEvent, item: FileOrDir) => {
|
private readonly handleItemDoubleClicked = async (ev: React.MouseEvent, item: FileOrDir) => {
|
||||||
await this.toggleDirectory(item as Directory);
|
await this.toggleDirectory(item as Directory);
|
||||||
await this.setActiveFile(item as FileEntry);
|
await this.setActiveFile(item as FileEntry);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private getItemFromDOM = (clientReact) => {
|
private readonly getItemFromDOM = (clientReact) => {
|
||||||
return FileTreeItem.refToItemIdMap.get(clientReact);
|
return FileTreeItem.refToItemIdMap.get(clientReact);
|
||||||
};
|
};
|
||||||
|
|
||||||
private getDOMFromItem = (item: FileOrDir) => {
|
private readonly getDOMFromItem = (item: FileOrDir) => {
|
||||||
return FileTreeItem.itemIdToRefMap.get(item.id);
|
return FileTreeItem.itemIdToRefMap.get(item.id);
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleClick = (ev: React.MouseEvent) => {
|
private readonly handleClick = (ev: React.MouseEvent) => {
|
||||||
// clicked in "blank space"
|
// clicked in "blank space"
|
||||||
if (ev.currentTarget === ev.target) {
|
if (ev.currentTarget === ev.target) {
|
||||||
this.setPseudoActiveFile(null);
|
this.setPseudoActiveFile(null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleItemCtxMenu = (ev: React.MouseEvent, item: FileOrDir) => {
|
private readonly handleItemCtxMenu = (ev: React.MouseEvent, item: FileOrDir) => {
|
||||||
return this.props.onContextMenu?.(ev, item);
|
return this.props.onContextMenu?.(ev, item);
|
||||||
};
|
};
|
||||||
|
|
||||||
private handleKeyDown = (ev: React.KeyboardEvent) => {
|
private readonly handleKeyDown = (ev: React.KeyboardEvent) => {
|
||||||
return this.keyboardHotkeys.handleKeyDown(ev);
|
return this.keyboardHotkeys.handleKeyDown(ev);
|
||||||
};
|
};
|
||||||
|
|
||||||
private onResize = () => {
|
private readonly onResize = () => {
|
||||||
if (this.wrapperRef.current != null) {
|
if (this.wrapperRef.current != null) {
|
||||||
this.resize();
|
this.resize();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private resize = (scrollX, scrollY) => {
|
private readonly resize = (scrollX, scrollY) => {
|
||||||
const scrollXPos = scrollX || 0;
|
const scrollXPos = scrollX || 0;
|
||||||
const scrollYPos = scrollY || this.props.model.state.scrollOffset;
|
const scrollYPos = scrollY || this.props.model.state.scrollOffset;
|
||||||
const div = this.wrapperRef.current.querySelector('div').querySelector('div') as HTMLDivElement;
|
const div = this.wrapperRef.current.querySelector('div').querySelector('div') as HTMLDivElement;
|
||||||
@ -617,7 +617,7 @@ export class FileTreeX extends React.Component<IFileTreeXProps> {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private changeResolvePath = async (item: FileOrDir): Promise<void> => {
|
private readonly changeResolvePath = async (item: FileOrDir): Promise<void> => {
|
||||||
// Change the path as per pgAdmin requirement: Item Id wise
|
// Change the path as per pgAdmin requirement: Item Id wise
|
||||||
if (item.type === FileType.File) {
|
if (item.type === FileType.File) {
|
||||||
item.resolvedPathCache = item.parent.path + '/' + item._metadata.data.id;
|
item.resolvedPathCache = item.parent.path + '/' + item._metadata.data.id;
|
||||||
|
@ -3,7 +3,7 @@ import { FileEntry, Directory, FileType } from 'react-aspen';
|
|||||||
import { FileTreeXEvent, IFileTreeXHandle } from '../types';
|
import { FileTreeXEvent, IFileTreeXHandle } from '../types';
|
||||||
|
|
||||||
export class KeyboardHotkeys {
|
export class KeyboardHotkeys {
|
||||||
private hotkeyActions = {
|
private readonly hotkeyActions = {
|
||||||
'ArrowUp': () => this.jumpToPrevItem(),
|
'ArrowUp': () => this.jumpToPrevItem(),
|
||||||
'ArrowDown': () => this.jumpToNextItem(),
|
'ArrowDown': () => this.jumpToNextItem(),
|
||||||
'ArrowRight': () => this.expandOrJumpToFirstChild(),
|
'ArrowRight': () => this.expandOrJumpToFirstChild(),
|
||||||
@ -34,17 +34,17 @@ export class KeyboardHotkeys {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private jumpToFirstItem = (): void => {
|
private readonly jumpToFirstItem = (): void => {
|
||||||
const { root } = this.fileTreeX.getModel();
|
const { root } = this.fileTreeX.getModel();
|
||||||
this.fileTreeX.setActiveFile(root.getFileEntryAtIndex(0), true);
|
this.fileTreeX.setActiveFile(root.getFileEntryAtIndex(0), true);
|
||||||
};
|
};
|
||||||
|
|
||||||
private jumpToLastItem = (): void => {
|
private readonly jumpToLastItem = (): void => {
|
||||||
const { root } = this.fileTreeX.getModel();
|
const { root } = this.fileTreeX.getModel();
|
||||||
this.fileTreeX.setActiveFile(root.getFileEntryAtIndex(root.branchSize - 1), true);
|
this.fileTreeX.setActiveFile(root.getFileEntryAtIndex(root.branchSize - 1), true);
|
||||||
};
|
};
|
||||||
|
|
||||||
private jumpToNextItem = (): void => {
|
private readonly jumpToNextItem = (): void => {
|
||||||
const { root } = this.fileTreeX.getModel();
|
const { root } = this.fileTreeX.getModel();
|
||||||
let currentPseudoActive = this.fileTreeX.getActiveFile();
|
let currentPseudoActive = this.fileTreeX.getActiveFile();
|
||||||
if (!currentPseudoActive) {
|
if (!currentPseudoActive) {
|
||||||
@ -63,7 +63,7 @@ export class KeyboardHotkeys {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private jumpToPrevItem = (): void => {
|
private readonly jumpToPrevItem = (): void => {
|
||||||
const { root } = this.fileTreeX.getModel();
|
const { root } = this.fileTreeX.getModel();
|
||||||
let currentPseudoActive = this.fileTreeX.getActiveFile();
|
let currentPseudoActive = this.fileTreeX.getActiveFile();
|
||||||
if (!currentPseudoActive) {
|
if (!currentPseudoActive) {
|
||||||
@ -103,7 +103,7 @@ export class KeyboardHotkeys {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private selectFileOrToggleDirState = (): void => {
|
private readonly selectFileOrToggleDirState = (): void => {
|
||||||
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
||||||
if (!currentPseudoActive) { return; }
|
if (!currentPseudoActive) { return; }
|
||||||
if (currentPseudoActive.type === FileType.Directory) {
|
if (currentPseudoActive.type === FileType.Directory) {
|
||||||
@ -113,7 +113,7 @@ export class KeyboardHotkeys {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private toggleDirectoryExpand = (): void => {
|
private readonly toggleDirectoryExpand = (): void => {
|
||||||
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
||||||
if (!currentPseudoActive) { return; }
|
if (!currentPseudoActive) { return; }
|
||||||
if (currentPseudoActive.type === FileType.Directory) {
|
if (currentPseudoActive.type === FileType.Directory) {
|
||||||
@ -121,7 +121,7 @@ export class KeyboardHotkeys {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private resetSteppedOrSelectedItem = (): void => {
|
private readonly resetSteppedOrSelectedItem = (): void => {
|
||||||
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
||||||
if (currentPseudoActive) {
|
if (currentPseudoActive) {
|
||||||
return this.resetSteppedItem();
|
return this.resetSteppedItem();
|
||||||
@ -129,11 +129,11 @@ export class KeyboardHotkeys {
|
|||||||
this.fileTreeX.setActiveFile(null);
|
this.fileTreeX.setActiveFile(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
private resetSteppedItem = () => {
|
private readonly resetSteppedItem = () => {
|
||||||
this.fileTreeX.setActiveFile(null);
|
this.fileTreeX.setActiveFile(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
private copyEntry = () => {
|
private readonly copyEntry = () => {
|
||||||
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
const currentPseudoActive = this.fileTreeX.getActiveFile();
|
||||||
this.events.dispatch(FileTreeXEvent.onTreeEvents, null, 'copied', currentPseudoActive);
|
this.events.dispatch(FileTreeXEvent.onTreeEvents, null, 'copied', currentPseudoActive);
|
||||||
};
|
};
|
||||||
|
@ -9,7 +9,7 @@ export interface IFileTreeXTriggerEvents {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface IItemRendererX extends IItemRenderer {
|
export interface IItemRendererX extends IItemRenderer {
|
||||||
getBoundingClientRectForItem(item: FileEntry | Directory): ClientRect
|
getBoundingClientRectForItem(item: FileEntry | Directory): DOMRect
|
||||||
}
|
}
|
||||||
|
|
||||||
// Here imagination is your limit! IFileTreeHandle has core low-level features you can build on top of as your application needs
|
// Here imagination is your limit! IFileTreeHandle has core low-level features you can build on top of as your application needs
|
||||||
|
Loading…
Reference in New Issue
Block a user