2022-06-16 19:41:29 +02:00
import server from "../../services/server.js" ;
import froca from "../../services/froca.js" ;
import linkService from "../../services/link.js" ;
import utils from "../../services/utils.js" ;
import BasicWidget from "../basic_widget.js" ;
const TPL = `
< div class = "delete-notes-dialog modal mx-auto" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog modal-dialog-scrollable modal-xl" role = "document" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title mr-auto" > Delete notes preview < / h 4 >
< button type = "button" class = "close" data - dismiss = "modal" aria - label = "Close" >
< span aria - hidden = "true" > & times ; < / s p a n >
< / b u t t o n >
< / d i v >
< div class = "modal-body" >
< div class = "checkbox" >
< label >
< input class = "delete-all-clones" value = "1" type = "checkbox" >
delete also all clones
< / l a b e l >
< / d i v >
< div class = "checkbox" >
< label title = "Normal (soft) deletion only marks the notes as deleted and they can be undeleted (in recent changes dialog) within a period of time. Checking this option will erase the notes immediatelly and it won't be possible to undelete the notes." >
< input class = "erase-notes" value = "1" type = "checkbox" >
erase notes permanently ( can ' t be undone ) . This will force application reload .
< / l a b e l >
< / d i v >
< div class = "delete-notes-list-wrapper" >
< h4 > Following notes will be deleted ( < span class = "deleted-notes-count" > < / s p a n > ) < / h 4 >
< ul class = "delete-notes-list" style = "max-height: 200px; overflow: auto;" > < / u l >
< / d i v >
< div class = "no-note-to-delete-wrapper alert alert-info" >
No note will be deleted ( only clones ) .
< / d i v >
< div class = "broken-relations-wrapper" >
< div class = "alert alert-danger" >
< h4 > Following relations will be broken and deleted ( < span class = "broke-relations-count" > < / s p a n > ) < / h 4 >
< ul class = "broken-relations-list" style = "max-height: 200px; overflow: auto;" > < / u l >
< / d i v >
< / d i v >
< / d i v >
< div class = "modal-footer" >
< button class = "delete-notes-dialog-cancel-button btn btn-sm" > Cancel < / b u t t o n >
& nbsp ;
< button class = "delete-notes-dialog-ok-button btn btn-primary btn-sm" > OK < / b u t t o n >
< / d i v >
< / d i v >
< / d i v >
< / d i v > ` ;
export default class DeleteNotesDialog extends BasicWidget {
constructor ( ) {
super ( ) ;
this . branchIds = null ;
this . resolve = null ;
}
doRender ( ) {
this . $widget = $ ( TPL ) ;
this . $content = this . $widget . find ( ".recent-changes-content" ) ;
this . $okButton = this . $widget . find ( ".delete-notes-dialog-ok-button" ) ;
this . $cancelButton = this . $widget . find ( ".delete-notes-dialog-cancel-button" ) ;
this . $deleteNotesList = this . $widget . find ( ".delete-notes-list" ) ;
this . $brokenRelationsList = this . $widget . find ( ".broken-relations-list" ) ;
this . $deletedNotesCount = this . $widget . find ( ".deleted-notes-count" ) ;
this . $noNoteToDeleteWrapper = this . $widget . find ( ".no-note-to-delete-wrapper" ) ;
this . $deleteNotesListWrapper = this . $widget . find ( ".delete-notes-list-wrapper" ) ;
this . $brokenRelationsListWrapper = this . $widget . find ( ".broken-relations-wrapper" ) ;
this . $brokenRelationsCount = this . $widget . find ( ".broke-relations-count" ) ;
this . $deleteAllClones = this . $widget . find ( ".delete-all-clones" ) ;
this . $eraseNotes = this . $widget . find ( ".erase-notes" ) ;
2022-06-16 20:19:26 +02:00
this . $widget . on ( 'shown.bs.modal' , ( ) => this . $okButton . trigger ( "focus" ) ) ;
2022-06-16 19:41:29 +02:00
this . $cancelButton . on ( 'click' , ( ) => {
utils . closeActiveDialog ( ) ;
this . resolve ( { proceed : false } ) ;
} ) ;
this . $okButton . on ( 'click' , ( ) => {
utils . closeActiveDialog ( ) ;
this . resolve ( {
proceed : true ,
deleteAllClones : this . isDeleteAllClonesChecked ( ) ,
eraseNotes : this . isEraseNotesChecked ( )
} ) ;
} ) ;
this . $deleteAllClones . on ( 'click' , ( ) => this . renderDeletePreview ( ) ) ;
}
async renderDeletePreview ( ) {
const response = await server . post ( 'delete-notes-preview' , {
branchIdsToDelete : this . branchIds ,
deleteAllClones : this . isDeleteAllClonesChecked ( )
} ) ;
this . $deleteNotesList . empty ( ) ;
this . $brokenRelationsList . empty ( ) ;
this . $deleteNotesListWrapper . toggle ( response . noteIdsToBeDeleted . length > 0 ) ;
this . $noNoteToDeleteWrapper . toggle ( response . noteIdsToBeDeleted . length === 0 ) ;
for ( const note of await froca . getNotes ( response . noteIdsToBeDeleted ) ) {
this . $deleteNotesList . append (
$ ( "<li>" ) . append (
await linkService . createNoteLink ( note . noteId , { showNotePath : true } )
)
) ;
}
this . $deletedNotesCount . text ( response . noteIdsToBeDeleted . length ) ;
this . $brokenRelationsListWrapper . toggle ( response . brokenRelations . length > 0 ) ;
this . $brokenRelationsCount . text ( response . brokenRelations . length ) ;
await froca . getNotes ( response . brokenRelations . map ( br => br . noteId ) ) ;
for ( const attr of response . brokenRelations ) {
this . $brokenRelationsList . append (
$ ( "<li>" )
. append ( ` Note ` )
. append ( await linkService . createNoteLink ( attr . value ) )
. append ( ` (to be deleted) is referenced by relation <code> ${ attr . name } </code> originating from ` )
. append ( await linkService . createNoteLink ( attr . noteId ) )
) ;
}
}
async showDeleteNotesDialogEvent ( { branchIdsToDelete , callback } ) {
this . branchIds = branchIdsToDelete ;
await this . renderDeletePreview ( ) ;
utils . openDialog ( this . $widget ) ;
this . $deleteAllClones . prop ( "checked" , false ) ;
this . $eraseNotes . prop ( "checked" , false ) ;
this . resolve = callback ;
}
isDeleteAllClonesChecked ( ) {
return this . $deleteAllClones . is ( ":checked" ) ;
}
isEraseNotesChecked ( ) {
return this . $eraseNotes . is ( ":checked" ) ;
}
}