@iobroker/adapter-react-v5
Version:
React components to develop ioBroker interfaces with react.
188 lines (187 loc) • 7.18 kB
TypeScript
/**
* Copyright 2020-2025, Denis Haev <dogafox@gmail.com>
*
* MIT License
*
*/
import React, { Component, type JSX } from 'react';
import type { Connection } from '@iobroker/socket-client';
import type { ThemeName, ThemeType, Translate, IobTheme } from '../types';
import { type FileViewerProps } from './FileViewer';
export interface MetaACL extends ioBroker.ObjectACL {
file: number;
}
export interface MetaObject extends ioBroker.MetaObject {
acl: MetaACL;
}
export interface FileBrowserProps {
/** The key to identify this component. */
key?: string;
/** Additional styling for this component. */
style?: React.CSSProperties;
/** The CSS class name. */
className?: string;
/** Translation function. */
t: Translate;
/** The selected language. */
lang: ioBroker.Languages;
/** The socket connection. */
socket: Connection;
/** Shows if the component data ready. */
ready?: boolean;
/** Is expert mode enabled? (default: false) */
expertMode?: boolean;
/** Show the toolbar? (default: false) */
showToolbar?: boolean;
/** If defined, allow selecting only files from this folder and subfolders */
limitPath?: string;
/** Allow upload of new files? (default: false) */
allowUpload?: boolean;
/** Allow download of files? (default: false) */
allowDownload?: boolean;
/** Allow creation of new folders? (default: false) */
allowCreateFolder?: boolean;
/** Allow deleting files? (default: false) */
allowDelete?: boolean;
/** Allow viewing files? (default: false) */
allowView?: boolean;
/** Prefix (default: '.') */
imagePrefix?: string;
/** Show the expert button? */
showExpertButton?: boolean;
/** Type of view */
viewType?: 'Table' | 'Tile';
/** Show the buttons to switch the view from table to tile? (default: false) */
showViewTypeButton?: boolean;
/** The ID of the selected file. */
selected?: string | string[];
/** The file extensions to show, like ['png', 'svg', 'bmp', 'jpg', 'jpeg', 'gif']. */
filterFiles?: string[];
/** The file extension categories to show. */
filterByType?: 'images' | 'code' | 'txt';
/** Callback for file selection. */
onSelect?: (id: string | string[], isDoubleClick?: boolean, isFolder?: boolean) => void;
/** Theme name */
themeName?: ThemeName;
/** Theme type. */
themeType?: ThemeType;
/** Theme object. */
theme: IobTheme;
/** Padding in pixels for folder levels */
levelPadding?: number;
restrictToFolder?: string;
modalEditOfAccessControl?: (obj: FileBrowserClass) => JSX.Element | null;
allowNonRestricted?: boolean;
showTypeSelector?: boolean;
FileViewer?: React.FC<FileViewerProps>;
}
export interface FolderOrFileItem {
id: string;
level: number;
name: string;
folder: boolean;
temp?: boolean;
size?: number | undefined;
ext?: string | null;
modified?: number;
title?: ioBroker.StringOrTranslated;
meta?: boolean;
from?: string;
ts?: number;
color?: string;
icon?: string;
acl?: ioBroker.EvaluatedFileACL | MetaACL;
}
export type Folders = Record<string, FolderOrFileItem[]>;
interface FileBrowserState {
viewType: 'Table' | 'Tile';
folders: Folders;
filterEmpty: boolean;
expanded: string[];
currentDir: string;
expertMode: boolean;
addFolder: boolean;
uploadFile: boolean | 'dragging';
deleteItem: string;
suppressDeleteConfirm: boolean;
viewer: string;
formatEditFile: string | null;
path: string;
selected: string;
errorText: string;
modalEditOfAccess: boolean;
backgroundImage: string | null;
queueLength: number;
loadAllFolders: boolean;
fileErrors: string[];
filterByType: string;
showTypesMenu: HTMLButtonElement | null;
restrictToFolder: string;
pathFocus: boolean;
}
export declare class FileBrowserClass extends Component<FileBrowserProps, FileBrowserState> {
private readonly imagePrefix;
private readonly levelPadding;
private mounted;
private suppressDeleteConfirm;
private browseList;
private browseListRunning;
private initialReadFinished;
private supportSubscribes;
private _tempTimeout;
private readonly limitToObjectID;
private readonly limitToPath;
private lastSelect;
private setOpacityTimer;
private cacheFoldersTimeout;
private foldersLoading;
private cacheFolders;
private readonly localStorage;
private readonly scrollPositions;
private readonly refFileDiv;
constructor(props: FileBrowserProps);
static getDerivedStateFromProps(props: FileBrowserProps, state: FileBrowserState): Partial<FileBrowserState> | null;
loadFolders(): Promise<void>;
scrollToSelected(): void;
componentDidMount(): Promise<void>;
componentWillUnmount(): void;
browseFoldersCb(foldersList: string[], newFoldersNotNull: Folders, cb: (folders: Folders) => void): void;
browseFolders(foldersList: string[], _newFolders?: Folders | null): Promise<Folders>;
readDirSerial(adapter: string, relPath: string): Promise<ioBroker.ReadDirResult[]>;
processBrowseList(level?: number): void;
browseFolder(folderId: string, _newFolders?: Folders | null, _checkEmpty?: boolean, force?: boolean): Promise<Folders>;
toggleFolder(item: FolderOrFileItem, e: React.MouseEvent): void;
onFileChange: (id: string, fileName: string, size: number | null) => void;
changeFolder(e: React.MouseEvent<HTMLDivElement>, folder?: string): void;
select(id: string, e?: React.MouseEvent<HTMLDivElement> | null, cb?: () => void): void;
getText(text?: ioBroker.StringOrTranslated | null): string | undefined;
renderFolder(item: FolderOrFileItem, expanded?: boolean): JSX.Element | null;
renderBackFolder(): JSX.Element;
formatSize(size: number | null | undefined): JSX.Element;
formatAcl(acl: ioBroker.EvaluatedFileACL | MetaACL | undefined): JSX.Element;
getFileIcon(ext: string | null): JSX.Element;
static getEditFile(ext: string | null): boolean;
setStateBackgroundImage: () => void;
getStyleBackgroundImage: () => React.CSSProperties | null;
renderFile(item: FolderOrFileItem): JSX.Element;
renderItems(folderId: string): JSX.Element | (JSX.Element | null)[];
renderToolbar(): JSX.Element;
findItem(id: string, folders?: Folders | null): null | FolderOrFileItem;
renderInputDialog(): JSX.Element | null;
componentDidUpdate(): void;
findFirstFolder(id: string): string | null;
uploadFile(fileName: string, data: string): Promise<void>;
renderUpload(): JSX.Element[] | null;
deleteRecursive(id: string): Promise<void>;
deleteItem(deleteItem: string): void;
renderDeleteDialog(): JSX.Element | null;
renderViewDialog(): JSX.Element | null;
renderError(): JSX.Element | null;
updateItemsAcl(info: FolderOrFileItem[]): void;
changeToPath(): void;
renderBreadcrumb(): JSX.Element;
renderPath(): JSX.Element;
render(): JSX.Element;
}
export declare const FileBrowser: (props: Record<string, any>) => JSX.Element;
export {};