2015-08-05 10:24:26 +03:00
'use strict' ;
2015-07-24 18:13:42 +03:00
var csrf ;
2015-09-06 13:57:25 +03:00
var suburl ;
2015-07-24 18:13:42 +03:00
2015-08-19 23:31:28 +03:00
function initCommentPreviewTab ( $form ) {
2016-08-18 02:10:07 +03:00
var $tabMenu = $form . find ( '.tabular.menu' ) ;
$tabMenu . find ( '.item' ) . tab ( ) ;
$tabMenu . find ( '.item[data-tab="' + $tabMenu . data ( 'preview' ) + '"]' ) . click ( function ( ) {
2015-08-10 13:57:57 +03:00
var $this = $ ( this ) ;
$ . post ( $this . data ( 'url' ) , {
"_csrf" : csrf ,
"mode" : "gfm" ,
"context" : $this . data ( 'context' ) ,
2016-08-18 02:10:07 +03:00
"text" : $form . find ( '.tab.segment[data-tab="' + $tabMenu . data ( 'write' ) + '"] textarea' ) . val ( )
2015-08-10 13:57:57 +03:00
} ,
function ( data ) {
2016-08-18 08:44:07 +03:00
var $previewPanel = $form . find ( '.tab.segment[data-tab="' + $tabMenu . data ( 'preview' ) + '"]' ) ;
$previewPanel . html ( data ) ;
emojify . run ( $previewPanel [ 0 ] ) ;
$ ( 'pre code' , $previewPanel [ 0 ] ) . each ( function ( i , block ) {
2016-02-01 22:52:47 +03:00
hljs . highlightBlock ( block ) ;
} ) ;
2015-08-10 13:57:57 +03:00
}
) ;
} ) ;
2015-11-12 00:19:28 +03:00
buttonsClickOnEnter ( ) ;
2015-08-19 23:31:28 +03:00
}
2016-08-12 12:29:29 +03:00
var previewFileModes ;
2016-08-11 15:48:08 +03:00
function initEditPreviewTab ( $form ) {
2016-08-18 02:10:07 +03:00
var $tabMenu = $form . find ( '.tabular.menu' ) ;
$tabMenu . find ( '.item' ) . tab ( ) ;
var $previewTab = $tabMenu . find ( '.item[data-tab="' + $tabMenu . data ( 'preview' ) + '"]' ) ;
if ( $previewTab . length ) {
previewFileModes = $previewTab . data ( 'preview-file-modes' ) . split ( ',' ) ;
$previewTab . click ( function ( ) {
2016-08-11 15:48:08 +03:00
var $this = $ ( this ) ;
$ . post ( $this . data ( 'url' ) , {
"_csrf" : csrf ,
"mode" : "gfm" ,
"context" : $this . data ( 'context' ) ,
2016-08-18 02:10:07 +03:00
"text" : $form . find ( '.tab.segment[data-tab="' + $tabMenu . data ( 'write' ) + '"] textarea' ) . val ( )
2016-08-11 15:48:08 +03:00
} ,
function ( data ) {
2016-08-18 08:44:07 +03:00
var $previewPanel = $form . find ( '.tab.segment[data-tab="' + $tabMenu . data ( 'preview' ) + '"]' ) ;
$previewPanel . html ( data ) ;
emojify . run ( $previewPanel [ 0 ] ) ;
$ ( 'pre code' , $previewPanel [ 0 ] ) . each ( function ( i , block ) {
2016-08-11 15:48:08 +03:00
hljs . highlightBlock ( block ) ;
} ) ;
}
) ;
} ) ;
}
}
function initEditDiffTab ( $form ) {
2016-08-18 02:10:07 +03:00
var $tabMenu = $form . find ( '.tabular.menu' ) ;
$tabMenu . find ( '.item' ) . tab ( ) ;
$tabMenu . find ( '.item[data-tab="' + $tabMenu . data ( 'diff' ) + '"]' ) . click ( function ( ) {
2016-08-11 15:48:08 +03:00
var $this = $ ( this ) ;
$ . post ( $this . data ( 'url' ) , {
"_csrf" : csrf ,
"context" : $this . data ( 'context' ) ,
2016-08-18 02:10:07 +03:00
"content" : $form . find ( '.tab.segment[data-tab="' + $tabMenu . data ( 'write' ) + '"] textarea' ) . val ( )
2016-08-11 15:48:08 +03:00
} ,
function ( data ) {
2016-08-18 08:44:07 +03:00
var $diffPreviewPanel = $form . find ( '.tab.segment[data-tab="' + $tabMenu . data ( 'diff' ) + '"]' ) ;
$diffPreviewPanel . html ( data ) ;
emojify . run ( $diffPreviewPanel [ 0 ] ) ;
2016-08-11 15:48:08 +03:00
}
) ;
} ) ;
2016-08-18 02:10:07 +03:00
}
2016-08-11 15:48:08 +03:00
2016-08-18 02:10:07 +03:00
function initEditForm ( ) {
if ( $ ( '.edit.form' ) . length == 0 ) {
return ;
}
initEditPreviewTab ( $ ( '.edit.form' ) ) ;
initEditDiffTab ( $ ( '.edit.form' ) ) ;
2016-08-11 15:48:08 +03:00
}
2017-08-24 15:30:27 +03:00
function initBranchSelector ( ) {
var $selectBranch = $ ( '.ui.select-branch' )
var $branchMenu = $selectBranch . find ( '.reference-list-menu' ) ;
$branchMenu . find ( '.item:not(.no-select)' ) . click ( function ( ) {
var selectedValue = $ ( this ) . data ( 'id' ) ;
$ ( $ ( this ) . data ( 'id-selector' ) ) . val ( selectedValue ) ;
$selectBranch . find ( '.ui .branch-name' ) . text ( selectedValue ) ;
} ) ;
$selectBranch . find ( '.reference.column' ) . click ( function ( ) {
$selectBranch . find ( '.scrolling.reference-list-menu' ) . css ( 'display' , 'none' ) ;
$selectBranch . find ( '.reference .text' ) . removeClass ( 'black' ) ;
$ ( $ ( this ) . data ( 'target' ) ) . css ( 'display' , 'block' ) ;
$ ( this ) . find ( '.text' ) . addClass ( 'black' ) ;
return false ;
} ) ;
}
2016-08-18 02:10:07 +03:00
2017-03-15 04:10:35 +03:00
function updateIssuesMeta ( url , action , issueIds , elementId , afterSuccess ) {
$ . ajax ( {
type : "POST" ,
url : url ,
data : {
"_csrf" : csrf ,
"action" : action ,
"issue_ids" : issueIds ,
"id" : elementId
} ,
success : afterSuccess
} )
}
2017-12-04 02:14:26 +03:00
function initReactionSelector ( parent ) {
var reactions = '' ;
if ( ! parent ) {
parent = $ ( document ) ;
reactions = '.reactions > ' ;
}
parent . find ( reactions + 'a.label' ) . popup ( { 'position' : 'bottom left' , 'metadata' : { 'content' : 'title' , 'title' : 'none' } } ) ;
parent . find ( '.select-reaction > .menu > .item, ' + reactions + 'a.label' ) . on ( 'click' , function ( e ) {
var vm = this ;
e . preventDefault ( ) ;
if ( $ ( this ) . hasClass ( 'disabled' ) ) return ;
var actionURL = $ ( this ) . hasClass ( 'item' ) ?
$ ( this ) . closest ( '.select-reaction' ) . data ( 'action-url' ) :
$ ( this ) . data ( 'action-url' ) ;
var url = actionURL + '/' + ( $ ( this ) . hasClass ( 'blue' ) ? 'unreact' : 'react' ) ;
$ . ajax ( {
type : 'POST' ,
url : url ,
data : {
'_csrf' : csrf ,
'content' : $ ( this ) . data ( 'content' )
}
} ) . done ( function ( resp ) {
if ( resp && ( resp . html || resp . empty ) ) {
var content = $ ( vm ) . closest ( '.content' ) ;
var react = content . find ( '.segment.reactions' ) ;
if ( react . length > 0 ) {
react . remove ( ) ;
}
if ( ! resp . empty ) {
2017-12-06 06:17:50 +03:00
react = $ ( '<div class="ui attached segment reactions"></div>' ) ;
var attachments = content . find ( '.segment.bottom:first' ) ;
if ( attachments . length > 0 ) {
react . insertBefore ( attachments ) ;
} else {
react . appendTo ( content ) ;
}
2017-12-04 02:14:26 +03:00
react . html ( resp . html ) ;
var hasEmoji = react . find ( '.has-emoji' ) ;
for ( var i = 0 ; i < hasEmoji . length ; i ++ ) {
emojify . run ( hasEmoji . get ( i ) ) ;
}
react . find ( '.dropdown' ) . dropdown ( ) ;
initReactionSelector ( react ) ;
}
}
} ) ;
} ) ;
}
2015-08-19 23:31:28 +03:00
function initCommentForm ( ) {
if ( $ ( '.comment.form' ) . length == 0 ) {
return
}
2017-08-24 15:30:27 +03:00
initBranchSelector ( ) ;
2015-08-19 23:31:28 +03:00
initCommentPreviewTab ( $ ( '.comment.form' ) ) ;
2015-08-10 13:57:57 +03:00
// Labels
var $list = $ ( '.ui.labels.list' ) ;
2016-08-18 08:44:07 +03:00
var $noSelect = $list . find ( '.no-select' ) ;
var $labelMenu = $ ( '.select-label .menu' ) ;
var hasLabelUpdateAction = $labelMenu . data ( 'action' ) == 'update' ;
2015-08-14 19:42:43 +03:00
2017-01-30 15:46:45 +03:00
$ ( '.select-label' ) . dropdown ( 'setting' , 'onHide' , function ( ) {
2017-01-30 17:21:17 +03:00
if ( hasLabelUpdateAction ) {
location . reload ( ) ;
}
2017-01-30 15:46:45 +03:00
} ) ;
2016-08-18 08:44:07 +03:00
$labelMenu . find ( '.item:not(.no-select)' ) . click ( function ( ) {
2015-08-10 13:57:57 +03:00
if ( $ ( this ) . hasClass ( 'checked' ) ) {
2015-09-05 21:11:05 +03:00
$ ( this ) . removeClass ( 'checked' ) ;
$ ( this ) . find ( '.octicon' ) . removeClass ( 'octicon-check' ) ;
2016-08-18 08:44:07 +03:00
if ( hasLabelUpdateAction ) {
2017-03-15 04:10:35 +03:00
updateIssuesMeta (
$labelMenu . data ( 'update-url' ) ,
"detach" ,
$labelMenu . data ( 'issue-id' ) ,
$ ( this ) . data ( 'id' )
) ;
2015-08-14 19:42:43 +03:00
}
2015-08-10 13:57:57 +03:00
} else {
2015-09-05 21:11:05 +03:00
$ ( this ) . addClass ( 'checked' ) ;
$ ( this ) . find ( '.octicon' ) . addClass ( 'octicon-check' ) ;
2016-08-18 08:44:07 +03:00
if ( hasLabelUpdateAction ) {
2017-03-15 04:10:35 +03:00
updateIssuesMeta (
$labelMenu . data ( 'update-url' ) ,
"attach" ,
$labelMenu . data ( 'issue-id' ) ,
$ ( this ) . data ( 'id' )
) ;
2015-08-14 19:42:43 +03:00
}
2015-08-10 13:57:57 +03:00
}
2017-01-10 16:57:03 +03:00
var labelIds = [ ] ;
2015-08-10 13:57:57 +03:00
$ ( this ) . parent ( ) . find ( '.item' ) . each ( function ( ) {
if ( $ ( this ) . hasClass ( 'checked' ) ) {
2017-01-10 16:57:03 +03:00
labelIds . push ( $ ( this ) . data ( 'id' ) ) ;
2015-08-10 13:57:57 +03:00
$ ( $ ( this ) . data ( 'id-selector' ) ) . removeClass ( 'hide' ) ;
} else {
$ ( $ ( this ) . data ( 'id-selector' ) ) . addClass ( 'hide' ) ;
}
} ) ;
2016-08-18 08:44:07 +03:00
if ( labelIds . length == 0 ) {
$noSelect . removeClass ( 'hide' ) ;
2015-08-10 13:57:57 +03:00
} else {
2016-08-18 08:44:07 +03:00
$noSelect . addClass ( 'hide' ) ;
2015-08-10 13:57:57 +03:00
}
2017-01-10 16:57:03 +03:00
$ ( $ ( this ) . parent ( ) . data ( 'id' ) ) . val ( labelIds . join ( "," ) ) ;
2015-08-10 13:57:57 +03:00
return false ;
} ) ;
2016-08-18 08:44:07 +03:00
$labelMenu . find ( '.no-select.item' ) . click ( function ( ) {
if ( hasLabelUpdateAction ) {
2017-03-15 04:10:35 +03:00
updateIssuesMeta (
$labelMenu . data ( 'update-url' ) ,
"clear" ,
$labelMenu . data ( 'issue-id' ) ,
""
) ;
2015-08-14 19:42:43 +03:00
}
2015-08-10 13:57:57 +03:00
$ ( this ) . parent ( ) . find ( '.item' ) . each ( function ( ) {
$ ( this ) . removeClass ( 'checked' ) ;
$ ( this ) . find ( '.octicon' ) . removeClass ( 'octicon-check' ) ;
} ) ;
$list . find ( '.item' ) . each ( function ( ) {
$ ( this ) . addClass ( 'hide' ) ;
} ) ;
2016-08-18 08:44:07 +03:00
$noSelect . removeClass ( 'hide' ) ;
2015-08-10 13:57:57 +03:00
$ ( $ ( this ) . parent ( ) . data ( 'id' ) ) . val ( '' ) ;
} ) ;
2015-08-10 16:47:23 +03:00
function selectItem ( select _id , input _id ) {
var $menu = $ ( select _id + ' .menu' ) ;
2015-09-05 21:11:05 +03:00
var $list = $ ( '.ui' + select _id + '.list' ) ;
2016-08-18 08:44:07 +03:00
var hasUpdateAction = $menu . data ( 'action' ) == 'update' ;
2015-08-14 19:42:43 +03:00
2015-08-10 16:47:23 +03:00
$menu . find ( '.item:not(.no-select)' ) . click ( function ( ) {
$ ( this ) . parent ( ) . find ( '.item' ) . each ( function ( ) {
$ ( this ) . removeClass ( 'selected active' )
} ) ;
$ ( this ) . addClass ( 'selected active' ) ;
2016-08-18 08:44:07 +03:00
if ( hasUpdateAction ) {
2017-03-15 04:10:35 +03:00
updateIssuesMeta (
$menu . data ( 'update-url' ) ,
"" ,
$menu . data ( 'issue-id' ) ,
2017-06-28 11:55:28 +03:00
$ ( this ) . data ( 'id' ) ,
function ( ) { location . reload ( ) ; }
2017-03-15 04:10:35 +03:00
) ;
2015-08-14 19:42:43 +03:00
}
2015-08-10 16:47:23 +03:00
switch ( input _id ) {
case '#milestone_id' :
$list . find ( '.selected' ) . html ( '<a class="item" href=' + $ ( this ) . data ( 'href' ) + '>' +
$ ( this ) . text ( ) + '</a>' ) ;
break ;
case '#assignee_id' :
$list . find ( '.selected' ) . html ( '<a class="item" href=' + $ ( this ) . data ( 'href' ) + '>' +
'<img class="ui avatar image" src=' + $ ( this ) . data ( 'avatar' ) + '>' +
$ ( this ) . text ( ) + '</a>' ) ;
}
$ ( '.ui' + select _id + '.list .no-select' ) . addClass ( 'hide' ) ;
$ ( input _id ) . val ( $ ( this ) . data ( 'id' ) ) ;
2015-08-10 13:57:57 +03:00
} ) ;
2015-08-10 16:47:23 +03:00
$menu . find ( '.no-select.item' ) . click ( function ( ) {
$ ( this ) . parent ( ) . find ( '.item:not(.no-select)' ) . each ( function ( ) {
$ ( this ) . removeClass ( 'selected active' )
} ) ;
2015-08-10 13:57:57 +03:00
2016-08-18 08:44:07 +03:00
if ( hasUpdateAction ) {
2017-03-15 04:10:35 +03:00
updateIssuesMeta (
$menu . data ( 'update-url' ) ,
"" ,
$menu . data ( 'issue-id' ) ,
2017-06-28 11:55:28 +03:00
$ ( this ) . data ( 'id' ) ,
function ( ) { location . reload ( ) ; }
2017-03-15 04:10:35 +03:00
) ;
2015-08-14 19:42:43 +03:00
}
2015-08-10 16:47:23 +03:00
$list . find ( '.selected' ) . html ( '' ) ;
$list . find ( '.no-select' ) . removeClass ( 'hide' ) ;
$ ( input _id ) . val ( '' ) ;
2015-08-10 13:57:57 +03:00
} ) ;
2015-08-10 16:47:23 +03:00
}
2015-08-10 13:57:57 +03:00
2015-08-10 16:47:23 +03:00
// Milestone and assignee
selectItem ( '.select-milestone' , '#milestone_id' ) ;
selectItem ( '.select-assignee' , '#assignee_id' ) ;
2015-08-10 13:57:57 +03:00
}
2015-07-07 20:09:03 +03:00
function initInstall ( ) {
if ( $ ( '.install' ) . length == 0 ) {
return ;
}
2017-01-09 12:16:10 +03:00
if ( $ ( '#db_host' ) . val ( ) == "" ) {
$ ( '#db_host' ) . val ( "127.0.0.1:3306" ) ;
$ ( '#db_user' ) . val ( "gitea" ) ;
$ ( '#db_name' ) . val ( "gitea" ) ;
}
2015-07-07 20:09:03 +03:00
// Database type change detection.
$ ( "#db_type" ) . change ( function ( ) {
2016-11-07 16:26:13 +03:00
var sqliteDefault = 'data/gitea.db' ;
var tidbDefault = 'data/gitea_tidb' ;
2015-09-13 16:51:51 +03:00
2016-08-18 08:44:07 +03:00
var dbType = $ ( this ) . val ( ) ;
if ( dbType === "SQLite3" || dbType === "TiDB" ) {
2015-07-07 20:09:03 +03:00
$ ( '#sql_settings' ) . hide ( ) ;
$ ( '#pgsql_settings' ) . hide ( ) ;
$ ( '#sqlite_settings' ) . show ( ) ;
2015-09-13 16:51:51 +03:00
2016-08-18 08:44:07 +03:00
if ( dbType === "SQLite3" && $ ( '#db_path' ) . val ( ) == tidbDefault ) {
$ ( '#db_path' ) . val ( sqliteDefault ) ;
} else if ( dbType === "TiDB" && $ ( '#db_path' ) . val ( ) == sqliteDefault ) {
$ ( '#db_path' ) . val ( tidbDefault ) ;
2015-09-13 16:51:51 +03:00
}
2015-07-07 20:09:03 +03:00
return ;
}
2016-12-24 04:37:35 +03:00
var dbDefaults = {
"MySQL" : "127.0.0.1:3306" ,
"PostgreSQL" : "127.0.0.1:5432" ,
"MSSQL" : "127.0.0.1:1433"
} ;
2015-07-07 20:09:03 +03:00
$ ( '#sqlite_settings' ) . hide ( ) ;
$ ( '#sql_settings' ) . show ( ) ;
2016-12-24 04:37:35 +03:00
$ ( '#pgsql_settings' ) . toggle ( dbType === "PostgreSQL" ) ;
$ . each ( dbDefaults , function ( type , defaultHost ) {
if ( $ ( '#db_host' ) . val ( ) == defaultHost ) {
$ ( '#db_host' ) . val ( dbDefaults [ dbType ] ) ;
return false ;
2015-07-07 20:09:03 +03:00
}
2016-12-24 04:37:35 +03:00
} ) ;
2015-07-07 20:09:03 +03:00
} ) ;
2015-08-29 19:22:26 +03:00
2016-08-07 21:01:47 +03:00
// TODO: better handling of exclusive relations.
2015-08-29 19:22:26 +03:00
$ ( '#offline-mode input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '#disable-gravatar' ) . checkbox ( 'check' ) ;
2016-08-07 21:01:47 +03:00
$ ( '#federated-avatar-lookup' ) . checkbox ( 'uncheck' ) ;
}
} ) ;
$ ( '#disable-gravatar input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '#federated-avatar-lookup' ) . checkbox ( 'uncheck' ) ;
} else {
$ ( '#offline-mode' ) . checkbox ( 'uncheck' ) ;
}
} ) ;
$ ( '#federated-avatar-lookup input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '#disable-gravatar' ) . checkbox ( 'uncheck' ) ;
$ ( '#offline-mode' ) . checkbox ( 'uncheck' ) ;
2015-08-29 19:22:26 +03:00
}
} ) ;
2017-08-19 18:34:49 +03:00
$ ( '#enable-openid-signin input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
if ( $ ( '#disable-registration input' ) . is ( ':checked' ) ) {
} else {
$ ( '#enable-openid-signup' ) . checkbox ( 'check' ) ;
}
} else {
$ ( '#enable-openid-signup' ) . checkbox ( 'uncheck' ) ;
}
} ) ;
2015-09-13 19:14:32 +03:00
$ ( '#disable-registration input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '#enable-captcha' ) . checkbox ( 'uncheck' ) ;
2017-08-19 18:34:49 +03:00
$ ( '#enable-openid-signup' ) . checkbox ( 'uncheck' ) ;
} else {
$ ( '#enable-openid-signup' ) . checkbox ( 'check' ) ;
2015-09-13 19:14:32 +03:00
}
} ) ;
$ ( '#enable-captcha input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '#disable-registration' ) . checkbox ( 'uncheck' ) ;
}
} ) ;
2015-09-05 21:11:05 +03:00
}
2015-07-07 20:09:03 +03:00
2015-07-24 18:13:42 +03:00
function initRepository ( ) {
2015-07-24 16:02:49 +03:00
if ( $ ( '.repository' ) . length == 0 ) {
return ;
}
2015-11-14 12:34:01 +03:00
function initFilterSearchDropdown ( selector ) {
var $dropdown = $ ( selector ) ;
$dropdown . dropdown ( {
fullTextSearch : true ,
2017-10-15 22:59:24 +03:00
selectOnKeydown : false ,
2015-11-14 12:34:01 +03:00
onChange : function ( text , value , $choice ) {
2017-10-15 22:59:24 +03:00
if ( $choice . data ( 'url' ) ) {
window . location . href = $choice . data ( 'url' ) ;
}
2015-11-14 12:34:01 +03:00
} ,
message : { noResults : $dropdown . data ( 'no-results' ) }
} ) ;
}
2015-12-09 08:14:54 +03:00
// File list and commits
if ( $ ( '.repository.file.list' ) . length > 0 ||
2015-12-11 03:52:06 +03:00
( '.repository.commits' ) . length > 0 ) {
2017-10-15 22:59:24 +03:00
initFilterBranchTagDropdown ( '.choose.reference .dropdown' ) ;
2015-11-14 12:34:01 +03:00
}
2015-11-27 09:50:38 +03:00
// Wiki
if ( $ ( '.repository.wiki.view' ) . length > 0 ) {
initFilterSearchDropdown ( '.choose.page .dropdown' ) ;
}
2015-08-31 08:36:31 +03:00
// Options
if ( $ ( '.repository.settings.options' ) . length > 0 ) {
$ ( '#repo_name' ) . keyup ( function ( ) {
2016-08-18 08:44:07 +03:00
var $prompt = $ ( '#repo-name-change-prompt' ) ;
2015-09-01 16:37:41 +03:00
if ( $ ( this ) . val ( ) . toString ( ) . toLowerCase ( ) != $ ( this ) . data ( 'repo-name' ) . toString ( ) . toLowerCase ( ) ) {
2016-08-18 08:44:07 +03:00
$prompt . show ( ) ;
2015-08-31 11:10:28 +03:00
} else {
2016-08-18 08:44:07 +03:00
$prompt . hide ( ) ;
2015-08-31 08:36:31 +03:00
}
} ) ;
2016-07-30 20:26:43 +03:00
// Enable or select internal/external wiki system and issue tracker.
$ ( '.enable-system' ) . change ( function ( ) {
if ( this . checked ) {
$ ( $ ( this ) . data ( 'target' ) ) . removeClass ( 'disabled' ) ;
2017-09-12 09:48:13 +03:00
if ( ! $ ( this ) . data ( 'context' ) ) $ ( $ ( this ) . data ( 'context' ) ) . addClass ( 'disabled' ) ;
2016-07-30 20:26:43 +03:00
} else {
$ ( $ ( this ) . data ( 'target' ) ) . addClass ( 'disabled' ) ;
2017-09-12 09:48:13 +03:00
if ( ! $ ( this ) . data ( 'context' ) ) $ ( $ ( this ) . data ( 'context' ) ) . removeClass ( 'disabled' ) ;
2016-07-30 20:26:43 +03:00
}
} ) ;
$ ( '.enable-system-radio' ) . change ( function ( ) {
if ( this . value == 'false' ) {
$ ( $ ( this ) . data ( 'target' ) ) . addClass ( 'disabled' ) ;
2017-09-12 09:48:13 +03:00
if ( typeof $ ( this ) . data ( 'context' ) !== 'undefined' ) $ ( $ ( this ) . data ( 'context' ) ) . removeClass ( 'disabled' ) ;
2016-07-30 20:26:43 +03:00
} else if ( this . value == 'true' ) {
$ ( $ ( this ) . data ( 'target' ) ) . removeClass ( 'disabled' ) ;
2017-09-12 09:48:13 +03:00
if ( typeof $ ( this ) . data ( 'context' ) !== 'undefined' ) $ ( $ ( this ) . data ( 'context' ) ) . addClass ( 'disabled' ) ;
2016-07-30 20:26:43 +03:00
}
} ) ;
2015-08-31 08:36:31 +03:00
}
2015-07-24 18:13:42 +03:00
// Labels
2015-08-05 10:24:26 +03:00
if ( $ ( '.repository.labels' ) . length > 0 ) {
2015-08-09 17:45:38 +03:00
// Create label
2016-08-18 08:44:07 +03:00
var $newLabelPanel = $ ( '.new-label.segment' ) ;
2015-08-09 17:45:38 +03:00
$ ( '.new-label.button' ) . click ( function ( ) {
2016-08-18 08:44:07 +03:00
$newLabelPanel . show ( ) ;
2015-08-09 17:45:38 +03:00
} ) ;
$ ( '.new-label.segment .cancel' ) . click ( function ( ) {
2016-08-18 08:44:07 +03:00
$newLabelPanel . hide ( ) ;
2015-08-09 17:45:38 +03:00
} ) ;
2015-08-05 10:24:26 +03:00
$ ( '.color-picker' ) . each ( function ( ) {
$ ( this ) . minicolors ( ) ;
} ) ;
$ ( '.precolors .color' ) . click ( function ( ) {
2015-09-05 21:11:05 +03:00
var color _hex = $ ( this ) . data ( 'color-hex' ) ;
2015-08-05 10:24:26 +03:00
$ ( '.color-picker' ) . val ( color _hex ) ;
$ ( '.minicolors-swatch-color' ) . css ( "background-color" , color _hex ) ;
} ) ;
$ ( '.edit-label-button' ) . click ( function ( ) {
$ ( '#label-modal-id' ) . val ( $ ( this ) . data ( 'id' ) ) ;
2015-08-09 17:45:38 +03:00
$ ( '.edit-label .new-label-input' ) . val ( $ ( this ) . data ( 'title' ) ) ;
2015-09-18 13:18:31 +03:00
$ ( '.edit-label .color-picker' ) . val ( $ ( this ) . data ( 'color' ) ) ;
2015-08-05 10:24:26 +03:00
$ ( '.minicolors-swatch-color' ) . css ( "background-color" , $ ( this ) . data ( 'color' ) ) ;
$ ( '.edit-label.modal' ) . modal ( {
onApprove : function ( ) {
$ ( '.edit-label.form' ) . submit ( ) ;
}
} ) . modal ( 'show' ) ;
return false ;
} ) ;
2015-07-24 16:02:49 +03:00
}
2015-08-05 10:24:26 +03:00
// Milestones
2015-08-05 15:23:08 +03:00
if ( $ ( '.repository.milestones' ) . length > 0 ) {
}
2015-08-05 10:24:26 +03:00
if ( $ ( '.repository.new.milestone' ) . length > 0 ) {
2015-09-05 21:11:05 +03:00
var $datepicker = $ ( '.milestone.datepicker' ) ;
2015-08-05 10:24:26 +03:00
$datepicker . datetimepicker ( {
lang : $datepicker . data ( 'lang' ) ,
inline : true ,
timepicker : false ,
startDate : $datepicker . data ( 'start-date' ) ,
2015-08-05 13:26:18 +03:00
formatDate : 'Y-m-d' ,
2015-08-05 10:24:26 +03:00
onSelectDate : function ( ct ) {
2015-08-05 13:26:18 +03:00
$ ( '#deadline' ) . val ( ct . dateFormat ( 'Y-m-d' ) ) ;
2015-07-24 18:13:42 +03:00
}
2015-08-05 10:24:26 +03:00
} ) ;
$ ( '#clear-date' ) . click ( function ( ) {
$ ( '#deadline' ) . val ( '' ) ;
return false ;
} ) ;
2015-08-06 17:48:11 +03:00
}
2015-08-13 18:21:43 +03:00
// Issues
if ( $ ( '.repository.view.issue' ) . length > 0 ) {
2015-08-19 18:14:57 +03:00
// Edit issue title
2016-08-18 08:44:07 +03:00
var $issueTitle = $ ( '#issue-title' ) ;
var $editInput = $ ( '#edit-title-input input' ) ;
2015-08-19 18:14:57 +03:00
var editTitleToggle = function ( ) {
2016-08-18 08:44:07 +03:00
$issueTitle . toggle ( ) ;
2015-08-19 18:14:57 +03:00
$ ( '.not-in-edit' ) . toggle ( ) ;
$ ( '#edit-title-input' ) . toggle ( ) ;
$ ( '.in-edit' ) . toggle ( ) ;
2016-08-18 08:44:07 +03:00
$editInput . focus ( ) ;
2015-08-19 18:14:57 +03:00
return false ;
2015-09-05 21:11:05 +03:00
} ;
2015-08-19 18:14:57 +03:00
$ ( '#edit-title' ) . click ( editTitleToggle ) ;
$ ( '#cancel-edit-title' ) . click ( editTitleToggle ) ;
2016-03-05 08:51:51 +03:00
$ ( '#save-edit-title' ) . click ( editTitleToggle ) . click ( function ( ) {
2016-08-18 08:44:07 +03:00
if ( $editInput . val ( ) . length == 0 ||
$editInput . val ( ) == $issueTitle . text ( ) ) {
$editInput . val ( $issueTitle . text ( ) ) ;
2015-11-27 09:50:38 +03:00
return false ;
2015-12-05 09:09:14 +03:00
}
$ . post ( $ ( this ) . data ( 'update-url' ) , {
"_csrf" : csrf ,
2016-08-18 08:44:07 +03:00
"title" : $editInput . val ( )
2015-12-05 09:09:14 +03:00
} ,
function ( data ) {
2016-08-18 08:44:07 +03:00
$editInput . val ( data . title ) ;
$issueTitle . text ( data . title ) ;
2017-02-05 17:36:00 +03:00
location . reload ( ) ;
2015-12-05 09:09:14 +03:00
} ) ;
return false ;
} ) ;
2015-08-19 18:14:57 +03:00
2015-08-19 23:31:28 +03:00
// Edit issue or comment content
$ ( '.edit-content' ) . click ( function ( ) {
2016-07-25 21:48:17 +03:00
var $segment = $ ( this ) . parent ( ) . parent ( ) . parent ( ) . next ( ) ;
2016-08-18 08:44:07 +03:00
var $editContentZone = $segment . find ( '.edit-content-zone' ) ;
var $renderContent = $segment . find ( '.render-content' ) ;
var $rawContent = $segment . find ( '.raw-content' ) ;
2015-08-19 23:31:28 +03:00
var $textarea ;
// Setup new form
2016-08-18 08:44:07 +03:00
if ( $editContentZone . html ( ) . length == 0 ) {
$editContentZone . html ( $ ( '#edit-content-form' ) . html ( ) ) ;
2015-08-19 23:31:28 +03:00
$textarea = $segment . find ( 'textarea' ) ;
2017-12-11 09:03:04 +03:00
issuesTribute . attach ( $textarea . get ( ) ) ;
2015-08-19 23:31:28 +03:00
// Give new write/preview data-tab name to distinguish from others
2016-08-18 08:44:07 +03:00
var $editContentForm = $editContentZone . find ( '.ui.comment.form' ) ;
var $tabMenu = $editContentForm . find ( '.tabular.menu' ) ;
$tabMenu . attr ( 'data-write' , $editContentZone . data ( 'write' ) ) ;
$tabMenu . attr ( 'data-preview' , $editContentZone . data ( 'preview' ) ) ;
$tabMenu . find ( '.write.item' ) . attr ( 'data-tab' , $editContentZone . data ( 'write' ) ) ;
$tabMenu . find ( '.preview.item' ) . attr ( 'data-tab' , $editContentZone . data ( 'preview' ) ) ;
$editContentForm . find ( '.write.segment' ) . attr ( 'data-tab' , $editContentZone . data ( 'write' ) ) ;
$editContentForm . find ( '.preview.segment' ) . attr ( 'data-tab' , $editContentZone . data ( 'preview' ) ) ;
initCommentPreviewTab ( $editContentForm ) ;
$editContentZone . find ( '.cancel.button' ) . click ( function ( ) {
$renderContent . show ( ) ;
$editContentZone . hide ( ) ;
2015-08-19 23:31:28 +03:00
} ) ;
2016-08-18 08:44:07 +03:00
$editContentZone . find ( '.save.button' ) . click ( function ( ) {
$renderContent . show ( ) ;
$editContentZone . hide ( ) ;
2015-08-19 23:31:28 +03:00
2016-08-18 08:44:07 +03:00
$ . post ( $editContentZone . data ( 'update-url' ) , {
2015-08-19 23:31:28 +03:00
"_csrf" : csrf ,
"content" : $textarea . val ( ) ,
2016-08-18 08:44:07 +03:00
"context" : $editContentZone . data ( 'context' )
2015-08-19 23:31:28 +03:00
} ,
function ( data ) {
if ( data . length == 0 ) {
2016-08-18 08:44:07 +03:00
$renderContent . html ( $ ( '#no-content' ) . html ( ) ) ;
2015-08-19 23:31:28 +03:00
} else {
2016-08-18 08:44:07 +03:00
$renderContent . html ( data . content ) ;
emojify . run ( $renderContent [ 0 ] ) ;
$ ( 'pre code' , $renderContent [ 0 ] ) . each ( function ( i , block ) {
2016-02-02 01:48:04 +03:00
hljs . highlightBlock ( block ) ;
} ) ;
2015-08-19 23:31:28 +03:00
}
} ) ;
} ) ;
} else {
$textarea = $segment . find ( 'textarea' ) ;
}
// Show write/preview tab and copy raw content as needed
2016-08-18 08:44:07 +03:00
$editContentZone . show ( ) ;
$renderContent . hide ( ) ;
2015-08-19 23:31:28 +03:00
if ( $textarea . val ( ) . length == 0 ) {
2016-08-18 08:44:07 +03:00
$textarea . val ( $rawContent . text ( ) ) ;
2015-08-19 23:31:28 +03:00
}
$textarea . focus ( ) ;
return false ;
} ) ;
2016-07-25 21:48:17 +03:00
// Delete comment
$ ( '.delete-comment' ) . click ( function ( ) {
var $this = $ ( this ) ;
if ( confirm ( $this . data ( 'locale' ) ) ) {
$ . post ( $this . data ( 'url' ) , {
"_csrf" : csrf
2016-07-30 20:26:43 +03:00
} ) . success ( function ( ) {
2016-07-25 21:48:17 +03:00
$ ( '#' + $this . data ( 'comment-id' ) ) . remove ( ) ;
2016-07-26 05:47:25 +03:00
} ) ;
2016-07-25 21:48:17 +03:00
}
return false ;
} ) ;
2015-08-19 18:14:57 +03:00
// Change status
2016-08-18 08:44:07 +03:00
var $statusButton = $ ( '#status-button' ) ;
2016-08-31 00:37:46 +03:00
$ ( '#comment-form .edit_area' ) . keyup ( function ( ) {
2015-08-13 18:21:43 +03:00
if ( $ ( this ) . val ( ) . length == 0 ) {
2016-08-18 08:44:07 +03:00
$statusButton . text ( $statusButton . data ( 'status' ) )
2015-08-13 18:21:43 +03:00
} else {
2016-08-18 08:44:07 +03:00
$statusButton . text ( $statusButton . data ( 'status-and-comment' ) )
2015-08-13 18:21:43 +03:00
}
} ) ;
2016-08-18 08:44:07 +03:00
$statusButton . click ( function ( ) {
$ ( '#status' ) . val ( $statusButton . data ( 'status-val' ) ) ;
2015-08-13 18:21:43 +03:00
$ ( '#comment-form' ) . submit ( ) ;
2015-12-11 03:52:06 +03:00
} ) ;
2017-12-04 02:14:26 +03:00
initReactionSelector ( ) ;
2015-08-13 18:21:43 +03:00
}
2015-08-20 19:18:30 +03:00
// Diff
if ( $ ( '.repository.diff' ) . length > 0 ) {
var $counter = $ ( '.diff-counter' ) ;
2015-10-30 04:09:48 +03:00
if ( $counter . length >= 1 ) {
$counter . each ( function ( i , item ) {
var $item = $ ( item ) ;
var addLine = $item . find ( 'span[data-line].add' ) . data ( "line" ) ;
var delLine = $item . find ( 'span[data-line].del' ) . data ( "line" ) ;
var addPercent = parseFloat ( addLine ) / ( parseFloat ( addLine ) + parseFloat ( delLine ) ) * 100 ;
$item . find ( ".bar .add" ) . css ( "width" , addPercent + "%" ) ;
} ) ;
2015-08-20 19:18:30 +03:00
}
}
2015-11-14 12:34:01 +03:00
// Quick start and repository home
$ ( '#repo-clone-ssh' ) . click ( function ( ) {
$ ( '.clone-url' ) . text ( $ ( this ) . data ( 'link' ) ) ;
$ ( '#repo-clone-url' ) . val ( $ ( this ) . data ( 'link' ) ) ;
$ ( this ) . addClass ( 'blue' ) ;
$ ( '#repo-clone-https' ) . removeClass ( 'blue' ) ;
2016-02-01 19:30:28 +03:00
localStorage . setItem ( 'repo-clone-protocol' , 'ssh' ) ;
2015-11-14 12:34:01 +03:00
} ) ;
$ ( '#repo-clone-https' ) . click ( function ( ) {
$ ( '.clone-url' ) . text ( $ ( this ) . data ( 'link' ) ) ;
$ ( '#repo-clone-url' ) . val ( $ ( this ) . data ( 'link' ) ) ;
$ ( this ) . addClass ( 'blue' ) ;
$ ( '#repo-clone-ssh' ) . removeClass ( 'blue' ) ;
2016-02-01 19:30:28 +03:00
localStorage . setItem ( 'repo-clone-protocol' , 'https' ) ;
2015-11-14 12:34:01 +03:00
} ) ;
$ ( '#repo-clone-url' ) . click ( function ( ) {
$ ( this ) . select ( ) ;
} ) ;
2015-10-03 02:58:36 +03:00
2015-08-08 17:43:14 +03:00
// Pull request
if ( $ ( '.repository.compare.pull' ) . length > 0 ) {
2015-11-14 12:34:01 +03:00
initFilterSearchDropdown ( '.choose.branch .dropdown' ) ;
2015-08-05 10:24:26 +03:00
}
2017-02-21 18:02:10 +03:00
2017-09-14 11:16:22 +03:00
// Branches
if ( $ ( '.repository.settings.branches' ) . length > 0 ) {
initFilterSearchDropdown ( '.protected-branches .dropdown' ) ;
$ ( '.enable-protection, .enable-whitelist' ) . change ( function ( ) {
if ( this . checked ) {
$ ( $ ( this ) . data ( 'target' ) ) . removeClass ( 'disabled' ) ;
} else {
$ ( $ ( this ) . data ( 'target' ) ) . addClass ( 'disabled' ) ;
2017-02-21 18:02:10 +03:00
}
2017-09-14 11:16:22 +03:00
} ) ;
}
2017-02-21 18:02:10 +03:00
}
2016-07-30 20:26:43 +03:00
function initRepositoryCollaboration ( ) {
2016-03-06 02:08:42 +03:00
console . log ( 'initRepositoryCollaboration' ) ;
2016-08-18 08:44:07 +03:00
// Change collaborator access mode
2016-07-30 20:26:43 +03:00
$ ( '.access-mode.menu .item' ) . click ( function ( ) {
2016-03-06 02:08:42 +03:00
var $menu = $ ( this ) . parent ( ) ;
$ . post ( $menu . data ( 'url' ) , {
"_csrf" : csrf ,
"uid" : $menu . data ( 'uid' ) ,
"mode" : $ ( this ) . data ( 'value' )
} )
} ) ;
}
2017-07-17 05:04:43 +03:00
function initTeamSettings ( ) {
// Change team access mode
$ ( '.organization.new.team input[name=permission]' ) . change ( function ( ) {
var val = $ ( 'input[name=permission]:checked' , '.organization.new.team' ) . val ( )
if ( val === 'admin' ) {
$ ( '.organization.new.team .team-units' ) . hide ( ) ;
} else {
$ ( '.organization.new.team .team-units' ) . show ( ) ;
}
} ) ;
}
2016-08-11 15:48:08 +03:00
function initWikiForm ( ) {
2016-08-18 08:44:07 +03:00
var $editArea = $ ( '.repository.wiki textarea#edit_area' ) ;
if ( $editArea . length > 0 ) {
2016-08-11 15:48:08 +03:00
new SimpleMDE ( {
2015-11-26 04:10:25 +03:00
autoDownloadFontAwesome : false ,
2016-08-18 08:44:07 +03:00
element : $editArea [ 0 ] ,
2016-04-19 23:45:28 +03:00
forceSync : true ,
2015-11-26 04:10:25 +03:00
previewRender : function ( plainText , preview ) { // Async method
setTimeout ( function ( ) {
2015-12-14 01:55:13 +03:00
// FIXME: still send render request when return back to edit mode
2016-08-18 08:44:07 +03:00
$ . post ( $editArea . data ( 'url' ) , {
2015-11-26 04:10:25 +03:00
"_csrf" : csrf ,
"mode" : "gfm" ,
2016-08-18 08:44:07 +03:00
"context" : $editArea . data ( 'context' ) ,
2015-11-26 04:10:25 +03:00
"text" : plainText
} ,
function ( data ) {
preview . innerHTML = '<div class="markdown">' + data + '</div>' ;
emojify . run ( $ ( '.editor-preview' ) [ 0 ] ) ;
2017-02-14 04:13:59 +03:00
$ ( '.editor-preview' ) . autolink ( ) ;
2015-11-26 04:10:25 +03:00
}
) ;
} , 0 ) ;
return "Loading..." ;
} ,
renderingConfig : {
singleLineBreaks : false
} ,
2016-08-11 15:48:08 +03:00
indentWithTabs : false ,
2015-11-26 04:10:25 +03:00
tabSize : 4 ,
2016-08-11 15:48:08 +03:00
spellChecker : false ,
2015-11-26 04:10:25 +03:00
toolbar : [ "bold" , "italic" , "strikethrough" , "|" ,
2016-08-11 15:48:08 +03:00
"heading-1" , "heading-2" , "heading-3" , "heading-bigger" , "heading-smaller" , "|" ,
2015-11-26 04:10:25 +03:00
"code" , "quote" , "|" ,
"unordered-list" , "ordered-list" , "|" ,
2016-08-11 15:48:08 +03:00
"link" , "image" , "table" , "horizontal-rule" , "|" ,
2016-08-18 02:10:07 +03:00
"clean-block" , "preview" , "fullscreen" ]
2015-11-26 04:10:25 +03:00
} )
}
}
2016-08-18 08:44:07 +03:00
var simpleMDEditor ;
var codeMirrorEditor ;
2016-08-11 15:48:08 +03:00
// For IE
String . prototype . endsWith = function ( pattern ) {
var d = this . length - pattern . length ;
return d >= 0 && this . lastIndexOf ( pattern ) === d ;
} ;
2016-08-18 08:44:07 +03:00
// Adding function to get the cursor position in a text field to jQuery object.
2016-08-11 15:48:08 +03:00
( function ( $ , undefined ) {
$ . fn . getCursorPosition = function ( ) {
var el = $ ( this ) . get ( 0 ) ;
var pos = 0 ;
if ( 'selectionStart' in el ) {
pos = el . selectionStart ;
} else if ( 'selection' in document ) {
el . focus ( ) ;
var Sel = document . selection . createRange ( ) ;
var SelLength = document . selection . createRange ( ) . text . length ;
Sel . moveStart ( 'character' , - el . value . length ) ;
pos = Sel . text . length - SelLength ;
}
return pos ;
}
} ) ( jQuery ) ;
2016-08-18 08:44:07 +03:00
function setSimpleMDE ( $editArea ) {
if ( codeMirrorEditor ) {
codeMirrorEditor . toTextArea ( ) ;
codeMirrorEditor = null ;
}
if ( simpleMDEditor ) {
return true ;
}
simpleMDEditor = new SimpleMDE ( {
autoDownloadFontAwesome : false ,
element : $editArea [ 0 ] ,
forceSync : true ,
renderingConfig : {
singleLineBreaks : false
} ,
indentWithTabs : false ,
tabSize : 4 ,
spellChecker : false ,
previewRender : function ( plainText , preview ) { // Async method
setTimeout ( function ( ) {
// FIXME: still send render request when return back to edit mode
$ . post ( $editArea . data ( 'url' ) , {
"_csrf" : csrf ,
"mode" : "gfm" ,
"context" : $editArea . data ( 'context' ) ,
"text" : plainText
} ,
function ( data ) {
preview . innerHTML = '<div class="markdown">' + data + '</div>' ;
emojify . run ( $ ( '.editor-preview' ) [ 0 ] ) ;
}
) ;
} , 0 ) ;
return "Loading..." ;
} ,
toolbar : [ "bold" , "italic" , "strikethrough" , "|" ,
"heading-1" , "heading-2" , "heading-3" , "heading-bigger" , "heading-smaller" , "|" ,
"code" , "quote" , "|" ,
"unordered-list" , "ordered-list" , "|" ,
"link" , "image" , "table" , "horizontal-rule" , "|" ,
"clean-block" , "preview" , "fullscreen" , "side-by-side" ]
} ) ;
return true ;
}
function setCodeMirror ( $editArea ) {
if ( simpleMDEditor ) {
simpleMDEditor . toTextArea ( ) ;
simpleMDEditor = null ;
}
if ( codeMirrorEditor ) {
return true ;
}
codeMirrorEditor = CodeMirror . fromTextArea ( $editArea [ 0 ] , {
lineNumbers : true
} ) ;
codeMirrorEditor . on ( "change" , function ( cm , change ) {
$editArea . val ( cm . getValue ( ) ) ;
} ) ;
return true ;
}
2016-08-11 15:48:08 +03:00
function initEditor ( ) {
2016-08-28 11:41:44 +03:00
$ ( '.js-quick-pull-choice-option' ) . change ( function ( ) {
if ( $ ( this ) . val ( ) == 'commit-to-new-branch' ) {
$ ( '.quick-pull-branch-name' ) . show ( ) ;
$ ( '.quick-pull-branch-name input' ) . prop ( 'required' , true ) ;
} else {
$ ( '.quick-pull-branch-name' ) . hide ( ) ;
$ ( '.quick-pull-branch-name input' ) . prop ( 'required' , false ) ;
}
} ) ;
2016-08-18 08:44:07 +03:00
var $editFilename = $ ( "#file-name" ) ;
$editFilename . keyup ( function ( e ) {
var $section = $ ( '.breadcrumb span.section' ) ;
var $divider = $ ( '.breadcrumb div.divider' ) ;
2016-08-11 15:48:08 +03:00
if ( e . keyCode == 8 ) {
if ( $ ( this ) . getCursorPosition ( ) == 0 ) {
2016-08-18 08:44:07 +03:00
if ( $section . length > 0 ) {
var value = $section . last ( ) . find ( 'a' ) . text ( ) ;
2016-08-11 15:48:08 +03:00
$ ( this ) . val ( value + $ ( this ) . val ( ) ) ;
$ ( this ) [ 0 ] . setSelectionRange ( value . length , value . length ) ;
2016-08-18 08:44:07 +03:00
$section . last ( ) . remove ( ) ;
$divider . last ( ) . remove ( ) ;
2016-08-11 15:48:08 +03:00
}
}
}
if ( e . keyCode == 191 ) {
var parts = $ ( this ) . val ( ) . split ( '/' ) ;
for ( var i = 0 ; i < parts . length ; ++ i ) {
var value = parts [ i ] ;
if ( i < parts . length - 1 ) {
if ( value . length ) {
$ ( '<span class="section"><a href="#">' + value + '</a></span>' ) . insertBefore ( $ ( this ) ) ;
$ ( '<div class="divider"> / </div>' ) . insertBefore ( $ ( this ) ) ;
}
}
else {
$ ( this ) . val ( value ) ;
}
$ ( this ) [ 0 ] . setSelectionRange ( 0 , 0 ) ;
}
}
var parts = [ ] ;
$ ( '.breadcrumb span.section' ) . each ( function ( i , element ) {
element = $ ( element ) ;
if ( element . find ( 'a' ) . length ) {
parts . push ( element . find ( 'a' ) . text ( ) ) ;
} else {
parts . push ( element . text ( ) ) ;
}
} ) ;
if ( $ ( this ) . val ( ) )
parts . push ( $ ( this ) . val ( ) ) ;
2016-08-25 07:35:03 +03:00
$ ( '#tree_path' ) . val ( parts . join ( '/' ) ) ;
2016-08-11 15:48:08 +03:00
} ) . trigger ( 'keyup' ) ;
2016-08-18 08:44:07 +03:00
var $editArea = $ ( '.repository.editor textarea#edit_area' ) ;
if ( ! $editArea . length )
2016-08-11 15:48:08 +03:00
return ;
2016-08-18 08:44:07 +03:00
var markdownFileExts = $editArea . data ( "markdown-file-exts" ) . split ( "," ) ;
var lineWrapExtensions = $editArea . data ( "line-wrap-extensions" ) . split ( "," ) ;
2016-08-11 15:48:08 +03:00
2016-08-18 08:44:07 +03:00
$editFilename . on ( "keyup" , function ( e ) {
var val = $editFilename . val ( ) , m , mode , spec , extension , extWithDot , previewLink , dataUrl , apiCall ;
2016-08-11 15:48:08 +03:00
extension = extWithDot = "" ;
if ( m = /.+\.([^.]+)$/ . exec ( val ) ) {
extension = m [ 1 ] ;
extWithDot = "." + extension ;
}
var info = CodeMirror . findModeByExtension ( extension ) ;
previewLink = $ ( 'a[data-tab=preview]' ) ;
if ( info ) {
mode = info . mode ;
spec = info . mime ;
apiCall = mode ;
}
else {
apiCall = extension
}
2016-08-12 12:29:29 +03:00
if ( previewLink . length && apiCall && previewFileModes && previewFileModes . length && previewFileModes . indexOf ( apiCall ) >= 0 ) {
2016-08-11 15:48:08 +03:00
dataUrl = previewLink . data ( 'url' ) ;
previewLink . data ( 'url' , dataUrl . replace ( /(.*)\/.*/i , '$1/' + mode ) ) ;
previewLink . show ( ) ;
}
else {
previewLink . hide ( ) ;
}
// If this file is a Markdown extensions, we will load that editor and return
2016-08-12 12:29:29 +03:00
if ( markdownFileExts . indexOf ( extWithDot ) >= 0 ) {
2016-08-18 08:44:07 +03:00
if ( setSimpleMDE ( $editArea ) ) {
2016-08-11 15:48:08 +03:00
return ;
}
}
// Else we are going to use CodeMirror
2016-08-18 08:44:07 +03:00
if ( ! codeMirrorEditor && ! setCodeMirror ( $editArea ) ) {
2016-08-17 09:06:38 +03:00
return ;
2016-08-11 15:48:08 +03:00
}
if ( mode ) {
2016-08-18 08:44:07 +03:00
codeMirrorEditor . setOption ( "mode" , spec ) ;
CodeMirror . autoLoadMode ( codeMirrorEditor , mode ) ;
2016-08-11 15:48:08 +03:00
}
if ( lineWrapExtensions . indexOf ( extWithDot ) >= 0 ) {
2016-08-18 08:44:07 +03:00
codeMirrorEditor . setOption ( "lineWrapping" , true ) ;
2016-08-11 15:48:08 +03:00
}
else {
2016-08-18 08:44:07 +03:00
codeMirrorEditor . setOption ( "lineWrapping" , false ) ;
2016-08-11 15:48:08 +03:00
}
2016-08-31 02:18:40 +03:00
// get the filename without any folder
var value = $editFilename . val ( ) ;
if ( value . length === 0 ) {
return ;
}
value = value . split ( '/' ) ;
value = value [ value . length - 1 ] ;
$ . getJSON ( $editFilename . data ( 'ec-url-prefix' ) + value , function ( editorconfig ) {
if ( editorconfig . indent _style === 'tab' ) {
codeMirrorEditor . setOption ( "indentWithTabs" , true ) ;
codeMirrorEditor . setOption ( 'extraKeys' , { } ) ;
} else {
codeMirrorEditor . setOption ( "indentWithTabs" , false ) ;
// required because CodeMirror doesn't seems to use spaces correctly for {"indentWithTabs": false}:
// - https://github.com/codemirror/CodeMirror/issues/988
// - https://codemirror.net/doc/manual.html#keymaps
codeMirrorEditor . setOption ( 'extraKeys' , {
Tab : function ( cm ) {
var spaces = Array ( parseInt ( cm . getOption ( "indentUnit" ) ) + 1 ) . join ( " " ) ;
cm . replaceSelection ( spaces ) ;
}
} ) ;
}
codeMirrorEditor . setOption ( "indentUnit" , editorconfig . indent _size || 4 ) ;
codeMirrorEditor . setOption ( "tabSize" , editorconfig . tab _width || 4 ) ;
} ) ;
2016-08-11 15:48:08 +03:00
} ) . trigger ( 'keyup' ) ;
}
2015-09-06 23:31:22 +03:00
function initOrganization ( ) {
2015-09-06 17:56:31 +03:00
if ( $ ( '.organization' ) . length == 0 ) {
return ;
}
// Options
if ( $ ( '.organization.settings.options' ) . length > 0 ) {
$ ( '#org_name' ) . keyup ( function ( ) {
2016-08-18 08:44:07 +03:00
var $prompt = $ ( '#org-name-change-prompt' ) ;
2015-09-06 17:56:31 +03:00
if ( $ ( this ) . val ( ) . toString ( ) . toLowerCase ( ) != $ ( this ) . data ( 'org-name' ) . toString ( ) . toLowerCase ( ) ) {
2016-08-18 08:44:07 +03:00
$prompt . show ( ) ;
2015-09-06 17:56:31 +03:00
} else {
2016-08-18 08:44:07 +03:00
$prompt . hide ( ) ;
2015-09-06 17:56:31 +03:00
}
} ) ;
}
2015-09-06 23:31:22 +03:00
}
2015-09-06 17:56:31 +03:00
2016-03-05 08:51:51 +03:00
function initUserSettings ( ) {
console . log ( 'initUserSettings' ) ;
2015-09-06 17:56:31 +03:00
2015-09-06 23:31:22 +03:00
// Options
if ( $ ( '.user.settings.profile' ) . length > 0 ) {
$ ( '#username' ) . keyup ( function ( ) {
2016-08-18 08:44:07 +03:00
var $prompt = $ ( '#name-change-prompt' ) ;
2015-09-06 23:31:22 +03:00
if ( $ ( this ) . val ( ) . toString ( ) . toLowerCase ( ) != $ ( this ) . data ( 'name' ) . toString ( ) . toLowerCase ( ) ) {
2016-08-18 08:44:07 +03:00
$prompt . show ( ) ;
2015-09-06 23:31:22 +03:00
} else {
2016-08-18 08:44:07 +03:00
$prompt . hide ( ) ;
2015-09-06 23:31:22 +03:00
}
} ) ;
}
2015-09-06 17:56:31 +03:00
}
2015-08-28 18:36:13 +03:00
function initWebhook ( ) {
if ( $ ( '.new.webhook' ) . length == 0 ) {
return ;
}
$ ( '.events.checkbox input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '.events.fields' ) . show ( ) ;
}
} ) ;
$ ( '.non-events.checkbox input' ) . change ( function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
$ ( '.events.fields' ) . hide ( ) ;
}
} ) ;
2015-12-05 21:24:13 +03:00
// Test delivery
$ ( '#test-delivery' ) . click ( function ( ) {
var $this = $ ( this ) ;
$this . addClass ( 'loading disabled' ) ;
$ . post ( $this . data ( 'link' ) , {
"_csrf" : csrf
} ) . done (
setTimeout ( function ( ) {
window . location . href = $this . data ( 'redirect' ) ;
} , 5000 )
)
} ) ;
2015-08-28 18:36:13 +03:00
}
2015-09-11 00:11:41 +03:00
function initAdmin ( ) {
if ( $ ( '.admin' ) . length == 0 ) {
return ;
}
2015-09-13 16:51:51 +03:00
// New user
2015-09-13 18:07:21 +03:00
if ( $ ( '.admin.new.user' ) . length > 0 ||
$ ( '.admin.edit.user' ) . length > 0 ) {
2015-09-13 16:51:51 +03:00
$ ( '#login_type' ) . change ( function ( ) {
if ( $ ( this ) . val ( ) . substring ( 0 , 1 ) == '0' ) {
$ ( '#login_name' ) . removeAttr ( 'required' ) ;
$ ( '.non-local' ) . hide ( ) ;
$ ( '.local' ) . show ( ) ;
$ ( '#user_name' ) . focus ( ) ;
2015-09-13 18:07:21 +03:00
2015-10-03 02:58:36 +03:00
if ( $ ( this ) . data ( 'password' ) == "required" ) {
2015-09-13 18:07:21 +03:00
$ ( '#password' ) . attr ( 'required' , 'required' ) ;
}
2015-09-13 16:51:51 +03:00
} else {
$ ( '#login_name' ) . attr ( 'required' , 'required' ) ;
$ ( '.non-local' ) . show ( ) ;
$ ( '.local' ) . hide ( ) ;
$ ( '#login_name' ) . focus ( ) ;
2015-09-13 18:07:21 +03:00
$ ( '#password' ) . removeAttr ( 'required' ) ;
2015-09-13 16:51:51 +03:00
}
} ) ;
}
2016-07-08 02:25:09 +03:00
function onSecurityProtocolChange ( ) {
if ( $ ( '#security_protocol' ) . val ( ) > 0 ) {
$ ( '.has-tls' ) . show ( ) ;
} else {
$ ( '.has-tls' ) . hide ( ) ;
}
}
2015-09-13 16:51:51 +03:00
2017-05-01 16:26:53 +03:00
function onOAuth2Change ( ) {
$ ( '.open_id_connect_auto_discovery_url, .oauth2_use_custom_url' ) . hide ( ) ;
$ ( '.open_id_connect_auto_discovery_url input[required]' ) . removeAttr ( 'required' ) ;
var provider = $ ( '#oauth2_provider' ) . val ( ) ;
switch ( provider ) {
case 'github' :
case 'gitlab' :
$ ( '.oauth2_use_custom_url' ) . show ( ) ;
break ;
case 'openidConnect' :
$ ( '.open_id_connect_auto_discovery_url input' ) . attr ( 'required' , 'required' ) ;
$ ( '.open_id_connect_auto_discovery_url' ) . show ( ) ;
break ;
}
onOAuth2UseCustomURLChange ( ) ;
}
function onOAuth2UseCustomURLChange ( ) {
var provider = $ ( '#oauth2_provider' ) . val ( ) ;
$ ( '.oauth2_use_custom_url_field' ) . hide ( ) ;
$ ( '.oauth2_use_custom_url_field input[required]' ) . removeAttr ( 'required' ) ;
if ( $ ( '#oauth2_use_custom_url' ) . is ( ':checked' ) ) {
if ( ! $ ( '#oauth2_token_url' ) . val ( ) ) {
$ ( '#oauth2_token_url' ) . val ( $ ( '#' + provider + '_token_url' ) . val ( ) ) ;
}
if ( ! $ ( '#oauth2_auth_url' ) . val ( ) ) {
$ ( '#oauth2_auth_url' ) . val ( $ ( '#' + provider + '_auth_url' ) . val ( ) ) ;
}
if ( ! $ ( '#oauth2_profile_url' ) . val ( ) ) {
$ ( '#oauth2_profile_url' ) . val ( $ ( '#' + provider + '_profile_url' ) . val ( ) ) ;
}
if ( ! $ ( '#oauth2_email_url' ) . val ( ) ) {
$ ( '#oauth2_email_url' ) . val ( $ ( '#' + provider + '_email_url' ) . val ( ) ) ;
}
switch ( provider ) {
case 'github' :
$ ( '.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input' ) . attr ( 'required' , 'required' ) ;
$ ( '.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url' ) . show ( ) ;
break ;
case 'gitlab' :
$ ( '.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input' ) . attr ( 'required' , 'required' ) ;
$ ( '.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url' ) . show ( ) ;
$ ( '#oauth2_email_url' ) . val ( '' ) ;
break ;
}
}
}
2015-09-11 00:11:41 +03:00
// New authentication
if ( $ ( '.admin.new.authentication' ) . length > 0 ) {
$ ( '#auth_type' ) . change ( function ( ) {
2017-02-22 10:14:37 +03:00
$ ( '.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls' ) . hide ( ) ;
2017-01-14 16:07:43 +03:00
2017-11-12 02:18:21 +03:00
$ ( '.ldap input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]' ) . removeAttr ( 'required' ) ;
2015-09-13 16:51:51 +03:00
2016-08-18 08:44:07 +03:00
var authType = $ ( this ) . val ( ) ;
switch ( authType ) {
2015-09-11 00:11:41 +03:00
case '2' : // LDAP
$ ( '.ldap' ) . show ( ) ;
2017-02-04 09:02:24 +03:00
$ ( '.ldap div.required:not(.dldap) input' ) . attr ( 'required' , 'required' ) ;
2015-09-11 00:11:41 +03:00
break ;
case '3' : // SMTP
$ ( '.smtp' ) . show ( ) ;
2016-07-08 02:25:09 +03:00
$ ( '.has-tls' ) . show ( ) ;
2017-01-14 16:07:43 +03:00
$ ( '.smtp div.required input, .has-tls' ) . attr ( 'required' , 'required' ) ;
2015-09-11 00:11:41 +03:00
break ;
case '4' : // PAM
$ ( '.pam' ) . show ( ) ;
2017-01-14 16:07:43 +03:00
$ ( '.pam input' ) . attr ( 'required' , 'required' ) ;
2015-09-11 00:11:41 +03:00
break ;
case '5' : // LDAP
$ ( '.dldap' ) . show ( ) ;
2017-02-04 09:02:24 +03:00
$ ( '.dldap div.required:not(.ldap) input' ) . attr ( 'required' , 'required' ) ;
2015-09-11 00:11:41 +03:00
break ;
2017-02-22 10:14:37 +03:00
case '6' : // OAuth2
$ ( '.oauth2' ) . show ( ) ;
2017-05-01 16:26:53 +03:00
$ ( '.oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input' ) . attr ( 'required' , 'required' ) ;
onOAuth2Change ( ) ;
2017-02-22 10:14:37 +03:00
break ;
2015-09-11 00:11:41 +03:00
}
2016-08-18 08:44:07 +03:00
if ( authType == '2' || authType == '5' ) {
2016-07-08 02:25:09 +03:00
onSecurityProtocolChange ( )
}
2015-09-11 00:11:41 +03:00
} ) ;
2017-01-14 16:07:43 +03:00
$ ( '#auth_type' ) . change ( ) ;
2017-05-01 16:26:53 +03:00
$ ( '#security_protocol' ) . change ( onSecurityProtocolChange ) ;
$ ( '#oauth2_provider' ) . change ( onOAuth2Change ) ;
$ ( '#oauth2_use_custom_url' ) . change ( onOAuth2UseCustomURLChange ) ;
2016-07-08 02:25:09 +03:00
}
// Edit authentication
if ( $ ( '.admin.edit.authentication' ) . length > 0 ) {
2016-08-18 08:44:07 +03:00
var authType = $ ( '#auth_type' ) . val ( ) ;
if ( authType == '2' || authType == '5' ) {
2016-07-08 02:25:09 +03:00
$ ( '#security_protocol' ) . change ( onSecurityProtocolChange ) ;
2017-05-01 16:26:53 +03:00
} else if ( authType == '6' ) {
$ ( '#oauth2_provider' ) . change ( onOAuth2Change ) ;
$ ( '#oauth2_use_custom_url' ) . change ( onOAuth2UseCustomURLChange ) ;
onOAuth2Change ( ) ;
2016-07-08 02:25:09 +03:00
}
2015-09-11 00:11:41 +03:00
}
2015-12-05 09:09:14 +03:00
// Notice
if ( $ ( '.admin.notice' ) ) {
2016-08-18 08:44:07 +03:00
var $detailModal = $ ( '#detail-modal' ) ;
2015-12-05 09:09:14 +03:00
// Attach view detail modals
$ ( '.view-detail' ) . click ( function ( ) {
2016-08-18 08:44:07 +03:00
$detailModal . find ( '.content p' ) . text ( $ ( this ) . data ( 'content' ) ) ;
$detailModal . modal ( 'show' ) ;
2015-12-05 09:09:14 +03:00
return false ;
} ) ;
// Select actions
var $checkboxes = $ ( '.select.table .ui.checkbox' ) ;
$ ( '.select.action' ) . click ( function ( ) {
switch ( $ ( this ) . data ( 'action' ) ) {
case 'select-all' :
$checkboxes . checkbox ( 'check' ) ;
break ;
case 'deselect-all' :
$checkboxes . checkbox ( 'uncheck' ) ;
break ;
case 'inverse' :
$checkboxes . checkbox ( 'toggle' ) ;
break ;
}
} ) ;
$ ( '#delete-selection' ) . click ( function ( ) {
var $this = $ ( this ) ;
$this . addClass ( "loading disabled" ) ;
var ids = [ ] ;
$checkboxes . each ( function ( ) {
if ( $ ( this ) . checkbox ( 'is checked' ) ) {
ids . push ( $ ( this ) . data ( 'id' ) ) ;
}
} ) ;
$ . post ( $this . data ( 'link' ) , {
"_csrf" : csrf ,
"ids" : ids
} ) . done ( function ( ) {
window . location . href = $this . data ( 'redirect' ) ;
} ) ;
} ) ;
}
2015-09-11 00:11:41 +03:00
}
2015-11-12 00:19:28 +03:00
function buttonsClickOnEnter ( ) {
2015-11-14 12:34:01 +03:00
$ ( '.ui.button' ) . keypress ( function ( e ) {
2015-11-12 02:44:39 +03:00
if ( e . keyCode == 13 || e . keyCode == 32 ) // enter key or space bar
2015-11-12 00:19:28 +03:00
$ ( this ) . click ( ) ;
} ) ;
}
2015-11-22 09:32:09 +03:00
function hideWhenLostFocus ( body , parent ) {
$ ( document ) . click ( function ( e ) {
var target = e . target ;
if ( ! $ ( target ) . is ( body ) && ! $ ( target ) . parents ( ) . is ( parent ) ) {
$ ( body ) . hide ( ) ;
}
} ) ;
}
2015-11-17 10:18:05 +03:00
function searchUsers ( ) {
2016-08-18 08:44:07 +03:00
var $searchUserBox = $ ( '#search-user-box' ) ;
2017-10-03 06:27:48 +03:00
$searchUserBox . search ( {
minCharacters : 2 ,
apiSettings : {
url : suburl + '/api/v1/users/search?q={query}' ,
onResponse : function ( response ) {
var items = [ ] ;
$ . each ( response . data , function ( i , item ) {
var title = item . login ;
if ( item . full _name && item . full _name . length > 0 ) {
title += ' (' + item . full _name + ')' ;
}
items . push ( {
title : title ,
image : item . avatar _url
} )
} ) ;
2015-11-17 10:18:05 +03:00
2017-10-03 06:27:48 +03:00
return { results : items }
2015-11-17 10:18:05 +03:00
}
2017-10-03 06:27:48 +03:00
} ,
searchFields : [ 'login' , 'full_name' ] ,
showNoResults : false
2015-11-17 10:18:05 +03:00
} ) ;
2015-11-22 09:32:09 +03:00
}
function searchRepositories ( ) {
2016-08-18 08:44:07 +03:00
var $searchRepoBox = $ ( '#search-repo-box' ) ;
2017-10-03 06:27:48 +03:00
$searchRepoBox . search ( {
minCharacters : 2 ,
apiSettings : {
url : suburl + '/api/v1/repos/search?q={query}&uid=' + $searchRepoBox . data ( 'uid' ) ,
onResponse : function ( response ) {
var items = [ ] ;
$ . each ( response . data , function ( i , item ) {
items . push ( {
title : item . full _name . split ( "/" ) [ 1 ] ,
description : item . full _name
} )
} ) ;
2015-11-22 09:32:09 +03:00
2017-10-03 06:27:48 +03:00
return { results : items }
2015-11-22 09:32:09 +03:00
}
2017-10-03 06:27:48 +03:00
} ,
searchFields : [ 'full_name' ] ,
showNoResults : false
2015-11-17 10:18:05 +03:00
} ) ;
}
2016-08-11 15:48:08 +03:00
function initCodeView ( ) {
if ( $ ( '.code-view .linenums' ) . length > 0 ) {
$ ( document ) . on ( 'click' , '.lines-num span' , function ( e ) {
var $select = $ ( this ) ;
var $list = $select . parent ( ) . siblings ( '.lines-code' ) . find ( 'ol.linenums > li' ) ;
selectRange ( $list , $list . filter ( '[rel=' + $select . attr ( 'id' ) + ']' ) , ( e . shiftKey ? $list . filter ( '.active' ) . eq ( 0 ) : null ) ) ;
deSelect ( ) ;
} ) ;
$ ( window ) . on ( 'hashchange' , function ( e ) {
var m = window . location . hash . match ( /^#(L\d+)\-(L\d+)$/ ) ;
var $list = $ ( '.code-view ol.linenums > li' ) ;
var $first ;
if ( m ) {
$first = $list . filter ( '.' + m [ 1 ] ) ;
selectRange ( $list , $first , $list . filter ( '.' + m [ 2 ] ) ) ;
$ ( "html, body" ) . scrollTop ( $first . offset ( ) . top - 200 ) ;
return ;
}
m = window . location . hash . match ( /^#(L\d+)$/ ) ;
if ( m ) {
$first = $list . filter ( '.' + m [ 1 ] ) ;
selectRange ( $list , $first ) ;
$ ( "html, body" ) . scrollTop ( $first . offset ( ) . top - 200 ) ;
}
} ) . trigger ( 'hashchange' ) ;
}
}
2015-03-07 23:12:13 +03:00
$ ( document ) . ready ( function ( ) {
2015-07-24 18:13:42 +03:00
csrf = $ ( 'meta[name=_csrf]' ) . attr ( "content" ) ;
2015-09-06 13:57:25 +03:00
suburl = $ ( 'meta[name=_suburl]' ) . attr ( "content" ) ;
2015-07-24 18:13:42 +03:00
2015-08-14 19:42:43 +03:00
// Show exact time
$ ( '.time-since' ) . each ( function ( ) {
2016-03-05 08:51:51 +03:00
$ ( this ) . addClass ( 'poping up' ) . attr ( 'data-content' , $ ( this ) . attr ( 'title' ) ) . attr ( 'data-variation' , 'inverted tiny' ) . attr ( 'title' , '' ) ;
2015-08-14 19:42:43 +03:00
} ) ;
2015-07-07 20:09:03 +03:00
// Semantic UI modules.
2017-10-15 22:59:24 +03:00
$ ( '.dropdown:not(.custom)' ) . dropdown ( ) ;
2015-07-24 11:42:47 +03:00
$ ( '.jump.dropdown' ) . dropdown ( {
2015-08-10 17:38:21 +03:00
action : 'hide' ,
2015-08-11 07:44:14 +03:00
onShow : function ( ) {
2015-08-10 17:38:21 +03:00
$ ( '.poping.up' ) . popup ( 'hide' ) ;
}
2015-07-23 23:50:05 +03:00
} ) ;
2015-07-07 20:09:03 +03:00
$ ( '.slide.up.dropdown' ) . dropdown ( {
2015-03-07 23:12:13 +03:00
transition : 'slide up'
} ) ;
2015-12-05 09:09:14 +03:00
$ ( '.upward.dropdown' ) . dropdown ( {
direction : 'upward'
} ) ;
2015-07-08 14:47:56 +03:00
$ ( '.ui.accordion' ) . accordion ( ) ;
$ ( '.ui.checkbox' ) . checkbox ( ) ;
2015-08-03 12:42:09 +03:00
$ ( '.ui.progress' ) . progress ( {
showActivity : false
} ) ;
2015-07-09 08:17:48 +03:00
$ ( '.poping.up' ) . popup ( ) ;
2015-08-10 17:38:21 +03:00
$ ( '.top.menu .poping.up' ) . popup ( {
2015-08-11 07:44:14 +03:00
onShow : function ( ) {
if ( $ ( '.top.menu .menu.transition' ) . hasClass ( 'visible' ) ) {
2015-08-10 17:38:21 +03:00
return false ;
}
}
} ) ;
2015-08-27 18:06:14 +03:00
$ ( '.tabular.menu .item' ) . tab ( ) ;
2015-11-13 20:05:48 +03:00
$ ( '.tabable.menu .item' ) . tab ( ) ;
2015-08-27 18:06:14 +03:00
$ ( '.toggle.button' ) . click ( function ( ) {
$ ( $ ( this ) . data ( 'target' ) ) . slideToggle ( 100 ) ;
} ) ;
2015-07-07 20:09:03 +03:00
2017-01-18 04:18:55 +03:00
// make table <tr> element clickable like a link
$ ( 'tr[data-href]' ) . click ( function ( event ) {
window . location = $ ( this ) . data ( 'href' ) ;
} ) ;
2015-08-27 18:58:50 +03:00
// Highlight JS
2015-08-28 09:24:05 +03:00
if ( typeof hljs != 'undefined' ) {
hljs . initHighlightingOnLoad ( ) ;
}
2015-08-27 18:58:50 +03:00
2015-08-11 12:54:00 +03:00
// Dropzone
2016-08-18 08:44:07 +03:00
var $dropzone = $ ( '#dropzone' ) ;
if ( $dropzone . length > 0 ) {
2015-08-11 12:54:00 +03:00
// Disable auto discover for all elements:
Dropzone . autoDiscover = false ;
var filenameDict = { } ;
2016-08-18 08:44:07 +03:00
$dropzone . dropzone ( {
url : $dropzone . data ( 'upload-url' ) ,
2015-08-11 12:54:00 +03:00
headers : { "X-Csrf-Token" : csrf } ,
2016-08-18 08:44:07 +03:00
maxFiles : $dropzone . data ( 'max-file' ) ,
maxFilesize : $dropzone . data ( 'max-size' ) ,
acceptedFiles : ( $dropzone . data ( 'accepts' ) === '*/*' ) ? null : $dropzone . data ( 'accepts' ) ,
2015-08-11 12:54:00 +03:00
addRemoveLinks : true ,
2016-08-18 08:44:07 +03:00
dictDefaultMessage : $dropzone . data ( 'default-message' ) ,
dictInvalidFileType : $dropzone . data ( 'invalid-input-type' ) ,
dictFileTooBig : $dropzone . data ( 'file-too-big' ) ,
dictRemoveFile : $dropzone . data ( 'remove-file' ) ,
2015-08-11 12:54:00 +03:00
init : function ( ) {
this . on ( "success" , function ( file , data ) {
filenameDict [ file . name ] = data . uuid ;
2016-08-11 15:48:08 +03:00
var input = $ ( '<input id="' + data . uuid + '" name="files" type="hidden">' ) . val ( data . uuid ) ;
$ ( '.files' ) . append ( input ) ;
2015-09-05 21:11:05 +03:00
} ) ;
2015-08-11 12:54:00 +03:00
this . on ( "removedfile" , function ( file ) {
2015-08-11 18:24:40 +03:00
if ( file . name in filenameDict ) {
$ ( '#' + filenameDict [ file . name ] ) . remove ( ) ;
}
2016-08-18 08:44:07 +03:00
if ( $dropzone . data ( 'remove-url' ) && $dropzone . data ( 'csrf' ) ) {
$ . post ( $dropzone . data ( 'remove-url' ) , {
file : filenameDict [ file . name ] ,
_csrf : $dropzone . data ( 'csrf' )
} ) ;
2016-08-11 15:48:08 +03:00
}
2015-08-11 12:54:00 +03:00
} )
}
} ) ;
}
2015-08-09 10:23:02 +03:00
2015-09-05 21:11:05 +03:00
// Emojify
emojify . setConfig ( {
2017-10-23 11:48:56 +03:00
img _dir : suburl + '/vendor/plugins/emojify/images' ,
2015-12-14 14:04:24 +03:00
ignore _emoticons : true
2015-09-05 21:11:05 +03:00
} ) ;
2016-03-03 03:18:58 +03:00
var hasEmoji = document . getElementsByClassName ( 'has-emoji' ) ;
2016-03-05 08:51:51 +03:00
for ( var i = 0 ; i < hasEmoji . length ; i ++ ) {
emojify . run ( hasEmoji [ i ] ) ;
2016-03-03 03:18:58 +03:00
}
2015-09-05 21:11:05 +03:00
2015-10-03 02:58:36 +03:00
// Clipboard JS
var clipboard = new Clipboard ( '.clipboard' ) ;
clipboard . on ( 'success' , function ( e ) {
e . clearSelection ( ) ;
$ ( '#' + e . trigger . getAttribute ( 'id' ) ) . popup ( 'destroy' ) ;
e . trigger . setAttribute ( 'data-content' , e . trigger . getAttribute ( 'data-success' ) )
$ ( '#' + e . trigger . getAttribute ( 'id' ) ) . popup ( 'show' ) ;
e . trigger . setAttribute ( 'data-content' , e . trigger . getAttribute ( 'data-original' ) )
} ) ;
clipboard . on ( 'error' , function ( e ) {
$ ( '#' + e . trigger . getAttribute ( 'id' ) ) . popup ( 'destroy' ) ;
e . trigger . setAttribute ( 'data-content' , e . trigger . getAttribute ( 'data-error' ) )
$ ( '#' + e . trigger . getAttribute ( 'id' ) ) . popup ( 'show' ) ;
e . trigger . setAttribute ( 'data-content' , e . trigger . getAttribute ( 'data-original' ) )
} ) ;
2015-08-05 15:23:08 +03:00
// Helpers.
2017-10-26 03:49:16 +03:00
$ ( '.delete-button' ) . click ( showDeletePopup ) ;
2015-08-18 21:49:44 +03:00
2017-10-26 03:49:16 +03:00
$ ( '.delete-branch-button' ) . click ( showDeletePopup ) ;
$ ( '.undo-button' ) . click ( function ( ) {
var $this = $ ( this ) ;
$ . post ( $this . data ( 'url' ) , {
"_csrf" : csrf ,
"id" : $this . data ( "id" )
} ) . done ( function ( data ) {
window . location . href = data . redirect ;
} ) ;
2015-08-05 15:23:08 +03:00
} ) ;
2015-08-18 22:36:16 +03:00
$ ( '.show-panel.button' ) . click ( function ( ) {
$ ( $ ( this ) . data ( 'panel' ) ) . show ( ) ;
} ) ;
2015-08-29 22:21:59 +03:00
$ ( '.show-modal.button' ) . click ( function ( ) {
$ ( $ ( this ) . data ( 'modal' ) ) . modal ( 'show' ) ;
} ) ;
2016-07-30 20:26:43 +03:00
$ ( '.delete-post.button' ) . click ( function ( ) {
2016-03-05 08:51:51 +03:00
var $this = $ ( this ) ;
2016-07-30 20:26:43 +03:00
$ . post ( $this . data ( 'request-url' ) , {
2016-03-05 08:51:51 +03:00
"_csrf" : csrf
2016-07-30 20:26:43 +03:00
} ) . done ( function ( ) {
2016-03-05 08:51:51 +03:00
window . location . href = $this . data ( 'done-url' ) ;
} ) ;
} ) ;
2015-08-05 15:23:08 +03:00
2015-11-14 12:34:01 +03:00
// Set anchor.
$ ( '.markdown' ) . each ( function ( ) {
var headers = { } ;
$ ( this ) . find ( 'h1, h2, h3, h4, h5, h6' ) . each ( function ( ) {
var node = $ ( this ) ;
2016-12-31 13:06:09 +03:00
var val = encodeURIComponent ( node . text ( ) . toLowerCase ( ) . replace ( /[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g , '' ) . replace ( /[ ]/g , '-' ) ) ;
2015-11-14 12:34:01 +03:00
var name = val ;
if ( headers [ val ] > 0 ) {
name = val + '-' + headers [ val ] ;
}
if ( headers [ val ] == undefined ) {
headers [ val ] = 1 ;
} else {
headers [ val ] += 1 ;
}
node = node . wrap ( '<div id="' + name + '" class="anchor-wrap" ></div>' ) ;
node . append ( '<a class="anchor" href="#' + name + '"><span class="octicon octicon-link"></span></a>' ) ;
} ) ;
} ) ;
2017-02-14 04:13:59 +03:00
$ ( '.markdown' ) . autolink ( ) ;
2015-11-14 12:34:01 +03:00
2017-03-15 04:10:35 +03:00
$ ( '.issue-checkbox' ) . click ( function ( ) {
var numChecked = $ ( '.issue-checkbox' ) . children ( 'input:checked' ) . length ;
if ( numChecked > 0 ) {
2017-12-31 03:47:52 +03:00
$ ( '#issue-filters' ) . hide ( ) ;
$ ( '#issue-actions' ) . show ( ) ;
2017-03-15 04:10:35 +03:00
} else {
2017-12-31 03:47:52 +03:00
$ ( '#issue-filters' ) . show ( ) ;
$ ( '#issue-actions' ) . hide ( ) ;
2017-03-15 04:10:35 +03:00
}
} ) ;
$ ( '.issue-action' ) . click ( function ( ) {
var action = this . dataset . action
var elementId = this . dataset . elementId
var issueIDs = $ ( '.issue-checkbox' ) . children ( 'input:checked' ) . map ( function ( ) {
return this . dataset . issueId ;
} ) . get ( ) . join ( ) ;
var url = this . dataset . url
updateIssuesMeta ( url , action , issueIDs , elementId , function ( ) {
location . reload ( ) ;
} ) ;
} ) ;
2015-11-12 00:19:28 +03:00
buttonsClickOnEnter ( ) ;
2015-11-17 10:18:05 +03:00
searchUsers ( ) ;
2015-11-22 09:32:09 +03:00
searchRepositories ( ) ;
2015-11-17 10:18:05 +03:00
2015-08-10 13:57:57 +03:00
initCommentForm ( ) ;
2015-07-07 20:09:03 +03:00
initInstall ( ) ;
2015-07-24 16:02:49 +03:00
initRepository ( ) ;
2016-08-11 15:48:08 +03:00
initWikiForm ( ) ;
initEditForm ( ) ;
initEditor ( ) ;
2015-09-06 17:56:31 +03:00
initOrganization ( ) ;
2015-08-28 18:36:13 +03:00
initWebhook ( ) ;
2015-09-11 00:11:41 +03:00
initAdmin ( ) ;
2016-08-18 08:44:07 +03:00
initCodeView ( ) ;
2017-08-17 19:04:39 +03:00
initVueApp ( ) ;
2017-07-17 05:04:43 +03:00
initTeamSettings ( ) ;
2017-09-22 09:17:31 +03:00
initCtrlEnterSubmit ( ) ;
2017-12-31 03:47:52 +03:00
initNavbarContentToggle ( ) ;
2016-08-18 08:44:07 +03:00
// Repo clone url.
if ( $ ( '#repo-clone-url' ) . length > 0 ) {
switch ( localStorage . getItem ( 'repo-clone-protocol' ) ) {
case 'ssh' :
if ( $ ( '#repo-clone-ssh' ) . click ( ) . length === 0 ) {
$ ( '#repo-clone-https' ) . click ( ) ;
}
break ;
default :
$ ( '#repo-clone-https' ) . click ( ) ;
break ;
}
}
2016-03-05 08:51:51 +03:00
var routes = {
2016-03-06 02:08:42 +03:00
'div.user.settings' : initUserSettings ,
'div.repository.settings.collaboration' : initRepositoryCollaboration
2016-03-05 08:51:51 +03:00
} ;
var selector ;
for ( selector in routes ) {
if ( $ ( selector ) . length > 0 ) {
routes [ selector ] ( ) ;
break ;
}
}
2015-11-14 12:34:01 +03:00
} ) ;
2016-08-11 15:48:08 +03:00
function changeHash ( hash ) {
if ( history . pushState ) {
history . pushState ( null , null , hash ) ;
2015-11-14 12:34:01 +03:00
}
2016-08-11 15:48:08 +03:00
else {
location . hash = hash ;
2015-11-14 12:34:01 +03:00
}
2016-08-11 15:48:08 +03:00
}
2015-11-14 12:34:01 +03:00
2016-08-11 15:48:08 +03:00
function deSelect ( ) {
if ( window . getSelection ) {
window . getSelection ( ) . removeAllRanges ( ) ;
} else {
document . selection . empty ( ) ;
2015-11-14 12:34:01 +03:00
}
2016-08-11 15:48:08 +03:00
}
2015-11-14 12:34:01 +03:00
2016-08-11 15:48:08 +03:00
function selectRange ( $list , $select , $from ) {
$list . removeClass ( 'active' ) ;
if ( $from ) {
var a = parseInt ( $select . attr ( 'rel' ) . substr ( 1 ) ) ;
var b = parseInt ( $from . attr ( 'rel' ) . substr ( 1 ) ) ;
var c ;
if ( a != b ) {
if ( a > b ) {
c = a ;
a = b ;
b = c ;
2015-11-14 12:34:01 +03:00
}
2016-08-11 15:48:08 +03:00
var classes = [ ] ;
for ( var i = a ; i <= b ; i ++ ) {
classes . push ( '.L' + i ) ;
2015-11-14 12:34:01 +03:00
}
2016-08-11 15:48:08 +03:00
$list . filter ( classes . join ( ',' ) ) . addClass ( 'active' ) ;
changeHash ( '#L' + a + '-' + 'L' + b ) ;
return
}
2015-11-14 12:34:01 +03:00
}
2016-08-11 15:48:08 +03:00
$select . addClass ( 'active' ) ;
changeHash ( '#' + $select . attr ( 'rel' ) ) ;
}
2016-07-30 20:26:43 +03:00
$ ( function ( ) {
if ( $ ( '.user.signin' ) . length > 0 ) return ;
$ ( 'form' ) . areYouSure ( ) ;
2017-01-30 08:57:47 +03:00
2017-02-09 12:58:05 +03:00
// Parse SSH Key
$ ( "#ssh-key-content" ) . on ( 'change paste keyup' , function ( ) {
2017-02-16 07:16:42 +03:00
var arrays = $ ( this ) . val ( ) . split ( " " ) ;
var $title = $ ( "#ssh-key-title" )
if ( $title . val ( ) === "" && arrays . length === 3 && arrays [ 2 ] !== "" ) {
$title . val ( arrays [ 2 ] ) ;
2017-02-09 12:58:05 +03:00
}
} ) ;
2016-04-19 23:45:28 +03:00
} ) ;
2017-05-09 03:31:30 +03:00
2017-10-26 03:49:16 +03:00
function showDeletePopup ( ) {
var $this = $ ( this ) ;
var filter = "" ;
if ( $this . attr ( "id" ) ) {
filter += "#" + $this . attr ( "id" )
}
$ ( '.delete.modal' + filter ) . modal ( {
closable : false ,
onApprove : function ( ) {
if ( $this . data ( 'type' ) == "form" ) {
$ ( $this . data ( 'form' ) ) . submit ( ) ;
return ;
}
$ . post ( $this . data ( 'url' ) , {
"_csrf" : csrf ,
"id" : $this . data ( "id" )
} ) . done ( function ( data ) {
window . location . href = data . redirect ;
} ) ;
}
} ) . modal ( 'show' ) ;
return false ;
}
2017-08-17 04:31:34 +03:00
function initVueComponents ( ) {
var vueDelimeters = [ '${' , '}' ] ;
2017-05-09 03:31:30 +03:00
2017-08-17 04:31:34 +03:00
Vue . component ( 'repo-search' , {
delimiters : vueDelimeters ,
2017-05-09 03:31:30 +03:00
2017-08-17 04:31:34 +03:00
props : {
searchLimit : {
type : Number ,
default : 10
} ,
suburl : {
type : String ,
required : true
} ,
uid : {
type : Number ,
required : true
} ,
2017-08-22 16:00:34 +03:00
organizations : {
type : Array ,
default : [ ]
} ,
isOrganization : {
type : Boolean ,
default : true
} ,
canCreateOrganization : {
type : Boolean ,
default : false
} ,
organizationsTotalCount : {
type : Number ,
default : 0
} ,
moreReposLink : {
type : String ,
default : ''
}
2017-08-17 04:31:34 +03:00
} ,
data : function ( ) {
return {
tab : 'repos' ,
repos : [ ] ,
2017-08-22 16:00:34 +03:00
reposTotalCount : 0 ,
2017-08-17 04:31:34 +03:00
reposFilter : 'all' ,
searchQuery : '' ,
2017-11-01 22:39:05 +03:00
isLoading : false ,
repoTypes : {
'all' : {
count : 0 ,
searchMode : '' ,
} ,
'forks' : {
count : 0 ,
searchMode : 'fork' ,
} ,
'mirrors' : {
count : 0 ,
searchMode : 'mirror' ,
} ,
'sources' : {
count : 0 ,
searchMode : 'source' ,
} ,
'collaborative' : {
count : 0 ,
searchMode : 'collaborative' ,
} ,
}
}
} ,
computed : {
showMoreReposLink : function ( ) {
return this . repos . length > 0 && this . repos . length < this . repoTypes [ this . reposFilter ] . count ;
} ,
searchURL : function ( ) {
return this . suburl + '/api/v1/repos/search?uid=' + this . uid + '&q=' + this . searchQuery + '&limit=' + this . searchLimit + '&mode=' + this . repoTypes [ this . reposFilter ] . searchMode + ( this . reposFilter !== 'all' ? '&exclusive=1' : '' ) ;
} ,
repoTypeCount : function ( ) {
return this . repoTypes [ this . reposFilter ] . count ;
2017-08-17 04:31:34 +03:00
}
2017-05-09 03:31:30 +03:00
} ,
mounted : function ( ) {
2017-11-01 22:39:05 +03:00
this . searchRepos ( this . reposFilter ) ;
2017-05-09 03:31:30 +03:00
2017-08-17 04:31:34 +03:00
var self = this ;
2017-05-09 03:31:30 +03:00
Vue . nextTick ( function ( ) {
2017-08-17 04:31:34 +03:00
self . $refs . search . focus ( ) ;
2017-05-09 03:31:30 +03:00
} ) ;
} ,
methods : {
changeTab : function ( t ) {
this . tab = t ;
} ,
2017-08-17 04:31:34 +03:00
changeReposFilter : function ( filter ) {
this . reposFilter = filter ;
2017-11-01 22:39:05 +03:00
this . repos = [ ] ;
this . repoTypes [ filter ] . count = 0 ;
this . searchRepos ( filter ) ;
2017-08-17 04:31:34 +03:00
} ,
showRepo : function ( repo , filter ) {
switch ( filter ) {
case 'sources' :
return repo . owner . id == this . uid && ! repo . mirror && ! repo . fork ;
case 'forks' :
return repo . owner . id == this . uid && ! repo . mirror && repo . fork ;
case 'mirrors' :
return repo . mirror ;
case 'collaborative' :
2017-09-13 19:02:37 +03:00
return repo . owner . id != this . uid && ! repo . mirror ;
2017-08-17 04:31:34 +03:00
default :
return true ;
}
2017-05-09 03:31:30 +03:00
} ,
2017-11-01 22:39:05 +03:00
searchRepos : function ( reposFilter ) {
2017-05-09 03:31:30 +03:00
var self = this ;
2017-11-01 22:39:05 +03:00
2017-08-17 04:31:34 +03:00
this . isLoading = true ;
2017-11-01 22:39:05 +03:00
var searchedMode = this . repoTypes [ reposFilter ] . searchMode ;
var searchedURL = this . searchURL ;
2017-08-17 04:31:34 +03:00
var searchedQuery = this . searchQuery ;
2017-11-01 22:39:05 +03:00
$ . getJSON ( searchedURL , function ( result , textStatus , request ) {
if ( searchedURL == self . searchURL ) {
2017-08-17 04:31:34 +03:00
self . repos = result . data ;
2017-11-01 22:39:05 +03:00
var count = request . getResponseHeader ( 'X-Total-Count' ) ;
if ( searchedQuery === '' && searchedMode === '' ) {
self . reposTotalCount = count ;
2017-08-17 04:31:34 +03:00
}
2017-11-01 22:39:05 +03:00
self . repoTypes [ reposFilter ] . count = count ;
2017-08-17 04:31:34 +03:00
}
} ) . always ( function ( ) {
2017-11-01 22:39:05 +03:00
if ( searchedURL == self . searchURL ) {
2017-08-17 04:31:34 +03:00
self . isLoading = false ;
}
2017-05-09 03:31:30 +03:00
} ) ;
} ,
repoClass : function ( repo ) {
if ( repo . fork ) {
return 'octicon octicon-repo-forked' ;
} else if ( repo . mirror ) {
return 'octicon octicon-repo-clone' ;
} else if ( repo . private ) {
2017-05-27 19:40:54 +03:00
return 'octicon octicon-lock' ;
2017-05-09 03:31:30 +03:00
} else {
return 'octicon octicon-repo' ;
}
}
}
2017-08-17 04:31:34 +03:00
} )
}
2017-09-22 09:17:31 +03:00
function initCtrlEnterSubmit ( ) {
$ ( ".js-quick-submit" ) . keydown ( function ( e ) {
if ( ( ( e . ctrlKey && ! e . altKey ) || e . metaKey ) && ( e . keyCode == 13 || e . keyCode == 10 ) ) {
$ ( this ) . closest ( "form" ) . submit ( ) ;
}
} ) ;
}
2017-08-17 19:04:39 +03:00
function initVueApp ( ) {
var el = document . getElementById ( 'app' ) ;
2017-08-17 04:31:34 +03:00
if ( ! el ) {
return ;
}
initVueComponents ( ) ;
new Vue ( {
delimiters : [ '${' , '}' ] ,
el : el ,
data : {
searchLimit : document . querySelector ( 'meta[name=_search_limit]' ) . content ,
suburl : document . querySelector ( 'meta[name=_suburl]' ) . content ,
uid : document . querySelector ( 'meta[name=_context_uid]' ) . content ,
} ,
2017-05-09 03:31:30 +03:00
} ) ;
}
2017-09-12 09:48:13 +03:00
function timeAddManual ( ) {
$ ( '.mini.modal' )
. modal ( {
duration : 200 ,
onApprove : function ( ) {
$ ( '#add_time_manual_form' ) . submit ( ) ;
}
} ) . modal ( 'show' )
;
}
function toggleStopwatch ( ) {
$ ( "#toggle_stopwatch_form" ) . submit ( ) ;
}
function cancelStopwatch ( ) {
$ ( "#cancel_stopwatch_form" ) . submit ( ) ;
}
2017-10-15 22:59:24 +03:00
function initFilterBranchTagDropdown ( selector ) {
$ ( selector ) . each ( function ( ) {
var $dropdown = $ ( this ) ;
var $data = $dropdown . find ( '.data' ) ;
var data = {
items : [ ] ,
mode : $data . data ( 'mode' ) ,
searchTerm : '' ,
noResults : '' ,
canCreateBranch : false ,
menuVisible : false ,
active : 0
} ;
$data . find ( '.item' ) . each ( function ( ) {
data . items . push ( {
name : $ ( this ) . text ( ) ,
url : $ ( this ) . data ( 'url' ) ,
branch : $ ( this ) . hasClass ( 'branch' ) ,
tag : $ ( this ) . hasClass ( 'tag' ) ,
selected : $ ( this ) . hasClass ( 'selected' )
} ) ;
} ) ;
$data . remove ( ) ;
new Vue ( {
delimiters : [ '${' , '}' ] ,
el : this ,
data : data ,
beforeMount : function ( ) {
var vm = this ;
this . noResults = vm . $el . getAttribute ( 'data-no-results' ) ;
this . canCreateBranch = vm . $el . getAttribute ( 'data-can-create-branch' ) === 'true' ;
document . body . addEventListener ( 'click' , function ( event ) {
if ( vm . $el . contains ( event . target ) ) {
return ;
}
if ( vm . menuVisible ) {
Vue . set ( vm , 'menuVisible' , false ) ;
}
} ) ;
} ,
watch : {
menuVisible : function ( visible ) {
if ( visible ) {
this . focusSearchField ( ) ;
}
}
} ,
computed : {
filteredItems : function ( ) {
var vm = this ;
var items = vm . items . filter ( function ( item ) {
return ( ( vm . mode === 'branches' && item . branch )
|| ( vm . mode === 'tags' && item . tag ) )
&& ( ! vm . searchTerm
|| item . name . toLowerCase ( ) . indexOf ( vm . searchTerm . toLowerCase ( ) ) >= 0 ) ;
} ) ;
vm . active = ( items . length === 0 && vm . showCreateNewBranch ? 0 : - 1 ) ;
return items ;
} ,
showNoResults : function ( ) {
return this . filteredItems . length === 0
&& ! this . showCreateNewBranch ;
} ,
showCreateNewBranch : function ( ) {
var vm = this ;
if ( ! this . canCreateBranch || ! vm . searchTerm || vm . mode === 'tags' ) {
return false ;
}
return vm . items . filter ( function ( item ) {
return item . name . toLowerCase ( ) === vm . searchTerm . toLowerCase ( )
} ) . length === 0 ;
}
} ,
methods : {
selectItem : function ( item ) {
var prev = this . getSelected ( ) ;
if ( prev !== null ) {
prev . selected = false ;
}
item . selected = true ;
window . location . href = item . url ;
} ,
createNewBranch : function ( ) {
if ( ! this . showCreateNewBranch ) {
return ;
}
this . $refs . newBranchForm . submit ( ) ;
} ,
focusSearchField : function ( ) {
var vm = this ;
Vue . nextTick ( function ( ) {
vm . $refs . searchField . focus ( ) ;
} ) ;
} ,
getSelected : function ( ) {
for ( var i = 0 , j = this . items . length ; i < j ; ++ i ) {
if ( this . items [ i ] . selected )
return this . items [ i ] ;
}
return null ;
} ,
2017-10-19 09:00:36 +03:00
getSelectedIndexInFiltered : function ( ) {
2017-10-15 22:59:24 +03:00
for ( var i = 0 , j = this . filteredItems . length ; i < j ; ++ i ) {
if ( this . filteredItems [ i ] . selected )
return i ;
}
return - 1 ;
} ,
2017-10-19 09:00:36 +03:00
scrollToActive : function ( ) {
2017-10-15 22:59:24 +03:00
var el = this . $refs [ 'listItem' + this . active ] ;
if ( ! el || el . length === 0 ) {
return ;
}
if ( Array . isArray ( el ) ) {
el = el [ 0 ] ;
}
var cont = this . $refs . scrollContainer ;
if ( el . offsetTop < cont . scrollTop ) {
cont . scrollTop = el . offsetTop ;
}
else if ( el . offsetTop + el . clientHeight > cont . scrollTop + cont . clientHeight ) {
cont . scrollTop = el . offsetTop + el . clientHeight - cont . clientHeight ;
}
} ,
keydown : function ( event ) {
var vm = this ;
if ( event . keyCode === 40 ) {
// arrow down
event . preventDefault ( ) ;
if ( vm . active === - 1 ) {
vm . active = vm . getSelectedIndexInFiltered ( ) ;
}
if ( vm . active + ( vm . showCreateNewBranch ? 0 : 1 ) >= vm . filteredItems . length ) {
return ;
}
vm . active ++ ;
vm . scrollToActive ( ) ;
}
if ( event . keyCode === 38 ) {
// arrow up
event . preventDefault ( ) ;
if ( vm . active === - 1 ) {
vm . active = vm . getSelectedIndexInFiltered ( ) ;
}
if ( vm . active <= 0 ) {
return ;
}
vm . active -- ;
vm . scrollToActive ( ) ;
}
if ( event . keyCode == 13 ) {
// enter
event . preventDefault ( ) ;
if ( vm . active >= vm . filteredItems . length ) {
vm . createNewBranch ( ) ;
} else if ( vm . active >= 0 ) {
vm . selectItem ( vm . filteredItems [ vm . active ] ) ;
}
}
if ( event . keyCode == 27 ) {
// escape
event . preventDefault ( ) ;
vm . menuVisible = false ;
}
}
}
} ) ;
} ) ;
}
2017-11-30 08:08:40 +03:00
$ ( ".commit-button" ) . click ( function ( ) {
$ ( this ) . parent ( ) . find ( '.commit-body' ) . toggle ( ) ;
} ) ;
2017-12-31 03:47:52 +03:00
function initNavbarContentToggle ( ) {
var content = $ ( '#navbar' ) ;
var toggle = $ ( '#navbar-expand-toggle' ) ;
var isExpanded = false ;
toggle . click ( function ( ) {
isExpanded = ! isExpanded ;
if ( isExpanded ) {
content . addClass ( 'shown' ) ;
toggle . addClass ( 'active' ) ;
}
else {
content . removeClass ( 'shown' ) ;
toggle . removeClass ( 'active' ) ;
}
} ) ;
}