Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
gitlab-ce
Commits
8df62a3a
Commit
8df62a3a
authored
Oct 26, 2017
by
Filipa Lacerda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove old code
parent
bf4e97fc
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
112 additions
and
242 deletions
+112
-242
app/assets/javascripts/dispatcher.js
app/assets/javascripts/dispatcher.js
+2
-2
app/assets/javascripts/importer_status.js
app/assets/javascripts/importer_status.js
+71
-73
app/assets/javascripts/issuable_bulk_update_actions.js
app/assets/javascripts/issuable_bulk_update_actions.js
+0
-1
app/assets/javascripts/issuable_index.js
app/assets/javascripts/issuable_index.js
+37
-165
app/assets/javascripts/main.js
app/assets/javascripts/main.js
+2
-1
No files found.
app/assets/javascripts/dispatcher.js
View file @
8df62a3a
/* eslint-disable func-names, space-before-function-paren, no-var, prefer-arrow-callback, wrap-iife, no-shadow, consistent-return, one-var, one-var-declaration-per-line, camelcase, default-case, no-new, quotes, no-duplicate-case, no-case-declarations, no-fallthrough, max-len */
/* global ProjectSelect */
/* global IssuableIndex */
import
IssuableIndex
from
'
./issuable_index
'
;
/* global Milestone */
/* global IssuableForm */
/* global LabelsSelect */
...
...
@@ -173,7 +173,7 @@ import Diff from './diff';
filteredSearchManager
.
setup
();
}
const
pagePrefix
=
page
===
'
projects:merge_requests:index
'
?
'
merge_request_
'
:
'
issue_
'
;
IssuableIndex
.
init
(
pagePrefix
);
new
IssuableIndex
(
pagePrefix
);
shortcut_handler
=
new
ShortcutsNavigation
();
new
UsersSelect
();
...
...
app/assets/javascripts/importer_status.js
View file @
8df62a3a
/* eslint-disable func-names, space-before-function-paren, wrap-iife, camelcase, no-var, one-var, one-var-declaration-per-line, prefer-template, quotes, object-shorthand, comma-dangle, no-unused-vars, prefer-arrow-callback, no-else-return, vars-on-top, no-new, max-len */
class
ImporterStatus
{
constructor
(
jobsUrl
,
importUrl
)
{
this
.
jobsUrl
=
jobsUrl
;
this
.
importUrl
=
importUrl
;
this
.
initStatusPage
();
this
.
setAutoUpdate
();
}
(
function
()
{
window
.
ImporterStatus
=
(
function
()
{
function
ImporterStatus
(
jobs_url
,
import_url
)
{
this
.
jobs_url
=
jobs_url
;
this
.
import_url
=
import_url
;
this
.
initStatusPage
();
this
.
setAutoUpdate
();
}
initStatusPage
()
{
$
(
'
.js-add-to-import
'
)
.
off
(
'
click
'
)
.
on
(
'
click
'
,
(
event
)
=>
{
const
$btn
=
$
(
event
.
currentTarget
);
const
$tr
=
$btn
.
closest
(
'
tr
'
);
const
$targetField
=
$tr
.
find
(
'
.import-target
'
);
const
$namespaceInput
=
$targetField
.
find
(
'
.js-select-namespace option:selected
'
);
const
id
=
$tr
.
attr
(
'
id
'
).
replace
(
'
repo_
'
,
''
);
let
targetNamespace
;
let
newName
;
if
(
$namespaceInput
.
length
>
0
)
{
targetNamespace
=
$namespaceInput
[
0
].
innerHTML
;
newName
=
$targetField
.
find
(
'
#path
'
).
prop
(
'
value
'
);
$targetField
.
empty
().
append
(
`
${
targetNamespace
}
/
${
newName
}
`
);
}
$btn
.
disable
().
addClass
(
'
is-loading
'
);
ImporterStatus
.
prototype
.
initStatusPage
=
function
()
{
$
(
'
.js-add-to-import
'
).
off
(
'
click
'
).
on
(
'
click
'
,
(
function
(
_this
)
{
return
function
(
e
)
{
var
$btn
,
$namespace_input
,
$target_field
,
$tr
,
id
,
target_namespace
,
newName
;
$btn
=
$
(
e
.
currentTarget
);
$tr
=
$btn
.
closest
(
'
tr
'
);
$target_field
=
$tr
.
find
(
'
.import-target
'
);
$namespace_input
=
$target_field
.
find
(
'
.js-select-namespace option:selected
'
);
id
=
$tr
.
attr
(
'
id
'
).
replace
(
'
repo_
'
,
''
);
target_namespace
=
null
;
newName
=
null
;
if
(
$namespace_input
.
length
>
0
)
{
target_namespace
=
$namespace_input
[
0
].
innerHTML
;
newName
=
$target_field
.
find
(
'
#path
'
).
prop
(
'
value
'
);
$target_field
.
empty
().
append
(
target_namespace
+
"
/
"
+
newName
);
}
$btn
.
disable
().
addClass
(
'
is-loading
'
);
return
$
.
post
(
_this
.
import_url
,
{
repo_id
:
id
,
target_namespace
:
target_namespace
,
new_name
:
newName
},
{
dataType
:
'
script
'
});
};
})(
this
));
return
$
(
'
.js-import-all
'
).
off
(
'
click
'
).
on
(
'
click
'
,
function
(
e
)
{
var
$btn
;
$btn
=
$
(
this
);
return
$
.
post
(
this
.
importUrl
,
{
repo_id
:
id
,
target_namespace
:
targetNamespace
,
new_name
:
newName
,
},
{
dataType
:
'
script
'
,
});
});
$
(
'
.js-import-all
'
)
.
off
(
'
click
'
)
.
on
(
'
click
'
,
function
onClickImportAll
()
{
const
$btn
=
$
(
this
);
$btn
.
disable
().
addClass
(
'
is-loading
'
);
return
$
(
'
.js-add-to-import
'
).
each
(
function
()
{
return
$
(
'
.js-add-to-import
'
).
each
(
function
triggerAddImport
()
{
return
$
(
this
).
trigger
(
'
click
'
);
});
});
};
}
setAutoUpdate
()
{
return
setInterval
(()
=>
$
.
get
(
this
.
jobsUrl
,
data
=>
$
.
each
(
data
,
(
i
,
job
)
=>
{
const
jobItem
=
$
(
`#project_
${
job
.
id
}
`
);
const
statusField
=
jobItem
.
find
(
'
.job-status
'
);
ImporterStatus
.
prototype
.
setAutoUpdate
=
function
()
{
return
setInterval
(((
function
(
_this
)
{
return
function
()
{
return
$
.
get
(
_this
.
jobs_url
,
function
(
data
)
{
return
$
.
each
(
data
,
function
(
i
,
job
)
{
var
job_item
,
status_field
;
job_item
=
$
(
"
#project_
"
+
job
.
id
);
status_field
=
job_item
.
find
(
"
.job-status
"
);
if
(
job
.
import_status
===
'
finished
'
)
{
job_item
.
removeClass
(
"
active
"
).
addClass
(
"
success
"
);
return
status_field
.
html
(
'
<span><i class="fa fa-check"></i> done</span>
'
);
}
else
if
(
job
.
import_status
===
'
scheduled
'
)
{
return
status_field
.
html
(
"
<i class='fa fa-spinner fa-spin'></i> scheduled
"
);
}
else
if
(
job
.
import_status
===
'
started
'
)
{
return
status_field
.
html
(
"
<i class='fa fa-spinner fa-spin'></i> started
"
);
}
else
{
return
status_field
.
html
(
job
.
import_status
);
}
});
});
};
})(
this
)),
4000
);
};
const
spinner
=
'
<i class="fa fa-spinner fa-spin"></i>
'
;
return
ImporterStatus
;
})();
switch
(
job
.
import_status
)
{
case
'
finished
'
:
jobItem
.
removeClass
(
'
active
'
).
addClass
(
'
success
'
);
statusField
.
html
(
'
<span><i class="fa fa-check"></i> done</span>
'
);
break
;
case
'
scheduled
'
:
statusField
.
html
(
`
${
spinner
}
scheduled`
);
break
;
case
'
started
'
:
statusField
.
html
(
`
${
spinner
}
started`
);
break
;
default
:
statusField
.
html
(
job
.
import_status
);
break
;
}
})),
4000
);
}
}
$
(
function
()
{
if
(
$
(
'
.js-importer-status
'
).
length
)
{
var
jobsImportPath
=
$
(
'
.js-importer-status
'
).
data
(
'
jobs-import-path
'
);
var
importPath
=
$
(
'
.js-importer-status
'
).
data
(
'
import-path
'
)
;
// eslint-disable-next-line consistent-return
export
default
function
initImporterStatus
(
)
{
const
importerStatus
=
$
(
'
.js-importer-status
'
);
const
data
=
importerStatus
.
dataset
;
new
window
.
ImporterStatus
(
jobsImportPath
,
importPath
);
}
}
);
}
).
call
(
window
);
if
(
importerStatus
.
length
)
{
return
new
ImporterStatus
(
data
.
jobsImportPath
,
data
.
importPath
);
}
}
app/assets/javascripts/issuable_bulk_update_actions.js
View file @
8df62a3a
/* eslint-disable comma-dangle, quotes, consistent-return, func-names, array-callback-return, space-before-function-paren, prefer-arrow-callback, max-len, no-unused-expressions, no-sequences, no-underscore-dangle, no-unused-vars, no-param-reassign */
/* global IssuableIndex */
import
_
from
'
underscore
'
;
import
Flash
from
'
./flash
'
;
...
...
app/assets/javascripts/issuable_index.js
View file @
8df62a3a
/* eslint-disable no-param-reassign, func-names, no-var, camelcase, no-unused-vars, object-shorthand, space-before-function-paren, no-return-assign, comma-dangle, consistent-return, one-var, one-var-declaration-per-line, quotes, prefer-template, prefer-arrow-callback, wrap-iife, max-len */
/* global IssuableIndex */
import
_
from
'
underscore
'
;
import
IssuableBulkUpdateSidebar
from
'
./issuable_bulk_update_sidebar
'
;
import
IssuableBulkUpdateActions
from
'
./issuable_bulk_update_actions
'
;
((
global
)
=>
{
var
issuable_created
;
issuable_created
=
false
;
global
.
IssuableIndex
=
{
init
:
function
(
pagePrefix
)
{
IssuableIndex
.
initTemplates
();
IssuableIndex
.
initSearch
();
IssuableIndex
.
initBulkUpdate
(
pagePrefix
);
IssuableIndex
.
initResetFilters
();
IssuableIndex
.
resetIncomingEmailToken
();
IssuableIndex
.
initLabelFilterRemove
();
},
initTemplates
:
function
()
{
return
IssuableIndex
.
labelRow
=
_
.
template
(
'
<% _.each(labels, function(label){ %> <span class="label-row btn-group" role="group" aria-label="<%- label.title %>" style="color: <%- label.text_color %>;"> <a href="#" class="btn btn-transparent has-tooltip" style="background-color: <%- label.color %>;" title="<%- label.description %>" data-container="body"> <%- label.title %> </a> <button type="button" class="btn btn-transparent label-remove js-label-filter-remove" style="background-color: <%- label.color %>;" data-label="<%- label.title %>"> <i class="fa fa-times"></i> </button> </span> <% }); %>
'
);
},
initSearch
:
function
()
{
const
$searchInput
=
$
(
'
#issuable_search
'
);
IssuableIndex
.
initSearchState
(
$searchInput
);
// `immediate` param set to false debounces on the `trailing` edge, lets user finish typing
const
debouncedExecSearch
=
_
.
debounce
(
IssuableIndex
.
executeSearch
,
1000
,
false
);
$searchInput
.
off
(
'
keyup
'
).
on
(
'
keyup
'
,
debouncedExecSearch
);
// ensures existing filters are preserved when manually submitted
$
(
'
#issuable_search_form
'
).
on
(
'
submit
'
,
(
e
)
=>
{
e
.
preventDefault
();
debouncedExecSearch
(
e
);
});
},
initSearchState
:
function
(
$searchInput
)
{
const
currentSearchVal
=
$searchInput
.
val
();
IssuableIndex
.
searchState
=
{
elem
:
$searchInput
,
current
:
currentSearchVal
};
IssuableIndex
.
maybeFocusOnSearch
();
},
accessSearchPristine
:
function
(
set
)
{
// store reference to previous value to prevent search on non-mutating keyup
const
state
=
IssuableIndex
.
searchState
;
const
currentSearchVal
=
state
.
elem
.
val
();
if
(
set
)
{
state
.
current
=
currentSearchVal
;
}
else
{
return
state
.
current
===
currentSearchVal
;
}
},
maybeFocusOnSearch
:
function
()
{
const
currentSearchVal
=
IssuableIndex
.
searchState
.
current
;
if
(
currentSearchVal
&&
currentSearchVal
!==
''
)
{
const
queryLength
=
currentSearchVal
.
length
;
const
$searchInput
=
IssuableIndex
.
searchState
.
elem
;
/* The following ensures that the cursor is initially placed at
* the end of search input when focus is applied. It accounts
* for differences in browser implementations of `setSelectionRange`
* and cursor placement for elements in focus.
*/
$searchInput
.
focus
();
if
(
$searchInput
.
setSelectionRange
)
{
$searchInput
.
setSelectionRange
(
queryLength
,
queryLength
);
}
else
{
$searchInput
.
val
(
currentSearchVal
);
}
}
},
executeSearch
:
function
(
e
)
{
const
$search
=
$
(
'
#issuable_search
'
);
const
$searchName
=
$search
.
attr
(
'
name
'
);
const
$searchValue
=
$search
.
val
();
const
$filtersForm
=
$
(
'
.js-filter-form
'
);
const
$input
=
$
(
`input[name='
${
$searchName
}
']`
,
$filtersForm
);
const
isPristine
=
IssuableIndex
.
accessSearchPristine
();
if
(
isPristine
)
{
return
;
}
if
(
!
$input
.
length
)
{
$filtersForm
.
append
(
`<input type='hidden' name='
${
$searchName
}
' value='
${
_
.
escape
(
$searchValue
)}
'/>`
);
}
else
{
$input
.
val
(
$searchValue
);
}
IssuableIndex
.
filterResults
(
$filtersForm
);
},
initLabelFilterRemove
:
function
()
{
return
$
(
document
).
off
(
'
click
'
,
'
.js-label-filter-remove
'
).
on
(
'
click
'
,
'
.js-label-filter-remove
'
,
function
(
e
)
{
var
$button
;
$button
=
$
(
this
);
// Remove the label input box
$
(
'
input[name="label_name[]"]
'
).
filter
(
function
()
{
return
this
.
value
===
$button
.
data
(
'
label
'
);
}).
remove
();
// Submit the form to get new data
IssuableIndex
.
filterResults
(
$
(
'
.filter-form
'
));
});
},
filterResults
:
(
function
(
_this
)
{
return
function
(
form
)
{
var
formAction
,
formData
,
issuesUrl
;
formData
=
form
.
serializeArray
();
formData
=
formData
.
filter
(
function
(
data
)
{
return
data
.
value
!==
''
;
});
formData
=
$
.
param
(
formData
);
formAction
=
form
.
attr
(
'
action
'
);
issuesUrl
=
formAction
;
issuesUrl
+=
""
+
(
formAction
.
indexOf
(
'
?
'
)
===
-
1
?
'
?
'
:
'
&
'
);
issuesUrl
+=
formData
;
return
gl
.
utils
.
visitUrl
(
issuesUrl
);
};
})(
this
),
initResetFilters
:
function
()
{
$
(
'
.reset-filters
'
).
on
(
'
click
'
,
function
(
e
)
{
e
.
preventDefault
();
const
target
=
e
.
target
;
const
$form
=
$
(
target
).
parents
(
'
.js-filter-form
'
);
const
baseIssuesUrl
=
target
.
href
;
$form
.
attr
(
'
action
'
,
baseIssuesUrl
);
gl
.
utils
.
visitUrl
(
baseIssuesUrl
);
export
default
class
IssuableIndex
{
constructor
(
pagePrefix
)
{
this
.
initBulkUpdate
(
pagePrefix
);
IssuableIndex
.
resetIncomingEmailToken
();
this
.
initLabelFilterRemove
();
}
initBulkUpdate
(
pagePrefix
)
{
const
userCanBulkUpdate
=
$
(
'
.issues-bulk-update
'
).
length
>
0
;
const
alreadyInitialized
=
!!
this
.
bulkUpdateSidebar
;
if
(
userCanBulkUpdate
&&
!
alreadyInitialized
)
{
IssuableBulkUpdateActions
.
init
({
prefixId
:
pagePrefix
,
});
},
initBulkUpdate
:
function
(
pagePrefix
)
{
const
userCanBulkUpdate
=
$
(
'
.issues-bulk-update
'
).
length
>
0
;
const
alreadyInitialized
=
!!
this
.
bulkUpdateSidebar
;
if
(
userCanBulkUpdate
&&
!
alreadyInitialized
)
{
IssuableBulkUpdateActions
.
init
({
prefixId
:
pagePrefix
,
});
this
.
bulkUpdateSidebar
=
new
IssuableBulkUpdateSidebar
();
}
},
resetIncomingEmailToken
:
function
()
{
$
(
'
.incoming-email-token-reset
'
).
on
(
'
click
'
,
function
(
e
)
{
e
.
preventDefault
();
$
.
ajax
({
type
:
'
PUT
'
,
url
:
$
(
'
.incoming-email-token-reset
'
).
attr
(
'
href
'
),
dataType
:
'
json
'
,
success
:
function
(
response
)
{
$
(
'
#issue_email
'
).
val
(
response
.
new_issue_address
).
focus
();
},
beforeSend
:
function
()
{
$
(
'
.incoming-email-token-reset
'
).
text
(
'
resetting...
'
);
},
complete
:
function
()
{
$
(
'
.incoming-email-token-reset
'
).
text
(
'
reset it
'
);
}
});
});
this
.
bulkUpdateSidebar
=
new
IssuableBulkUpdateSidebar
();
}
};
})(
window
);
}
static
resetIncomingEmailToken
()
{
$
(
'
.incoming-email-token-reset
'
).
on
(
'
click
'
,
(
e
)
=>
{
e
.
preventDefault
();
$
.
ajax
({
type
:
'
PUT
'
,
url
:
$
(
'
.incoming-email-token-reset
'
).
attr
(
'
href
'
),
dataType
:
'
json
'
,
success
(
response
)
{
$
(
'
#issue_email
'
).
val
(
response
.
new_issue_address
).
focus
();
},
beforeSend
()
{
$
(
'
.incoming-email-token-reset
'
).
text
(
'
resetting...
'
);
},
complete
()
{
$
(
'
.incoming-email-token-reset
'
).
text
(
'
reset it
'
);
},
});
});
}
}
app/assets/javascripts/main.js
View file @
8df62a3a
...
...
@@ -57,7 +57,7 @@ import './gl_field_errors';
import
'
./gl_form
'
;
import
'
./groups_select
'
;
import
'
./header
'
;
import
'
./importer_status
'
;
import
initImporterStatus
from
'
./importer_status
'
;
import
'
./issuable_index
'
;
import
'
./issuable_context
'
;
import
'
./issuable_form
'
;
...
...
@@ -140,6 +140,7 @@ $(function () {
var
fitSidebarForSize
;
initBreadcrumbs
();
initImporterStatus
();
// Set the default path for all cookies to GitLab's root directory
Cookies
.
defaults
.
path
=
gon
.
relative_url_root
||
'
/
'
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment