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
1
Merge Requests
1
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
nexedi
gitlab-ce
Commits
1fc4e2b6
Commit
1fc4e2b6
authored
7 years ago
by
Filipa Lacerda
Committed by
Phil Hughes
7 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Export logo and labels select as ES6 modules
parent
b6e69673
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
422 additions
and
430 deletions
+422
-430
app/assets/javascripts/boards/components/board_sidebar.js
app/assets/javascripts/boards/components/board_sidebar.js
+1
-1
app/assets/javascripts/dispatcher.js
app/assets/javascripts/dispatcher.js
+1
-1
app/assets/javascripts/init_issuable_sidebar.js
app/assets/javascripts/init_issuable_sidebar.js
+1
-1
app/assets/javascripts/init_legacy_filters.js
app/assets/javascripts/init_legacy_filters.js
+1
-1
app/assets/javascripts/issuable_bulk_update_sidebar.js
app/assets/javascripts/issuable_bulk_update_sidebar.js
+1
-2
app/assets/javascripts/labels_select.js
app/assets/javascripts/labels_select.js
+411
-415
app/assets/javascripts/logo.js
app/assets/javascripts/logo.js
+3
-5
app/assets/javascripts/main.js
app/assets/javascripts/main.js
+2
-2
spec/javascripts/labels_issue_sidebar_spec.js
spec/javascripts/labels_issue_sidebar_spec.js
+1
-2
No files found.
app/assets/javascripts/boards/components/board_sidebar.js
View file @
1fc4e2b6
/* eslint-disable comma-dangle, space-before-function-paren, no-new */
/* global MilestoneSelect */
/* global LabelsSelect */
/* global Sidebar */
import
Vue
from
'
vue
'
;
...
...
@@ -11,6 +10,7 @@ import Assignees from '../../sidebar/components/assignees/assignees';
import
DueDateSelectors
from
'
../../due_date_select
'
;
import
'
./sidebar/remove_issue
'
;
import
IssuableContext
from
'
../../issuable_context
'
;
import
LabelsSelect
from
'
../../labels_select
'
;
const
Store
=
gl
.
issueBoards
.
BoardsStore
;
...
...
This diff is collapsed.
Click to expand it.
app/assets/javascripts/dispatcher.js
View file @
1fc4e2b6
...
...
@@ -3,7 +3,7 @@
import
IssuableIndex
from
'
./issuable_index
'
;
/* global Milestone */
import
IssuableForm
from
'
./issuable_form
'
;
/* global LabelsSelect */
import
LabelsSelect
from
'
./labels_select
'
;
/* global MilestoneSelect */
/* global NewBranchForm */
/* global NotificationsForm */
...
...
This diff is collapsed.
Click to expand it.
app/assets/javascripts/init_issuable_sidebar.js
View file @
1fc4e2b6
/* eslint-disable no-new */
/* global MilestoneSelect */
/* global LabelsSelect */
import
LabelsSelect
from
'
./labels_select
'
;
import
IssuableContext
from
'
./issuable_context
'
;
/* global Sidebar */
...
...
This diff is collapsed.
Click to expand it.
app/assets/javascripts/init_legacy_filters.js
View file @
1fc4e2b6
/* eslint-disable no-new */
/* global LabelsSelect */
import
LabelsSelect
from
'
./labels_select
'
;
/* global MilestoneSelect */
/* global SubscriptionSelect */
...
...
This diff is collapsed.
Click to expand it.
app/assets/javascripts/issuable_bulk_update_sidebar.js
View file @
1fc4e2b6
/* eslint-disable class-methods-use-this, no-new */
/* global LabelsSelect */
/* global MilestoneSelect */
/* global SubscriptionSelect */
...
...
@@ -7,7 +6,7 @@ import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
import
'
./milestone_select
'
;
import
issueStatusSelect
from
'
./issue_status_select
'
;
import
'
./subscription_select
'
;
import
'
./labels_select
'
;
import
LabelsSelect
from
'
./labels_select
'
;
const
HIDDEN_CLASS
=
'
hidden
'
;
const
DISABLED_CONTENT_CLASS
=
'
disabled-content
'
;
...
...
This diff is collapsed.
Click to expand it.
app/assets/javascripts/labels_select.js
View file @
1fc4e2b6
...
...
@@ -6,474 +6,470 @@ import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
import
DropdownUtils
from
'
./filtered_search/dropdown_utils
'
;
import
CreateLabelDropdown
from
'
./create_label
'
;
(
function
()
{
this
.
LabelsSelect
=
(
function
()
{
function
LabelsSelect
(
els
)
{
var
_this
,
$els
;
_this
=
this
;
export
default
class
LabelsSelect
{
constructor
(
els
)
{
var
_this
,
$els
;
_this
=
this
;
$els
=
$
(
els
);
$els
=
$
(
els
);
if
(
!
els
)
{
$els
=
$
(
'
.js-label-select
'
);
}
if
(
!
els
)
{
$els
=
$
(
'
.js-label-select
'
);
}
$els
.
each
(
function
(
i
,
dropdown
)
{
var
$block
,
$colorPreview
,
$dropdown
,
$form
,
$loading
,
$selectbox
,
$sidebarCollapsedValue
,
$value
,
abilityName
,
defaultLabel
,
enableLabelCreateButton
,
issueURLSplit
,
issueUpdateURL
,
labelHTMLTemplate
,
labelNoneHTMLTemplate
,
labelUrl
,
namespacePath
,
projectPath
,
saveLabelData
,
selectedLabel
,
showAny
,
showNo
,
$sidebarLabelTooltip
,
initialSelected
,
$toggleText
,
fieldName
,
useId
,
propertyName
,
showMenuAbove
,
$container
,
$dropdownContainer
;
$dropdown
=
$
(
dropdown
);
$dropdownContainer
=
$dropdown
.
closest
(
'
.labels-filter
'
);
$toggleText
=
$dropdown
.
find
(
'
.dropdown-toggle-text
'
);
namespacePath
=
$dropdown
.
data
(
'
namespace-path
'
);
projectPath
=
$dropdown
.
data
(
'
project-path
'
);
labelUrl
=
$dropdown
.
data
(
'
labels
'
);
issueUpdateURL
=
$dropdown
.
data
(
'
issueUpdate
'
);
selectedLabel
=
$dropdown
.
data
(
'
selected
'
);
if
((
selectedLabel
!=
null
)
&&
!
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
selectedLabel
=
selectedLabel
.
split
(
'
,
'
);
}
showNo
=
$dropdown
.
data
(
'
show-no
'
);
showAny
=
$dropdown
.
data
(
'
show-any
'
);
showMenuAbove
=
$dropdown
.
data
(
'
showMenuAbove
'
);
defaultLabel
=
$dropdown
.
data
(
'
default-label
'
);
abilityName
=
$dropdown
.
data
(
'
ability-name
'
);
$selectbox
=
$dropdown
.
closest
(
'
.selectbox
'
);
$block
=
$selectbox
.
closest
(
'
.block
'
);
$form
=
$dropdown
.
closest
(
'
form, .js-issuable-update
'
);
$sidebarCollapsedValue
=
$block
.
find
(
'
.sidebar-collapsed-icon span
'
);
$sidebarLabelTooltip
=
$block
.
find
(
'
.js-sidebar-labels-tooltip
'
);
$value
=
$block
.
find
(
'
.value
'
);
$loading
=
$block
.
find
(
'
.block-loading
'
).
fadeOut
();
fieldName
=
$dropdown
.
data
(
'
field-name
'
);
useId
=
$dropdown
.
is
(
'
.js-issuable-form-dropdown, .js-filter-bulk-update, .js-label-sidebar-dropdown
'
);
propertyName
=
useId
?
'
id
'
:
'
title
'
;
initialSelected
=
$selectbox
.
find
(
'
input[name="
'
+
$dropdown
.
data
(
'
field-name
'
)
+
'
"]
'
)
.
map
(
function
()
{
return
this
.
value
;
}).
get
();
if
(
issueUpdateURL
!=
null
)
{
issueURLSplit
=
issueUpdateURL
.
split
(
'
/
'
);
}
if
(
issueUpdateURL
)
{
labelHTMLTemplate
=
_
.
template
(
'
<% _.each(labels, function(label){ %> <a href="<%- ["",issueURLSplit[1], issueURLSplit[2],""].join("/") %>issues?label_name[]=<%- encodeURIComponent(label.title) %>"> <span class="label has-tooltip color-label" title="<%- label.description %>" style="background-color: <%- label.color %>; color: <%- label.text_color %>;"> <%- label.title %> </span> </a> <% }); %>
'
);
labelNoneHTMLTemplate
=
'
<span class="no-value">None</span>
'
;
}
$els
.
each
(
function
(
i
,
dropdown
)
{
var
$block
,
$colorPreview
,
$dropdown
,
$form
,
$loading
,
$selectbox
,
$sidebarCollapsedValue
,
$value
,
abilityName
,
defaultLabel
,
enableLabelCreateButton
,
issueURLSplit
,
issueUpdateURL
,
labelHTMLTemplate
,
labelNoneHTMLTemplate
,
labelUrl
,
namespacePath
,
projectPath
,
saveLabelData
,
selectedLabel
,
showAny
,
showNo
,
$sidebarLabelTooltip
,
initialSelected
,
$toggleText
,
fieldName
,
useId
,
propertyName
,
showMenuAbove
,
$container
,
$dropdownContainer
;
$dropdown
=
$
(
dropdown
);
$dropdownContainer
=
$dropdown
.
closest
(
'
.labels-filter
'
);
$toggleText
=
$dropdown
.
find
(
'
.dropdown-toggle-text
'
);
namespacePath
=
$dropdown
.
data
(
'
namespace-path
'
);
projectPath
=
$dropdown
.
data
(
'
project-path
'
);
labelUrl
=
$dropdown
.
data
(
'
labels
'
);
issueUpdateURL
=
$dropdown
.
data
(
'
issueUpdate
'
);
selectedLabel
=
$dropdown
.
data
(
'
selected
'
);
if
((
selectedLabel
!=
null
)
&&
!
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
selectedLabel
=
selectedLabel
.
split
(
'
,
'
);
}
showNo
=
$dropdown
.
data
(
'
show-no
'
);
showAny
=
$dropdown
.
data
(
'
show-any
'
);
showMenuAbove
=
$dropdown
.
data
(
'
showMenuAbove
'
);
defaultLabel
=
$dropdown
.
data
(
'
default-label
'
);
abilityName
=
$dropdown
.
data
(
'
ability-name
'
);
$selectbox
=
$dropdown
.
closest
(
'
.selectbox
'
);
$block
=
$selectbox
.
closest
(
'
.block
'
);
$form
=
$dropdown
.
closest
(
'
form, .js-issuable-update
'
);
$sidebarCollapsedValue
=
$block
.
find
(
'
.sidebar-collapsed-icon span
'
);
$sidebarLabelTooltip
=
$block
.
find
(
'
.js-sidebar-labels-tooltip
'
);
$value
=
$block
.
find
(
'
.value
'
);
$loading
=
$block
.
find
(
'
.block-loading
'
).
fadeOut
();
fieldName
=
$dropdown
.
data
(
'
field-name
'
);
useId
=
$dropdown
.
is
(
'
.js-issuable-form-dropdown, .js-filter-bulk-update, .js-label-sidebar-dropdown
'
);
propertyName
=
useId
?
'
id
'
:
'
title
'
;
initialSelected
=
$selectbox
.
find
(
'
input[name="
'
+
$dropdown
.
data
(
'
field-name
'
)
+
'
"]
'
)
.
map
(
function
()
{
return
this
.
value
;
}).
get
();
if
(
issueUpdateURL
!=
null
)
{
issueURLSplit
=
issueUpdateURL
.
split
(
'
/
'
);
}
if
(
issueUpdateURL
)
{
labelHTMLTemplate
=
_
.
template
(
'
<% _.each(labels, function(label){ %> <a href="<%- ["",issueURLSplit[1], issueURLSplit[2],""].join("/") %>issues?label_name[]=<%- encodeURIComponent(label.title) %>"> <span class="label has-tooltip color-label" title="<%- label.description %>" style="background-color: <%- label.color %>; color: <%- label.text_color %>;"> <%- label.title %> </span> </a> <% }); %>
'
);
labelNoneHTMLTemplate
=
'
<span class="no-value">None</span>
'
;
}
$sidebarLabelTooltip
.
tooltip
();
$sidebarLabelTooltip
.
tooltip
();
if
(
$dropdown
.
closest
(
'
.dropdown
'
).
find
(
'
.dropdown-new-label
'
).
length
)
{
new
CreateLabelDropdown
(
$dropdown
.
closest
(
'
.dropdown
'
).
find
(
'
.dropdown-new-label
'
),
namespacePath
,
projectPath
);
}
if
(
$dropdown
.
closest
(
'
.dropdown
'
).
find
(
'
.dropdown-new-label
'
).
length
)
{
new
CreateLabelDropdown
(
$dropdown
.
closest
(
'
.dropdown
'
).
find
(
'
.dropdown-new-label
'
),
namespacePath
,
projectPath
);
}
saveLabelData
=
function
()
{
var
data
,
selected
;
selected
=
$dropdown
.
closest
(
'
.selectbox
'
).
find
(
"
input[name='
"
+
fieldName
+
"
']
"
).
map
(
function
()
{
return
this
.
value
;
}).
get
();
saveLabelData
=
function
()
{
var
data
,
selected
;
selected
=
$dropdown
.
closest
(
'
.selectbox
'
).
find
(
"
input[name='
"
+
fieldName
+
"
']
"
).
map
(
function
()
{
return
this
.
value
;
}).
get
();
if
(
_
.
isEqual
(
initialSelected
,
selected
))
return
;
initialSelected
=
selected
;
if
(
_
.
isEqual
(
initialSelected
,
selected
))
return
;
initialSelected
=
selected
;
data
=
{};
data
[
abilityName
]
=
{};
data
[
abilityName
].
label_ids
=
selected
;
if
(
!
selected
.
length
)
{
data
[
abilityName
].
label_ids
=
[
''
];
data
=
{};
data
[
abilityName
]
=
{};
data
[
abilityName
].
label_ids
=
selected
;
if
(
!
selected
.
length
)
{
data
[
abilityName
].
label_ids
=
[
''
];
}
$loading
.
removeClass
(
'
hidden
'
).
fadeIn
();
$dropdown
.
trigger
(
'
loading.gl.dropdown
'
);
return
$
.
ajax
({
type
:
'
PUT
'
,
url
:
issueUpdateURL
,
dataType
:
'
JSON
'
,
data
:
data
}).
done
(
function
(
data
)
{
var
labelCount
,
template
,
labelTooltipTitle
,
labelTitles
;
$loading
.
fadeOut
();
$dropdown
.
trigger
(
'
loaded.gl.dropdown
'
);
$selectbox
.
hide
();
data
.
issueURLSplit
=
issueURLSplit
;
labelCount
=
0
;
if
(
data
.
labels
.
length
)
{
template
=
labelHTMLTemplate
(
data
);
labelCount
=
data
.
labels
.
length
;
}
$loading
.
removeClass
(
'
hidden
'
).
fadeIn
();
$dropdown
.
trigger
(
'
loading.gl.dropdown
'
);
return
$
.
ajax
({
type
:
'
PUT
'
,
url
:
issueUpdateURL
,
dataType
:
'
JSON
'
,
data
:
data
}).
done
(
function
(
data
)
{
var
labelCount
,
template
,
labelTooltipTitle
,
labelTitles
;
$loading
.
fadeOut
();
$dropdown
.
trigger
(
'
loaded.gl.dropdown
'
);
$selectbox
.
hide
();
data
.
issueURLSplit
=
issueURLSplit
;
labelCount
=
0
;
if
(
data
.
labels
.
length
)
{
template
=
labelHTMLTemplate
(
data
);
labelCount
=
data
.
labels
.
length
;
}
else
{
template
=
labelNoneHTMLTemplate
;
}
$value
.
removeAttr
(
'
style
'
).
html
(
template
);
$sidebarCollapsedValue
.
text
(
labelCount
);
if
(
data
.
labels
.
length
)
{
labelTitles
=
data
.
labels
.
map
(
function
(
label
)
{
return
label
.
title
;
});
else
{
template
=
labelNoneHTMLTemplate
;
}
$value
.
removeAttr
(
'
style
'
).
html
(
template
);
$sidebarCollapsedValue
.
text
(
labelCount
);
if
(
labelTitles
.
length
>
5
)
{
labelTitles
=
labelTitles
.
slice
(
0
,
5
);
labelTitles
.
push
(
'
and
'
+
(
data
.
labels
.
length
-
5
)
+
'
more
'
)
;
}
if
(
data
.
labels
.
length
)
{
labelTitles
=
data
.
labels
.
map
(
function
(
label
)
{
return
label
.
title
;
});
labelTooltipTitle
=
labelTitles
.
join
(
'
,
'
);
}
else
{
labelTooltipTitle
=
''
;
$sidebarLabelTooltip
.
tooltip
(
'
destroy
'
);
if
(
labelTitles
.
length
>
5
)
{
labelTitles
=
labelTitles
.
slice
(
0
,
5
);
labelTitles
.
push
(
'
and
'
+
(
data
.
labels
.
length
-
5
)
+
'
more
'
);
}
$sidebarLabelTooltip
.
attr
(
'
title
'
,
labelTooltipTitle
)
.
tooltip
(
'
fixTitle
'
);
labelTooltipTitle
=
labelTitles
.
join
(
'
,
'
);
}
else
{
labelTooltipTitle
=
''
;
$sidebarLabelTooltip
.
tooltip
(
'
destroy
'
);
}
$
(
'
.has-tooltip
'
,
$value
).
tooltip
({
container
:
'
body
'
});
$sidebarLabelTooltip
.
attr
(
'
title
'
,
labelTooltipTitle
)
.
tooltip
(
'
fixTitle
'
);
$
(
'
.has-tooltip
'
,
$value
).
tooltip
({
container
:
'
body
'
});
};
$dropdown
.
glDropdown
({
showMenuAbove
:
showMenuAbove
,
data
:
function
(
term
,
callback
)
{
return
$
.
ajax
({
url
:
labelUrl
}).
done
(
function
(
data
)
{
data
=
_
.
chain
(
data
).
groupBy
(
function
(
label
)
{
return
label
.
title
;
}).
map
(
function
(
label
)
{
var
color
;
color
=
_
.
map
(
label
,
function
(
dup
)
{
return
dup
.
color
;
});
};
$dropdown
.
glDropdown
({
showMenuAbove
:
showMenuAbove
,
data
:
function
(
term
,
callback
)
{
return
$
.
ajax
({
url
:
labelUrl
}).
done
(
function
(
data
)
{
data
=
_
.
chain
(
data
).
groupBy
(
function
(
label
)
{
return
label
.
title
;
}).
map
(
function
(
label
)
{
var
color
;
color
=
_
.
map
(
label
,
function
(
dup
)
{
return
dup
.
color
;
});
return
{
id
:
label
[
0
].
id
,
title
:
label
[
0
].
title
,
color
:
color
,
duplicate
:
color
.
length
>
1
};
}).
value
();
if
(
$dropdown
.
hasClass
(
'
js-extra-options
'
))
{
var
extraData
=
[];
if
(
showNo
)
{
extraData
.
unshift
({
id
:
0
,
title
:
'
No Label
'
});
return
{
id
:
label
[
0
].
id
,
title
:
label
[
0
].
title
,
color
:
color
,
duplicate
:
color
.
length
>
1
};
}).
value
();
if
(
$dropdown
.
hasClass
(
'
js-extra-options
'
))
{
var
extraData
=
[];
if
(
showNo
)
{
extraData
.
unshift
({
id
:
0
,
title
:
'
No Label
'
});
}
if
(
showAny
)
{
extraData
.
unshift
({
isAny
:
true
,
title
:
'
Any Label
'
});
}
if
(
extraData
.
length
)
{
extraData
.
push
(
'
divider
'
);
data
=
extraData
.
concat
(
data
);
}
}
callback
(
data
);
if
(
showMenuAbove
)
{
$dropdown
.
data
(
'
glDropdown
'
).
positionMenuAbove
();
}
});
},
renderRow
:
function
(
label
,
instance
)
{
var
$a
,
$li
,
color
,
colorEl
,
indeterminate
,
removesAll
,
selectedClass
,
spacing
,
i
,
marked
,
dropdownName
,
dropdownValue
;
$li
=
$
(
'
<li>
'
);
$a
=
$
(
'
<a href="#">
'
);
selectedClass
=
[];
removesAll
=
label
.
id
<=
0
||
(
label
.
id
==
null
);
if
(
$dropdown
.
hasClass
(
'
js-filter-bulk-update
'
))
{
indeterminate
=
$dropdown
.
data
(
'
indeterminate
'
)
||
[];
marked
=
$dropdown
.
data
(
'
marked
'
)
||
[];
if
(
indeterminate
.
indexOf
(
label
.
id
)
!==
-
1
)
{
selectedClass
.
push
(
'
is-indeterminate
'
);
}
if
(
marked
.
indexOf
(
label
.
id
)
!==
-
1
)
{
// Remove is-indeterminate class if the item will be marked as active
i
=
selectedClass
.
indexOf
(
'
is-indeterminate
'
);
if
(
i
!==
-
1
)
{
selectedClass
.
splice
(
i
,
1
);
}
selectedClass
.
push
(
'
is-active
'
);
if
(
showAny
)
{
extraData
.
unshift
({
isAny
:
true
,
title
:
'
Any Label
'
});
}
}
else
{
if
(
this
.
id
(
label
))
{
dropdownName
=
$dropdown
.
data
(
'
fieldName
'
);
dropdownValue
=
this
.
id
(
label
).
toString
().
replace
(
/'/g
,
'
\\\'
'
);
if
(
$form
.
find
(
"
input[type='hidden'][name='
"
+
dropdownName
+
"
'][value='
"
+
dropdownValue
+
"
']
"
).
length
)
{
selectedClass
.
push
(
'
is-active
'
);
}
if
(
extraData
.
length
)
{
extraData
.
push
(
'
divider
'
);
data
=
extraData
.
concat
(
data
);
}
}
if
(
$dropdown
.
hasClass
(
'
js-multiselect
'
)
&&
removesAll
)
{
selectedClass
.
push
(
'
dropdown-clear-active
'
);
}
callback
(
data
);
if
(
showMenuAbove
)
{
$dropdown
.
data
(
'
glDropdown
'
).
positionMenuAbove
();
}
if
(
label
.
duplicate
)
{
color
=
gl
.
DropdownUtils
.
duplicateLabelColor
(
label
.
color
);
});
},
renderRow
:
function
(
label
,
instance
)
{
var
$a
,
$li
,
color
,
colorEl
,
indeterminate
,
removesAll
,
selectedClass
,
spacing
,
i
,
marked
,
dropdownName
,
dropdownValue
;
$li
=
$
(
'
<li>
'
);
$a
=
$
(
'
<a href="#">
'
);
selectedClass
=
[];
removesAll
=
label
.
id
<=
0
||
(
label
.
id
==
null
);
if
(
$dropdown
.
hasClass
(
'
js-filter-bulk-update
'
))
{
indeterminate
=
$dropdown
.
data
(
'
indeterminate
'
)
||
[];
marked
=
$dropdown
.
data
(
'
marked
'
)
||
[];
if
(
indeterminate
.
indexOf
(
label
.
id
)
!==
-
1
)
{
selectedClass
.
push
(
'
is-indeterminate
'
);
}
else
{
if
(
label
.
color
!=
null
)
{
color
=
label
.
color
[
0
];
if
(
marked
.
indexOf
(
label
.
id
)
!==
-
1
)
{
// Remove is-indeterminate class if the item will be marked as active
i
=
selectedClass
.
indexOf
(
'
is-indeterminate
'
);
if
(
i
!==
-
1
)
{
selectedClass
.
splice
(
i
,
1
);
}
selectedClass
.
push
(
'
is-active
'
);
}
if
(
color
)
{
colorEl
=
"
<span class='dropdown-label-box' style='background:
"
+
color
+
"
'></span>
"
;
}
else
{
colorEl
=
''
;
}
// We need to identify which items are actually labels
if
(
label
.
id
)
{
selectedClass
.
push
(
'
label-item
'
);
$a
.
attr
(
'
data-label-id
'
,
label
.
id
);
}
$a
.
addClass
(
selectedClass
.
join
(
'
'
)).
html
(
colorEl
+
"
"
+
label
.
title
);
// Return generated html
return
$li
.
html
(
$a
).
prop
(
'
outerHTML
'
);
},
search
:
{
fields
:
[
'
title
'
]
},
selectable
:
true
,
filterable
:
true
,
selected
:
$dropdown
.
data
(
'
selected
'
)
||
[],
toggleLabel
:
function
(
selected
,
el
)
{
var
isSelected
=
el
!==
null
?
el
.
hasClass
(
'
is-active
'
)
:
false
;
var
title
=
selected
.
title
;
var
selectedLabels
=
this
.
selected
;
if
(
selected
.
id
===
0
)
{
this
.
selected
=
[];
return
'
No Label
'
;
}
else
{
if
(
this
.
id
(
label
))
{
dropdownName
=
$dropdown
.
data
(
'
fieldName
'
);
dropdownValue
=
this
.
id
(
label
).
toString
().
replace
(
/'/g
,
'
\\\'
'
);
if
(
$form
.
find
(
"
input[type='hidden'][name='
"
+
dropdownName
+
"
'][value='
"
+
dropdownValue
+
"
']
"
).
length
)
{
selectedClass
.
push
(
'
is-active
'
);
}
}
else
if
(
isSelected
)
{
this
.
selected
.
push
(
title
);
if
(
$dropdown
.
hasClass
(
'
js-multiselect
'
)
&&
removesAll
)
{
selectedClass
.
push
(
'
dropdown-clear-active
'
);
}
else
{
var
index
=
this
.
selected
.
indexOf
(
title
);
this
.
selected
.
splice
(
index
,
1
);
}
if
(
label
.
duplicate
)
{
color
=
gl
.
DropdownUtils
.
duplicateLabelColor
(
label
.
color
);
}
else
{
if
(
label
.
color
!=
null
)
{
color
=
label
.
color
[
0
];
}
}
if
(
color
)
{
colorEl
=
"
<span class='dropdown-label-box' style='background:
"
+
color
+
"
'></span>
"
;
}
else
{
colorEl
=
''
;
}
// We need to identify which items are actually labels
if
(
label
.
id
)
{
selectedClass
.
push
(
'
label-item
'
);
$a
.
attr
(
'
data-label-id
'
,
label
.
id
);
}
$a
.
addClass
(
selectedClass
.
join
(
'
'
)).
html
(
colorEl
+
"
"
+
label
.
title
);
// Return generated html
return
$li
.
html
(
$a
).
prop
(
'
outerHTML
'
);
},
search
:
{
fields
:
[
'
title
'
]
},
selectable
:
true
,
filterable
:
true
,
selected
:
$dropdown
.
data
(
'
selected
'
)
||
[],
toggleLabel
:
function
(
selected
,
el
)
{
var
isSelected
=
el
!==
null
?
el
.
hasClass
(
'
is-active
'
)
:
false
;
var
title
=
selected
.
title
;
var
selectedLabels
=
this
.
selected
;
if
(
selected
.
id
===
0
)
{
this
.
selected
=
[];
return
'
No Label
'
;
}
else
if
(
isSelected
)
{
this
.
selected
.
push
(
title
);
}
else
{
var
index
=
this
.
selected
.
indexOf
(
title
);
this
.
selected
.
splice
(
index
,
1
);
}
if
(
selectedLabels
.
length
===
1
)
{
return
selectedLabels
;
}
else
if
(
selectedLabels
.
length
)
{
return
selectedLabels
[
0
]
+
"
+
"
+
(
selectedLabels
.
length
-
1
)
+
"
more
"
;
}
else
{
return
defaultLabel
;
}
},
fieldName
:
$dropdown
.
data
(
'
field-name
'
),
id
:
function
(
label
)
{
if
(
label
.
id
<=
0
)
return
label
.
title
;
if
(
$dropdown
.
hasClass
(
'
js-issuable-form-dropdown
'
))
{
return
label
.
id
;
}
if
(
selectedLabels
.
length
===
1
)
{
return
selectedLabels
;
if
(
$dropdown
.
hasClass
(
"
js-filter-submit
"
)
&&
(
label
.
isAny
==
null
))
{
return
label
.
title
;
}
else
{
return
label
.
id
;
}
},
hidden
:
function
()
{
var
isIssueIndex
,
isMRIndex
,
page
,
selectedLabels
;
page
=
$
(
'
body
'
).
attr
(
'
data-page
'
);
isIssueIndex
=
page
===
'
projects:issues:index
'
;
isMRIndex
=
page
===
'
projects:merge_requests:index
'
;
$selectbox
.
hide
();
// display:block overrides the hide-collapse rule
$value
.
removeAttr
(
'
style
'
);
if
(
$dropdown
.
hasClass
(
'
js-issuable-form-dropdown
'
))
{
return
;
}
if
(
$
(
'
html
'
).
hasClass
(
'
issue-boards-page
'
))
{
return
;
}
if
(
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
)
&&
(
isIssueIndex
||
isMRIndex
))
{
selectedLabels
=
$dropdown
.
closest
(
'
form
'
).
find
(
"
input:hidden[name='
"
+
(
$dropdown
.
data
(
'
fieldName
'
))
+
"
']
"
);
Issuable
.
filterResults
(
$dropdown
.
closest
(
'
form
'
));
}
else
if
(
selectedLabels
.
length
)
{
return
selectedLabels
[
0
]
+
"
+
"
+
(
selectedLabels
.
length
-
1
)
+
"
more
"
;
else
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
)
)
{
$dropdown
.
closest
(
'
form
'
).
submit
()
;
}
else
{
return
defaultLabel
;
if
(
!
$dropdown
.
hasClass
(
'
js-filter-bulk-update
'
))
{
saveLabelData
();
}
}
},
fieldName
:
$dropdown
.
data
(
'
field-name
'
),
id
:
function
(
label
)
{
if
(
label
.
id
<=
0
)
return
label
.
title
;
}
},
multiSelect
:
$dropdown
.
hasClass
(
'
js-multiselect
'
),
vue
:
$dropdown
.
hasClass
(
'
js-issue-board-sidebar
'
),
clicked
:
function
(
options
)
{
const
{
$el
,
e
,
isMarking
}
=
options
;
const
label
=
options
.
selectedObj
;
var
isIssueIndex
,
isMRIndex
,
page
,
boardsModel
;
var
fadeOutLoader
=
()
=>
{
$loading
.
fadeOut
();
};
if
(
$dropdown
.
hasClass
(
'
js-issuable-form-dropdown
'
))
{
return
label
.
id
;
}
page
=
$
(
'
body
'
).
attr
(
'
data-page
'
);
isIssueIndex
=
page
===
'
projects:issues:index
'
;
isMRIndex
=
page
===
'
projects:merge_requests:index
'
;
if
(
$dropdown
.
hasClass
(
"
js-filter-submit
"
)
&&
(
label
.
isAny
==
null
))
{
return
label
.
title
;
}
else
{
return
label
.
id
;
}
},
hidden
:
function
()
{
var
isIssueIndex
,
isMRIndex
,
page
,
selectedLabels
;
page
=
$
(
'
body
'
).
attr
(
'
data-page
'
);
isIssueIndex
=
page
===
'
projects:issues:index
'
;
isMRIndex
=
page
===
'
projects:merge_requests:index
'
;
$selectbox
.
hide
();
// display:block overrides the hide-collapse rule
$value
.
removeAttr
(
'
style
'
);
if
(
$dropdown
.
hasClass
(
'
js-issuable-form-dropdown
'
))
{
return
;
}
if
(
$dropdown
.
parent
().
find
(
'
.is-active:not(.dropdown-clear-active)
'
).
length
)
{
$dropdown
.
parent
()
.
find
(
'
.dropdown-clear-active
'
)
.
removeClass
(
'
is-active
'
);
}
if
(
$
(
'
html
'
).
hasClass
(
'
issue-boards-page
'
))
{
return
;
}
if
(
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
)
&&
(
isIssueIndex
||
isMRIndex
))
{
selectedLabels
=
$dropdown
.
closest
(
'
form
'
).
find
(
"
input:hidden[name='
"
+
(
$dropdown
.
data
(
'
fieldName
'
))
+
"
']
"
);
Issuable
.
filterResults
(
$dropdown
.
closest
(
'
form
'
));
}
else
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
))
{
$dropdown
.
closest
(
'
form
'
).
submit
();
}
else
{
if
(
!
$dropdown
.
hasClass
(
'
js-filter-bulk-update
'
))
{
saveLabelData
();
}
}
}
},
multiSelect
:
$dropdown
.
hasClass
(
'
js-multiselect
'
),
vue
:
$dropdown
.
hasClass
(
'
js-issue-board-sidebar
'
),
clicked
:
function
(
options
)
{
const
{
$el
,
e
,
isMarking
}
=
options
;
const
label
=
options
.
selectedObj
;
var
isIssueIndex
,
isMRIndex
,
page
,
boardsModel
;
var
fadeOutLoader
=
()
=>
{
$loading
.
fadeOut
();
};
page
=
$
(
'
body
'
).
attr
(
'
data-page
'
);
isIssueIndex
=
page
===
'
projects:issues:index
'
;
isMRIndex
=
page
===
'
projects:merge_requests:index
'
;
if
(
$dropdown
.
parent
().
find
(
'
.is-active:not(.dropdown-clear-active)
'
).
length
)
{
$dropdown
.
parent
()
.
find
(
'
.dropdown-clear-active
'
)
.
removeClass
(
'
is-active
'
);
}
if
(
$dropdown
.
hasClass
(
'
js-issuable-form-dropdown
'
))
{
return
;
}
if
(
$dropdown
.
hasClass
(
'
js-issuable-form-dropdown
'
))
{
return
;
}
if
(
$dropdown
.
hasClass
(
'
js-filter-bulk-update
'
))
{
_this
.
enableBulkLabelDropdown
();
_this
.
setDropdownData
(
$dropdown
,
isMarking
,
label
.
id
);
return
;
}
if
(
$dropdown
.
hasClass
(
'
js-filter-bulk-update
'
))
{
_this
.
enableBulkLabelDropdown
();
_this
.
setDropdownData
(
$dropdown
,
isMarking
,
label
.
id
);
return
;
}
if
(
$dropdown
.
closest
(
'
.add-issues-modal
'
).
length
)
{
boardsModel
=
gl
.
issueBoards
.
ModalStore
.
store
.
filter
;
}
if
(
$dropdown
.
closest
(
'
.add-issues-modal
'
).
length
)
{
boardsModel
=
gl
.
issueBoards
.
ModalStore
.
store
.
filter
;
if
(
boardsModel
)
{
if
(
label
.
isAny
)
{
boardsModel
[
'
label_name
'
]
=
[];
}
else
if
(
$el
.
hasClass
(
'
is-active
'
))
{
boardsModel
[
'
label_name
'
].
push
(
label
.
title
);
}
if
(
boardsModel
)
{
if
(
label
.
isAny
)
{
boardsModel
[
'
label_name
'
]
=
[];
}
else
if
(
$el
.
hasClass
(
'
is-active
'
))
{
boardsModel
[
'
label_name
'
].
push
(
label
.
title
);
}
e
.
preventDefault
();
return
;
e
.
preventDefault
();
return
;
}
else
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
)
&&
(
isIssueIndex
||
isMRIndex
))
{
if
(
!
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
selectedLabel
=
label
.
title
;
return
Issuable
.
filterResults
(
$dropdown
.
closest
(
'
form
'
));
}
else
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
)
&&
(
isIssueIndex
||
isMRIndex
))
{
if
(
!
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
selectedLabel
=
label
.
title
;
return
Issuable
.
filterResults
(
$dropdown
.
closest
(
'
form
'
));
}
}
else
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
))
{
return
$dropdown
.
closest
(
'
form
'
).
submit
();
}
else
if
(
$dropdown
.
hasClass
(
'
js-issue-board-sidebar
'
))
{
if
(
$el
.
hasClass
(
'
is-active
'
))
{
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
labels
.
push
(
new
ListLabel
({
id
:
label
.
id
,
title
:
label
.
title
,
color
:
label
.
color
[
0
],
textColor
:
'
#fff
'
}));
}
else
if
(
$dropdown
.
hasClass
(
'
js-filter-submit
'
))
{
return
$dropdown
.
closest
(
'
form
'
).
submit
();
else
{
var
labels
=
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
labels
;
labels
=
labels
.
filter
(
function
(
selectedLabel
)
{
return
selectedLabel
.
id
!==
label
.
id
;
});
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
labels
=
labels
;
}
else
if
(
$dropdown
.
hasClass
(
'
js-issue-board-sidebar
'
))
{
if
(
$el
.
hasClass
(
'
is-active
'
))
{
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
labels
.
push
(
new
ListLabel
({
id
:
label
.
id
,
title
:
label
.
title
,
color
:
label
.
color
[
0
],
textColor
:
'
#fff
'
}));
}
else
{
var
labels
=
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
labels
;
labels
=
labels
.
filter
(
function
(
selectedLabel
)
{
return
selectedLabel
.
id
!==
label
.
id
;
});
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
labels
=
labels
;
}
$loading
.
fadeIn
();
$loading
.
fadeIn
();
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
update
(
$dropdown
.
attr
(
'
data-issue-update
'
))
.
then
(
fadeOutLoader
)
.
catch
(
fadeOutLoader
);
}
else
{
if
(
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
gl
.
issueBoards
.
BoardsStore
.
detail
.
issue
.
update
(
$dropdown
.
attr
(
'
data-issue-update
'
))
.
then
(
fadeOutLoader
)
.
catch
(
fadeOutLoader
);
}
else
{
if
(
$dropdown
.
hasClass
(
'
js-multiselect
'
))
{
}
else
{
return
saveLabelData
();
}
return
saveLabelData
();
}
},
});
// Set dropdown data
_this
.
setOriginalDropdownData
(
$dropdownContainer
,
$dropdown
);
}
},
});
this
.
bindEvents
();
}
LabelsSelect
.
prototype
.
bindEvents
=
function
()
{
return
$
(
'
body
'
).
on
(
'
change
'
,
'
.selected_issue
'
,
this
.
onSelectCheckboxIssue
);
};
LabelsSelect
.
prototype
.
onSelectCheckboxIssue
=
function
()
{
if
(
$
(
'
.selected_issue:checked
'
).
length
)
{
return
;
// Set dropdown data
_this
.
setOriginalDropdownData
(
$dropdownContainer
,
$dropdown
);
});
this
.
bindEvents
();
}
bindEvents
()
{
return
$
(
'
body
'
).
on
(
'
change
'
,
'
.selected_issue
'
,
this
.
onSelectCheckboxIssue
);
}
// eslint-disable-next-line class-methods-use-this
onSelectCheckboxIssue
()
{
if
(
$
(
'
.selected_issue:checked
'
).
length
)
{
return
;
}
return
$
(
'
.issues-bulk-update .labels-filter .dropdown-toggle-text
'
).
text
(
'
Label
'
);
}
// eslint-disable-next-line class-methods-use-this
enableBulkLabelDropdown
()
{
IssuableBulkUpdateActions
.
willUpdateLabels
=
true
;
}
// eslint-disable-next-line class-methods-use-this
setDropdownData
(
$dropdown
,
isMarking
,
value
)
{
var
i
,
markedIds
,
unmarkedIds
,
indeterminateIds
;
markedIds
=
$dropdown
.
data
(
'
marked
'
)
||
[];
unmarkedIds
=
$dropdown
.
data
(
'
unmarked
'
)
||
[];
indeterminateIds
=
$dropdown
.
data
(
'
indeterminate
'
)
||
[];
if
(
isMarking
)
{
markedIds
.
push
(
value
);
i
=
indeterminateIds
.
indexOf
(
value
);
if
(
i
>
-
1
)
{
indeterminateIds
.
splice
(
i
,
1
);
}
return
$
(
'
.issues-bulk-update .labels-filter .dropdown-toggle-text
'
).
text
(
'
Label
'
);
};
LabelsSelect
.
prototype
.
enableBulkLabelDropdown
=
function
()
{
IssuableBulkUpdateActions
.
willUpdateLabels
=
true
;
};
LabelsSelect
.
prototype
.
setDropdownData
=
function
(
$dropdown
,
isMarking
,
value
)
{
var
i
,
markedIds
,
unmarkedIds
,
indeterminateIds
;
markedIds
=
$dropdown
.
data
(
'
marked
'
)
||
[];
unmarkedIds
=
$dropdown
.
data
(
'
unmarked
'
)
||
[];
indeterminateIds
=
$dropdown
.
data
(
'
indeterminate
'
)
||
[];
if
(
isMarking
)
{
markedIds
.
push
(
value
);
i
=
indeterminateIds
.
indexOf
(
value
);
if
(
i
>
-
1
)
{
indeterminateIds
.
splice
(
i
,
1
);
}
i
=
unmarkedIds
.
indexOf
(
value
);
if
(
i
>
-
1
)
{
unmarkedIds
.
splice
(
i
,
1
);
}
}
else
{
// If marked item (not common) is unmarked
i
=
markedIds
.
indexOf
(
value
);
if
(
i
>
-
1
)
{
markedIds
.
splice
(
i
,
1
);
}
// If an indeterminate item is being unmarked
if
(
IssuableBulkUpdateActions
.
getOriginalIndeterminateIds
().
indexOf
(
value
)
>
-
1
)
{
unmarkedIds
.
push
(
value
);
}
// If a marked item is being unmarked
// (a marked item could also be a label that is present in all selection)
if
(
IssuableBulkUpdateActions
.
getOriginalCommonIds
().
indexOf
(
value
)
>
-
1
)
{
unmarkedIds
.
push
(
value
);
}
i
=
unmarkedIds
.
indexOf
(
value
);
if
(
i
>
-
1
)
{
unmarkedIds
.
splice
(
i
,
1
);
}
}
else
{
// If marked item (not common) is unmarked
i
=
markedIds
.
indexOf
(
value
);
if
(
i
>
-
1
)
{
markedIds
.
splice
(
i
,
1
);
}
$dropdown
.
data
(
'
marked
'
,
markedIds
);
$dropdown
.
data
(
'
unmarked
'
,
unmarkedIds
);
$dropdown
.
data
(
'
indeterminate
'
,
indeterminateIds
);
};
// If an indeterminate item is being unmarked
if
(
IssuableBulkUpdateActions
.
getOriginalIndeterminateIds
().
indexOf
(
value
)
>
-
1
)
{
unmarkedIds
.
push
(
value
);
}
LabelsSelect
.
prototype
.
setOriginalDropdownData
=
function
(
$container
,
$dropdown
)
{
var
labels
=
[];
$container
.
find
(
'
[name="label_name[]"]
'
).
map
(
function
()
{
return
labels
.
push
(
this
.
value
);
});
$dropdown
.
data
(
'
marked
'
,
labels
);
};
// If a marked item is being unmarked
// (a marked item could also be a label that is present in all selection)
if
(
IssuableBulkUpdateActions
.
getOriginalCommonIds
().
indexOf
(
value
)
>
-
1
)
{
unmarkedIds
.
push
(
value
);
}
}
return
LabelsSelect
;
})();
}).
call
(
window
);
$dropdown
.
data
(
'
marked
'
,
markedIds
);
$dropdown
.
data
(
'
unmarked
'
,
unmarkedIds
);
$dropdown
.
data
(
'
indeterminate
'
,
indeterminateIds
);
}
// eslint-disable-next-line class-methods-use-this
setOriginalDropdownData
(
$container
,
$dropdown
)
{
const
labels
=
[];
$container
.
find
(
'
[name="label_name[]"]
'
).
map
(
function
()
{
return
labels
.
push
(
this
.
value
);
});
$dropdown
.
data
(
'
marked
'
,
labels
);
}
}
This diff is collapsed.
Click to expand it.
app/assets/javascripts/logo.js
View file @
1fc4e2b6
/* eslint-disable func-names, space-before-function-paren, prefer-arrow-callback */
(
function
()
{
window
.
addEventListener
(
'
beforeunload
'
,
function
()
{
export
default
function
initLogoAnimation
()
{
window
.
addEventListener
(
'
beforeunload
'
,
()
=>
{
$
(
'
.tanuki-logo
'
).
addClass
(
'
animate
'
);
});
}
).
call
(
window
);
}
This diff is collapsed.
Click to expand it.
app/assets/javascripts/main.js
View file @
1fc4e2b6
...
...
@@ -55,11 +55,10 @@ import './gl_field_errors';
import
'
./gl_form
'
;
import
initTodoToggle
from
'
./header
'
;
import
initImporterStatus
from
'
./importer_status
'
;
import
'
./labels_select
'
;
import
'
./layout_nav
'
;
import
LazyLoader
from
'
./lazy_loader
'
;
import
'
./line_highlighter
'
;
import
'
./logo
'
;
import
initLogoAnimation
from
'
./logo
'
;
import
'
./merge_request
'
;
import
'
./merge_request_tabs
'
;
import
'
./milestone
'
;
...
...
@@ -134,6 +133,7 @@ $(function () {
initBreadcrumbs
();
initImporterStatus
();
initTodoToggle
();
initLogoAnimation
();
// Set the default path for all cookies to GitLab's root directory
Cookies
.
defaults
.
path
=
gon
.
relative_url_root
||
'
/
'
;
...
...
This diff is collapsed.
Click to expand it.
spec/javascripts/labels_issue_sidebar_spec.js
View file @
1fc4e2b6
/* eslint-disable no-new */
import
IssuableContext
from
'
~/issuable_context
'
;
/* global LabelsSelect */
import
LabelsSelect
from
'
~/labels_select
'
;
import
'
~/gl_dropdown
'
;
import
'
select2
'
;
import
'
~/api
'
;
import
'
~/create_label
'
;
import
'
~/users_select
'
;
import
'
~/labels_select
'
;
(()
=>
{
let
saveLabelCount
=
0
;
...
...
This diff is collapsed.
Click to expand it.
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