BigW Consortium Gitlab
Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gitlab-ce
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Forest Godfrey
gitlab-ce
Commits
8df62a3a
Unverified
Commit
8df62a3a
authored
Oct 26, 2017
by
Filipa Lacerda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove old code
parent
bf4e97fc
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
112 additions
and
242 deletions
+112
-242
dispatcher.js
app/assets/javascripts/dispatcher.js
+2
-2
importer_status.js
app/assets/javascripts/importer_status.js
+71
-73
issuable_bulk_update_actions.js
app/assets/javascripts/issuable_bulk_update_actions.js
+0
-1
issuable_index.js
app/assets/javascripts/issuable_index.js
+37
-165
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