Открыть боковую панель
nt_test134
nt_project_qgddddf2ot8w
Коммиты
812f495b
Коммит
812f495b
создал
Фев 21, 2018
по автору
Clement Ho
Просмотр файлов
Merge branch 'master' into dispatcher-import-batch-2
владельцы
8446d3df
ef91fadb
Изменения
54
Скрыть пробелы
Построчно
Рядом
app/assets/javascripts/blob_edit/blob_bundle.js
Просмотр файла @
812f495b
...
...
@@ -4,7 +4,7 @@ import NewCommitForm from '../new_commit_form';
import
EditBlob
from
'
./edit_blob
'
;
import
BlobFileDropzone
from
'
../blob/blob_file_dropzone
'
;
$
(
()
=>
{
export
default
()
=>
{
const
editBlobForm
=
$
(
'
.js-edit-blob-form
'
);
const
uploadBlobForm
=
$
(
'
.js-upload-blob-form
'
);
const
deleteBlobForm
=
$
(
'
.js-delete-blob-form
'
);
...
...
@@ -34,4 +34,4 @@ $(() => {
if
(
deleteBlobForm
.
length
)
{
new
NewCommitForm
(
deleteBlobForm
);
}
}
)
;
};
app/assets/javascripts/boards/filtered_search_boards.js
Просмотр файла @
812f495b
/* eslint-disable class-methods-use-this */
import
FilteredSearchContainer
from
'
../filtered_search/container
'
;
import
FilteredSearchManager
from
'
../filtered_search/filtered_search_manager
'
;
export
default
class
FilteredSearchBoards
extends
gl
.
FilteredSearchManager
{
export
default
class
FilteredSearchBoards
extends
FilteredSearchManager
{
constructor
(
store
,
updateUrl
=
false
,
cantEdit
=
[])
{
super
(
'
boards
'
);
...
...
app/assets/javascripts/dispatcher.js
Просмотр файла @
812f495b
...
...
@@ -115,11 +115,6 @@ var Dispatcher;
.
catch
(
fail
);
shortcut_handler
=
true
;
break
;
case
'
help:index
'
:
import
(
'
./pages/help
'
)
.
then
(
callDefault
)
.
catch
(
fail
);
break
;
case
'
search:show
'
:
import
(
'
./pages/search/show
'
)
.
then
(
callDefault
)
...
...
app/assets/javascripts/docs/docs_bundle.js
Просмотр файла @
812f495b
...
...
@@ -4,10 +4,7 @@ function addMousetrapClick(el, key) {
el
.
addEventListener
(
'
click
'
,
()
=>
Mousetrap
.
trigger
(
key
));
}
function
domContentLoaded
()
{
export
default
()
=>
{
addMousetrapClick
(
document
.
querySelector
(
'
.js-trigger-shortcut
'
),
'
?
'
);
addMousetrapClick
(
document
.
querySelector
(
'
.js-trigger-search-bar
'
),
'
s
'
);
}
document
.
addEventListener
(
'
DOMContentLoaded
'
,
domContentLoaded
);
};
app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.js
Просмотр файла @
812f495b
import
eventHub
from
'
../event_hub
'
;
import
FilteredSearchTokenizer
from
'
../filtered_search_tokenizer
'
;
export
default
{
name
:
'
RecentSearchesDropdownContent
'
,
...
...
@@ -23,7 +24,7 @@ export default {
processedItems
()
{
return
this
.
items
.
map
((
item
)
=>
{
const
{
tokens
,
searchToken
}
=
gl
.
FilteredSearchTokenizer
.
processTokens
(
item
,
this
.
allowedKeys
);
=
FilteredSearchTokenizer
.
processTokens
(
item
,
this
.
allowedKeys
);
const
resultantTokens
=
tokens
.
map
(
token
=>
({
prefix
:
`
${
token
.
key
}
:`
,
...
...
app/assets/javascripts/filtered_search/dropdown_emoji.js
Просмотр файла @
812f495b
import
Flash
from
'
../flash
'
;
import
Ajax
from
'
../droplab/plugins/ajax
'
;
import
Filter
from
'
../droplab/plugins/filter
'
;
import
'
./filtered_search_dropdown
'
;
import
FilteredSearchDropdown
from
'
./filtered_search_dropdown
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
class
DropdownEmoji
extends
gl
.
FilteredSearchDropdown
{
export
default
class
DropdownEmoji
extends
FilteredSearchDropdown
{
constructor
(
options
=
{})
{
super
(
options
);
this
.
config
=
{
...
...
@@ -49,7 +50,7 @@ class DropdownEmoji extends gl.FilteredSearchDropdown {
itemClicked
(
e
)
{
super
.
itemClicked
(
e
,
(
selected
)
=>
{
const
name
=
selected
.
querySelector
(
'
.js-data-value
'
).
innerText
.
trim
();
return
gl
.
DropdownUtils
.
getEscapedText
(
name
);
return
DropdownUtils
.
getEscapedText
(
name
);
});
}
...
...
@@ -76,6 +77,3 @@ class DropdownEmoji extends gl.FilteredSearchDropdown {
.
addHook
(
this
.
input
,
this
.
dropdown
,
[
Ajax
,
Filter
],
this
.
config
).
init
();
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
DropdownEmoji
=
DropdownEmoji
;
app/assets/javascripts/filtered_search/dropdown_hint.js
Просмотр файла @
812f495b
import
Filter
from
'
~/droplab/plugins/filter
'
;
import
'
./filtered_search_dropdown
'
;
import
FilteredSearchDropdown
from
'
./filtered_search_dropdown
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
import
FilteredSearchDropdownManager
from
'
./filtered_search_dropdown_manager
'
;
import
FilteredSearchVisualTokens
from
'
./filtered_search_visual_tokens
'
;
class
DropdownHint
extends
gl
.
FilteredSearchDropdown
{
export
default
class
DropdownHint
extends
FilteredSearchDropdown
{
constructor
(
options
=
{})
{
const
{
input
,
tokenKeys
}
=
options
;
super
(
options
);
this
.
config
=
{
Filter
:
{
template
:
'
hint
'
,
filterFunction
:
gl
.
DropdownUtils
.
filterHint
.
bind
(
null
,
{
filterFunction
:
DropdownUtils
.
filterHint
.
bind
(
null
,
{
input
,
allowedKeys
:
tokenKeys
.
getKeys
(),
}),
...
...
@@ -45,10 +48,10 @@ class DropdownHint extends gl.FilteredSearchDropdown {
});
if
(
searchTerms
.
length
>
0
)
{
gl
.
FilteredSearchVisualTokens
.
addSearchVisualToken
(
searchTerms
.
join
(
'
'
));
FilteredSearchVisualTokens
.
addSearchVisualToken
(
searchTerms
.
join
(
'
'
));
}
gl
.
FilteredSearchDropdownManager
.
addWordToInput
(
token
.
replace
(
'
:
'
,
''
),
''
,
false
,
this
.
container
);
FilteredSearchDropdownManager
.
addWordToInput
(
token
.
replace
(
'
:
'
,
''
),
''
,
false
,
this
.
container
);
}
this
.
dismissDropdown
();
this
.
dispatchInputEvent
();
...
...
@@ -73,6 +76,3 @@ class DropdownHint extends gl.FilteredSearchDropdown {
this
.
droplab
.
addHook
(
this
.
input
,
this
.
dropdown
,
[
Filter
],
this
.
config
).
init
();
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
DropdownHint
=
DropdownHint
;
app/assets/javascripts/filtered_search/dropdown_non_user.js
Просмотр файла @
812f495b
import
Flash
from
'
../flash
'
;
import
Ajax
from
'
../droplab/plugins/ajax
'
;
import
Filter
from
'
../droplab/plugins/filter
'
;
import
'
./filtered_search_dropdown
'
;
import
FilteredSearchDropdown
from
'
./filtered_search_dropdown
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
class
DropdownNonUser
extends
gl
.
FilteredSearchDropdown
{
export
default
class
DropdownNonUser
extends
FilteredSearchDropdown
{
constructor
(
options
=
{})
{
const
{
input
,
endpoint
,
symbol
,
preprocessing
}
=
options
;
super
(
options
);
...
...
@@ -21,7 +22,7 @@ class DropdownNonUser extends gl.FilteredSearchDropdown {
},
},
Filter
:
{
filterFunction
:
gl
.
DropdownUtils
.
filterWithSymbol
.
bind
(
null
,
this
.
symbol
,
input
),
filterFunction
:
DropdownUtils
.
filterWithSymbol
.
bind
(
null
,
this
.
symbol
,
input
),
template
:
'
title
'
,
},
};
...
...
@@ -30,7 +31,7 @@ class DropdownNonUser extends gl.FilteredSearchDropdown {
itemClicked
(
e
)
{
super
.
itemClicked
(
e
,
(
selected
)
=>
{
const
title
=
selected
.
querySelector
(
'
.js-data-value
'
).
innerText
.
trim
();
return
`
${
this
.
symbol
}${
gl
.
DropdownUtils
.
getEscapedText
(
title
)}
`
;
return
`
${
this
.
symbol
}${
DropdownUtils
.
getEscapedText
(
title
)}
`
;
});
}
...
...
@@ -45,6 +46,3 @@ class DropdownNonUser extends gl.FilteredSearchDropdown {
.
addHook
(
this
.
input
,
this
.
dropdown
,
[
Ajax
,
Filter
],
this
.
config
).
init
();
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
DropdownNonUser
=
DropdownNonUser
;
app/assets/javascripts/filtered_search/dropdown_user.js
Просмотр файла @
812f495b
import
Flash
from
'
../flash
'
;
import
AjaxFilter
from
'
../droplab/plugins/ajax_filter
'
;
import
'
./filtered_search_dropdown
'
;
import
FilteredSearchDropdown
from
'
./filtered_search_dropdown
'
;
import
{
addClassIfElementExists
}
from
'
../lib/utils/dom_utils
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
import
FilteredSearchTokenizer
from
'
./filtered_search_tokenizer
'
;
class
DropdownUser
extends
gl
.
FilteredSearchDropdown
{
export
default
class
DropdownUser
extends
FilteredSearchDropdown
{
constructor
(
options
=
{})
{
const
{
tokenKeys
}
=
options
;
super
(
options
);
...
...
@@ -56,8 +58,8 @@ class DropdownUser extends gl.FilteredSearchDropdown {
}
getSearchInput
()
{
const
query
=
gl
.
DropdownUtils
.
getSearchInput
(
this
.
input
);
const
{
lastToken
}
=
gl
.
FilteredSearchTokenizer
.
processTokens
(
query
,
this
.
tokenKeys
.
get
());
const
query
=
DropdownUtils
.
getSearchInput
(
this
.
input
);
const
{
lastToken
}
=
FilteredSearchTokenizer
.
processTokens
(
query
,
this
.
tokenKeys
.
get
());
let
value
=
lastToken
||
''
;
...
...
@@ -78,6 +80,3 @@ class DropdownUser extends gl.FilteredSearchDropdown {
this
.
droplab
.
addHook
(
this
.
input
,
this
.
dropdown
,
[
AjaxFilter
],
this
.
config
).
init
();
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
DropdownUser
=
DropdownUser
;
app/assets/javascripts/filtered_search/dropdown_utils.js
Просмотр файла @
812f495b
import
_
from
'
underscore
'
;
import
FilteredSearchContainer
from
'
./container
'
;
import
FilteredSearchTokenizer
from
'
./filtered_search_tokenizer
'
;
import
FilteredSearchDropdownManager
from
'
./filtered_search_dropdown_manager
'
;
import
FilteredSearchVisualTokens
from
'
./filtered_search_visual_tokens
'
;
class
DropdownUtils
{
export
default
class
DropdownUtils
{
static
getEscapedText
(
text
)
{
let
escapedText
=
text
;
const
hasSpace
=
text
.
indexOf
(
'
'
)
!==
-
1
;
...
...
@@ -24,7 +27,7 @@ class DropdownUtils {
static
filterWithSymbol
(
filterSymbol
,
input
,
item
)
{
const
updatedItem
=
item
;
const
searchInput
=
gl
.
DropdownUtils
.
getSearchInput
(
input
);
const
searchInput
=
DropdownUtils
.
getSearchInput
(
input
);
const
title
=
updatedItem
.
title
.
toLowerCase
();
let
value
=
searchInput
.
toLowerCase
();
...
...
@@ -114,9 +117,9 @@ class DropdownUtils {
static
filterHint
(
config
,
item
)
{
const
{
input
,
allowedKeys
}
=
config
;
const
updatedItem
=
item
;
const
searchInput
=
gl
.
DropdownUtils
.
getSearchQuery
(
input
);
const
searchInput
=
DropdownUtils
.
getSearchQuery
(
input
);
const
{
lastToken
,
tokens
}
=
gl
.
FilteredSearchTokenizer
.
processTokens
(
searchInput
,
allowedKeys
);
FilteredSearchTokenizer
.
processTokens
(
searchInput
,
allowedKeys
);
const
lastKey
=
lastToken
.
key
||
lastToken
||
''
;
const
allowMultiple
=
item
.
type
===
'
array
'
;
const
itemInExistingTokens
=
tokens
.
some
(
t
=>
t
.
key
===
item
.
hint
);
...
...
@@ -140,7 +143,7 @@ class DropdownUtils {
const
dataValue
=
selected
.
getAttribute
(
'
data-value
'
);
if
(
dataValue
)
{
gl
.
FilteredSearchDropdownManager
.
addWordToInput
(
filter
,
dataValue
,
true
);
FilteredSearchDropdownManager
.
addWordToInput
(
filter
,
dataValue
,
true
);
}
// Return boolean based on whether it was set
...
...
@@ -190,7 +193,7 @@ class DropdownUtils {
}
}
else
if
(
token
.
classList
.
contains
(
'
input-token
'
))
{
const
{
isLastVisualTokenValid
}
=
gl
.
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
const
input
=
FilteredSearchContainer
.
container
.
querySelector
(
'
.filtered-search
'
);
const
inputValue
=
input
&&
input
.
value
;
...
...
@@ -211,7 +214,7 @@ class DropdownUtils {
static
getSearchInput
(
filteredSearchInput
)
{
const
inputValue
=
filteredSearchInput
.
value
;
const
{
right
}
=
gl
.
DropdownUtils
.
getInputSelectionPosition
(
filteredSearchInput
);
const
{
right
}
=
DropdownUtils
.
getInputSelectionPosition
(
filteredSearchInput
);
return
inputValue
.
slice
(
0
,
right
);
}
...
...
@@ -252,6 +255,3 @@ class DropdownUtils {
};
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
DropdownUtils
=
DropdownUtils
;
app/assets/javascripts/filtered_search/filtered_search_dropdown.js
Просмотр файла @
812f495b
import
DropdownUtils
from
'
./dropdown_utils
'
;
import
FilteredSearchDropdownManager
from
'
./filtered_search_dropdown_manager
'
;
const
DATA_DROPDOWN_TRIGGER
=
'
data-dropdown-trigger
'
;
class
FilteredSearchDropdown
{
export
default
class
FilteredSearchDropdown
{
constructor
({
droplab
,
dropdown
,
input
,
filter
})
{
this
.
droplab
=
droplab
;
this
.
hookId
=
input
&&
input
.
id
;
...
...
@@ -30,11 +33,11 @@ class FilteredSearchDropdown {
const
{
selected
}
=
e
.
detail
;
if
(
selected
.
tagName
===
'
LI
'
&&
selected
.
innerHTML
)
{
const
dataValueSet
=
gl
.
DropdownUtils
.
setDataValueIfSelected
(
this
.
filter
,
selected
);
const
dataValueSet
=
DropdownUtils
.
setDataValueIfSelected
(
this
.
filter
,
selected
);
if
(
!
dataValueSet
)
{
const
value
=
getValueFunction
(
selected
);
gl
.
FilteredSearchDropdownManager
.
addWordToInput
(
this
.
filter
,
value
,
true
);
FilteredSearchDropdownManager
.
addWordToInput
(
this
.
filter
,
value
,
true
);
}
this
.
resetFilters
();
...
...
@@ -117,6 +120,3 @@ class FilteredSearchDropdown {
}
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
FilteredSearchDropdown
=
FilteredSearchDropdown
;
app/assets/javascripts/filtered_search/filtered_search_dropdown_manager.js
Просмотр файла @
812f495b
import
_
from
'
underscore
'
;
import
DropLab
from
'
~/droplab/drop_lab
'
;
import
FilteredSearchContainer
from
'
./container
'
;
class
FilteredSearchDropdownManager
{
import
FilteredSearchTokenKeys
from
'
./filtered_search_token_keys
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
import
DropdownHint
from
'
./dropdown_hint
'
;
import
DropdownEmoji
from
'
./dropdown_emoji
'
;
import
DropdownNonUser
from
'
./dropdown_non_user
'
;
import
DropdownUser
from
'
./dropdown_user
'
;
import
FilteredSearchVisualTokens
from
'
./filtered_search_visual_tokens
'
;
export
default
class
FilteredSearchDropdownManager
{
constructor
(
baseEndpoint
=
''
,
tokenizer
,
page
,
isGroup
,
filteredSearchTokenKeys
)
{
this
.
container
=
FilteredSearchContainer
.
container
;
this
.
baseEndpoint
=
baseEndpoint
.
replace
(
/
\/
$/
,
''
);
this
.
tokenizer
=
tokenizer
;
this
.
filteredSearchTokenKeys
=
filteredSearchTokenKeys
;
this
.
filteredSearchTokenKeys
=
filteredSearchTokenKeys
||
FilteredSearchTokenKeys
;
this
.
filteredSearchInput
=
this
.
container
.
querySelector
(
'
.filtered-search
'
);
this
.
page
=
page
;
...
...
@@ -33,24 +40,24 @@ class FilteredSearchDropdownManager {
const
allowedMappings
=
{
hint
:
{
reference
:
null
,
gl
:
'
DropdownHint
'
,
gl
:
DropdownHint
,
element
:
this
.
container
.
querySelector
(
'
#js-dropdown-hint
'
),
},
};
const
availableMappings
=
{
author
:
{
reference
:
null
,
gl
:
'
DropdownUser
'
,
gl
:
DropdownUser
,
element
:
this
.
container
.
querySelector
(
'
#js-dropdown-author
'
),
},
assignee
:
{
reference
:
null
,
gl
:
'
DropdownUser
'
,
gl
:
DropdownUser
,
element
:
this
.
container
.
querySelector
(
'
#js-dropdown-assignee
'
),
},
milestone
:
{
reference
:
null
,
gl
:
'
DropdownNonUser
'
,
gl
:
DropdownNonUser
,
extraArguments
:
{
endpoint
:
`
${
this
.
baseEndpoint
}
/milestones.json`
,
symbol
:
'
%
'
,
...
...
@@ -59,17 +66,17 @@ class FilteredSearchDropdownManager {
},
label
:
{
reference
:
null
,
gl
:
'
DropdownNonUser
'
,
gl
:
DropdownNonUser
,
extraArguments
:
{
endpoint
:
`
${
this
.
baseEndpoint
}
/labels.json`
,
symbol
:
'
~
'
,
preprocessing
:
gl
.
DropdownUtils
.
duplicateLabelPreprocessing
,
preprocessing
:
DropdownUtils
.
duplicateLabelPreprocessing
,
},
element
:
this
.
container
.
querySelector
(
'
#js-dropdown-label
'
),
},
'
my-reaction
'
:
{
reference
:
null
,
gl
:
'
DropdownEmoji
'
,
gl
:
DropdownEmoji
,
element
:
this
.
container
.
querySelector
(
'
#js-dropdown-my-reaction
'
),
},
};
...
...
@@ -86,11 +93,11 @@ class FilteredSearchDropdownManager {
static
addWordToInput
(
tokenName
,
tokenValue
=
''
,
clicked
=
false
)
{
const
input
=
FilteredSearchContainer
.
container
.
querySelector
(
'
.filtered-search
'
);
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenName
,
tokenValue
);
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenName
,
tokenValue
);
input
.
value
=
''
;
if
(
clicked
)
{
gl
.
FilteredSearchVisualTokens
.
moveInputToTheRight
();
FilteredSearchVisualTokens
.
moveInputToTheRight
();
}
}
...
...
@@ -131,9 +138,9 @@ class FilteredSearchDropdownManager {
const
extraArguments
=
mappingKey
.
extraArguments
||
{};
const
glArguments
=
Object
.
assign
({},
defaultArguments
,
extraArguments
);
// Passing glArguments to `new
gl[
glClass
]
(<arguments>)`
// Passing glArguments to `new glClass(<arguments>)`
mappingKey
.
reference
=
new
(
Function
.
prototype
.
bind
.
apply
(
gl
[
glClass
]
,
[
null
,
glArguments
]))();
new
(
Function
.
prototype
.
bind
.
apply
(
glClass
,
[
null
,
glArguments
]))();
}
if
(
firstLoad
)
{
...
...
@@ -171,7 +178,7 @@ class FilteredSearchDropdownManager {
}
setDropdown
()
{
const
query
=
gl
.
DropdownUtils
.
getSearchQuery
(
true
);
const
query
=
DropdownUtils
.
getSearchQuery
(
true
);
const
{
lastToken
,
searchToken
}
=
this
.
tokenizer
.
processTokens
(
query
,
this
.
filteredSearchTokenKeys
.
getKeys
());
...
...
@@ -216,6 +223,3 @@ class FilteredSearchDropdownManager {
this
.
droplab
.
destroy
();
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
FilteredSearchDropdownManager
=
FilteredSearchDropdownManager
;
app/assets/javascripts/filtered_search/filtered_search_manager.js
Просмотр файла @
812f495b
import
_
from
'
underscore
'
;
import
{
getParameterByName
,
getUrlParamsArray
,
}
from
'
~/lib/utils/common_utils
'
;
import
{
visitUrl
}
from
'
../lib/utils/url_utility
'
;
import
Flash
from
'
../flash
'
;
import
FilteredSearchContainer
from
'
./container
'
;
import
RecentSearchesRoot
from
'
./recent_searches_root
'
;
import
FilteredSearchTokenKeys
from
'
./filtered_search_token_keys
'
;
import
RecentSearchesRoot
from
'
./recent_searches_root
'
;
import
RecentSearchesStore
from
'
./stores/recent_searches_store
'
;
import
RecentSearchesService
from
'
./services/recent_searches_service
'
;
import
eventHub
from
'
./event_hub
'
;
import
{
addClassIfElementExists
}
from
'
../lib/utils/dom_utils
'
;
import
FilteredSearchTokenizer
from
'
./filtered_search_tokenizer
'
;
import
FilteredSearchDropdownManager
from
'
./filtered_search_dropdown_manager
'
;
import
FilteredSearchVisualTokens
from
'
./filtered_search_visual_tokens
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
class
FilteredSearchManager
{
export
default
class
FilteredSearchManager
{
constructor
({
page
,
filteredSearchTokenKeys
=
FilteredSearchTokenKeys
,
...
...
@@ -66,8 +74,8 @@ class FilteredSearchManager {
});
if
(
this
.
filteredSearchInput
)
{
this
.
tokenizer
=
gl
.
FilteredSearchTokenizer
;
this
.
dropdownManager
=
new
gl
.
FilteredSearchDropdownManager
(
this
.
tokenizer
=
FilteredSearchTokenizer
;
this
.
dropdownManager
=
new
FilteredSearchDropdownManager
(
this
.
filteredSearchInput
.
getAttribute
(
'
data-base-endpoint
'
)
||
''
,
this
.
tokenizer
,
this
.
page
,
...
...
@@ -85,7 +93,6 @@ class FilteredSearchManager {
this
.
bindEvents
();
this
.
loadSearchParamsFromURL
();
this
.
dropdownManager
.
setDropdown
();
this
.
cleanupWrapper
=
this
.
cleanup
.
bind
(
this
);
document
.
addEventListener
(
'
beforeunload
'
,
this
.
cleanupWrapper
);
}
...
...
@@ -197,8 +204,8 @@ class FilteredSearchManager {
// 8 = Backspace Key
// 46 = Delete Key
if
(
e
.
keyCode
===
8
||
e
.
keyCode
===
46
)
{
const
{
lastVisualToken
}
=
gl
.
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
const
{
tokenName
,
tokenValue
}
=
gl
.
DropdownUtils
.
getVisualTokenValues
(
lastVisualToken
);
const
{
lastVisualToken
}
=
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
const
{
tokenName
,
tokenValue
}
=
DropdownUtils
.
getVisualTokenValues
(
lastVisualToken
);
const
canEdit
=
tokenName
&&
this
.
canEdit
&&
this
.
canEdit
(
tokenName
,
tokenValue
);
if
(
this
.
filteredSearchInput
.
value
===
''
&&
lastVisualToken
&&
canEdit
)
{
...
...
@@ -206,8 +213,8 @@ class FilteredSearchManager {
if
(
backspaceCount
===
2
)
{
backspaceCount
=
0
;
this
.
filteredSearchInput
.
value
=
gl
.
FilteredSearchVisualTokens
.
getLastTokenPartial
();
gl
.
FilteredSearchVisualTokens
.
removeLastTokenPartial
();
this
.
filteredSearchInput
.
value
=
FilteredSearchVisualTokens
.
getLastTokenPartial
();
FilteredSearchVisualTokens
.
removeLastTokenPartial
();
}
}
...
...
@@ -275,7 +282,7 @@ class FilteredSearchManager {
e
.
stopImmediatePropagation
();
const
button
=
e
.
target
.
closest
(
'
.selectable
'
);
gl
.
FilteredSearchVisualTokens
.
selectToken
(
button
,
true
);
FilteredSearchVisualTokens
.
selectToken
(
button
,
true
);
this
.
removeSelectedToken
();
}
}
...
...
@@ -287,7 +294,7 @@ class FilteredSearchManager {
const
isElementTokensContainer
=
e
.
target
.
classList
.
contains
(
'
tokens-container
'
);
if
((
!
isElementInFilteredSearch
&&
!
isElementInFilterDropdown
)
||
isElementTokensContainer
)
{
gl
.
FilteredSearchVisualTokens
.
moveInputToTheRight
();
FilteredSearchVisualTokens
.
moveInputToTheRight
();
this
.
dropdownManager
.
resetDropdowns
();
}
}
...
...
@@ -300,13 +307,13 @@ class FilteredSearchManager {
if
(
token
&&
canEdit
)
{
e
.
preventDefault
();
e
.
stopPropagation
();
gl
.
FilteredSearchVisualTokens
.
editToken
(
token
);
FilteredSearchVisualTokens
.
editToken
(
token
);
this
.
tokenChange
();
}
}
toggleClearSearchButton
()
{
const
query
=
gl
.
DropdownUtils
.
getSearchQuery
();
const
query
=
DropdownUtils
.
getSearchQuery
();
const
hidden
=
'
hidden
'
;
const
hasHidden
=
this
.
clearSearchButton
.
classList
.
contains
(
hidden
);
...
...
@@ -318,7 +325,7 @@ class FilteredSearchManager {
}
handleInputPlaceholder
()
{
const
query
=
gl
.
DropdownUtils
.
getSearchQuery
();
const
query
=
DropdownUtils
.
getSearchQuery
();
const
placeholder
=
'
Search or filter results...
'
;
const
currentPlaceholder
=
this
.
filteredSearchInput
.
placeholder
;
...
...
@@ -338,7 +345,7 @@ class FilteredSearchManager {
}
removeSelectedToken
()
{
gl
.
FilteredSearchVisualTokens
.
removeSelectedToken
();
FilteredSearchVisualTokens
.
removeSelectedToken
();
this
.
handleInputPlaceholder
();
this
.
toggleClearSearchButton
();
this
.
dropdownManager
.
updateCurrentDropdownOffset
();
...
...
@@ -358,7 +365,7 @@ class FilteredSearchManager {
let
canClearToken
=
t
.
classList
.
contains
(
'
js-visual-token
'
);
if
(
canClearToken
)
{
const
{
tokenName
,
tokenValue
}
=
gl
.
DropdownUtils
.
getVisualTokenValues
(
t
);
const
{
tokenName
,
tokenValue
}
=
DropdownUtils
.
getVisualTokenValues
(
t
);
canClearToken
=
this
.
canEdit
&&
this
.
canEdit
(
tokenName
,
tokenValue
);
}
...
...
@@ -386,12 +393,12 @@ class FilteredSearchManager {
const
{
tokens
,
searchToken
}
=
this
.
tokenizer
.
processTokens
(
input
.
value
,
this
.
filteredSearchTokenKeys
.
getKeys
());
const
{
isLastVisualTokenValid
}
=
gl
.
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
=
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
if
(
isLastVisualTokenValid
)
{
tokens
.
forEach
((
t
)
=>
{
input
.
value
=
input
.
value
.
replace
(
`
${
t
.
key
}
:
${
t
.
symbol
}${
t
.
value
}
`
,
''
);
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
t
.
key
,
`
${
t
.
symbol
}${
t
.
value
}
`
);
FilteredSearchVisualTokens
.
addFilterVisualToken
(
t
.
key
,
`
${
t
.
symbol
}${
t
.
value
}
`
);
});
const
fragments
=
searchToken
.
split
(
'
:
'
);
...
...
@@ -404,10 +411,10 @@ class FilteredSearchManager {
const
searchTerms
=
inputValues
.
join
(
'
'
);
input
.
value
=
input
.
value
.
replace
(
searchTerms
,
''
);
gl
.
FilteredSearchVisualTokens
.
addSearchVisualToken
(
searchTerms
);
FilteredSearchVisualTokens
.
addSearchVisualToken
(
searchTerms
);
}
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenKey
);
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenKey
);
input
.
value
=
input
.
value
.
replace
(
`
${
tokenKey
}
:`
,
''
);
}
}
else
{
...
...
@@ -415,7 +422,7 @@ class FilteredSearchManager {
const
valueCompletedRegex
=
/
([
~%@
]{0,1}
".+"
)
|
([
~%@
]{0,1}
'.+'
)
|^
((?![
~%@
]
'
)(?![
~%@
]
"
)(?!
'
)(?!
"
))
.*/g
;
if
(
searchToken
.
match
(
valueCompletedRegex
)
&&
input
.
value
[
input
.
value
.
length
-
1
]
===
'
'
)
{
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
searchToken
);
FilteredSearchVisualTokens
.
addFilterVisualToken
(
searchToken
);
// Trim the last space as seen in the if statement above
input
.
value
=
input
.
value
.
replace
(
searchToken
,
''
).
trim
();
...
...
@@ -431,7 +438,7 @@ class FilteredSearchManager {
saveCurrentSearchQuery
()
{
// Don't save before we have fetched the already saved searches
this
.
fetchingRecentSearchesPromise
.
then
(()
=>
{
const
searchQuery
=
gl
.
DropdownUtils
.
getSearchQuery
();
const
searchQuery
=
DropdownUtils
.
getSearchQuery
();
if
(
searchQuery
.
length
>
0
)
{
const
resultantSearches
=
this
.
recentSearchesStore
.
addRecentSearch
(
searchQuery
);
this
.
recentSearchesService
.
save
(
resultantSearches
);
...
...
@@ -447,7 +454,7 @@ class FilteredSearchManager {
}
loadSearchParamsFromURL
()
{
const
urlParams
=
gl
.
utils
.
getUrlParamsArray
();
const
urlParams
=
getUrlParamsArray
();
const
params
=
this
.
getAllParams
(
urlParams
);
const
usernameParams
=
this
.
getUsernameParams
();
let
hasFilteredSearch
=
false
;
...
...
@@ -463,7 +470,7 @@ class FilteredSearchManager {
if
(
condition
)
{
hasFilteredSearch
=
true
;
const
canEdit
=
this
.
canEdit
&&
this
.
canEdit
(
condition
.
tokenKey
);
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
FilteredSearchVisualTokens
.
addFilterVisualToken
(
condition
.
tokenKey
,
condition
.
value
,
canEdit
,
...
...
@@ -492,7 +499,7 @@ class FilteredSearchManager {
hasFilteredSearch
=
true
;
const
canEdit
=
this
.
canEdit
&&
this
.
canEdit
(
sanitizedKey
,
sanitizedValue
);
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
FilteredSearchVisualTokens
.
addFilterVisualToken
(
sanitizedKey
,
`
${
symbol
}${
quotationsToUse
}${
sanitizedValue
}${
quotationsToUse
}
`
,
canEdit
,
...
...
@@ -503,7 +510,7 @@ class FilteredSearchManager {
hasFilteredSearch
=
true
;
const
tokenName
=
'
assignee
'
;
const
canEdit
=
this
.
canEdit
&&
this
.
canEdit
(
tokenName
);
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenName
,
`@
${
usernameParams
[
id
]}
`
,
canEdit
);
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenName
,
`@
${
usernameParams
[
id
]}
`
,
canEdit
);
}
}
else
if
(
!
match
&&
keyParam
===
'
author_id
'
)
{
const
id
=
parseInt
(
value
,
10
);
...
...
@@ -511,7 +518,7 @@ class FilteredSearchManager {
hasFilteredSearch
=
true
;
const
tokenName
=
'
author
'
;
const
canEdit
=
this
.
canEdit
&&
this
.
canEdit
(
tokenName
);
gl
.
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenName
,
`@
${
usernameParams
[
id
]}
`
,
canEdit
);
FilteredSearchVisualTokens
.
addFilterVisualToken
(
tokenName
,
`@
${
usernameParams
[
id
]}
`
,
canEdit
);
}
}
else
if
(
!
match
&&
keyParam
===
'
search
'
)
{
hasFilteredSearch
=
true
;
...
...
@@ -543,13 +550,13 @@ class FilteredSearchManager {
search
(
state
=
null
)
{
const
paths
=
[];
const
searchQuery
=
gl
.
DropdownUtils
.
getSearchQuery
();
const
searchQuery
=
DropdownUtils
.
getSearchQuery
();
this
.
saveCurrentSearchQuery
();
const
{
tokens
,
searchToken
}
=
this
.
tokenizer
.
processTokens
(
searchQuery
,
this
.
filteredSearchTokenKeys
.
getKeys
());
const
currentState
=
state
||
gl
.
utils
.
getParameterByName
(
'
state
'
)
||
'
opened
'
;
const
currentState
=
state
||
getParameterByName
(
'
state
'
)
||
'
opened
'
;
paths
.
push
(
`state=
${
currentState
}
`
);
tokens
.
forEach
((
token
)
=>
{
...
...
@@ -628,6 +635,3 @@ class FilteredSearchManager {
return
true
;
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
FilteredSearchManager
=
FilteredSearchManager
;
app/assets/javascripts/filtered_search/filtered_search_tokenizer.js
Просмотр файла @
812f495b
import
'
./filtered_search_token_keys
'
;
class
FilteredSearchTokenizer
{
export
default
class
FilteredSearchTokenizer
{
static
processTokens
(
input
,
allowedKeys
)
{
// Regex extracts `(token):(symbol)(value)`
// Values that start with a double quote must end in a double quote (same for single)
...
...
@@ -50,6 +50,3 @@ class FilteredSearchTokenizer {
};
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
FilteredSearchTokenizer
=
FilteredSearchTokenizer
;
app/assets/javascripts/filtered_search/filtered_search_visual_tokens.js
Просмотр файла @
812f495b
...
...
@@ -3,8 +3,9 @@ import AjaxCache from '../lib/utils/ajax_cache';
import
Flash
from
'
../flash
'
;
import
FilteredSearchContainer
from
'
./container
'
;
import
UsersCache
from
'
../lib/utils/users_cache
'
;
import
DropdownUtils
from
'
./dropdown_utils
'
;
class
FilteredSearchVisualTokens
{
export
default
class
FilteredSearchVisualTokens
{
static
getLastVisualTokenBeforeInput
()
{
const
inputLi
=
FilteredSearchContainer
.
container
.
querySelector
(
'
.input-token
'
);
const
lastVisualToken
=
inputLi
&&
inputLi
.
previousElementSibling
;
...
...
@@ -74,7 +75,7 @@ class FilteredSearchVisualTokens {
let
processed
=
labels
;
if
(
!
labels
.
preprocessed
)
{
processed
=
gl
.
DropdownUtils
.
duplicateLabelPreprocessing
(
labels
);
processed
=
DropdownUtils
.
duplicateLabelPreprocessing
(
labels
);
AjaxCache
.
override
(
labelsEndpoint
,
processed
);
processed
.
preprocessed
=
true
;
}
...
...
@@ -90,7 +91,7 @@ class FilteredSearchVisualTokens {
return
AjaxCache
.
retrieve
(
labelsEndpoint
)
.
then
(
FilteredSearchVisualTokens
.
preprocessLabel
.
bind
(
null
,
labelsEndpoint
))
.
then
((
labels
)
=>
{
const
matchingLabel
=
(
labels
||
[]).
find
(
label
=>
`~
${
gl
.
DropdownUtils
.
getEscapedText
(
label
.
title
)}
`
===
tokenValue
);
const
matchingLabel
=
(
labels
||
[]).
find
(
label
=>
`~
${
DropdownUtils
.
getEscapedText
(
label
.
title
)}
`
===
tokenValue
);
if
(
!
matchingLabel
)
{
return
;
...
...
@@ -259,11 +260,11 @@ class FilteredSearchVisualTokens {
static
tokenizeInput
()
{
const
input
=
FilteredSearchContainer
.
container
.
querySelector
(
'
.filtered-search
'
);
const
{
isLastVisualTokenValid
}
=
gl
.
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
if
(
input
.
value
)
{
if
(
isLastVisualTokenValid
)
{
gl
.
FilteredSearchVisualTokens
.
addSearchVisualToken
(
input
.
value
);
FilteredSearchVisualTokens
.
addSearchVisualToken
(
input
.
value
);
}
else
{
FilteredSearchVisualTokens
.
addValueToPreviousVisualTokenElement
(
input
.
value
);
}
...
...
@@ -324,12 +325,12 @@ class FilteredSearchVisualTokens {
if
(
!
tokenContainer
.
lastElementChild
.
isEqualNode
(
inputLi
))
{
const
{
isLastVisualTokenValid
}
=
gl
.
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
FilteredSearchVisualTokens
.
getLastVisualTokenBeforeInput
();
if
(
!
isLastVisualTokenValid
)
{
const
lastPartial
=
gl
.
FilteredSearchVisualTokens
.
getLastTokenPartial
();
gl
.
FilteredSearchVisualTokens
.
removeLastTokenPartial
();
gl
.
FilteredSearchVisualTokens
.
addSearchVisualToken
(
lastPartial
);
const
lastPartial
=
FilteredSearchVisualTokens
.
getLastTokenPartial
();
FilteredSearchVisualTokens
.
removeLastTokenPartial
();
FilteredSearchVisualTokens
.
addSearchVisualToken
(
lastPartial
);
}
tokenContainer
.
removeChild
(
inputLi
);
...
...
@@ -337,6 +338,3 @@ class FilteredSearchVisualTokens {
}
}
}
window
.
gl
=
window
.
gl
||
{};
gl
.
FilteredSearchVisualTokens
=
FilteredSearchVisualTokens
;
app/assets/javascripts/help/help.js
Просмотр файла @
812f495b
// We will render the icons list here
if
(
$
(
'
#user-content-gitlab-icons
'
).
length
>
0
)
{
const
$iconsHeader
=
$
(
'
#user-content-gitlab-icons
'
);
const
$iconsList
=
$
(
'
<div id="iconsList">ICONS</div>
'
);
$
(
$iconsList
).
insertAfter
(
$iconsHeader
.
parent
());
}
export
default
()
=>
{
if
(
$
(
'
#user-content-gitlab-icons
'
).
length
>
0
)
{
const
$iconsHeader
=
$
(
'
#user-content-gitlab-icons
'
);
const
$iconsList
=
$
(
'
<div id="iconsList">ICONS</div>
'
);
$
(
$iconsList
).
insertAfter
(
$iconsHeader
.
parent
());
}
};
app/assets/javascripts/pages/dashboard/groups/index/index.js
Просмотр файла @
812f495b
import
initGroupsList
from
'
../../../..
/groups
'
;
import
initGroupsList
from
'
~
/groups
'
;
export
default
()
=>
{
initGroupsList
();
};
export
default
initGroupsList
;
app/assets/javascripts/pages/groups/show/index.js
Просмотр файла @
812f495b
...
...
@@ -5,7 +5,7 @@ import notificationsDropdown from '~/notifications_dropdown';
import
NotificationsForm
from
'
~/notifications_form
'
;
import
ProjectsList
from
'
~/projects_list
'
;
import
ShortcutsNavigation
from
'
~/shortcuts_navigation
'
;
import
initGroupsList
from
'
../../..
/groups
'
;
import
initGroupsList
from
'
~
/groups
'
;
document
.
addEventListener
(
'
DOMContentLoaded
'
,
()
=>
{
const
newGroupChildWrapper
=
document
.
querySelector
(
'
.js-new-project-subgroup
'
);
...
...
app/assets/javascripts/pages/help/index.js
удалено
100644 → 0
Просмотр файла @
8446d3df
import
VersionCheckImage
from
'
../../version_check_image
'
;
export
default
()
=>
VersionCheckImage
.
bindErrorEvent
(
$
(
'
img.js-version-status-badge
'
));
app/assets/javascripts/pages/help/index/index.js
0 → 100644
Просмотр файла @
812f495b
import
VersionCheckImage
from
'
~/version_check_image
'
;
import
docs
from
'
~/docs/docs_bundle
'
;
document
.
addEventListener
(
'
DOMContentLoaded
'
,
()
=>
{
docs
();
VersionCheckImage
.
bindErrorEvent
(
$
(
'
img.js-version-status-badge
'
));
});
Пред
1
2
3
След
Редактирование
Предварительный просмотр
Поддерживает Markdown
0%
Попробовать снова
или
прикрепить новый файл
.
Отмена
You are about to add
0
people
to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Отмена
Пожалуйста,
зарегистрируйтесь
или
войдите
чтобы прокомментировать