import { Button, FormItem, ScopedContext, Table } from 'amis'; import { FormControlProps } from 'amis/lib/renderers/Form/Item'; import React from 'react'; @FormItem({ test: /(^|\/)dataset\-picker$/, name: 'dataset-picker', }) export class DataestRenderer extends React.Component< FormControlProps, { source: any; breadcrumb: any; hash: any; showDialog: any; } > { static contextType = ScopedContext; constructor(props: FormControlProps) { super(props); this.state = { source: [], breadcrumb: ['根目录'], hash: '', showDialog: false, }; } fetchSource(prefix) { if (prefix === '/') { return new Promise((resolve, reject) => { this.props.env .resFetcher({ method: 'get', url: '/res/api/shares', }) .then((res) => resolve(res)) .catch((err) => reject(err)); }); } else { return new Promise((resolve, reject) => { this.props.env .resFetcher({ method: 'get', url: `/res/api/resources/${prefix}`, }) .then((res) => resolve(res)) .catch((err) => reject(err)); }); } } async setSource(prefix) { const result: any = await this.fetchSource(prefix); const source = prefix === '/' ? result.data.data .filter((item) => !item.password_hash) .map((item) => { return { ...item, name: item.path.replaceAll(/^\/|\/$/g, ''), mimetype: item.path[item.path.length - 1] === '/' ? '文件夹' : null, }; }) : result.data.data.items.map((item) => { return { ...item, mimetype: item.isDir ? '文件夹' : item.type, updated_at: item.modified.slice(0, 16).replace('T', ' '), }; }); this.setState({ source }); } getPath(breadcrumb, n) { return breadcrumb.slice(n).toString().replaceAll(',', '/'); } componentWillMount() { const scoped = this.context; scoped.registerComponent(this); } async componentDidMount() { this.setSource('/'); } componentDidUpdate(prevProps: any, prevState: any, snapshot: any) { if ( JSON.stringify(prevState.breadcrumb) !== JSON.stringify(this.state.breadcrumb) ) { this.reload(); } } componentWillUnmount() { const scoped = this.context; scoped.unRegisterComponent(this); } reload() { this.setSource(`${this.getPath(this.state.breadcrumb, 1)}/`); } render() { return ( <> {this.state.showDialog ? (