11import React , { FC , memo , useCallback , useEffect , useState } from 'react' ;
22import { Draft , produce } from "immer" ;
3- import { ActionURL } from " @labkey/api" ;
4- import { createWebDavDirectory , LoadingSpinner } from '@labkey/components' ;
3+ import { ActionURL } from ' @labkey/api' ;
4+ import { ConfirmModal , createWebDavDirectory , deleteWebDavResource , LoadingSpinner } from '@labkey/components' ;
55
66import { MY_ATTACHMENTS_DIR } from "./constants" ;
77import { FileAttachmentModel , SavedFileModel } from "./models" ;
@@ -11,6 +11,7 @@ import { CreateDirectoryModal } from './CreateDirectoryModal';
1111export const FileDisplayPanel : FC = memo ( ( ) => {
1212 const [ loading , setLoading ] = useState < boolean > ( true ) ;
1313 const [ showCreateDirectoryModal , setShowCreateDirectoryModal ] = useState < boolean > ( ) ;
14+ const [ selectedDeleteResource , setSelectedDeleteResource ] = useState < string > ( ) ;
1415 const [ fileAttachmentModel , setFileAttachmentModel ] = useState < FileAttachmentModel > ( new FileAttachmentModel ( ) ) ;
1516
1617 //equivalent to componentDidMount and componentDidUpdate
@@ -46,14 +47,36 @@ export const FileDisplayPanel : FC = memo(() => {
4647 if ( ! name ?. startsWith ( '/' ) ) path = path + '/' ;
4748 path = path + name ;
4849
50+ // Note: containerPath param can be the path (i.e. '/MyProject') or the container GUID
4951 createWebDavDirectory ( ActionURL . getContainer ( ) , path , true )
5052 . then ( ( ) => {
5153 // reset loading state to force refresh of panel savedFiles
5254 setLoading ( true ) ;
5355 } ) ;
5456
5557 closeCreateDirectory ( ) ;
56- } , [ closeCreateDirectory ] ) ;
58+ } , [ closeCreateDirectory , createWebDavDirectory ] ) ;
59+
60+ const onDeleteResource = useCallback ( ( resourceName : string ) => {
61+ let path = MY_ATTACHMENTS_DIR ;
62+ if ( ! resourceName ?. startsWith ( '/' ) ) path = path + '/' ;
63+ path = path + resourceName ;
64+
65+ setSelectedDeleteResource ( path ) ;
66+ } , [ ] ) ;
67+
68+ const onCancelDeleteResource = useCallback ( ( ) => {
69+ setSelectedDeleteResource ( undefined ) ;
70+ } , [ ] ) ;
71+
72+ const onConfirmDeleteResource = useCallback ( ( ) => {
73+ deleteWebDavResource ( ActionURL . getContainer ( ) , selectedDeleteResource )
74+ . then ( ( ) => {
75+ // reset loading state to force refresh of panel savedFiles
76+ setLoading ( true ) ;
77+ setSelectedDeleteResource ( undefined ) ;
78+ } ) ;
79+ } , [ deleteWebDavResource , selectedDeleteResource ] ) ;
5780
5881 return (
5982 < div className = 'panel panel-default' >
@@ -69,6 +92,13 @@ export const FileDisplayPanel : FC = memo(() => {
6992 fileAttachmentModel ?. savedFiles ?. map ( ( savedFile ) => (
7093 < li key = { savedFile . fileName } >
7194 < a href = { savedFile . href } target = '_blank' > { savedFile . fileName } </ a >
95+ < a
96+ className = "labkey-text-link"
97+ style = { { paddingLeft : '10px' } }
98+ onClick = { ( ) => onDeleteResource ( savedFile . fileName ) }
99+ >
100+ Delete
101+ </ a >
72102 </ li >
73103 ) )
74104 }
@@ -95,6 +125,12 @@ export const FileDisplayPanel : FC = memo(() => {
95125 </ p >
96126 ) }
97127 { showCreateDirectoryModal && < CreateDirectoryModal close = { closeCreateDirectory } submit = { submitCreateDirectory } /> }
128+ { selectedDeleteResource && (
129+ < ConfirmModal onConfirm = { onConfirmDeleteResource } onCancel = { onCancelDeleteResource } show title = "Delete Resource?" >
130+ < p > Are you sure you want to delete the selected resource?</ p >
131+ < p > < b > { selectedDeleteResource } </ b > </ p >
132+ </ ConfirmModal >
133+ ) }
98134 </ div >
99135 </ div >
100136 ) ;
0 commit comments