2018-03-26 08:52:38 +08:00
import noteDetailService from '../services/note_detail.js' ;
import utils from '../services/utils.js' ;
import server from '../services/server.js' ;
2019-11-09 22:21:14 +08:00
import toastService from "../services/toast.js" ;
2018-03-26 08:52:38 +08:00
const $dialog = $ ( "#note-revisions-dialog" ) ;
const $list = $ ( "#note-revision-list" ) ;
const $content = $ ( "#note-revision-content" ) ;
const $title = $ ( "#note-revision-title" ) ;
2019-11-09 15:53:13 +08:00
const $titleButtons = $ ( "#note-revision-title-buttons" ) ;
2019-11-09 22:21:14 +08:00
const $eraseAllRevisionsButton = $ ( "#note-revisions-erase-all-revisions-button" ) ;
2018-03-26 08:52:38 +08:00
let revisionItems = [ ] ;
2018-11-14 21:52:05 +08:00
let note ;
2018-03-26 08:52:38 +08:00
2019-09-03 01:56:52 +08:00
export async function showCurrentNoteRevisions ( ) {
2019-10-20 18:29:34 +08:00
await showNoteRevisionsDialog ( noteDetailService . getActiveTabNoteId ( ) ) ;
2018-03-26 08:52:38 +08:00
}
2019-08-21 03:40:47 +08:00
export async function showNoteRevisionsDialog ( noteId , noteRevisionId ) {
2019-06-11 04:45:03 +08:00
utils . closeActiveDialog ( ) ;
2018-03-26 08:52:38 +08:00
glob . activeDialog = $dialog ;
2018-11-07 00:47:40 +08:00
$dialog . modal ( ) ;
2018-03-26 08:52:38 +08:00
2019-11-09 22:21:14 +08:00
await loadNoteRevisions ( noteId , noteRevisionId ) ;
}
async function loadNoteRevisions ( noteId , noteRevisionId ) {
2018-03-26 08:52:38 +08:00
$list . empty ( ) ;
$content . empty ( ) ;
2019-10-20 18:29:34 +08:00
note = noteDetailService . getActiveTabNote ( ) ;
2019-11-02 02:21:48 +08:00
revisionItems = await server . get ( ` notes/ ${ noteId } /revisions ` ) ;
2018-03-26 08:52:38 +08:00
for ( const item of revisionItems ) {
$list . append ( $ ( '<option>' , {
value : item . noteRevisionId ,
2019-11-10 00:39:48 +08:00
text : item . dateLastEdited . substr ( 0 , 16 ) + ` ( ${ item . contentLength } bytes) `
2018-03-26 08:52:38 +08:00
} ) ) ;
}
if ( revisionItems . length > 0 ) {
if ( ! noteRevisionId ) {
noteRevisionId = $list . find ( "option:first" ) . val ( ) ;
}
$list . val ( noteRevisionId ) . trigger ( 'change' ) ;
2019-11-09 22:21:14 +08:00
} else {
2018-03-26 08:52:38 +08:00
$title . text ( "No revisions for this note yet..." ) ;
}
}
2019-11-02 02:21:48 +08:00
$list . on ( 'change' , async ( ) => {
2018-03-26 08:52:38 +08:00
const optVal = $list . find ( ":selected" ) . val ( ) ;
const revisionItem = revisionItems . find ( r => r . noteRevisionId === optVal ) ;
2019-11-09 22:21:14 +08:00
$titleButtons . empty ( ) ;
$content . empty ( ) ;
2018-03-26 08:52:38 +08:00
$title . html ( revisionItem . title ) ;
2018-04-09 00:13:52 +08:00
2019-11-09 23:51:51 +08:00
const $eraseRevisionButton = $ ( '<button class="btn btn-sm" type="button">Delete this revision</button>' ) ;
2019-11-09 22:21:14 +08:00
$eraseRevisionButton . on ( 'click' , async ( ) => {
const confirmDialog = await import ( '../dialogs/confirm.js' ) ;
2019-11-09 23:51:51 +08:00
const text = 'Do you want to delete this revision? This action will delete revision title and content, but still preserve revision metadata.' ;
2019-11-09 22:21:14 +08:00
if ( await confirmDialog . confirm ( text ) ) {
await server . remove ( ` notes/ ${ revisionItem . noteId } /revisions/ ${ revisionItem . noteRevisionId } ` ) ;
loadNoteRevisions ( revisionItem . noteId ) ;
2019-11-09 23:51:51 +08:00
toastService . showMessage ( 'Note revision has been deleted.' ) ;
2019-11-09 22:21:14 +08:00
}
} ) ;
$titleButtons
. append ( $eraseRevisionButton )
. append ( ' ' ) ;
2019-11-09 15:53:13 +08:00
const $downloadButton = $ ( '<button class="btn btn-sm btn-primary" type="button">Download</button>' ) ;
$downloadButton . on ( 'click' , ( ) => {
utils . download ( utils . getHost ( ) + ` /api/notes/ ${ revisionItem . noteId } /revisions/ ${ revisionItem . noteRevisionId } /download ` ) ;
} ) ;
2019-11-09 22:21:14 +08:00
$titleButtons . append ( $downloadButton ) ;
2019-11-09 15:53:13 +08:00
2019-11-02 02:21:48 +08:00
const fullNoteRevision = await server . get ( ` notes/ ${ revisionItem . noteId } /revisions/ ${ revisionItem . noteRevisionId } ` ) ;
2019-11-09 20:01:05 +08:00
if ( revisionItem . type === 'text' ) {
2019-11-02 02:21:48 +08:00
$content . html ( fullNoteRevision . content ) ;
2018-04-09 00:13:52 +08:00
}
2019-11-09 20:01:05 +08:00
else if ( revisionItem . type === 'code' ) {
2019-11-02 02:21:48 +08:00
$content . html ( $ ( "<pre>" ) . text ( fullNoteRevision . content ) ) ;
2018-04-09 00:13:52 +08:00
}
2019-11-09 20:01:05 +08:00
else if ( revisionItem . type === 'image' ) {
2019-11-09 06:09:57 +08:00
$content . html ( $ ( "<img>" )
2019-11-09 15:53:13 +08:00
// reason why we put this inline as base64 is that we do not want to let user to copy this
// as a URL to be used in a note. Instead if they copy and paste it into a note, it will be a uploaded as a new note
2019-11-09 06:09:57 +08:00
. attr ( "src" , ` data: ${ note . mime } ;base64, ` + fullNoteRevision . content )
. css ( "width" , "100%" ) ) ;
}
2019-11-09 20:01:05 +08:00
else if ( revisionItem . type === 'file' ) {
const $table = $ ( "<table cellpadding='10'>" )
. append ( $ ( "<tr>" ) . append (
$ ( "<th>" ) . text ( "MIME: " ) ,
$ ( "<td>" ) . text ( revisionItem . mime )
) )
. append ( $ ( "<tr>" ) . append (
$ ( "<th>" ) . text ( "File size:" ) ,
$ ( "<td>" ) . text ( revisionItem . contentLength + " bytes" )
) ) ;
if ( fullNoteRevision . content ) {
$table . append ( $ ( "<tr>" ) . append (
$ ( "<th>" ) . text ( "Preview:" ) ,
$ ( "<td>" ) . append (
$ ( '<pre class="file-preview-content"></pre>' )
. text ( fullNoteRevision . content )
)
) ) ;
}
$content . html ( $table ) ;
2019-11-09 18:58:52 +08:00
}
2018-11-14 21:52:05 +08:00
else {
$content . text ( "Preview isn't available for this note type." ) ;
}
2019-11-09 22:21:14 +08:00
} ) ;
$eraseAllRevisionsButton . on ( 'click' , async ( ) => {
const confirmDialog = await import ( '../dialogs/confirm.js' ) ;
2019-11-09 23:51:51 +08:00
const text = 'Do you want to delete all revisions of this note? This action will erase revision title and content, but still preserve revision metadata.' ;
2019-11-09 22:21:14 +08:00
if ( await confirmDialog . confirm ( text ) ) {
await server . remove ( ` notes/ ${ note . noteId } /revisions ` ) ;
$dialog . modal ( 'hide' ) ;
2019-11-09 23:51:51 +08:00
toastService . showMessage ( 'Note revisions has been deleted.' ) ;
2019-11-09 22:21:14 +08:00
}
2019-10-11 02:00:06 +08:00
} ) ;