From 1eef597159785ea3be0e3ab5f5d90ef2de4d7bcb Mon Sep 17 00:00:00 2001 From: Moe Date: Fri, 24 Apr 2020 10:50:05 -0700 Subject: [PATCH] Face Manager : Add Entire Face (folder of images) deletion at once --- .../faceManagerCustomAutoLoadLibrary/index.js | 70 +++++++++++++++---- .../languages/en_CA.json | 2 + .../web/libs/js/super.faceManager.js | 32 ++++++++- 3 files changed, 87 insertions(+), 17 deletions(-) diff --git a/plugins/face/faceManagerCustomAutoLoadLibrary/index.js b/plugins/face/faceManagerCustomAutoLoadLibrary/index.js index 761d306a..bbe12e28 100644 --- a/plugins/face/faceManagerCustomAutoLoadLibrary/index.js +++ b/plugins/face/faceManagerCustomAutoLoadLibrary/index.js @@ -42,6 +42,30 @@ module.exports = function(s,config,lang,app,io){ callback(faces) }) } + const getFaceImagesByName = (name,callback) => { + var stats = fs.statSync(config.facesFolder + name) + if(stats.isDirectory()){ + var images + try{ + images = fs.readdirSync(config.facesFolder + name) + }catch(err){ + images = [] + } + callback(images) + }else{ + callback([]) + } + } + const deletePath = (deletionPath,callback) => { + if(fs.existsSync(deletionPath)){ + fs.unlink(deletionPath,() => { + s.file('delete',deletionPath) + if(callback)callback() + }) + }else{ + if(callback)callback(true) + } + } app.get(config.webPaths.superApiPrefix+':auth/faceManager/names', function (req,res){ s.superAuth(req.params,function(resp){ getFaceFolderNames((faces)=>{ @@ -83,22 +107,40 @@ module.exports = function(s,config,lang,app,io){ s.superAuth(req.params,function(resp){ res.setHeader('Content-Type', 'application/json') const imagePath = config.facesFolder + req.params.name + '/' + req.params.image - if(fs.existsSync(imagePath)){ - fs.unlink(imagePath,() => { - s.file('delete',imagePath) - sendDataToConnectedSuperUsers({ - f:'faceManagerImageDeleted', - faceName: req.params.name, - fileName: req.params.image, - }) - getFaceFolderNames((faces) => { - s.sendToAllDetectors({ - f: 'recompileFaceDescriptors', - faces: faces - }) + deletePath(imagePath,() => { + sendDataToConnectedSuperUsers({ + f:'faceManagerImageDeleted', + faceName: req.params.name, + fileName: req.params.image, + }) + getFaceFolderNames((faces) => { + s.sendToAllDetectors({ + f: 'recompileFaceDescriptors', + faces: faces }) }) - } + }) + res.end(s.prettyPrint({ + ok: true, + })) + },res,req) + }) + app.get(config.webPaths.superApiPrefix+':auth/faceManager/delete/:name', function (req,res){ + s.superAuth(req.params,function(resp){ + res.setHeader('Content-Type', 'application/json') + const facePath = config.facesFolder + req.params.name + deletePath(facePath,() => { + getFaceFolderNames((faces) => { + s.sendToAllDetectors({ + f: 'recompileFaceDescriptors', + faces: faces + }) + }) + }) + sendDataToConnectedSuperUsers({ + f:'faceManagerFolderDeleted', + faceName: req.params.name, + }) res.end(s.prettyPrint({ ok: true, })) diff --git a/plugins/face/faceManagerCustomAutoLoadLibrary/languages/en_CA.json b/plugins/face/faceManagerCustomAutoLoadLibrary/languages/en_CA.json index 0c0a9676..41282ae3 100644 --- a/plugins/face/faceManagerCustomAutoLoadLibrary/languages/en_CA.json +++ b/plugins/face/faceManagerCustomAutoLoadLibrary/languages/en_CA.json @@ -4,6 +4,8 @@ "Click to Upload Images": "Click to Upload Images", "Face Name": "Face Name", "faceManager": "Face Manager", + "deleteFace": "Delete Face", + "deleteFaceText": "Are you sure you want to delete ALL the images for this face? they will not be recoverable.", "deleteImage": "Delete Image", "deleteImageText": "Are you sure you want to delete this image? it will not be recoverable." } diff --git a/plugins/face/faceManagerCustomAutoLoadLibrary/web/libs/js/super.faceManager.js b/plugins/face/faceManagerCustomAutoLoadLibrary/web/libs/js/super.faceManager.js index 57adf785..a25c064f 100644 --- a/plugins/face/faceManagerCustomAutoLoadLibrary/web/libs/js/super.faceManager.js +++ b/plugins/face/faceManagerCustomAutoLoadLibrary/web/libs/js/super.faceManager.js @@ -13,6 +13,11 @@ $(document).ready(function(){ callback(response) }) } + var deleteFaceFolder = function(name,callback){ + $.get(superApiPrefix + $user.sessionKey + '/faceManager/delete/' + name,function(response){ + callback(response) + }) + } var moveFaceImage = function(name,image,newFaceName,callback){ $.get(superApiPrefix + $user.sessionKey + '/faceManager/image/' + name + '/' + image + '/move/' + newFaceName + '/' + image + '?websocketResponse=1' ,function(response){ callback(response) @@ -36,14 +41,14 @@ $(document).ready(function(){ ` } var createFaceHeader = function(name){ - return `${name}` + return `
${name}
` } var drawFaceImages = function(){ getFaceImages(function(faces){ var html = '' $.each(faces,function(name,images){ // if(images.length === 0)return - html += `${createFaceHeader(name)}
` + html += `${createFaceHeader(name)}
` $.each(images,function(n,image){ html += getFaceImageHtml(name,image) }) @@ -139,6 +144,24 @@ $(document).ready(function(){ }) return false; }) + faceManagerImages.on('click','.deleteFolder',function(e){ + e.preventDefault() + var faceName = $(this).attr('face') + $.confirm.create({ + title: lang.deleteFace, + body: lang.deleteFaceText, + clickOptions: { + class: 'btn-danger', + title: lang.Delete, + }, + clickCallback: function(){ + deleteFaceFolder(faceName,function(response){ + console.log(response) + }) + } + }) + return false; + }) $('#fileinput').change(function(){ var name = faceNameField.val() $.ajax({ @@ -160,7 +183,7 @@ $(document).ready(function(){ case'faceManagerImageUploaded': var row = faceManagerImages.find(`.row[face="${d.faceName}"]`) if(row.length === 0){ - faceManagerImages.append(`${createFaceHeader(d.faceName)}
`) + faceManagerImages.append(`${createFaceHeader(d.faceName)}
`) row = faceManagerImages.find(`.row[face="${d.faceName}"]`) activateDroppableContainer(d.faceName) } @@ -171,6 +194,9 @@ $(document).ready(function(){ case'faceManagerImageDeleted': $(`.face-image[face="${d.faceName}"][image="${d.fileName}"]`).remove() break; + case'faceManagerFolderDeleted': + $(`[face="${d.faceName}"]`).remove() + break; } }) })