2018-03-27 11:18:50 +08:00
import noteDetailService from "./note_detail.js" ;
import utils from "./utils.js" ;
import Branch from "../entities/branch.js" ;
import server from "./server.js" ;
import treeCache from "./tree_cache.js" ;
import messagingService from "./messaging.js" ;
2018-12-12 04:53:56 +08:00
import hoistedNoteService from "./hoisted_note.js" ;
2018-03-27 11:18:50 +08:00
2018-04-17 11:13:33 +08:00
async function prepareTree ( noteRows , branchRows , relations ) {
utils . assertArguments ( noteRows , branchRows , relations ) ;
2018-03-27 11:18:50 +08:00
2018-04-17 11:13:33 +08:00
treeCache . load ( noteRows , branchRows , relations ) ;
2018-03-27 11:18:50 +08:00
2018-12-12 04:53:56 +08:00
const hoistedNoteId = await hoistedNoteService . getHoistedNoteId ( ) ;
2018-12-13 03:39:56 +08:00
let hoistedBranch ;
if ( hoistedNoteId === 'root' ) {
hoistedBranch = await treeCache . getBranch ( 'root' ) ;
}
else {
const hoistedNote = await treeCache . getNote ( hoistedNoteId ) ;
hoistedBranch = ( await hoistedNote . getBranches ( ) ) [ 0 ] ;
}
2018-12-12 04:53:56 +08:00
return [ await prepareNode ( hoistedBranch ) ] ;
2018-03-27 11:18:50 +08:00
}
async function prepareBranch ( note ) {
if ( note . type === 'search' ) {
return await prepareSearchBranch ( note ) ;
}
else {
return await prepareRealBranch ( note ) ;
}
}
2018-12-13 03:54:58 +08:00
async function getIcon ( note ) {
const hoistedNoteId = await hoistedNoteService . getHoistedNoteId ( ) ;
2018-11-09 18:57:52 +08:00
if ( note . noteId === 'root' ) {
return "jam jam-chevrons-right" ;
}
2018-12-13 03:54:58 +08:00
else if ( note . noteId === hoistedNoteId ) {
return "jam jam-arrow-up" ;
}
2018-11-09 18:57:52 +08:00
else if ( note . type === 'text' ) {
if ( note . hasChildren ( ) ) {
return "jam jam-folder" ;
}
else {
return "jam jam-file" ;
}
}
else if ( note . type === 'file' ) {
return "jam jam-attachment"
}
else if ( note . type === 'image' ) {
return "jam jam-picture"
}
else if ( note . type === 'code' ) {
return "jam jam-terminal"
}
else if ( note . type === 'render' ) {
return "jam jam-play"
}
else if ( note . type === 'search' ) {
return "jam jam-search-folder"
}
else if ( note . type === 'relation-map' ) {
return "jam jam-map"
}
}
2018-05-27 04:16:34 +08:00
async function prepareNode ( branch ) {
const note = await branch . getNote ( ) ;
const title = ( branch . prefix ? ( branch . prefix + " - " ) : "" ) + note . title ;
2018-12-13 03:54:58 +08:00
const hoistedNoteId = await hoistedNoteService . getHoistedNoteId ( ) ;
2018-05-27 04:16:34 +08:00
const node = {
noteId : note . noteId ,
parentNoteId : branch . parentNoteId ,
branchId : branch . branchId ,
isProtected : note . isProtected ,
title : utils . escapeHtml ( title ) ,
extraClasses : await getExtraClasses ( note ) ,
2018-12-13 03:54:58 +08:00
icon : await getIcon ( note ) ,
2018-05-27 04:16:34 +08:00
refKey : note . noteId ,
2019-03-19 04:59:53 +08:00
expanded : branch . isExpanded || hoistedNoteId === note . noteId ,
lazy : true
2018-05-27 04:16:34 +08:00
} ;
if ( note . hasChildren ( ) || note . type === 'search' ) {
node . folder = true ;
}
return node ;
}
2018-03-27 11:18:50 +08:00
async function prepareRealBranch ( parentNote ) {
utils . assertArguments ( parentNote ) ;
const childBranches = await parentNote . getChildBranches ( ) ;
if ( ! childBranches ) {
messagingService . logError ( ` No children for ${ parentNote } . This shouldn't happen. ` ) ;
return ;
}
const noteList = [ ] ;
for ( const branch of childBranches ) {
2018-05-27 04:16:34 +08:00
const node = await prepareNode ( branch ) ;
2018-03-27 11:18:50 +08:00
noteList . push ( node ) ;
}
return noteList ;
}
async function prepareSearchBranch ( note ) {
const fullNote = await noteDetailService . loadNote ( note . noteId ) ;
2019-02-16 04:21:26 +08:00
const json = JSON . parse ( fullNote . noteContent . content ) ;
const results = ( await server . get ( 'search/' + encodeURIComponent ( json . searchString ) ) )
2018-08-15 04:50:05 +08:00
. filter ( res => res . noteId !== note . noteId ) ; // this is necessary because title of the search note is often the same as the search text which would match and create circle
2018-03-27 11:18:50 +08:00
2018-06-06 10:47:47 +08:00
// force to load all the notes at once instead of one by one
2018-08-15 05:07:50 +08:00
await treeCache . getNotes ( results . map ( res => res . noteId ) ) ;
2018-06-06 10:47:47 +08:00
2018-06-05 11:21:45 +08:00
for ( const result of results ) {
2018-06-06 10:47:47 +08:00
const origBranch = await treeCache . getBranch ( result . branchId ) ;
2018-03-27 11:18:50 +08:00
const branch = new Branch ( treeCache , {
branchId : "virt" + utils . randomString ( 10 ) ,
2018-06-05 11:21:45 +08:00
noteId : result . noteId ,
2018-03-27 11:18:50 +08:00
parentNoteId : note . noteId ,
2018-06-06 10:47:47 +08:00
prefix : origBranch . prefix ,
2018-03-27 11:18:50 +08:00
virtual : true
} ) ;
treeCache . addBranch ( branch ) ;
}
return await prepareRealBranch ( fullNote ) ;
}
async function getExtraClasses ( note ) {
utils . assertArguments ( note ) ;
const extraClasses = [ ] ;
if ( note . isProtected ) {
extraClasses . push ( "protected" ) ;
}
2018-04-17 11:34:56 +08:00
if ( note . getParentNoteIds ( ) . length > 1 ) {
2018-03-27 11:18:50 +08:00
extraClasses . push ( "multiple-parents" ) ;
}
2018-08-13 16:59:31 +08:00
if ( note . cssClass ) {
extraClasses . push ( note . cssClass ) ;
}
2019-01-29 04:42:37 +08:00
extraClasses . push ( utils . getNoteTypeClass ( note . type ) ) ;
2018-03-27 11:18:50 +08:00
2019-01-14 03:14:33 +08:00
if ( note . mime ) { // some notes should not have mime type (e.g. render)
2019-01-29 04:42:37 +08:00
extraClasses . push ( utils . getMimeTypeClass ( note . mime ) ) ;
2019-01-14 03:14:33 +08:00
}
2018-03-27 11:18:50 +08:00
return extraClasses . join ( " " ) ;
}
export default {
prepareTree ,
prepareBranch ,
2018-11-14 15:42:00 +08:00
getExtraClasses ,
getIcon
2018-03-27 11:18:50 +08:00
}