2015-01-20 10:25:10 +00:00
define ( [
'jquery' ,
'underscore' ,
'backbone' ,
2015-01-31 05:17:47 +00:00
'common' ,
2015-12-27 14:09:52 +00:00
'app/views/share' ,
2016-02-23 11:54:33 +00:00
'app/views/dialogs/repo-change-password' ,
2016-01-28 06:33:17 +00:00
'app/views/dialogs/repo-history-settings' ,
2016-02-07 09:29:49 +00:00
'app/views/dialogs/repo-share-link-admin' ,
2016-03-22 03:47:52 +00:00
'app/views/dialogs/repo-folder-perm-admin' ,
2016-03-22 10:32:42 +00:00
'app/views/widgets/hl-item-view' ,
'app/views/widgets/dropdown'
2016-02-23 11:54:33 +00:00
] , function ( $ , _ , Backbone , Common , ShareView , RepoChangePasswordDialog ,
2016-03-22 03:47:52 +00:00
HistorySettingsDialog , RepoShareLinkAdminDialog , RepoFolderPermAdminDialog ,
2016-03-22 10:32:42 +00:00
HLItemView , DropdownView ) {
2015-01-20 10:25:10 +00:00
'use strict' ;
2016-03-22 03:47:52 +00:00
var RepoView = HLItemView . extend ( {
2015-01-20 10:25:10 +00:00
tagName : 'tr' ,
2015-04-03 04:15:41 +00:00
template : _ . template ( $ ( '#repo-tmpl' ) . html ( ) ) ,
2016-11-29 07:03:13 +00:00
mobileTemplate : _ . template ( $ ( '#repo-mobile-tmpl' ) . html ( ) ) , // for extra small devices (phones, less than 768px)
2015-12-27 14:09:52 +00:00
renameTemplate : _ . template ( $ ( "#repo-rename-form-template" ) . html ( ) ) ,
2016-01-14 03:56:01 +00:00
transferTemplate : _ . template ( $ ( '#repo-transfer-form-tmpl' ) . html ( ) ) ,
2017-07-20 06:10:09 +00:00
addLabelTemplate : _ . template ( $ ( '#add-lib-label-form-tmpl' ) . html ( ) ) ,
2015-01-20 10:25:10 +00:00
2015-01-31 05:17:47 +00:00
events : {
2017-06-26 08:08:54 +00:00
'click' : 'clickItem' ,
2016-12-28 09:08:10 +00:00
'click td:lt(2)' : 'visitRepo' ,
2015-03-31 04:15:47 +00:00
'click .repo-delete-btn' : 'del' ,
2015-12-27 14:09:52 +00:00
'click .repo-share-btn' : 'share' ,
'click .js-repo-rename' : 'rename' ,
2016-01-14 03:56:01 +00:00
'click .js-repo-transfer' : 'transfer' ,
2016-02-23 11:54:33 +00:00
'click .js-repo-change-password' : 'changePassword' ,
2016-02-07 09:29:49 +00:00
'click .js-popup-history-setting' : 'popupHistorySetting' ,
'click .js-popup-share-link-admin' : 'popupShareLinkAdmin' ,
2017-06-26 08:08:54 +00:00
'click .js-popup-folder-perm-admin' : 'popupFolderPermAdmin' ,
2017-07-20 06:10:09 +00:00
'click .js-repo-details' : 'viewDetails' ,
2018-07-23 15:01:21 +00:00
'click .js-add-label' : 'addLabel' ,
'click .mobile-menu-control' : 'showMobileMenu' ,
'click .mobile-menu-mask' : 'closeMobileMenu'
2015-01-31 05:17:47 +00:00
} ,
2015-02-04 13:57:26 +00:00
2017-06-26 08:08:54 +00:00
initialize : function ( options ) {
2016-03-22 03:47:52 +00:00
HLItemView . prototype . initialize . call ( this ) ;
2017-06-26 08:08:54 +00:00
this . myReposView = options . myReposView ;
2016-01-11 09:16:21 +00:00
this . listenTo ( this . model , "change" , this . render ) ;
2015-01-20 10:25:10 +00:00
} ,
render : function ( ) {
2016-03-11 04:10:55 +00:00
var obj = this . model . toJSON ( ) ;
2017-07-31 09:30:43 +00:00
var icon _size = Common . isHiDPI ( ) ? 48 : 24 ;
2016-03-11 04:10:55 +00:00
var icon _url = this . model . getIconUrl ( icon _size ) ;
2016-11-29 07:03:13 +00:00
var tmpl , dropdownOptions = { } ;
if ( $ ( window ) . width ( ) >= 768 ) {
tmpl = this . template ;
} else {
tmpl = this . mobileTemplate ;
dropdownOptions = { 'right' : 0 } ;
}
2016-03-14 04:15:28 +00:00
_ . extend ( obj , {
'icon_url' : icon _url ,
2016-08-22 03:20:08 +00:00
'icon_title' : this . model . getIconTitle ( ) ,
'can_generate_share_link' : app . pageOptions . can _generate _share _link ,
'can_generate_upload_link' : app . pageOptions . can _generate _upload _link
2016-03-14 04:15:28 +00:00
} ) ;
2016-11-29 07:03:13 +00:00
this . $el . html ( tmpl ( obj ) ) ;
this . dropdown = new DropdownView ( $ . extend ( {
2016-04-01 09:53:41 +00:00
el : this . $ ( '.sf-dropdown' )
2016-11-29 07:03:13 +00:00
} , dropdownOptions ) ) ;
2018-07-23 15:01:21 +00:00
this . mobileMenu = this . $ ( ".mobile-menu-container" ) ;
2015-01-20 10:25:10 +00:00
return this ;
2015-01-31 05:17:47 +00:00
} ,
2017-06-26 08:08:54 +00:00
clickItem : function ( e ) {
var target = e . target || event . srcElement ;
if ( this . $ ( 'td' ) . is ( target ) &&
2017-12-05 09:53:45 +00:00
this . myReposView . repoDetailsView . $el . is ( ':visible' ) ) {
2017-06-26 08:08:54 +00:00
this . viewDetails ( ) ;
}
} ,
2016-12-28 09:08:10 +00:00
visitRepo : function ( ) {
if ( $ ( window ) . width ( ) < 768 ) {
location . href = this . $ ( '.repo-name-span a' ) . attr ( 'href' ) ;
}
} ,
2015-03-31 04:15:47 +00:00
del : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2015-03-31 04:15:47 +00:00
var _this = this ;
2016-06-14 03:06:20 +00:00
var repo _name = this . model . get ( 'name' ) ;
var popupTitle = gettext ( "Delete Library" ) ;
var popupContent = gettext ( "Are you sure you want to delete %s ?" ) . replace ( '%s' , '<span class="op-target ellipsis ellipsis-op-target">' + Common . HTMLescape ( repo _name ) + '</span>' ) ;
2016-08-22 03:20:08 +00:00
var yesCallback = function ( ) {
2015-03-31 04:15:47 +00:00
$ . ajax ( {
2016-06-20 10:34:30 +00:00
url : Common . getUrl ( { 'name' : 'repo' , 'repo_id' : _this . model . get ( 'id' ) } ) ,
type : 'DELETE' ,
2016-06-14 03:06:20 +00:00
cache : false ,
dataType : 'json' ,
2016-06-20 10:34:30 +00:00
beforeSend : Common . prepareCSRFToken ,
2016-06-14 03:06:20 +00:00
success : function ( ) {
_this . $el . remove ( ) ;
Common . feedback ( gettext ( "Successfully deleted." ) , 'success' ) ;
2015-01-31 05:17:47 +00:00
} ,
2016-06-14 03:06:20 +00:00
error : function ( xhr , textStatus , errorThrown ) {
Common . ajaxErrorHandler ( xhr , textStatus , errorThrown ) ;
} ,
complete : function ( ) {
$ . modal . close ( ) ;
2015-01-31 05:17:47 +00:00
}
} ) ;
2016-06-14 03:06:20 +00:00
} ;
Common . showConfirm ( popupTitle , popupContent , yesCallback ) ;
this . togglePopup ( ) ;
2016-04-12 03:17:27 +00:00
return false ;
2015-01-31 05:17:47 +00:00
} ,
share : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2015-02-26 06:39:35 +00:00
var options = {
2015-03-18 02:45:13 +00:00
'is_repo_owner' : true ,
'is_virtual' : this . model . get ( 'virtual' ) ,
2015-05-27 09:58:21 +00:00
'user_perm' : 'rw' ,
2015-03-18 02:45:13 +00:00
'repo_id' : this . model . get ( 'id' ) ,
2015-05-13 09:35:14 +00:00
'repo_encrypted' : this . model . get ( 'encrypted' ) ,
2015-03-18 02:45:13 +00:00
'is_dir' : true ,
'dirent_path' : '/' ,
'obj_name' : this . model . get ( 'name' )
} ;
new ShareView ( options ) ;
2016-04-12 03:17:27 +00:00
return false ;
2015-12-27 14:09:52 +00:00
} ,
togglePopup : function ( ) {
2016-03-22 10:32:42 +00:00
this . dropdown . hide ( ) ;
2015-12-27 14:09:52 +00:00
} ,
rename : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2015-12-27 14:09:52 +00:00
var repo _name = this . model . get ( 'name' ) ;
var form = $ ( this . renameTemplate ( {
repo _name : repo _name
} ) ) ;
var $name _span = this . $ ( '.repo-name-span' ) ,
$op _td = this . $ ( '.repo-op-td' ) ,
$name _td = $name _span . closest ( 'td' ) ;
$name _td . attr ( 'colspan' , 2 ) . css ( {
'width' : $name _span . width ( ) + $op _td . outerWidth ( ) ,
'height' : $name _span . height ( )
} ) . append ( form ) ;
$op _td . hide ( ) ;
$name _span . hide ( ) ;
2018-02-05 08:47:56 +00:00
$ ( '[name="newname"]' , form ) . trigger ( 'select' ) ;
2015-12-27 14:09:52 +00:00
this . togglePopup ( ) ;
2016-03-22 03:47:52 +00:00
app . ui . freezeItemHightlight = true ;
2015-12-27 14:09:52 +00:00
var cancelRename = function ( ) {
2016-03-22 03:47:52 +00:00
app . ui . freezeItemHightlight = false ;
2015-12-27 14:09:52 +00:00
form . remove ( ) ;
$op _td . show ( ) ;
$name _span . show ( ) ;
$name _td . attr ( 'colspan' , 1 ) . css ( {
'width' : $name _span . width ( )
} ) ;
return false ; // stop bubbling (to 'doc click to hide .hidden-op')
} ;
2018-02-05 08:47:56 +00:00
$ ( '.cancel' , form ) . on ( 'click' , cancelRename ) ;
2015-12-27 14:09:52 +00:00
2016-01-11 09:16:21 +00:00
var form _id = form . attr ( 'id' ) ;
var _this = this ;
2018-02-05 08:47:56 +00:00
form . on ( 'submit' , function ( ) {
2016-01-11 09:16:21 +00:00
var new _name = $ . trim ( $ ( '[name="newname"]' , form ) . val ( ) ) ;
2017-04-14 06:03:25 +00:00
var err _msg ;
2016-01-11 09:16:21 +00:00
if ( ! new _name ) {
2017-04-14 06:03:25 +00:00
err _msg = gettext ( "It is required." ) ;
Common . feedback ( err _msg , 'error' ) ;
2016-01-11 09:16:21 +00:00
return false ;
}
2017-04-14 06:03:25 +00:00
if ( new _name . indexOf ( '/' ) != - 1 ) {
err _msg = gettext ( "Name should not include '/'." ) ;
Common . feedback ( err _msg , 'error' ) ;
2016-01-11 09:16:21 +00:00
return false ;
}
2017-04-14 06:03:25 +00:00
2016-01-11 09:16:21 +00:00
if ( new _name == repo _name ) {
cancelRename ( ) ;
return false ;
}
var post _data = {
'repo_name' : new _name
} ;
var post _url = Common . getUrl ( {
2016-01-28 06:33:17 +00:00
name : 'repo' ,
2016-01-11 09:16:21 +00:00
repo _id : _this . model . get ( 'id' )
2016-01-28 06:33:17 +00:00
} ) + '?op=rename' ;
2016-01-11 09:16:21 +00:00
var after _op _success = function ( data ) {
2016-03-22 03:47:52 +00:00
app . ui . freezeItemHightlight = false ;
2016-01-11 09:16:21 +00:00
_this . model . set ( { 'name' : new _name } ) ; // it will trigger 'change' event
} ;
var after _op _error = function ( xhr ) {
2018-07-31 10:15:44 +00:00
var error _msg = Common . prepareAjaxErrorMsg ( xhr ) ;
Common . feedback ( error _msg , 'error' ) ;
2016-01-11 09:16:21 +00:00
Common . enableButton ( submit _btn ) ;
} ;
var submit _btn = $ ( '[type="submit"]' , form ) ;
Common . disableButton ( submit _btn ) ;
$ . ajax ( {
url : post _url ,
type : 'POST' ,
dataType : 'json' ,
beforeSend : Common . prepareCSRFToken ,
data : post _data ,
success : after _op _success ,
error : after _op _error
} ) ;
return false ;
} ) ;
2015-12-27 14:09:52 +00:00
return false ;
2016-01-14 03:56:01 +00:00
} ,
transfer : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2016-01-14 03:56:01 +00:00
var _this = this ;
this . togglePopup ( ) ; // Close the popup
2016-01-28 06:33:17 +00:00
var repo _name = this . model . get ( 'name' ) ;
var $form = $ ( this . transferTemplate ( {
title : gettext ( "Transfer Library {library_name} To" ) . replace ( '{library_name}' ,
'<span class="op-target ellipsis ellipsis-op-target" title="' + Common . HTMLescape ( repo _name ) + '">' + Common . HTMLescape ( repo _name ) + '</span>' )
} ) ) ;
2016-01-14 03:56:01 +00:00
$form . modal ( { focus : false } ) ;
$ ( '#simplemodal-container' ) . css ( { 'width' : 'auto' , 'height' : 'auto' } ) ;
$ ( '[name="email"]' , $form ) . select2 ( $ . extend (
Common . contactInputOptionsForSelect2 ( ) , {
2016-12-05 10:20:07 +00:00
width : '280px' ,
2018-08-03 08:08:29 +00:00
maximumSelectionSize : 1 ,
placeholder : gettext ( "Search user or enter email and press Enter" ) , // to override 'placeholder' returned by `Common.conta...`
formatSelectionTooBig : gettext ( "You cannot select any more choices" )
2016-01-14 03:56:01 +00:00
} ) ) ;
2018-02-05 08:47:56 +00:00
$form . on ( 'submit' , function ( ) {
2018-08-03 08:08:29 +00:00
var email = $ . trim ( $ ( '[name="email"]' , $ ( this ) ) . val ( ) ) ;
if ( ! email ) {
2016-01-14 03:56:01 +00:00
return false ;
}
if ( email == _this . model . get ( 'owner' ) ) {
return false ;
}
var $submitBtn = $ ( '[type="submit"]' , $ ( this ) ) ;
Common . disableButton ( $submitBtn ) ;
$ . ajax ( {
url : Common . getUrl ( {
2016-01-28 06:33:17 +00:00
'name' : 'repo_owner' ,
2016-01-14 03:56:01 +00:00
'repo_id' : _this . model . get ( 'id' )
} ) ,
type : 'put' ,
dataType : 'json' ,
beforeSend : Common . prepareCSRFToken ,
data : {
2018-08-03 08:08:29 +00:00
'owner' : email
2016-01-14 03:56:01 +00:00
} ,
success : function ( ) {
$ . modal . close ( ) ;
_this . remove ( ) ;
2016-01-28 06:33:17 +00:00
Common . feedback ( gettext ( "Successfully transferred the library." ) , 'success' ) ;
2016-01-14 03:56:01 +00:00
} ,
error : function ( xhr ) {
2018-07-31 10:15:44 +00:00
var error _msg = Common . prepareAjaxErrorMsg ( xhr ) ;
2016-01-14 03:56:01 +00:00
$ ( '.error' , $form ) . html ( error _msg ) . show ( ) ;
Common . enableButton ( $submitBtn ) ;
}
} ) ;
return false ;
} ) ;
2017-10-13 06:53:26 +00:00
return false ;
2015-12-27 14:09:52 +00:00
} ,
2016-02-07 09:29:49 +00:00
popupHistorySetting : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2015-12-27 14:09:52 +00:00
var options = {
'repo_name' : this . model . get ( 'name' ) ,
2017-08-11 09:51:11 +00:00
'repo_id' : this . model . get ( 'id' ) ,
'url_name' : 'repo_history_limit'
2015-12-27 14:09:52 +00:00
} ;
this . togglePopup ( ) ; // close the popup
new HistorySettingsDialog ( options ) ;
return false ;
} ,
2015-12-28 03:17:26 +00:00
popupShareLinkAdmin : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2015-12-28 03:17:26 +00:00
var options = {
'repo_name' : this . model . get ( 'name' ) ,
'repo_id' : this . model . get ( 'id' )
} ;
this . togglePopup ( ) ; // close the popup
new RepoShareLinkAdminDialog ( options ) ;
2015-12-27 14:09:52 +00:00
return false ;
2016-02-07 09:29:49 +00:00
} ,
popupFolderPermAdmin : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2016-02-07 09:29:49 +00:00
var options = {
'repo_name' : this . model . get ( 'name' ) ,
'repo_id' : this . model . get ( 'id' )
} ;
this . togglePopup ( ) ; // close the popup
new RepoFolderPermAdminDialog ( options ) ;
return false ;
2016-02-23 11:54:33 +00:00
} ,
changePassword : function ( ) {
var options = {
'repo_name' : this . model . get ( 'name' ) ,
'repo_id' : this . model . get ( 'id' )
} ;
this . togglePopup ( ) ; // close the popup
new RepoChangePasswordDialog ( options ) ;
return false ;
2017-06-26 08:08:54 +00:00
} ,
viewDetails : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2017-06-26 08:08:54 +00:00
var obj = this . model . toJSON ( ) ;
2017-07-31 09:30:43 +00:00
var icon _size = Common . isHiDPI ( ) ? 48 : 24 ;
2017-06-26 08:08:54 +00:00
var data = $ . extend ( { } , obj , {
icon _url : this . model . getIconUrl ( icon _size ) ,
2017-07-31 09:30:43 +00:00
big _icon _url : this . model . getIconUrl ( )
2017-06-26 08:08:54 +00:00
} ) ;
2017-06-27 10:58:08 +00:00
var detailsView = this . myReposView . repoDetailsView ;
detailsView . show ( data ) ;
// fetch other data
$ . ajax ( {
url : Common . getUrl ( {
'name' : 'repo_v2.1' ,
'repo_id' : this . model . get ( 'id' )
} ) ,
cache : false ,
dataType : 'json' ,
success : function ( data ) {
detailsView . update ( {
'file_count' : data . file _count
} ) ;
} ,
error : function ( ) {
detailsView . update ( { 'error' : true } ) ;
}
} ) ;
2017-06-26 08:08:54 +00:00
this . togglePopup ( ) ; // close the popup
2017-07-20 06:10:09 +00:00
return false ;
} ,
addLabel : function ( ) {
var _this = this ;
this . togglePopup ( ) ; // Close the popup
var $form = $ ( this . addLabelTemplate ( ) ) ;
var $el = $ ( '<div><span class="loading-icon loading-tip"></span></div>' ) ;
$el . modal ( { focus : false , minWidth : 280 } ) ;
$ ( '#simplemodal-container' ) . css ( { 'height' : 'auto' } ) ;
$ . ajax ( {
// get all existing repo snapshot labels of the user
url : Common . getUrl ( { 'name' : 'user_repo_labels' } ) ,
cache : false ,
dataType : 'json' ,
success : function ( data ) { // data: ['xx', ...]
var s2 _data = [ ] ;
for ( var i = 0 , len = data . length ; i < len ; i ++ ) {
s2 _data . push ( {
'id' : data [ i ] ,
'text' : data [ i ]
} ) ;
}
$ ( '#simplemodal-data' ) . html ( $form ) ;
2018-08-03 08:08:29 +00:00
$ ( '[name="labels"]' , $form ) . select2 ( { tags : s2 _data } ) ;
2017-07-20 06:10:09 +00:00
} ,
error : function ( xhr ) {
2018-07-31 10:15:44 +00:00
var error _msg = Common . prepareAjaxErrorMsg ( xhr ) ;
2017-07-20 06:10:09 +00:00
$ ( '#simplemodal-data' ) . html ( '<p class="error">' + error _msg + '</p>' ) ;
}
} ) ;
2018-02-05 08:47:56 +00:00
$form . on ( 'submit' , function ( ) {
2017-07-20 06:10:09 +00:00
var $input = $ ( '[name="labels"]' , $form ) ;
2018-08-03 08:08:29 +00:00
var labels = $input . select2 ( 'val' ) ;
2017-07-20 06:10:09 +00:00
var $error = $ ( '.error' , $form ) ;
var $submit = $ ( '[type="submit"]' , $form ) ;
2018-08-03 08:08:29 +00:00
if ( labels . length == 0 ) {
2017-07-20 06:10:09 +00:00
$error . html ( gettext ( "It is required." ) ) . show ( ) ;
return false ;
}
Common . disableButton ( $submit ) ;
$ . ajax ( {
url : Common . getUrl ( {
'name' : 'repo_labels'
} ) ,
type : 'POST' ,
cache : false ,
dataType : 'json' ,
beforeSend : Common . prepareCSRFToken ,
data : {
'repo_id' : _this . model . get ( 'id' ) ,
'tag_names' : labels . join ( ',' )
} ,
success : function ( ) {
var msg = gettext ( "Successfully added label(s) for library {placeholder}" )
. replace ( '{placeholder}' , _this . model . get ( 'name' ) ) ;
$ . modal . close ( ) ;
Common . feedback ( msg , 'success' ) ;
} ,
error : function ( xhr ) {
2018-07-31 10:15:44 +00:00
var error _msg = Common . prepareAjaxErrorMsg ( xhr ) ;
2017-07-20 06:10:09 +00:00
$error . html ( error _msg ) . show ( ) ;
Common . enableButton ( $submit ) ;
}
} ) ;
return false ;
} ) ;
2018-07-23 15:01:21 +00:00
return false ;
} ,
2018-07-31 08:59:46 +00:00
showMobileMenu : function ( event ) {
2018-07-23 15:01:21 +00:00
var mobileMenu = this . mobileMenu . length ? this . mobileMenu : null ;
2018-07-31 08:59:46 +00:00
if ( mobileMenu ) {
2018-07-23 15:01:21 +00:00
mobileMenu . slideDown ( 'fast' ) ;
}
return false ;
} ,
hideMobileMenu : function ( ) {
var mobileMenu = this . mobileMenu . length ? this . mobileMenu : null ;
2018-07-31 08:59:46 +00:00
if ( mobileMenu ) {
2018-07-23 15:01:21 +00:00
mobileMenu . slideUp ( 'fast' ) ;
}
} ,
2018-07-31 08:59:46 +00:00
closeMobileMenu : function ( ) {
2018-07-23 15:01:21 +00:00
this . hideMobileMenu ( ) ;
2017-06-26 08:08:54 +00:00
return false ;
2015-01-20 10:25:10 +00:00
}
} ) ;
return RepoView ;
} ) ;