@@ -29,6 +29,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
2929import { CoreWSFileUploadOptions , CoreWSExternalFile } from '@providers/ws' ;
3030import { Subject } from 'rxjs' ;
3131import { CoreApp } from '@providers/app' ;
32+ import { CoreSite } from '@classes/site' ;
3233import { makeSingleton } from '@singletons/core.singletons' ;
3334
3435/**
@@ -106,6 +107,36 @@ export class CoreFileUploaderProvider {
106107 return false ;
107108 }
108109
110+ /**
111+ * Check if a certain site allows deleting draft files.
112+ *
113+ * @param siteId Site Id. If not defined, use current site.
114+ * @return Promise resolved with true if can delete.
115+ * @since 3.10
116+ */
117+ async canDeleteDraftFiles ( siteId ?: string ) : Promise < boolean > {
118+ try {
119+ const site = await this . sitesProvider . getSite ( siteId ) ;
120+
121+ return this . canDeleteDraftFilesInSite ( site ) ;
122+ } catch ( error ) {
123+ return false ;
124+ }
125+ }
126+
127+ /**
128+ * Check if a certain site allows deleting draft files.
129+ *
130+ * @param site Site. If not defined, use current site.
131+ * @return Whether draft files can be deleted.
132+ * @since 3.10
133+ */
134+ canDeleteDraftFilesInSite ( site ?: CoreSite ) : boolean {
135+ site = site || this . sitesProvider . getCurrentSite ( ) ;
136+
137+ return site . wsAvailable ( 'core_files_delete_draft_files' ) ;
138+ }
139+
109140 /**
110141 * Start the audio recorder application and return information about captured audio clip files.
111142 *
@@ -175,6 +206,25 @@ export class CoreFileUploaderProvider {
175206 } ) ;
176207 }
177208
209+ /**
210+ * Delete draft files.
211+ *
212+ * @param draftId Draft ID.
213+ * @param files Files to delete.
214+ * @param siteId Site ID. If not defined, current site.
215+ * @return Promise resolved when done.
216+ */
217+ async deleteDraftFiles ( draftId : number , files : { filepath : string , filename : string } [ ] , siteId ?: string ) : Promise < void > {
218+ const site = await this . sitesProvider . getSite ( siteId ) ;
219+
220+ const params = {
221+ draftitemid : draftId ,
222+ files : files ,
223+ } ;
224+
225+ return site . write ( 'core_files_delete_draft_files' , params ) ;
226+ }
227+
178228 /**
179229 * Get the upload options for a file taken with the Camera Cordova plugin.
180230 *
@@ -217,6 +267,35 @@ export class CoreFileUploaderProvider {
217267 return options ;
218268 }
219269
270+ /**
271+ * Given a list of original files and a list of current files, return the list of files to delete.
272+ *
273+ * @param originalFiles Original files.
274+ * @param currentFiles Current files.
275+ * @return List of files to delete.
276+ */
277+ getFilesToDelete ( originalFiles : CoreWSExternalFile [ ] , currentFiles : ( CoreWSExternalFile | FileEntry ) [ ] )
278+ : { filepath : string , filename : string } [ ] {
279+
280+ const filesToDelete : { filepath : string , filename : string } [ ] = [ ] ;
281+ currentFiles = currentFiles || [ ] ;
282+
283+ originalFiles . forEach ( ( file ) => {
284+ const stillInList = currentFiles . some ( ( currentFile ) => {
285+ return ( < CoreWSExternalFile > currentFile ) . fileurl == file . fileurl ;
286+ } ) ;
287+
288+ if ( ! stillInList ) {
289+ filesToDelete . push ( {
290+ filepath : file . filepath ,
291+ filename : file . filename ,
292+ } ) ;
293+ }
294+ } ) ;
295+
296+ return filesToDelete ;
297+ }
298+
220299 /**
221300 * Get the upload options for a file of any type.
222301 *
0 commit comments