@ -31,55 +31,55 @@ define([
return ctx . cpNfInner ;
} ;
funcs . getMetadataMgr = function ( ) {
return ctx . metadataMgr ;
} ;
funcs . getCryptpadCommon = function ( ) {
return Cryptpad ;
} ;
funcs . getSframeChannel = function ( ) {
return ctx . sframeChan ;
} ;
funcs . getMetadataMgr = function ( ) { return ctx . metadataMgr ; } ;
funcs . getCryptpadCommon = function ( ) { return Cryptpad ; } ;
funcs . getSframeChannel = function ( ) { return ctx . sframeChan ; } ;
funcs . getAppConfig = function ( ) { return AppConfig ; } ;
var isLoggedIn = funcs . isLoggedIn = function ( ) {
if ( ! ctx . cpNfInner ) { throw new Error ( "cpNfInner is not ready!" ) ; }
return ctx . cpNfInner . metadataMgr . getPrivateData ( ) . accountName ;
} ;
var titleUpdated ;
funcs . updateTitle = function ( title , cb ) {
ctx . metadataMgr . updateTitle ( title ) ;
titleUpdated = cb ;
// MISC
// Call the selected function with 'funcs' as a (new) first parameter
var callWithCommon = function ( f ) {
return function ( ) {
[ ] . unshift . call ( arguments , funcs ) ;
return f . apply ( null , arguments ) ;
} ;
} ;
// UI
funcs . createUserAdminMenu = UI . createUserAdminMenu ;
funcs . displayAvatar = UI . displayAvatar ;
funcs . initFilePicker = UI . initFilePicker ;
funcs . openFilePicker = UI . openFilePicker ;
funcs . openTemplatePicker = UI . openTemplatePicker ;
funcs . createUserAdminMenu = callWithCommon ( UI . createUserAdminMenu ) ;
funcs . initFilePicker = callWithCommon ( UI . initFilePicker ) ;
funcs . openFilePicker = callWithCommon ( UI . openFilePicker ) ;
funcs . openTemplatePicker = callWithCommon ( UI . openTemplatePicker ) ;
funcs . displayAvatar = callWithCommon ( UI . displayAvatar ) ;
funcs . createButton = callWithCommon ( UI . createButton ) ;
// History
funcs . getHistory = function ( config ) { return History . create ( funcs , config ) ; } ;
funcs . getHistory = callWithCommon ( History . create ) ;
// Title module
funcs . createTitle = Title. create ;
funcs . createTitle = callWithCommon( Title. create ) ;
funcs . getDefaultTitle = function ( ) {
if ( ! ctx . cpNfInner ) { throw new Error ( "cpNfInner is not ready!" ) ; }
return ctx . cpNfInner . metadataMgr . getMetadata ( ) . defaultTitle ;
} ;
// Files
funcs . uploadFile = callWithCommon ( File . uploadFile ) ;
funcs . createFileManager = callWithCommon ( File . create ) ;
// Misc
funcs . setDisplayName = function ( name , cb ) {
ctx . sframeChan . query ( 'Q_SETTINGS_SET_DISPLAY_NAME' , name , function ( err ) {
if ( cb ) { cb ( err ) ; }
} ) ;
cb = cb || $ . noop ;
ctx . sframeChan . query ( 'Q_SETTINGS_SET_DISPLAY_NAME' , name , cb ) ;
} ;
// Window
funcs . logout = function ( cb ) {
ctx . sframeChan . query ( 'Q_LOGOUT' , null , function ( err ) {
if ( cb ) { cb ( err ) ; }
} ) ;
cb = cb || $ . noop ;
ctx . sframeChan . query ( 'Q_LOGOUT' , null , cb ) ;
} ;
funcs . notify = function ( ) {
@ -87,11 +87,11 @@ define([
} ;
funcs . setLoginRedirect = function ( cb ) {
ctx . sframeChan . query ( 'Q_SET_LOGIN_REDIRECT' , null , function ( err ) {
if ( cb ) { cb ( err ) ; }
} ) ;
cb = cb || $ . noop ;
ctx . sframeChan . query ( 'Q_SET_LOGIN_REDIRECT' , null , cb ) ;
} ;
// Store
funcs . sendAnonRpcMsg = function ( msg , content , cb ) {
ctx . sframeChan . query ( 'Q_ANON_RPC_MESSAGE' , {
msg : msg ,
@ -128,11 +128,25 @@ define([
} , cb ) ;
} ;
// Files
funcs . uploadFile = function ( data , cb ) {
ctx . sframeChan . query ( 'Q_UPLOAD_FILE' , data , cb ) ;
funcs . getAttribute = function ( key , cb ) {
ctx . sframeChan . query ( 'Q_GET_ATTRIBUTE' , {
key : key
} , function ( err , res ) {
cb ( err || res . error , res . data ) ;
} ) ;
} ;
funcs . setAttribute = function ( key , value , cb ) {
cb = cb || $ . noop ;
ctx . sframeChan . query ( 'Q_SET_ATTRIBUTE' , {
key : key ,
value : value
} , cb ) ;
} ;
funcs . isStrongestStored = function ( ) {
var data = ctx . metadataMgr . getPrivateData ( ) ;
return ! data . readOnly || ! data . availableHashes . editHash ;
} ;
funcs . createFileManager = function ( config ) { return File . create ( funcs , config ) ; } ;
// Friends
var pendingFriends = [ ] ;
@ -160,7 +174,7 @@ define([
url : href ,
} ) ;
} ;
var prepareFeedback = funcs . prepareFeedback = function ( key ) {
funcs . prepareFeedback = function ( key ) {
if ( typeof ( key ) !== 'string' ) { return $ . noop ; }
var type = ctx . metadataMgr . getMetadata ( ) . type ;
@ -169,178 +183,8 @@ define([
} ;
} ;
// BUTTONS
var isStrongestStored = function ( ) {
var data = ctx . metadataMgr . getPrivateData ( ) ;
return ! data . readOnly || ! data . availableHashes . editHash ;
} ;
funcs . createButton = function ( type , rightside , data , callback ) {
var button ;
var size = "17px" ;
switch ( type ) {
case 'export' :
button = $ ( '<button>' , {
'class' : 'fa fa-download' ,
title : Messages . exportButtonTitle ,
} ) . append ( $ ( '<span>' , { 'class' : 'cp-toolbar-drawer-element' } ) . text ( Messages . exportButton ) ) ;
button . click ( prepareFeedback ( type ) ) ;
if ( callback ) {
button . click ( callback ) ;
}
break ;
case 'import' :
button = $ ( '<button>' , {
'class' : 'fa fa-upload' ,
title : Messages . importButtonTitle ,
} ) . append ( $ ( '<span>' , { 'class' : 'cp-toolbar-drawer-element' } ) . text ( Messages . importButton ) ) ;
if ( callback ) {
button
. click ( prepareFeedback ( type ) )
. click ( Cryptpad . importContent ( 'text/plain' , function ( content , file ) {
callback ( content , file ) ;
} , { accept : data ? data . accept : undefined } ) ) ;
}
break ;
case 'upload' :
button = $ ( '<button>' , {
'class' : 'btn btn-primary new' ,
title : Messages . uploadButtonTitle ,
} ) . append ( $ ( '<span>' , { 'class' : 'fa fa-upload' } ) ) . append ( ' ' + Messages . uploadButton ) ;
if ( ! data . FM ) { return ; }
var $input = $ ( '<input>' , {
'type' : 'file' ,
'style' : 'display: none;'
} ) . on ( 'change' , function ( e ) {
var file = e . target . files [ 0 ] ;
var ev = {
target : data . target
} ;
if ( data . filter && ! data . filter ( file ) ) {
Cryptpad . log ( 'TODO: invalid avatar (type or size)' ) ;
return ;
}
data . FM . handleFile ( file , ev ) ;
if ( callback ) { callback ( ) ; }
} ) ;
if ( data . accept ) { $input . attr ( 'accept' , data . accept ) ; }
button . click ( function ( ) { $input . click ( ) ; } ) ;
break ;
case 'template' :
if ( ! AppConfig . enableTemplates ) { return ; }
button = $ ( '<button>' , {
title : Messages . saveTemplateButton ,
} ) . append ( $ ( '<span>' , { 'class' : 'fa fa-bookmark' , style : 'font:' + size + ' FontAwesome' } ) ) ;
if ( data . rt ) {
button
. click ( function ( ) {
var title = data . getTitle ( ) || document . title ;
var todo = function ( val ) {
if ( typeof ( val ) !== "string" ) { return ; }
var toSave = data . rt . getUserDoc ( ) ;
if ( val . trim ( ) ) {
val = val . trim ( ) ;
title = val ;
try {
var parsed = JSON . parse ( toSave ) ;
var meta ;
if ( Array . isArray ( parsed ) && typeof ( parsed [ 3 ] ) === "object" ) {
meta = parsed [ 3 ] . metadata ; // pad
} else if ( parsed . info ) {
meta = parsed . info ; // poll
} else {
meta = parsed . metadata ;
}
if ( typeof ( meta ) === "object" ) {
meta . title = val ;
meta . defaultTitle = val ;
delete meta . users ;
}
toSave = JSON . stringify ( parsed ) ;
} catch ( e ) {
console . error ( "Parse error while setting the title" , e ) ;
}
}
ctx . sframeChan . query ( 'Q_SAVE_AS_TEMPLATE' , {
title : title ,
toSave : toSave
} , function ( ) {
Cryptpad . alert ( Messages . templateSaved ) ;
funcs . feedback ( 'TEMPLATE_CREATED' ) ;
} ) ;
} ;
Cryptpad . prompt ( Messages . saveTemplatePrompt , title , todo ) ;
} ) ;
}
break ;
case 'forget' :
button = $ ( '<button>' , {
id : 'cryptpad-forget' ,
title : Messages . forgetButtonTitle ,
'class' : "fa fa-trash cryptpad-forget" ,
style : 'font:' + size + ' FontAwesome'
} ) ;
if ( ! isStrongestStored ( ) ) {
button . addClass ( 'cp-toolbar-hidden' ) ;
}
if ( callback ) {
button
. click ( prepareFeedback ( type ) )
. click ( function ( ) {
var msg = isLoggedIn ( ) ? Messages . forgetPrompt : Messages . fm _removePermanentlyDialog ;
Cryptpad . confirm ( msg , function ( yes ) {
if ( ! yes ) { return ; }
ctx . sframeChan . query ( 'Q_MOVE_TO_TRASH' , null , function ( err ) {
if ( err ) { return void callback ( err ) ; }
var cMsg = isLoggedIn ( ) ? Messages . movedToTrash : Messages . deleted ;
Cryptpad . alert ( cMsg , undefined , true ) ;
callback ( ) ;
return ;
} ) ;
} ) ;
} ) ;
}
break ;
case 'history' :
if ( ! AppConfig . enableHistory ) {
button = $ ( '<span>' ) ;
break ;
}
button = $ ( '<button>' , {
title : Messages . historyButton ,
'class' : "fa fa-history history" ,
} ) . append ( $ ( '<span>' , { 'class' : 'cp-toolbar-drawer-element' } ) . text ( Messages . historyText ) ) ;
if ( data . histConfig ) {
button
. click ( prepareFeedback ( type ) )
. on ( 'click' , function ( ) {
funcs . getHistory ( data . histConfig ) ;
} ) ;
}
break ;
case 'more' :
button = $ ( '<button>' , {
title : Messages . moreActions || 'TODO' ,
'class' : "cp-toolbar-drawer-button fa fa-ellipsis-h" ,
style : 'font:' + size + ' FontAwesome'
} ) ;
break ;
default :
button = $ ( '<button>' , {
'class' : "fa fa-question" ,
style : 'font:' + size + ' FontAwesome'
} )
. click ( prepareFeedback ( type ) ) ;
}
if ( rightside ) {
button . addClass ( 'cp-toolbar-rightside-button' ) ;
}
return button ;
} ;
// Can, only be called by the filepicker app
// RESTRICTED
// Filepicker app
funcs . getFilesList = function ( types , cb ) {
ctx . sframeChan . query ( 'Q_GET_FILES_LIST' , types , function ( err , data ) {
cb ( err || data . error , data . data ) ;
@ -351,22 +195,15 @@ define([
ctx . sframeChan . query ( 'Q_STORE_LINK_TO_CLIPBOARD' , readOnly , function ( err ) {
if ( cb ) { cb ( err ) ; }
} ) ;
} ;
* /
} ; * /
Object . freeze ( funcs ) ;
return { create : function ( cb ) {
nThen ( function ( waitFor ) {
SFrameChannel . create ( window . top , waitFor ( function ( sfc ) { ctx . sframeChan = sfc ; } ) ) ;
SFrameChannel . create ( window . paren t, waitFor ( function ( sfc ) { ctx . sframeChan = sfc ; } ) , true ) ;
// CpNfInner.start() should be here....
} ) . nThen ( function ( ) {
ctx . metadataMgr = MetadataMgr . create ( ctx . sframeChan ) ;
ctx . metadataMgr . onTitleChange ( function ( title ) {
ctx . sframeChan . query ( 'Q_SET_PAD_TITLE_IN_DRIVE' , title , function ( err ) {
if ( err ) { return ; }
if ( titleUpdated ) { titleUpdated ( undefined , title ) ; }
} ) ;
} ) ;
ctx . sframeChan . on ( 'EV_RT_CONNECT' , function ( ) { CommonRealtime . setConnectionState ( true ) ; } ) ;
ctx . sframeChan . on ( 'EV_RT_DISCONNECT' , function ( ) { CommonRealtime . setConnectionState ( false ) ; } ) ;