2017-11-09 13:23:40 +00:00
define ( [
'jquery' ,
2020-05-07 09:58:58 +00:00
'/common/toolbar.js' ,
2017-11-09 13:23:40 +00:00
'/bower_components/nthen/index.js' ,
'/common/sframe-common.js' ,
2017-11-13 09:23:18 +00:00
'/common/common-interface.js' ,
2018-01-11 15:02:05 +00:00
'/common/common-ui-elements.js' ,
2017-11-13 15:32:40 +00:00
'/common/common-util.js' ,
'/common/common-hash.js' ,
'/customize/messages.js' ,
2018-01-11 15:02:05 +00:00
'/common/hyperscript.js' ,
2019-09-27 10:04:31 +00:00
'/common/common-credential.js' ,
2018-01-12 13:50:39 +00:00
'/customize/application_config.js' ,
2018-01-25 11:10:46 +00:00
'/api/config' ,
2019-08-02 14:54:44 +00:00
'/common/make-backup.js' ,
2019-01-08 13:44:40 +00:00
'/common/common-feedback.js' ,
2017-11-09 13:23:40 +00:00
2019-07-25 12:13:14 +00:00
'/common/jscolor.js' ,
2017-11-09 16:23:13 +00:00
'/bower_components/file-saver/FileSaver.min.js' ,
2017-11-09 13:23:40 +00:00
'css!/bower_components/bootstrap/dist/css/bootstrap.min.css' ,
2018-03-21 17:31:53 +00:00
'css!/bower_components/components-font-awesome/css/font-awesome.min.css' ,
2018-07-14 13:15:23 +00:00
'less!/settings/app-settings.less' ,
2020-05-05 09:19:32 +00:00
] , function (
2017-11-09 13:23:40 +00:00
$ ,
Toolbar ,
nThen ,
2017-11-13 09:23:18 +00:00
SFCommon ,
2017-11-13 15:32:40 +00:00
UI ,
2018-01-11 15:02:05 +00:00
UIElements ,
2017-11-13 15:32:40 +00:00
Util ,
Hash ,
2018-01-11 15:02:05 +00:00
Messages ,
2018-01-12 13:50:39 +00:00
h ,
2018-06-20 08:02:56 +00:00
Cred ,
2018-01-25 11:10:46 +00:00
AppConfig ,
2018-10-17 12:32:33 +00:00
ApiConfig ,
2019-01-08 13:44:40 +00:00
Backup ,
Feedback
2020-05-05 09:19:32 +00:00
) {
2017-11-09 16:23:13 +00:00
var saveAs = window . saveAs ;
2017-11-13 17:09:19 +00:00
var APP = window . APP = { } ;
2017-11-09 13:23:40 +00:00
var common ;
var metadataMgr ;
var privateData ;
var sframeChan ;
var categories = {
'account' : [
2020-02-11 12:35:58 +00:00
'cp-settings-own-drive' ,
2017-11-09 13:23:40 +00:00
'cp-settings-info-block' ,
'cp-settings-displayname' ,
'cp-settings-language-selector' ,
2020-11-26 17:15:36 +00:00
'cp-settings-mediatag-size' ,
2018-06-14 16:18:53 +00:00
'cp-settings-change-password' ,
2018-03-19 13:04:44 +00:00
'cp-settings-delete'
2017-11-09 13:23:40 +00:00
] ,
2020-02-07 13:10:50 +00:00
'security' : [
2020-01-28 15:39:24 +00:00
'cp-settings-logout-everywhere' ,
2020-01-28 10:31:03 +00:00
'cp-settings-autostore' ,
'cp-settings-safe-links' ,
2020-01-28 15:39:24 +00:00
'cp-settings-userfeedback' ,
2021-01-18 17:05:01 +00:00
'cp-settings-cache' ,
2020-01-28 10:31:03 +00:00
] ,
2017-11-09 13:23:40 +00:00
'drive' : [
2020-11-26 17:15:36 +00:00
'cp-settings-resettips' ,
2019-01-04 14:10:13 +00:00
'cp-settings-drive-duplicate' ,
2018-08-28 09:42:48 +00:00
'cp-settings-thumbnails' ,
2018-01-11 15:02:05 +00:00
'cp-settings-drive-backup' ,
'cp-settings-drive-import-local' ,
2020-02-03 09:58:38 +00:00
'cp-settings-trim-history'
2020-02-03 09:57:53 +00:00
//'cp-settings-drive-reset'
2017-11-09 13:23:40 +00:00
] ,
2018-12-06 12:48:14 +00:00
'cursor' : [
'cp-settings-cursor-color' ,
'cp-settings-cursor-share' ,
'cp-settings-cursor-show' ,
] ,
2017-12-22 17:01:15 +00:00
'pad' : [
'cp-settings-pad-width' ,
2018-12-21 17:16:29 +00:00
'cp-settings-pad-spellcheck' ,
2020-04-27 13:09:29 +00:00
'cp-settings-pad-notif' ,
2017-12-22 17:01:15 +00:00
] ,
2017-11-09 13:23:40 +00:00
'code' : [
2018-01-11 15:02:05 +00:00
'cp-settings-code-indent-unit' ,
2018-10-29 10:46:57 +00:00
'cp-settings-code-indent-type' ,
2019-10-15 16:00:54 +00:00
'cp-settings-code-brackets' ,
2018-10-29 10:46:57 +00:00
'cp-settings-code-font-size' ,
2019-04-23 11:23:33 +00:00
'cp-settings-code-spellcheck' ,
2018-01-25 11:09:20 +00:00
] ,
2020-08-05 09:17:00 +00:00
'kanban' : [
'cp-settings-kanban-tags' ,
] ,
2018-01-25 11:09:20 +00:00
'subscription' : {
2020-05-05 09:19:32 +00:00
onClick : function ( ) {
2018-01-25 11:09:20 +00:00
var urls = common . getMetadataMgr ( ) . getPrivateData ( ) . accounts ;
window . open ( urls . upgradeURL ) ;
2019-01-08 13:44:40 +00:00
Feedback . send ( 'SUBSCRIPTION_BUTTON' ) ;
2018-01-25 11:09:20 +00:00
}
}
2017-11-09 13:23:40 +00:00
} ;
2018-01-23 12:47:30 +00:00
if ( AppConfig . disableFeedback ) {
var feedbackIdx = categories . account . indexOf ( 'cp-settings-userfeedback' ) ;
categories . account . splice ( feedbackIdx , 1 ) ;
}
2018-01-23 13:24:40 +00:00
if ( AppConfig . disableProfile ) {
var displaynameIdx = categories . account . indexOf ( 'cp-settings-displayname' ) ;
categories . account . splice ( displaynameIdx , 1 ) ;
}
2018-01-25 11:10:46 +00:00
if ( ! ApiConfig . allowSubscriptions ) {
delete categories . subscription ;
}
2018-01-12 13:50:39 +00:00
2018-01-11 15:02:05 +00:00
var create = { } ;
2020-02-10 20:39:57 +00:00
var SPECIAL _HINTS _HANDLER = {
2020-05-05 09:19:32 +00:00
safeLinks : function ( ) {
return $ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2020-02-10 20:39:57 +00:00
. html ( Messages . _getKey ( 'settings_safeLinksHint' , [ '<span class="fa fa-shhare-alt"></span>' ] ) ) ;
} ,
} ;
2020-05-05 09:19:32 +00:00
var DEFAULT _HINT _HANDLER = function ( safeKey ) {
return $ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
. text ( Messages [ 'settings_' + safeKey + 'Hint' ] || 'Coming soon...' ) ;
2020-02-10 20:39:57 +00:00
} ;
2020-05-05 09:19:32 +00:00
var makeBlock = function ( key , getter , full ) {
var safeKey = key . replace ( /-([a-z])/g , function ( g ) { return g [ 1 ] . toUpperCase ( ) ; } ) ;
2020-01-28 10:31:03 +00:00
2020-05-05 09:19:32 +00:00
create [ key ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-' + key + ' cp-sidebarlayout-element' } ) ;
2020-01-28 10:31:03 +00:00
if ( full ) {
2020-05-05 09:19:32 +00:00
$ ( '<label>' ) . text ( Messages [ 'settings_' + safeKey + 'Title' ] || key ) . appendTo ( $div ) ;
2020-02-10 20:39:57 +00:00
// if this block's hint needs a special renderer, then create it in SPECIAL_HINTS_HANLDER
// otherwise the default will be used
2020-05-05 09:19:32 +00:00
var hintFunction = ( typeof ( SPECIAL _HINTS _HANDLER [ safeKey ] ) === 'function' ) ?
SPECIAL _HINTS _HANDLER [ safeKey ] :
2020-02-10 20:39:57 +00:00
DEFAULT _HINT _HANDLER ;
hintFunction ( safeKey ) . appendTo ( $div ) ;
2020-01-28 10:31:03 +00:00
}
2020-05-05 09:19:32 +00:00
getter ( function ( content ) {
2020-02-11 12:35:58 +00:00
if ( content === false ) {
$div . remove ( ) ;
$div = undefined ;
return ;
}
2020-01-28 10:31:03 +00:00
$div . append ( content ) ;
} , $div ) ;
return $div ;
} ;
} ;
2018-01-11 15:02:05 +00:00
// Account settings
2020-05-05 09:19:32 +00:00
create [ 'info-block' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-info-block' } ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
var $account = $ ( '<div>' , { 'class' : 'cp-sidebarlayout-element' } ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
var accountName = privateData . accountName ;
2020-05-05 09:19:32 +00:00
var $label = $ ( '<span>' , { 'class' : 'label' } ) . text ( Messages . user _accountName ) ;
2017-11-09 13:23:40 +00:00
var $name = $ ( '<span>' ) . text ( accountName || '' ) ;
if ( ! accountName ) {
$label . text ( '' ) ;
$name . text ( Messages . settings _anonymous ) ;
}
$account . append ( $label ) . append ( $name ) ;
var publicKey = privateData . edPublic ;
if ( publicKey ) {
2020-05-05 09:19:32 +00:00
var $key = $ ( '<div>' , { 'class' : 'cp-sidebarlayout-element' } ) . appendTo ( $div ) ;
2020-06-25 17:15:57 +00:00
var userHref = Hash . getPublicSigningKeyString ( privateData . origin , accountName , publicKey ) ;
2020-05-05 09:19:32 +00:00
var $pubLabel = $ ( '<span>' , { 'class' : 'label' } )
2017-11-09 13:23:40 +00:00
. text ( Messages . settings _publicSigningKey ) ;
2017-11-13 11:00:15 +00:00
$key . append ( $pubLabel ) . append ( UI . dialog . selectable ( userHref ) ) ;
2017-11-09 13:23:40 +00:00
}
return $div ;
} ;
// Create the block containing the display name field
2020-05-05 09:19:32 +00:00
create [ 'displayname' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-displayname cp-sidebarlayout-element' } ) ;
$ ( '<label>' , { 'for' : 'cp-settings-displayname' } ) . text ( Messages . user _displayName ) . appendTo ( $div ) ;
var $inputBlock = $ ( '<div>' , { 'class' : 'cp-sidebarlayout-input-block' } ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
var $input = $ ( '<input>' , {
'type' : 'text' ,
'id' : 'cp-settings-displayname' ,
2020-05-05 09:19:32 +00:00
'placeholder' : Messages . anonymous
} ) . appendTo ( $inputBlock ) ;
var $save = $ ( '<button>' , { 'class' : 'btn btn-primary' } ) . text ( Messages . settings _save ) . appendTo ( $inputBlock ) ;
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) . hide ( ) . appendTo ( $div ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) . hide ( ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
var displayName = metadataMgr . getUserData ( ) . name || '' ;
$input . val ( displayName ) ;
// When the display name is changed (enter or button clicked)
2020-05-05 09:19:32 +00:00
var todo = function ( ) {
2017-11-09 13:23:40 +00:00
displayName = $input . val ( ) ;
if ( displayName === metadataMgr . getUserData ( ) . name ) { return ; }
$spinner . show ( ) ;
2020-05-05 09:19:32 +00:00
common . setDisplayName ( displayName , function ( ) {
2017-11-09 13:23:40 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ;
2020-05-05 09:19:32 +00:00
$input . on ( 'keyup' , function ( e ) {
2017-11-09 13:23:40 +00:00
if ( $input . val ( ) !== displayName ) { $ok . hide ( ) ; }
if ( e . which === 13 ) { todo ( ) ; }
} ) ;
$save . click ( todo ) ;
// On remote change
2020-05-05 09:19:32 +00:00
var onChange = function ( ) {
2017-11-09 13:23:40 +00:00
if ( metadataMgr . getUserData ( ) . name !== $input . val ( ) ) {
$input . val ( metadataMgr . getUserData ( ) . name ) ;
$input . focusout ( ) ;
}
} ;
metadataMgr . onChange ( onChange ) ;
return $div ;
} ;
2017-12-22 17:01:15 +00:00
2020-05-05 09:19:32 +00:00
create [ 'language-selector' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-language-selector cp-sidebarlayout-element' } ) ;
2018-01-11 15:02:05 +00:00
$ ( '<label>' ) . text ( Messages . language ) . appendTo ( $div ) ;
var $b = common . createLanguageSelector ( $div ) ;
$b . find ( 'button' ) . addClass ( 'btn btn-secondary' ) ;
2017-11-09 13:23:40 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'logout-everywhere' ] = function ( ) {
2018-01-11 15:02:05 +00:00
if ( ! common . isLoggedIn ( ) ) { return ; }
2020-05-05 09:19:32 +00:00
var $div = $ ( '<div>' , { 'class' : 'cp-settings-logout-everywhere cp-sidebarlayout-element' } ) ;
2018-01-23 13:24:40 +00:00
$ ( '<label>' ) . text ( Messages . settings _logoutEverywhereTitle ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-01-11 15:02:05 +00:00
. text ( Messages . settings _logoutEverywhere ) . appendTo ( $div ) ;
var $button = $ ( '<button>' , {
2020-05-05 09:19:32 +00:00
id : 'cp-settings-logout-everywhere' ,
'class' : 'btn btn-primary'
} ) . text ( Messages . settings _logoutEverywhereButton )
2018-01-11 15:02:05 +00:00
. appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) . hide ( ) . appendTo ( $div ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) . hide ( ) . appendTo ( $div ) ;
2017-12-22 17:01:15 +00:00
2020-05-05 09:19:32 +00:00
$button . click ( function ( ) {
2017-12-22 17:01:15 +00:00
2020-05-05 09:19:32 +00:00
UI . confirm ( Messages . settings _logoutEverywhereConfirm , function ( yes ) {
2018-01-11 15:02:05 +00:00
if ( ! yes ) { return ; }
$spinner . show ( ) ;
$ok . hide ( ) ;
2017-12-22 17:01:15 +00:00
2019-01-08 14:17:43 +00:00
Feedback . send ( 'LOGOUT_EVERYWHERE' ) ;
2020-05-05 09:19:32 +00:00
sframeChan . query ( 'Q_SETTINGS_LOGOUT' , null , function ( ) {
2018-01-11 15:02:05 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
2020-05-05 09:19:32 +00:00
window . setTimeout ( function ( ) {
2018-01-11 15:02:05 +00:00
$ok . fadeOut ( 1500 ) ;
} , 2500 ) ;
} ) ;
} ) ;
2017-12-22 17:01:15 +00:00
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'autostore' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-autostore cp-sidebarlayout-element' } ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'label' } ) . text ( Messages . settings _autostoreTitle ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-08-28 09:42:48 +00:00
. append ( Messages . settings _autostoreHint ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2017-11-09 13:23:40 +00:00
2018-08-28 09:42:48 +00:00
var opt1 = UI . createRadio ( 'cp-settings-autostore' , 'cp-settings-autostore-no' ,
2020-05-05 09:19:32 +00:00
Messages . settings _autostoreNo , false , {
input : { value : - 1 } ,
label : { class : 'noTitle' }
} ) ;
2018-08-28 09:42:48 +00:00
var opt2 = UI . createRadio ( 'cp-settings-autostore' , 'cp-settings-autostore-maybe' ,
2020-05-05 09:19:32 +00:00
Messages . settings _autostoreMaybe , true , {
input : { value : 0 } ,
label : { class : 'noTitle' }
} ) ;
2018-08-28 09:42:48 +00:00
var opt3 = UI . createRadio ( 'cp-settings-autostore' , 'cp-settings-autostore-yes' ,
2020-05-05 09:19:32 +00:00
Messages . settings _autostoreYes , false , {
input : { value : 1 } ,
label : { class : 'noTitle' }
} ) ;
2020-08-05 09:17:00 +00:00
var $div2 = $ ( h ( 'div.cp-settings-radio-container' , [
2018-09-04 12:49:22 +00:00
opt3 ,
2018-08-28 09:42:48 +00:00
opt2 ,
2018-09-04 12:49:22 +00:00
opt1
2018-08-28 09:42:48 +00:00
] ) ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$div . find ( 'input[type="radio"]' ) . on ( 'change' , function ( ) {
2017-11-09 13:23:40 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
2018-08-28 09:42:48 +00:00
var val = $ ( 'input:radio[name="cp-settings-autostore"]:checked' ) . val ( ) ;
val = Number ( val ) || 0 ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'general' , 'autostore' ] , val , function ( ) {
2017-11-09 13:23:40 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
2018-08-28 09:42:48 +00:00
$ok . hide ( ) . appendTo ( $div2 ) ;
$spinner . hide ( ) . appendTo ( $div2 ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'general' , 'autostore' ] , function ( err , val ) {
2018-08-28 09:42:48 +00:00
if ( val === 1 ) { return void $ ( '#cp-settings-autostore-yes' ) . prop ( 'checked' , true ) ; }
if ( val === - 1 ) { return void $ ( '#cp-settings-autostore-no' ) . prop ( 'checked' , true ) ; }
$ ( '#cp-settings-autostore-maybe' ) . prop ( 'checked' , true ) ;
2017-11-09 13:23:40 +00:00
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'userfeedback' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-userfeedback cp-sidebarlayout-element' } ) ;
2018-01-11 15:02:05 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'label' } ) . text ( Messages . settings _userFeedbackTitle ) . appendTo ( $div ) ;
2018-01-11 15:02:05 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-01-11 15:02:05 +00:00
. append ( Messages . settings _userFeedbackHint1 )
. append ( Messages . settings _userFeedbackHint2 ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-01-11 15:02:05 +00:00
2018-04-18 12:19:45 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-userfeedback' ,
2020-05-05 09:19:32 +00:00
Messages . settings _userFeedback ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2018-01-11 15:02:05 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) || false ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'general' , 'allowUserFeedback' ] , val , function ( ) {
2018-01-11 15:02:05 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
2018-04-18 12:19:45 +00:00
$cbox . appendTo ( $div ) ;
2018-01-11 15:02:05 +00:00
2018-04-18 12:19:45 +00:00
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2018-01-11 15:02:05 +00:00
if ( privateData . feedbackAllowed ) {
$checkbox [ 0 ] . checked = true ;
}
return $div ;
} ;
2021-01-18 17:05:01 +00:00
// XXX
Messages . settings _cacheTitle = "Cache" ;
Messages . settings _cacheHint = "CryptPad stores parts of your documents in your browser's memory in order to save network usage and improve loading times. The documents stored in cache can then be loaded faster the next time you visit them. You can disable the cache if your device doesn't have a lot of free storage space. For security reasons, the cache is always cleared when you log out, but you can clear it manually if you want to reclaim storage space on your machine." ;
Messages . settings _cacheCheckbox = "Enable cache on this device" ;
Messages . settings _cacheButton = "Clear existing cache" ;
2021-01-19 14:14:19 +00:00
makeBlock ( 'cache' , function ( cb ) {
2021-01-18 17:05:01 +00:00
var store = window . cryptpadStore ;
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-cache' ,
Messages . settings _cacheCheckbox ,
false , { label : { class : 'noTitle' } } ) ) ;
var spinner = UI . makeSpinner ( $cbox ) ;
// Checkbox: "Enable safe links"
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
spinner . spin ( ) ;
var val = ! $checkbox . is ( ':checked' ) ? '1' : undefined ;
store . put ( 'disableCache' , val , function ( ) {
sframeChan . query ( 'Q_CACHE_DISABLE' , {
disabled : Boolean ( val )
} , function ( ) {
spinner . done ( ) ;
} ) ;
} ) ;
} ) ;
store . get ( 'disableCache' , function ( val ) {
if ( ! val ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
var button = h ( 'button.btn.btn-danger' , [
h ( 'i.fa.fa-trash-o' ) ,
h ( 'span' , Messages . settings _cacheButton )
] ) ;
var buttonContainer = h ( 'div.cp-settings-clear-cache' , button ) ;
var spinner2 = UI . makeSpinner ( $ ( buttonContainer ) ) ;
UI . confirmButton ( button , {
classes : 'btn-danger'
} , function ( ) {
2021-01-19 14:14:19 +00:00
spinner2 . spin ( ) ;
2021-01-18 17:05:01 +00:00
sframeChan . query ( 'Q_CLEAR_CACHE' , null , function ( ) {
2021-01-19 14:14:19 +00:00
spinner2 . done ( ) ;
2021-01-18 17:05:01 +00:00
} ) ;
} ) ;
cb ( [
$cbox [ 0 ] ,
buttonContainer
] ) ;
} , true ) ;
2020-05-05 09:19:32 +00:00
create [ 'delete' ] = function ( ) {
2018-06-14 16:18:53 +00:00
if ( ! common . isLoggedIn ( ) ) { return ; }
2020-05-05 09:19:32 +00:00
var $div = $ ( '<div>' , { 'class' : 'cp-settings-delete cp-sidebarlayout-element' } ) ;
2018-03-19 13:04:44 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'label' } ) . text ( Messages . settings _deleteTitle ) . appendTo ( $div ) ;
2018-03-19 13:04:44 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-03-19 17:13:57 +00:00
. append ( Messages . settings _deleteHint ) . appendTo ( $div ) ;
2018-03-19 13:04:44 +00:00
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-03-19 13:04:44 +00:00
2020-05-05 09:19:32 +00:00
var $button = $ ( '<button>' , { 'id' : 'cp-settings-delete' , 'class' : 'btn btn-danger' } )
2018-03-19 17:13:57 +00:00
. text ( Messages . settings _deleteButton ) . appendTo ( $div ) ;
2018-03-19 13:04:44 +00:00
2020-05-05 09:19:32 +00:00
$button . click ( function ( ) {
2018-03-19 13:04:44 +00:00
$spinner . show ( ) ;
2020-05-05 09:19:32 +00:00
UI . confirm ( Messages . settings _deleteConfirm , function ( yes ) {
2018-03-21 17:53:11 +00:00
if ( ! yes ) { return ; }
2020-05-05 09:19:32 +00:00
sframeChan . query ( "Q_SETTINGS_DELETE_ACCOUNT" , null , function ( err , data ) {
2018-03-21 17:27:20 +00:00
// Owned drive
if ( data . state === true ) {
2020-05-05 09:19:32 +00:00
sframeChan . query ( 'Q_SETTINGS_LOGOUT' , null , function ( ) { } ) ;
UI . alert ( Messages . settings _deleted , function ( ) {
2018-03-21 17:27:20 +00:00
common . gotoURL ( '/' ) ;
} ) ;
$ok . show ( ) ;
$spinner . hide ( ) ;
return ;
}
// Not owned drive
var msg = h ( 'div.cp-app-settings-delete-alert' , [
h ( 'p' , Messages . settings _deleteModal ) ,
h ( 'pre' , JSON . stringify ( data , 0 , 2 ) )
] ) ;
UI . alert ( msg ) ;
$spinner . hide ( ) ;
} ) ;
2018-03-19 13:04:44 +00:00
} ) ;
// TODO
/ *
UI . confirm ( "Are you sure?" , function ( yes ) {
// Logout everywhere
// Disconnect other tabs
// Remove owned pads
// Remove owned drive
// Remove pinstore
// Alert: "Account deleted", press OK to be redirected to the home page
$spinner . hide ( ) ;
} ) ; * /
} ) ;
$spinner . hide ( ) . appendTo ( $div ) ;
2018-03-21 17:27:20 +00:00
$ok . hide ( ) . appendTo ( $div ) ;
2018-03-19 13:04:44 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'change-password' ] = function ( ) {
2018-06-14 16:18:53 +00:00
if ( ! common . isLoggedIn ( ) ) { return ; }
2020-05-05 09:19:32 +00:00
var $div = $ ( '<div>' , { 'class' : 'cp-settings-change-password cp-sidebarlayout-element' } ) ;
2018-06-14 16:18:53 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'label' } ) . text ( Messages . settings _changePasswordTitle ) . appendTo ( $div ) ;
2018-06-14 16:18:53 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-06-20 08:02:56 +00:00
. append ( Messages . settings _changePasswordHint ) . appendTo ( $div ) ;
2018-06-14 16:18:53 +00:00
// var publicKey = privateData.edPublic;
2018-06-20 08:02:56 +00:00
var form = h ( 'div' , [
UI . passwordInput ( {
id : 'cp-settings-change-password-current' ,
placeholder : Messages . settings _changePasswordCurrent
} , true ) ,
h ( 'br' ) ,
UI . passwordInput ( {
id : 'cp-settings-change-password-new' ,
placeholder : Messages . settings _changePasswordNew
} , true ) ,
UI . passwordInput ( {
id : 'cp-settings-change-password-new2' ,
placeholder : Messages . settings _changePasswordNewConfirm
} , true ) ,
h ( 'button.btn.btn-primary' , Messages . settings _changePasswordButton )
] ) ;
$ ( form ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var updateBlock = function ( data , cb ) {
sframeChan . query ( 'Q_CHANGE_USER_PASSWORD' , data , function ( err , obj ) {
if ( err || obj . error ) { return void cb ( { error : err || obj . error } ) ; }
cb ( obj ) ;
2018-06-14 16:18:53 +00:00
} ) ;
} ;
2020-05-05 09:19:32 +00:00
var todo = function ( ) {
2018-06-20 08:02:56 +00:00
var oldPassword = $ ( form ) . find ( '#cp-settings-change-password-current' ) . val ( ) ;
var newPassword = $ ( form ) . find ( '#cp-settings-change-password-new' ) . val ( ) ;
var newPasswordConfirm = $ ( form ) . find ( '#cp-settings-change-password-new2' ) . val ( ) ;
/* basic validation */
if ( ! Cred . isLongEnoughPassword ( newPassword ) ) {
var warning = Messages . _getKey ( 'register_passwordTooShort' , [
Cred . MINIMUM _PASSWORD _LENGTH
] ) ;
return void UI . alert ( warning ) ;
}
if ( newPassword !== newPasswordConfirm ) {
UI . alert ( Messages . register _passwordsDontMatch ) ;
return ;
}
2018-08-07 09:40:21 +00:00
if ( oldPassword === newPassword ) {
return void UI . alert ( Messages . settings _changePasswordNewPasswordSameAsOld ) ;
}
2018-06-20 08:02:56 +00:00
UI . confirm ( Messages . settings _changePasswordConfirm ,
2020-05-05 09:19:32 +00:00
function ( yes ) {
if ( ! yes ) { return ; }
UI . addLoadingScreen ( {
hideTips : true ,
loadingText : Messages . settings _changePasswordPending ,
} ) ;
updateBlock ( {
password : oldPassword ,
newPassword : newPassword
} , function ( obj ) {
UI . removeLoadingScreen ( ) ;
if ( obj && obj . error ) {
2020-10-07 11:19:48 +00:00
// TODO more specific error message?
2020-05-05 09:19:32 +00:00
UI . alert ( Messages . settings _changePasswordError ) ;
}
} ) ;
} , {
ok : Messages . register _writtenPassword ,
cancel : Messages . register _cancel ,
2020-06-23 11:30:22 +00:00
cancelClass : 'btn.btn-safe' ,
okClass : 'btn.btn-danger' ,
2020-05-05 09:19:32 +00:00
reverseOrder : true ,
done : function ( $dialog ) {
$dialog . find ( '> div' ) . addClass ( 'half' ) ;
} ,
} , true ) ;
2018-06-20 08:02:56 +00:00
} ;
2020-05-05 09:19:32 +00:00
$ ( form ) . find ( 'button' ) . click ( function ( ) {
2018-06-20 08:02:56 +00:00
todo ( ) ;
} ) ;
2020-05-05 09:19:32 +00:00
$ ( form ) . find ( 'input' ) . keydown ( function ( e ) {
2018-06-20 08:02:56 +00:00
// Save on Enter
if ( e . which === 13 ) {
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
todo ( ) ;
}
} ) ;
2018-06-14 16:18:53 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
makeBlock ( 'own-drive' , function ( cb , $div ) {
2020-02-11 12:35:58 +00:00
if ( privateData . isDriveOwned || ! common . isLoggedIn ( ) ) {
return void cb ( false ) ;
}
2018-06-20 14:39:01 +00:00
2020-02-11 12:35:58 +00:00
$div . addClass ( 'alert alert-warning' ) ;
2018-06-20 14:39:01 +00:00
2018-12-19 17:59:20 +00:00
var form = h ( 'div' , [
UI . passwordInput ( {
id : 'cp-settings-migrate-password' ,
placeholder : Messages . settings _changePasswordCurrent
} , true ) ,
h ( 'button.btn.btn-primary' , Messages . settings _ownDriveButton )
] ) ;
2020-02-11 12:35:58 +00:00
var $form = $ ( form ) ;
2020-02-11 12:37:21 +00:00
var spinner = UI . makeSpinner ( $form ) ;
2018-12-19 17:59:20 +00:00
2020-05-05 09:19:32 +00:00
var todo = function ( ) {
2020-02-11 12:35:58 +00:00
var password = $form . find ( '#cp-settings-migrate-password' ) . val ( ) ;
2018-12-19 17:59:20 +00:00
if ( ! password ) { return ; }
2020-02-11 12:35:58 +00:00
spinner . spin ( ) ;
2020-05-05 09:19:32 +00:00
UI . confirm ( Messages . settings _ownDriveConfirm , function ( yes ) {
2018-06-20 14:39:01 +00:00
if ( ! yes ) { return ; }
2018-12-19 17:59:20 +00:00
var data = {
password : password ,
newPassword : password
} ;
UI . addLoadingScreen ( {
hideTips : true ,
loadingText : Messages . settings _ownDrivePending ,
} ) ;
2020-05-05 09:19:32 +00:00
sframeChan . query ( 'Q_CHANGE_USER_PASSWORD' , data , function ( err , obj ) {
2018-12-19 17:59:20 +00:00
UI . removeLoadingScreen ( ) ;
if ( err || obj . error ) { return UI . alert ( Messages . settings _changePasswordError ) ; }
2020-02-11 12:35:58 +00:00
spinner . done ( ) ;
2018-06-20 14:39:01 +00:00
} ) ;
} ) ;
2018-12-19 17:59:20 +00:00
} ;
2020-05-05 09:19:32 +00:00
$form . find ( 'button' ) . click ( function ( ) {
2018-12-19 17:59:20 +00:00
todo ( ) ;
} ) ;
2020-05-05 09:19:32 +00:00
$form . find ( 'input' ) . keydown ( function ( e ) {
2018-12-19 17:59:20 +00:00
// Save on Enter
if ( e . which === 13 ) {
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
todo ( ) ;
}
2018-06-20 14:39:01 +00:00
} ) ;
2020-02-11 12:35:58 +00:00
cb ( form ) ;
} , true ) ;
2018-06-20 14:39:01 +00:00
2020-11-26 17:15:36 +00:00
makeBlock ( 'mediatag-size' , function ( cb ) {
var $inputBlock = $ ( '<div>' , {
'class' : 'cp-sidebarlayout-input-block' ,
} ) ;
var spinner ;
var $input = $ ( '<input>' , {
'min' : - 1 ,
'max' : 1000 ,
type : 'number' ,
} ) . appendTo ( $inputBlock ) ;
var oldVal ;
var todo = function ( ) {
var val = parseInt ( $input . val ( ) ) ;
2020-12-14 13:53:37 +00:00
if ( typeof ( val ) !== 'number' || isNaN ( val ) ) { return UI . warn ( Messages . error ) ; }
2020-11-26 17:15:36 +00:00
if ( val === oldVal ) { return ; }
spinner . spin ( ) ;
common . setAttribute ( [ 'general' , 'mediatag-size' ] , val , function ( err ) {
if ( err ) {
spinner . hide ( ) ;
console . error ( err ) ;
return UI . warn ( Messages . error ) ;
}
2020-12-14 13:53:37 +00:00
oldVal = val ;
2020-11-26 17:15:36 +00:00
spinner . done ( ) ;
UI . log ( Messages . saved ) ;
} ) ;
} ;
var $save = $ ( h ( 'button.btn.btn-primary' , Messages . settings _save ) ) . appendTo ( $inputBlock ) ;
spinner = UI . makeSpinner ( $inputBlock ) ;
$save . click ( todo ) ;
$input . on ( 'keyup' , function ( e ) {
if ( e . which === 13 ) { todo ( ) ; }
} ) ;
common . getAttribute ( [ 'general' , 'mediatag-size' ] , function ( e , val ) {
if ( e ) { return void console . error ( e ) ; }
2020-12-14 13:53:37 +00:00
if ( typeof ( val ) !== 'number' || isNaN ( val ) ) {
2020-11-26 17:15:36 +00:00
oldVal = 5 ;
$input . val ( 5 ) ;
} else {
oldVal = val ;
$input . val ( val ) ;
}
} ) ;
cb ( $inputBlock ) ;
} , true ) ;
2020-01-28 10:31:03 +00:00
// Security
2020-05-05 09:19:32 +00:00
makeBlock ( 'safe-links' , function ( cb ) {
2020-01-28 10:31:03 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-safe-links' ,
2020-05-05 09:19:32 +00:00
Messages . settings _safeLinksCheckbox ,
false , { label : { class : 'noTitle' } } ) ) ;
2020-01-28 10:31:03 +00:00
var spinner = UI . makeSpinner ( $cbox ) ;
2020-02-10 09:46:20 +00:00
// Checkbox: "Enable safe links"
2020-05-05 09:19:32 +00:00
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2020-01-28 10:31:03 +00:00
spinner . spin ( ) ;
var val = ! $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'security' , 'unsafeLinks' ] , val , function ( ) {
2020-01-28 10:31:03 +00:00
spinner . done ( ) ;
} ) ;
} ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'security' , 'unsafeLinks' ] , function ( e , val ) {
2020-01-28 10:31:03 +00:00
if ( e ) { return void console . error ( e ) ; }
2020-02-10 09:46:20 +00:00
if ( val === false ) {
2020-01-28 10:31:03 +00:00
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
cb ( $cbox ) ;
} , true ) ;
2018-01-11 15:02:05 +00:00
// Drive settings
2020-05-05 09:19:32 +00:00
create [ 'drive-duplicate' ] = function ( ) {
2019-01-08 09:53:40 +00:00
if ( ! common . isLoggedIn ( ) ) { return ; }
2019-01-04 14:10:13 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-drive-duplicate cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _driveDuplicateTitle ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2019-01-04 14:10:13 +00:00
. text ( Messages . settings _driveDuplicateHint ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2019-01-04 14:10:13 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-drive-duplicate' ,
2020-05-05 09:19:32 +00:00
Messages . settings _driveDuplicateLabel ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2019-01-04 14:10:13 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'drive' , 'hideDuplicate' ] , val , function ( ) {
2019-01-04 14:10:13 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
$cbox . appendTo ( $div ) ;
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'drive' , 'hideDuplicate' ] , function ( e , val ) {
2019-01-04 14:10:13 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'resettips' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-resettips cp-sidebarlayout-element' } ) ;
2018-08-28 09:42:48 +00:00
$ ( '<label>' ) . text ( Messages . settings _resetTips ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-08-28 09:42:48 +00:00
. text ( Messages . settings _resetTipsButton ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $button = $ ( '<button>' , { 'id' : 'cp-settings-resettips' , 'class' : 'btn btn-primary' } )
2018-08-28 09:42:48 +00:00
. text ( Messages . settings _resetTipsAction ) . appendTo ( $div ) ;
var localStore = window . cryptpadStore ;
2020-05-05 09:19:32 +00:00
$button . click ( function ( ) {
Object . keys ( localStore . store ) . forEach ( function ( k ) {
if ( /^(hide-(info|alert))/ . test ( k ) ) {
2019-05-03 13:18:23 +00:00
localStore . put ( k , null ) ;
2018-08-28 09:42:48 +00:00
}
} ) ;
UI . alert ( Messages . settings _resetTipsDone ) ;
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'thumbnails' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-thumbnails cp-sidebarlayout-element' } ) ;
2018-08-28 09:42:48 +00:00
$ ( '<label>' ) . text ( Messages . settings _thumbnails ) . appendTo ( $div ) ;
// Disable
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-08-28 09:42:48 +00:00
. text ( Messages . settings _disableThumbnailsDescription ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-08-28 09:42:48 +00:00
var $cbox = $ ( UI . createCheckbox ( 'disableThumbnails' ,
2020-05-05 09:19:32 +00:00
Messages . settings _disableThumbnailsAction ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2018-08-28 09:42:48 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) || false ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'general' , 'disableThumbnails' ] , val , function ( ) {
2018-08-28 09:42:48 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
$cbox . appendTo ( $div ) ;
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'general' , 'disableThumbnails' ] , function ( e , val ) {
2018-08-28 09:42:48 +00:00
$checkbox [ 0 ] . checked = typeof ( val ) === "undefined" || val ;
} ) ;
// Reset
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-08-28 09:42:48 +00:00
. text ( Messages . settings _resetThumbnailsDescription ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $button = $ ( '<button>' , { 'id' : 'resetThumbnails' , 'class' : 'btn btn-primary' } )
2018-08-28 09:42:48 +00:00
. text ( Messages . settings _resetThumbnailsAction ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$button . click ( function ( ) {
sframeChan . query ( "Q_THUMBNAIL_CLEAR" , null , function ( err ) {
2018-08-28 09:42:48 +00:00
if ( err ) { return void console . error ( "Cannot clear localForage" ) ; }
UI . alert ( Messages . settings _resetThumbnailsDone ) ;
} ) ;
} ) ;
return $div ;
} ;
2018-10-19 16:38:35 +00:00
2020-05-05 09:19:32 +00:00
create [ 'drive-backup' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-drive-backup cp-sidebarlayout-element' } ) ;
2017-11-09 13:23:40 +00:00
var accountName = privateData . accountName ;
var displayName = metadataMgr . getUserData ( ) . name || '' ;
2018-10-18 16:50:38 +00:00
var name = displayName || accountName || Messages . anonymous ;
var suggestion = name + '-' + new Date ( ) . toDateString ( ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
var exportFile = function ( ) {
sframeChan . query ( "Q_SETTINGS_DRIVE_GET" , null , function ( err , data ) {
2017-11-09 13:23:40 +00:00
if ( err ) { return void console . error ( err ) ; }
var sjson = JSON . stringify ( data ) ;
2017-11-13 15:32:40 +00:00
UI . prompt ( Messages . exportPrompt ,
2020-05-05 09:19:32 +00:00
Util . fixFileName ( suggestion ) + '.json' ,
function ( filename ) {
if ( ! ( typeof ( filename ) === 'string' && filename ) ) { return ; }
var blob = new Blob ( [ sjson ] , { type : "application/json;charset=utf-8" } ) ;
saveAs ( blob , filename ) ;
} ) ;
2017-11-09 13:23:40 +00:00
} ) ;
} ;
2020-05-05 09:19:32 +00:00
var importFile = function ( content ) {
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
try {
var data = JSON . parse ( content ) ;
2020-05-05 09:19:32 +00:00
sframeChan . query ( "Q_SETTINGS_DRIVE_SET" , data , function ( e ) {
2017-11-09 13:23:40 +00:00
if ( e ) { console . error ( e ) ; }
$spinner . remove ( ) ;
} ) ;
} catch ( e ) {
console . error ( e ) ;
}
} ;
2020-05-05 09:19:32 +00:00
$ ( '<label>' , { 'for' : 'exportDrive' } ) . text ( Messages . settings _backupCategory ) . appendTo ( $div ) ;
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-10-15 14:33:46 +00:00
. text ( Messages . settings _backupHint || Messages . settings _backupTitle ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
/* add an export button */
var $export = common . createButton ( 'export' , true , { } , exportFile ) ;
$export . attr ( 'class' , 'btn btn-success' ) . text ( Messages . settings _backup ) ;
$div . append ( $export ) ;
/* add an import button */
var $import = common . createButton ( 'import' , true , { } , importFile ) ;
$import . attr ( 'class' , 'btn btn-success' ) . text ( Messages . settings _restore ) ;
$div . append ( $import ) ;
2018-10-17 12:32:33 +00:00
// Backup all the pads
2020-05-05 09:19:32 +00:00
var exportDrive = function ( ) {
2019-01-09 15:16:32 +00:00
Feedback . send ( 'FULL_DRIVE_EXPORT_START' ) ;
2020-05-05 09:19:32 +00:00
var todo = function ( data , filename ) {
2020-10-08 13:02:05 +00:00
var ui = Backup . createExportUI ( privateData . origin ) ;
2018-10-19 16:38:35 +00:00
2020-05-05 09:19:32 +00:00
var bu = Backup . create ( data , common . getPad , privateData . fileHost , function ( blob , errors ) {
2018-10-17 12:32:33 +00:00
saveAs ( blob , filename ) ;
2018-10-18 16:50:38 +00:00
sframeChan . event ( 'EV_CRYPTGET_DISCONNECT' ) ;
2020-05-05 09:19:32 +00:00
ui . complete ( function ( ) {
2019-01-09 15:16:32 +00:00
Feedback . send ( 'FULL_DRIVE_EXPORT_COMPLETE' ) ;
2018-10-19 16:38:35 +00:00
saveAs ( blob , filename ) ;
} , errors ) ;
2020-11-30 11:07:03 +00:00
} , ui . update , common . getCache ( ) ) ;
2020-05-05 09:19:32 +00:00
ui . onCancel ( function ( ) {
2018-10-19 16:38:35 +00:00
ui . close ( ) ;
bu . stop ( ) ;
2018-10-17 12:32:33 +00:00
} ) ;
} ;
2020-05-05 09:19:32 +00:00
sframeChan . query ( "Q_SETTINGS_DRIVE_GET" , "full" , function ( err , data ) {
2018-10-17 12:32:33 +00:00
if ( err ) { return void console . error ( err ) ; }
2018-10-18 16:50:38 +00:00
if ( data . error ) { return void console . error ( data . error ) ; }
2018-10-19 16:38:35 +00:00
UI . prompt ( Messages . settings _backup2Confirm ,
2020-05-05 09:19:32 +00:00
Util . fixFileName ( suggestion ) + '.zip' ,
function ( filename ) {
if ( ! ( typeof ( filename ) === 'string' && filename ) ) { return ; }
todo ( data , filename ) ;
} ) ;
2018-10-17 12:32:33 +00:00
} ) ;
} ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-10-17 12:32:33 +00:00
. text ( Messages . settings _backupHint2 ) . appendTo ( $div ) ;
2018-10-19 16:38:35 +00:00
var $export2 = common . createButton ( 'export' , true , { } , exportDrive ) ;
$export2 . attr ( 'class' , 'btn btn-success' ) . text ( Messages . settings _backup2 ) ;
$div . append ( $export2 ) ;
2018-10-17 12:32:33 +00:00
2017-11-09 13:23:40 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'drive-import-local' ] = function ( ) {
2018-01-11 15:02:05 +00:00
if ( ! common . isLoggedIn ( ) ) { return ; }
2020-05-05 09:19:32 +00:00
var $div = $ ( '<div>' , { 'class' : 'cp-settings-drive-import-local cp-sidebarlayout-element' } ) ;
2020-05-12 14:49:03 +00:00
$ ( '<label>' ) . text ( Messages . settings _import ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-01-11 15:02:05 +00:00
. text ( Messages . settings _importTitle ) . appendTo ( $div ) ;
var $button = $ ( '<button>' , {
'id' : 'cp-settings-import-local-pads' ,
'class' : 'btn btn-primary'
} ) . text ( Messages . settings _import ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) . hide ( ) . appendTo ( $div ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) . hide ( ) . appendTo ( $div ) ;
2018-01-11 15:02:05 +00:00
2020-05-05 09:19:32 +00:00
$button . click ( function ( ) {
UI . confirm ( Messages . settings _importConfirm , function ( yes ) {
2018-01-11 15:02:05 +00:00
if ( ! yes ) { return ; }
$spinner . show ( ) ;
$ok . hide ( ) ;
2020-05-05 09:19:32 +00:00
sframeChan . query ( 'Q_SETTINGS_IMPORT_LOCAL' , null , function ( ) {
2018-01-11 15:02:05 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
UI . alert ( Messages . settings _importDone ) ;
} ) ;
} , undefined , true ) ;
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
var redrawTrimHistory = function ( cb , $div ) {
2020-02-03 09:58:38 +00:00
var spinner = UI . makeSpinner ( ) ;
var button = h ( 'button.btn.btn-danger-alt' , {
disabled : 'disabled'
2020-02-18 13:14:29 +00:00
} , Messages . trimHistory _button ) ;
2020-02-03 09:58:38 +00:00
var currentSize = h ( 'p' , $ ( spinner . spinner ) . clone ( ) [ 0 ] ) ;
2020-02-11 11:05:09 +00:00
var content = h ( 'div#cp-settings-trim-container' , [
2020-02-03 09:58:38 +00:00
currentSize ,
button ,
spinner . ok ,
spinner . spinner
] ) ;
2020-02-11 11:05:09 +00:00
if ( ! privateData . isDriveOwned ) {
var href = privateData . origin + privateData . pathname + '#' + 'account' ;
2020-02-18 13:14:29 +00:00
$ ( currentSize ) . html ( Messages . trimHistory _needMigration ) ;
2020-05-05 09:19:32 +00:00
$ ( currentSize ) . find ( 'a' ) . prop ( 'href' , href ) . click ( function ( e ) {
2020-02-11 11:05:09 +00:00
e . preventDefault ( ) ;
$ ( '.cp-sidebarlayout-category[data-category="account"]' ) . click ( ) ;
} ) ;
return void cb ( content ) ;
}
2020-02-03 09:58:38 +00:00
2020-02-03 11:04:33 +00:00
var $button = $ ( button ) ;
2020-02-03 09:58:38 +00:00
var size ;
2020-02-05 16:55:25 +00:00
var channels = [ ] ;
2020-05-05 09:19:32 +00:00
nThen ( function ( waitFor ) {
2020-02-03 11:04:33 +00:00
APP . history . execCommand ( 'GET_HISTORY_SIZE' , {
account : true ,
channels : [ ]
2020-05-05 09:19:32 +00:00
} , waitFor ( function ( obj ) {
2020-02-03 11:04:33 +00:00
if ( obj && obj . error ) {
waitFor . abort ( ) ;
2020-02-18 13:14:46 +00:00
var error = h ( 'div.alert.alert-danger' , Messages . trimHistory _getSizeError ) ;
2020-02-03 11:04:33 +00:00
$ ( content ) . empty ( ) . append ( error ) ;
return ;
}
2020-02-05 16:55:25 +00:00
channels = obj . channels ;
2020-02-06 11:00:12 +00:00
size = Number ( obj . size ) ;
2020-02-03 11:04:33 +00:00
} ) ) ;
2020-05-05 09:19:32 +00:00
} ) . nThen ( function ( ) {
2020-02-06 10:34:52 +00:00
if ( ! size || size < 1024 ) {
2020-02-18 13:14:29 +00:00
$ ( currentSize ) . html ( Messages . trimHistory _noHistory ) ;
2020-02-06 10:34:52 +00:00
return ;
}
2020-02-06 11:00:12 +00:00
$ ( currentSize ) . html ( Messages . _getKey ( 'trimHistory_currentSize' , [ UIElements . prettySize ( size ) ] ) ) ;
2020-02-24 10:28:20 +00:00
$button . prop ( 'disabled' , '' ) ;
UI . confirmButton ( button , {
classes : 'btn-danger'
2020-05-05 09:19:32 +00:00
} , function ( ) {
2020-02-24 10:28:20 +00:00
$button . remove ( ) ;
spinner . spin ( ) ;
APP . history . execCommand ( 'TRIM_HISTORY' , {
channels : channels
2020-05-05 09:19:32 +00:00
} , function ( obj ) {
if ( obj && obj . error ) {
2020-02-24 10:28:20 +00:00
var error = h ( 'div.alert.alert-danger' , Messages . trimHistory _error ) ;
$ ( content ) . empty ( ) . append ( error ) ;
return ;
}
spinner . hide ( ) ;
redrawTrimHistory ( cb , $div ) ;
2020-02-03 09:58:38 +00:00
} ) ;
2020-02-24 10:28:20 +00:00
} ) ;
2020-02-03 09:58:38 +00:00
} ) ;
2020-02-11 11:05:09 +00:00
$div . find ( '#cp-settings-trim-container' ) . remove ( ) ;
2020-02-03 09:58:38 +00:00
cb ( content ) ;
2020-02-11 11:05:09 +00:00
} ;
2020-05-05 09:19:32 +00:00
makeBlock ( 'trim-history' , function ( cb , $div ) {
2020-12-08 10:44:27 +00:00
if ( ! common . isLoggedIn ( ) ) { return void cb ( false ) ; }
2020-02-11 11:05:09 +00:00
redrawTrimHistory ( cb , $div ) ;
2020-02-03 09:58:38 +00:00
} , true ) ;
2020-02-03 09:57:53 +00:00
/ *
2018-01-11 15:02:05 +00:00
create [ 'drive-reset' ] = function ( ) {
var $div = $ ( '<div>' , { 'class' : 'cp-settings-drive-reset cp-sidebarlayout-element' } ) ;
2017-11-09 13:23:40 +00:00
$ ( '<label>' ) . text ( Messages . settings _resetNewTitle ) . appendTo ( $div ) ;
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
. text ( Messages . settings _reset ) . appendTo ( $div ) ;
var $button = $ ( '<button>' , { 'id' : 'cp-settings-reset-drive' , 'class' : 'btn btn-danger' } )
. text ( Messages . settings _resetButton ) . appendTo ( $div ) ;
$button . click ( function ( ) {
2017-11-13 09:23:18 +00:00
UI . prompt ( Messages . settings _resetPrompt , "" , function ( val ) {
2017-11-09 13:23:40 +00:00
if ( val !== "I love CryptPad" ) {
2017-11-13 09:23:18 +00:00
UI . alert ( Messages . settings _resetError ) ;
2017-11-09 13:23:40 +00:00
return ;
}
sframeChan . query ( "Q_SETTINGS_DRIVE_RESET" , null , function ( err ) {
if ( err ) { return void console . error ( err ) ; }
2017-11-13 09:23:18 +00:00
UI . alert ( Messages . settings _resetDone ) ;
2017-11-09 13:23:40 +00:00
} ) ;
} , undefined , true ) ;
} ) ;
return $div ;
} ;
2020-02-03 09:57:53 +00:00
* /
2017-11-09 13:23:40 +00:00
2018-12-06 12:48:14 +00:00
// Cursor settings
2020-05-05 09:19:32 +00:00
create [ 'cursor-color' ] = function ( ) {
2018-12-06 12:48:14 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-cursor-color cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _cursorColorTitle ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-12-06 12:48:14 +00:00
. text ( Messages . settings _cursorColorHint ) . appendTo ( $div ) ;
var $inputBlock = $ ( '<div>' ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $colorPicker = $ ( "<div>" , { class : "cp-settings-cursor-color-picker" } ) ;
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-12-06 12:48:14 +00:00
2019-07-25 12:13:14 +00:00
// when jscolor picker value change
2020-05-05 09:19:32 +00:00
var _onchange = function ( colorL ) {
2019-07-25 12:13:14 +00:00
var val = "#" + colorL . toString ( ) ;
2018-12-06 12:48:14 +00:00
if ( ! /^#[0-9a-fA-F]{6}$/ . test ( val ) ) { return ; }
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'general' , 'cursor' , 'color' ] , val , function ( ) {
2018-12-06 12:48:14 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
2019-07-25 12:13:14 +00:00
} ;
2019-08-26 13:30:35 +00:00
var to ;
2020-05-05 09:19:32 +00:00
var onchange = function ( colorL ) {
2019-08-26 13:30:35 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
if ( to ) { clearTimeout ( to ) ; }
2020-05-05 09:19:32 +00:00
to = setTimeout ( function ( ) {
2019-08-26 13:30:35 +00:00
_onchange ( colorL ) ;
} , 300 ) ;
} ;
2018-12-06 12:48:14 +00:00
2019-07-25 12:13:14 +00:00
// jscolor picker
2020-05-05 09:19:32 +00:00
var jscolorL = new window . jscolor ( $colorPicker [ 0 ] , { showOnClick : false , onFineChange : onchange , valueElement : undefined } ) ;
$colorPicker . click ( function ( ) {
2019-07-25 12:13:14 +00:00
jscolorL . show ( ) ;
} ) ;
2018-12-06 12:48:14 +00:00
2019-07-25 12:13:14 +00:00
// set default color
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'general' , 'cursor' , 'color' ] , function ( e , val ) {
2018-12-06 12:48:14 +00:00
if ( e ) { return void console . error ( e ) ; }
2019-07-25 12:13:14 +00:00
val = val || "#000" ;
jscolorL . fromString ( val ) ;
2018-12-06 12:48:14 +00:00
} ) ;
2019-07-25 12:13:14 +00:00
$colorPicker . appendTo ( $inputBlock ) ;
$ok . hide ( ) . appendTo ( $inputBlock ) ;
$spinner . hide ( ) . appendTo ( $inputBlock ) ;
2018-12-06 12:48:14 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'cursor-share' ] = function ( ) {
2018-12-06 12:48:14 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-cursor-share cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _cursorShareTitle ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-12-06 12:48:14 +00:00
. text ( Messages . settings _cursorShareHint ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-12-06 12:48:14 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-cursor-share' ,
2020-05-05 09:19:32 +00:00
Messages . settings _cursorShareLabel ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2018-12-06 12:48:14 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'general' , 'cursor' , 'share' ] , val , function ( ) {
2018-12-06 12:48:14 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
$cbox . appendTo ( $div ) ;
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'general' , 'cursor' , 'share' ] , function ( e , val ) {
2018-12-06 12:48:14 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val !== false ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'cursor-show' ] = function ( ) {
2018-12-06 12:48:14 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-cursor-show cp-sidebarlayout-element'
} ) ;
2018-12-11 11:04:11 +00:00
$ ( '<label>' ) . text ( Messages . settings _cursorShowTitle + ' (BETA)' ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-12-06 12:48:14 +00:00
. text ( Messages . settings _cursorShowHint ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-12-06 12:48:14 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-cursor-show' ,
2020-05-05 09:19:32 +00:00
Messages . settings _cursorShowLabel ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2018-12-06 12:48:14 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'general' , 'cursor' , 'show' ] , val , function ( ) {
2018-12-06 12:48:14 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
$cbox . appendTo ( $div ) ;
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'general' , 'cursor' , 'show' ] , function ( e , val ) {
2018-12-06 12:48:14 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val !== false ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
return $div ;
} ;
2018-01-11 15:02:05 +00:00
// Rich text pads settings
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
create [ 'pad-width' ] = function ( ) {
2018-01-11 15:02:05 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-pad-width cp-sidebarlayout-element'
} ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'label' } ) . text ( Messages . settings _padWidth ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-01-11 15:02:05 +00:00
. text ( Messages . settings _padWidthHint ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2017-11-09 13:23:40 +00:00
2018-04-18 12:19:45 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-padwidth' ,
2020-05-05 09:19:32 +00:00
Messages . settings _padWidthLabel ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2017-11-09 13:23:40 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
2018-04-17 13:50:24 +00:00
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'pad' , 'width' ] , val , function ( ) {
2017-11-09 13:23:40 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
2018-04-17 13:50:24 +00:00
} ) ;
2018-04-18 12:19:45 +00:00
$cbox . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2018-04-18 12:19:45 +00:00
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2017-11-09 13:23:40 +00:00
2018-01-11 15:02:05 +00:00
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'pad' , 'width' ] , function ( e , val ) {
2018-01-11 15:02:05 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val ) {
2018-04-17 13:50:24 +00:00
$checkbox . attr ( 'checked' , 'checked' ) ;
2018-01-11 15:02:05 +00:00
}
} ) ;
2017-11-09 13:23:40 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'pad-spellcheck' ] = function ( ) {
2018-12-21 17:16:29 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-pad-spellcheck cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _padSpellcheckTitle ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
$ ( '<span>' , { 'class' : 'cp-sidebarlayout-description' } )
2018-12-21 17:16:29 +00:00
. text ( Messages . settings _padSpellcheckHint ) . appendTo ( $div ) ;
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2018-12-21 17:16:29 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-pad-spellcheck' ,
2020-05-05 09:19:32 +00:00
Messages . settings _padSpellcheckLabel ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2018-12-21 17:16:29 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'pad' , 'spellcheck' ] , val , function ( ) {
2018-12-21 17:16:29 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
$cbox . appendTo ( $div ) ;
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'pad' , 'spellcheck' ] , function ( e , val ) {
2018-12-21 17:16:29 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
makeBlock ( 'pad-notif' , function ( cb ) {
2020-04-27 13:09:29 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-pad-notif' ,
2020-05-05 09:19:32 +00:00
Messages . settings _padNotifCheckbox ,
false , { label : { class : 'noTitle' } } ) ) ;
2020-04-27 13:09:29 +00:00
var spinner = UI . makeSpinner ( $cbox ) ;
// Checkbox: "Enable safe links"
2020-05-05 09:19:32 +00:00
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2020-04-27 13:09:29 +00:00
spinner . spin ( ) ;
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'pad' , 'disableNotif' ] , val , function ( ) {
2020-04-27 13:09:29 +00:00
spinner . done ( ) ;
} ) ;
} ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'pad' , 'disableNotif' ] , function ( e , val ) {
2020-04-27 13:09:29 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val === true ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
cb ( $cbox ) ;
} , true ) ;
2018-01-11 15:02:05 +00:00
// Code settings
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
create [ 'code-indent-unit' ] = function ( ) {
2018-01-11 15:02:05 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-code-indent-unit cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _codeIndentation ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2018-01-11 15:02:05 +00:00
var $inputBlock = $ ( '<div>' , {
'class' : 'cp-sidebarlayout-input-block' ,
} ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2018-01-11 15:02:05 +00:00
var $input = $ ( '<input>' , {
'min' : 1 ,
'max' : 8 ,
type : 'number' ,
2020-05-05 09:19:32 +00:00
} ) . on ( 'change' , function ( ) {
2018-01-11 15:02:05 +00:00
var val = parseInt ( $input . val ( ) ) ;
if ( typeof ( val ) !== 'number' ) { return ; }
common . setAttribute ( [ 'codemirror' , 'indentUnit' ] , val ) ;
} ) . appendTo ( $inputBlock ) ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'codemirror' , 'indentUnit' ] , function ( e , val ) {
2018-01-11 15:02:05 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( typeof ( val ) !== 'number' ) {
$input . val ( 2 ) ;
} else {
$input . val ( val ) ;
}
2017-11-09 13:23:40 +00:00
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'code-indent-type' ] = function ( ) {
2018-01-11 15:02:05 +00:00
var key = 'indentWithTabs' ;
2017-11-09 13:23:40 +00:00
2018-01-11 15:02:05 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-code-indent-type cp-sidebarlayout-element'
2017-11-09 13:23:40 +00:00
} ) ;
2018-01-11 15:02:05 +00:00
$ ( '<label>' ) . text ( Messages . settings _codeUseTabs ) . appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2018-01-11 15:02:05 +00:00
var $inputBlock = $ ( '<div>' , {
2020-05-05 09:19:32 +00:00
'class' : 'cp-sidebarlayout-input-block' ,
} ) . css ( 'flex-flow' , 'column' )
. appendTo ( $div ) ;
2017-11-09 13:23:40 +00:00
2018-04-17 13:50:24 +00:00
2018-04-18 12:19:45 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-codeindent' ) ) ;
2020-05-05 09:19:32 +00:00
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2018-04-17 13:50:24 +00:00
var val = $checkbox . is ( ':checked' ) ;
2018-01-11 15:02:05 +00:00
if ( typeof ( val ) !== 'boolean' ) { return ; }
common . setAttribute ( [ 'codemirror' , key ] , val ) ;
2018-04-17 13:50:24 +00:00
} ) ;
2018-04-18 12:19:45 +00:00
$cbox . appendTo ( $inputBlock ) ;
2018-01-11 15:02:05 +00:00
/ * p r o x y . o n ( ' c h a n g e ' , [ ' s e t t i n g s ' , ' c o d e m i r r o r ' , k e y ] , f u n c t i o n ( o , n ) {
$input [ 0 ] . checked = ! ! n ;
} ) ; * /
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'codemirror' , key ] , function ( e , val ) {
2018-01-11 15:02:05 +00:00
if ( e ) { return void console . error ( e ) ; }
2018-04-17 13:50:24 +00:00
$checkbox [ 0 ] . checked = ! ! val ;
2018-01-11 15:02:05 +00:00
} ) ;
2017-11-09 13:23:40 +00:00
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'code-brackets' ] = function ( ) {
2019-10-15 16:00:54 +00:00
var key = 'brackets' ;
var $div = $ ( '<div>' , {
'class' : 'cp-settings-code-brackets cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _codeBrackets ) . appendTo ( $div ) ;
var $inputBlock = $ ( '<div>' , {
2020-05-05 09:19:32 +00:00
'class' : 'cp-sidebarlayout-input-block' ,
} ) . css ( 'flex-flow' , 'column' )
. appendTo ( $div ) ;
2019-10-15 16:00:54 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-codebrackets' ) ) ;
2020-05-05 09:19:32 +00:00
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2019-10-15 16:00:54 +00:00
var val = $checkbox . is ( ':checked' ) ;
if ( typeof ( val ) !== 'boolean' ) { return ; }
common . setAttribute ( [ 'codemirror' , key ] , val ) ;
} ) ;
$cbox . appendTo ( $inputBlock ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'codemirror' , key ] , function ( e , val ) {
2019-10-15 16:00:54 +00:00
if ( e ) { return void console . error ( e ) ; }
$checkbox [ 0 ] . checked = typeof ( val ) !== "boolean" || val ;
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'code-font-size' ] = function ( ) {
2018-10-29 10:46:57 +00:00
var key = 'fontSize' ;
var $div = $ ( '<div>' , {
'class' : 'cp-settings-code-font-size cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _codeFontSize ) . appendTo ( $div ) ;
var $inputBlock = $ ( '<div>' , {
'class' : 'cp-sidebarlayout-input-block' ,
} ) . appendTo ( $div ) ;
var $input = $ ( '<input>' , {
'min' : 8 ,
'max' : 30 ,
type : 'number' ,
2020-05-05 09:19:32 +00:00
} ) . on ( 'change' , function ( ) {
2018-10-29 10:46:57 +00:00
var val = parseInt ( $input . val ( ) ) ;
if ( typeof ( val ) !== 'number' ) { return ; }
common . setAttribute ( [ 'codemirror' , key ] , val ) ;
} ) . appendTo ( $inputBlock ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'codemirror' , key ] , function ( e , val ) {
2018-10-29 10:46:57 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( typeof ( val ) !== 'number' ) {
$input . val ( 12 ) ;
} else {
$input . val ( val ) ;
}
} ) ;
return $div ;
} ;
2020-05-05 09:19:32 +00:00
create [ 'code-spellcheck' ] = function ( ) {
2019-04-23 11:23:33 +00:00
var $div = $ ( '<div>' , {
'class' : 'cp-settings-code-spellcheck cp-sidebarlayout-element'
} ) ;
$ ( '<label>' ) . text ( Messages . settings _codeSpellcheckTitle ) . appendTo ( $div ) ;
//$('<span>', {'class': 'cp-sidebarlayout-description'})
// .text(Messages.settings_padSpellcheckHint).appendTo($div);
2020-05-05 09:19:32 +00:00
var $ok = $ ( '<span>' , { 'class' : 'fa fa-check' , title : Messages . saved } ) ;
var $spinner = $ ( '<span>' , { 'class' : 'fa fa-spinner fa-pulse' } ) ;
2019-04-23 11:23:33 +00:00
var $cbox = $ ( UI . createCheckbox ( 'cp-settings-code-spellcheck' ,
2020-05-05 09:19:32 +00:00
Messages . settings _codeSpellcheckLabel ,
false , { label : { class : 'noTitle' } } ) ) ;
var $checkbox = $cbox . find ( 'input' ) . on ( 'change' , function ( ) {
2019-04-23 11:23:33 +00:00
$spinner . show ( ) ;
$ok . hide ( ) ;
var val = $checkbox . is ( ':checked' ) ;
2020-05-05 09:19:32 +00:00
common . setAttribute ( [ 'codemirror' , 'spellcheck' ] , val , function ( ) {
2019-04-23 11:23:33 +00:00
$spinner . hide ( ) ;
$ok . show ( ) ;
} ) ;
} ) ;
$cbox . appendTo ( $div ) ;
$ok . hide ( ) . appendTo ( $cbox ) ;
$spinner . hide ( ) . appendTo ( $cbox ) ;
2020-05-05 09:19:32 +00:00
common . getAttribute ( [ 'codemirror' , 'spellcheck' ] , function ( e , val ) {
2019-04-23 11:23:33 +00:00
if ( e ) { return void console . error ( e ) ; }
if ( val ) {
$checkbox . attr ( 'checked' , 'checked' ) ;
}
} ) ;
return $div ;
} ;
2020-08-05 09:17:00 +00:00
makeBlock ( 'kanban-tags' , function ( cb ) {
var opt1 = UI . createRadio ( 'cp-settings-kanban-tags' , 'cp-settings-kanban-tags-and' ,
Messages . settings _kanbanTagsAnd , false , {
input : { value : 1 } ,
label : { class : 'noTitle' }
} ) ;
var opt2 = UI . createRadio ( 'cp-settings-kanban-tags' , 'cp-settings-kanban-tags-or' ,
Messages . settings _kanbanTagsOr , true , {
input : { value : 0 } ,
label : { class : 'noTitle' }
} ) ;
var div = h ( 'div.cp-settings-radio-container' , [
opt1 ,
opt2 ,
] ) ;
var $d = $ ( div ) ;
var spinner = UI . makeSpinner ( $d ) ;
$d . find ( 'input[type="radio"]' ) . on ( 'change' , function ( ) {
spinner . spin ( ) ;
var val = $ ( 'input:radio[name="cp-settings-kanban-tags"]:checked' ) . val ( ) ;
val = Number ( val ) || 0 ;
common . setAttribute ( [ 'kanban' , 'tagsAnd' ] , val , function ( ) {
spinner . done ( ) ;
} ) ;
} ) ;
common . getAttribute ( [ 'kanban' , 'tagsAnd' ] , function ( e , val ) {
if ( e ) { return void console . error ( e ) ; }
if ( val ) {
$ ( opt1 ) . find ( 'input' ) . attr ( 'checked' , 'checked' ) ;
}
} ) ;
cb ( $d ) ;
} , true ) ;
2018-01-11 15:02:05 +00:00
// Settings app
2020-05-05 09:19:32 +00:00
var createUsageButton = function ( ) {
common . createUsageBar ( null , function ( err , $bar ) {
2018-01-11 15:02:05 +00:00
if ( err ) { return void console . error ( err ) ; }
APP . $usage . html ( '' ) . append ( $bar ) ;
} , true ) ;
} ;
2017-11-09 13:23:40 +00:00
2020-05-05 09:19:32 +00:00
var hideCategories = function ( ) {
2017-11-09 13:23:40 +00:00
APP . $rightside . find ( '> div' ) . hide ( ) ;
} ;
2020-05-05 09:19:32 +00:00
var showCategories = function ( cat ) {
2017-11-09 13:23:40 +00:00
hideCategories ( ) ;
2020-05-05 09:19:32 +00:00
cat . forEach ( function ( c ) {
APP . $rightside . find ( '.' + c ) . show ( ) ;
2017-11-09 13:23:40 +00:00
} ) ;
} ;
2020-05-05 09:19:32 +00:00
var createLeftside = function ( ) {
var $categories = $ ( '<div>' , { 'class' : 'cp-sidebarlayout-categories' } )
. appendTo ( APP . $leftside ) ;
APP . $usage = $ ( '<div>' , { 'class' : 'usage' } ) . appendTo ( APP . $leftside ) ;
2018-01-29 09:38:00 +00:00
var active = privateData . category || 'account' ;
2020-05-05 09:19:32 +00:00
Object . keys ( categories ) . forEach ( function ( key ) {
2020-02-11 11:05:09 +00:00
var $category = $ ( '<div>' , {
'class' : 'cp-sidebarlayout-category' ,
'data-category' : key
} ) . appendTo ( $categories ) ;
2020-05-05 09:19:32 +00:00
if ( key === 'account' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-user-o' } ) ) ; }
if ( key === 'drive' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-hdd-o' } ) ) ; }
if ( key === 'cursor' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-i-cursor' } ) ) ; }
if ( key === 'code' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-file-code-o' } ) ) ; }
if ( key === 'pad' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-file-word-o' } ) ) ; }
if ( key === 'security' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-lock' } ) ) ; }
if ( key === 'subscription' ) { $category . append ( $ ( '<span>' , { 'class' : 'fa fa-star-o' } ) ) ; }
2020-08-05 09:36:16 +00:00
if ( key === 'kanban' ) { $category . append ( $ ( '<span>' , { 'class' : 'cptools cptools-kanban' } ) ) ; }
2017-11-09 13:23:40 +00:00
if ( key === active ) {
$category . addClass ( 'cp-leftside-active' ) ;
}
2020-05-05 09:19:32 +00:00
$category . click ( function ( ) {
2018-01-25 11:09:20 +00:00
if ( ! Array . isArray ( categories [ key ] ) && categories [ key ] . onClick ) {
categories [ key ] . onClick ( ) ;
2018-01-25 11:10:46 +00:00
return ;
2018-01-25 11:09:20 +00:00
}
2017-11-09 13:23:40 +00:00
active = key ;
2019-03-27 16:00:28 +00:00
common . setHash ( key ) ;
2017-11-09 13:23:40 +00:00
$categories . find ( '.cp-leftside-active' ) . removeClass ( 'cp-leftside-active' ) ;
$category . addClass ( 'cp-leftside-active' ) ;
showCategories ( categories [ key ] ) ;
} ) ;
2020-05-05 09:19:32 +00:00
$category . append ( Messages [ 'settings_cat_' + key ] || key ) ;
2017-11-09 13:23:40 +00:00
} ) ;
showCategories ( categories [ active ] ) ;
2020-01-28 10:31:03 +00:00
common . setHash ( active ) ;
2017-11-09 13:23:40 +00:00
} ;
2020-05-05 09:19:32 +00:00
nThen ( function ( waitFor ) {
2017-11-13 11:00:15 +00:00
$ ( waitFor ( UI . addLoadingScreen ) ) ;
2020-05-05 09:19:32 +00:00
SFCommon . create ( waitFor ( function ( c ) { APP . common = common = c ; } ) ) ;
} ) . nThen ( function ( waitFor ) {
2017-11-09 13:23:40 +00:00
APP . $container = $ ( '#cp-sidebarlayout-container' ) ;
APP . $toolbar = $ ( '#cp-toolbar' ) ;
2020-05-05 09:19:32 +00:00
APP . $leftside = $ ( '<div>' , { id : 'cp-sidebarlayout-leftside' } ) . appendTo ( APP . $container ) ;
APP . $rightside = $ ( '<div>' , { id : 'cp-sidebarlayout-rightside' } ) . appendTo ( APP . $container ) ;
2017-11-09 13:23:40 +00:00
sframeChan = common . getSframeChannel ( ) ;
sframeChan . onReady ( waitFor ( ) ) ;
2020-05-05 09:19:32 +00:00
} ) . nThen ( function ( /*waitFor*/ ) {
2017-11-09 13:23:40 +00:00
metadataMgr = common . getMetadataMgr ( ) ;
privateData = metadataMgr . getPrivateData ( ) ;
// Toolbar
2019-05-23 14:09:04 +00:00
var displayed = [ 'useradmin' , 'newpad' , 'limit' , 'pageTitle' , 'notifications' ] ;
2017-11-09 13:23:40 +00:00
var configTb = {
displayed : displayed ,
sfCommon : common ,
$container : APP . $toolbar ,
pageTitle : Messages . settings _title ,
metadataMgr : common . getMetadataMgr ( ) ,
} ;
APP . toolbar = Toolbar . create ( configTb ) ;
APP . toolbar . $rightside . hide ( ) ;
2020-02-03 11:04:33 +00:00
APP . history = common . makeUniversal ( 'history' ) ;
2017-11-09 13:23:40 +00:00
// Content
var $rightside = APP . $rightside ;
2018-08-28 09:42:48 +00:00
/ * f o r ( v a r f i n c r e a t e ) {
2018-01-11 15:02:05 +00:00
if ( typeof create [ f ] !== "function" ) { continue ; }
$rightside . append ( create [ f ] ( ) ) ;
2018-08-28 09:42:48 +00:00
} * /
2020-05-05 09:19:32 +00:00
var addItem = function ( cssClass ) {
2018-08-28 09:42:48 +00:00
var item = cssClass . slice ( 12 ) ; // remove 'cp-settings-'
2020-05-05 09:19:32 +00:00
if ( typeof ( create [ item ] ) === "function" ) {
2018-08-28 09:42:48 +00:00
$rightside . append ( create [ item ] ( ) ) ;
}
} ;
for ( var cat in categories ) {
if ( ! Array . isArray ( categories [ cat ] ) ) { continue ; }
categories [ cat ] . forEach ( addItem ) ;
2017-11-09 13:23:40 +00:00
}
2020-02-03 11:04:33 +00:00
2017-11-09 13:23:40 +00:00
// TODO RPC
//obj.proxy.on('change', [], refresh);
//obj.proxy.on('remove', [], refresh);
//Cryptpad.onDisplayNameChanged(refresh);
createLeftside ( ) ;
createUsageButton ( ) ;
2017-11-13 11:00:15 +00:00
UI . removeLoadingScreen ( ) ;
2017-11-09 13:23:40 +00:00
} ) ;
2020-05-06 14:31:17 +00:00
} ) ;