frontend/app/DuplicateComponent.tsx (88 lines of code) (raw):

import React from "react"; import {RouteComponentProps, withRouter} from "react-router-dom"; import { authenticatedFetch } from "./auth"; import VaultSelector from "./searchnbrowse/NewVaultSelector"; interface DuplicateComponentState { vaultId?: string; duplicatesCount?: string; itemCount?: string; duplicates?: DuplicateEntry[]; } interface DuplicateEntry { mxfsPath: string; duplicateNumber: number; duplicatesData: DuplicateData[]; } interface DuplicateData { mxfsPath: string; oid: string; } class DuplicateComponent extends React.Component<RouteComponentProps, DuplicateComponentState> { constructor(props:RouteComponentProps) { super(props); this.state = { vaultId: undefined, duplicatesCount: undefined, itemCount: undefined, duplicates: undefined }; } async getDuplicateData() { const abortController = new AbortController(); const response = await authenticatedFetch('/api/vault/'+ this.state.vaultId +'/findDuplicates', { signal: abortController.signal, }); if (response.status !== 200) { console.error(`Could not load data: server error ${response.status}`); const rawData = await response.text(); console.error(`Server said ${rawData}`); return; } else { const content = await response.json(); this.setState({ duplicatesCount: content.dupes_count, itemCount: content.item_count, duplicates: content.duplicates }); } } componentDidUpdate(prevProps: Readonly<RouteComponentProps>, prevState: Readonly<DuplicateComponentState>, snapshot?: any) { if (this.state.vaultId !== prevState.vaultId) { this.getDuplicateData(); } } render() { return ( <div className="windowpanel"> <VaultSelector currentvault={this.state.vaultId ?? ""} vaultWasChanged={(newVault) => { this.setState({ duplicatesCount: undefined }); this.setState({ itemCount: undefined }); this.setState({ vaultId: newVault }); }} /> <br /> <br /> {this.state.duplicatesCount ? ( <div>Duplicates in vault: {this.state.duplicatesCount}</div> ) :(<div>Loading duplicate data...</div>) } {this.state.itemCount ? ( <div>Items in vault: {this.state.itemCount}</div> ) :(null) } <br /> <br /> {this.state.duplicates ? ( this.state.duplicates.map((item,i) => (<div key={i}>Path: {item.mxfsPath}<br/> Duplicates: {item.duplicateNumber}{ item.duplicatesData ? ( item.duplicatesData.map((itemsub, i) => ( <div key={i}>ObjectMatrix Id.: {itemsub.oid}</div> ) ) ): (null) } <br/><br/></div>)) ) : (null) } </div> ); } } export default withRouter(DuplicateComponent);