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
fa7d3e3e
Commit
fa7d3e3e
authored
Oct 20, 2021
by
Florie Guibert
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Labels widget - Fix search input
Split header to be reused Split footer to be reused
parent
a0d10fed
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
305 additions
and
133 deletions
+305
-133
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
...onents/sidebar/labels_select_widget/dropdown_contents.vue
+37
-38
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
...ar/labels_select_widget/dropdown_contents_labels_view.vue
+5
-35
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_footer.vue
...mponents/sidebar/labels_select_widget/dropdown_footer.vue
+35
-0
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_header.vue
...mponents/sidebar/labels_select_widget/dropdown_header.vue
+82
-0
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js
...abels_select_widget/dropdown_contents_labels_view_spec.js
+3
-12
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js
...ts/sidebar/labels_select_widget/dropdown_contents_spec.js
+17
-48
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_footer_spec.js
...ents/sidebar/labels_select_widget/dropdown_footer_spec.js
+57
-0
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_header_spec.js
...ents/sidebar/labels_select_widget/dropdown_header_spec.js
+69
-0
No files found.
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
View file @
fa7d3e3e
<
script
>
<
script
>
import
{
GlButton
,
GlDropdown
,
GlDropdownItem
,
GlLink
}
from
'
@gitlab/ui
'
;
import
{
GlButton
,
GlDropdown
,
GlDropdownItem
,
GlLink
}
from
'
@gitlab/ui
'
;
import
{
debounce
}
from
'
lodash
'
;
import
{
DEFAULT_DEBOUNCE_AND_THROTTLE_MS
}
from
'
~/lib/utils/constants
'
;
import
{
__
,
s__
,
sprintf
}
from
'
~/locale
'
;
import
{
__
,
s__
,
sprintf
}
from
'
~/locale
'
;
import
DropdownContentsCreateView
from
'
./dropdown_contents_create_view.vue
'
;
import
DropdownContentsCreateView
from
'
./dropdown_contents_create_view.vue
'
;
import
DropdownContentsLabelsView
from
'
./dropdown_contents_labels_view.vue
'
;
import
DropdownContentsLabelsView
from
'
./dropdown_contents_labels_view.vue
'
;
import
DropdownFooter
from
'
./dropdown_footer.vue
'
;
import
DropdownHeader
from
'
./dropdown_header.vue
'
;
import
{
isDropdownVariantStandalone
,
isDropdownVariantSidebar
}
from
'
./utils
'
;
import
{
isDropdownVariantStandalone
,
isDropdownVariantSidebar
}
from
'
./utils
'
;
export
default
{
export
default
{
components
:
{
components
:
{
DropdownContentsLabelsView
,
DropdownContentsLabelsView
,
DropdownContentsCreateView
,
DropdownContentsCreateView
,
DropdownHeader
,
DropdownFooter
,
GlButton
,
GlButton
,
GlDropdown
,
GlDropdown
,
GlDropdownItem
,
GlDropdownItem
,
GlLink
,
GlLink
,
},
},
inject
:
[
'
allowLabelCreate
'
,
'
labelsManagePath
'
],
props
:
{
props
:
{
labelsCreateTitle
:
{
labelsCreateTitle
:
{
type
:
String
,
type
:
String
,
...
@@ -72,6 +77,7 @@ export default {
...
@@ -72,6 +77,7 @@ export default {
showDropdownContentsCreateView
:
false
,
showDropdownContentsCreateView
:
false
,
localSelectedLabels
:
[...
this
.
selectedLabels
],
localSelectedLabels
:
[...
this
.
selectedLabels
],
isDirty
:
false
,
isDirty
:
false
,
searchKey
:
''
,
};
};
},
},
computed
:
{
computed
:
{
...
@@ -122,6 +128,12 @@ export default {
...
@@ -122,6 +128,12 @@ export default {
this
.
localSelectedLabels
=
newVal
;
this
.
localSelectedLabels
=
newVal
;
},
},
},
},
created
()
{
this
.
debouncedSearchKeyUpdate
=
debounce
(
this
.
setSearchKey
,
DEFAULT_DEBOUNCE_AND_THROTTLE_MS
);
},
beforeDestroy
()
{
this
.
debouncedSearchKeyUpdate
.
cancel
();
},
methods
:
{
methods
:
{
toggleDropdownContentsCreateView
()
{
toggleDropdownContentsCreateView
()
{
this
.
showDropdownContentsCreateView
=
!
this
.
showDropdownContentsCreateView
;
this
.
showDropdownContentsCreateView
=
!
this
.
showDropdownContentsCreateView
;
...
@@ -144,6 +156,12 @@ export default {
...
@@ -144,6 +156,12 @@ export default {
this
.
setLabels
();
this
.
setLabels
();
}
}
},
},
setSearchKey
(
value
)
{
this
.
searchKey
=
value
;
},
setFocus
()
{
this
.
$refs
.
header
.
focusInput
();
},
},
},
};
};
</
script
>
</
script
>
...
@@ -155,39 +173,26 @@ export default {
...
@@ -155,39 +173,26 @@ export default {
class=
"gl-w-full gl-mt-2"
class=
"gl-w-full gl-mt-2"
data-qa-selector=
"labels_dropdown_content"
data-qa-selector=
"labels_dropdown_content"
@
hide=
"handleDropdownHide"
@
hide=
"handleDropdownHide"
@
shown=
"setFocus"
>
>
<template
#header
>
<template
#header
>
<d
iv
<d
ropdown-header
v-if=
"!isStandalone"
v-if=
"!isStandalone"
class=
"dropdown-title gl-display-flex gl-align-items-center gl-pt-0 gl-pb-3!"
ref=
"header"
data-testid=
"dropdown-header"
v-model=
"searchKey"
>
:labels-create-title=
"labelsCreateTitle"
<gl-button
:labels-list-title=
"labelsListTitle"
v-if=
"showDropdownContentsCreateView"
:show-dropdown-contents-create-view=
"showDropdownContentsCreateView"
:aria-label=
"__('Go back')"
@
toggleDropdownContentsCreateView=
"toggleDropdownContent"
variant=
"link"
@
closeDropdown=
"$emit('closeDropdown')"
size=
"small"
@
input=
"debouncedSearchKeyUpdate"
class=
"js-btn-back dropdown-header-button gl-p-0"
/>
icon=
"arrow-left"
data-testid=
"go-back-button"
@
click.stop=
"toggleDropdownContent"
/>
<span
class=
"gl-flex-grow-1"
>
{{
dropdownTitle
}}
</span>
<gl-button
:aria-label=
"__('Close')"
variant=
"link"
size=
"small"
class=
"dropdown-header-button gl-p-0!"
icon=
"close"
data-testid=
"close-button"
@
click=
"$emit('closeDropdown')"
/>
</div>
</
template
>
</
template
>
<
template
#default
>
<
template
#default
>
<component
<component
:is=
"dropdownContentsView"
:is=
"dropdownContentsView"
v-model=
"localSelectedLabels"
v-model=
"localSelectedLabels"
:search-key=
"searchKey"
:selected-labels=
"selectedLabels"
:selected-labels=
"selectedLabels"
:allow-multiselect=
"allowMultiselect"
:allow-multiselect=
"allowMultiselect"
:issuable-type=
"issuableType"
:issuable-type=
"issuableType"
...
@@ -197,18 +202,12 @@ export default {
...
@@ -197,18 +202,12 @@ export default {
/>
/>
</
template
>
</
template
>
<
template
#footer
>
<
template
#footer
>
<div
v-if=
"showDropdownFooter"
data-testid=
"dropdown-footer"
>
<dropdown-footer
<gl-dropdown-item
v-if=
"showDropdownFooter"
v-if=
"allowLabelCreate"
:footer-create-label-title=
"footerCreateLabelTitle"
data-testid=
"create-label-button"
:footer-manage-label-title=
"footerManageLabelTitle"
@
click.capture.native.stop=
"toggleDropdownContent"
@
toggleDropdownContentsCreateView=
"toggleDropdownContent"
>
/>
{{
footerCreateLabelTitle
}}
</gl-dropdown-item>
<gl-dropdown-item
:href=
"labelsManagePath"
@
click
.
capture
.
native
.
stop
>
{{
footerManageLabelTitle
}}
</gl-dropdown-item>
</div>
</
template
>
</
template
>
</gl-dropdown>
</gl-dropdown>
</template>
</template>
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
View file @
fa7d3e3e
<
script
>
<
script
>
import
{
import
{
GlDropdownForm
,
GlDropdownItem
,
GlLoadingIcon
,
GlIntersectionObserver
}
from
'
@gitlab/ui
'
;
GlDropdownForm
,
GlDropdownItem
,
GlLoadingIcon
,
GlSearchBoxByType
,
GlIntersectionObserver
,
}
from
'
@gitlab/ui
'
;
import
fuzzaldrinPlus
from
'
fuzzaldrin-plus
'
;
import
fuzzaldrinPlus
from
'
fuzzaldrin-plus
'
;
import
{
debounce
}
from
'
lodash
'
;
import
createFlash
from
'
~/flash
'
;
import
createFlash
from
'
~/flash
'
;
import
{
getIdFromGraphQLId
}
from
'
~/graphql_shared/utils
'
;
import
{
getIdFromGraphQLId
}
from
'
~/graphql_shared/utils
'
;
import
{
DEFAULT_DEBOUNCE_AND_THROTTLE_MS
}
from
'
~/lib/utils/constants
'
;
import
{
__
}
from
'
~/locale
'
;
import
{
__
}
from
'
~/locale
'
;
import
{
labelsQueries
}
from
'
~/sidebar/constants
'
;
import
{
labelsQueries
}
from
'
~/sidebar/constants
'
;
import
LabelItem
from
'
./label_item.vue
'
;
import
LabelItem
from
'
./label_item.vue
'
;
...
@@ -20,7 +12,6 @@ export default {
...
@@ -20,7 +12,6 @@ export default {
GlDropdownForm
,
GlDropdownForm
,
GlDropdownItem
,
GlDropdownItem
,
GlLoadingIcon
,
GlLoadingIcon
,
GlSearchBoxByType
,
GlIntersectionObserver
,
GlIntersectionObserver
,
LabelItem
,
LabelItem
,
},
},
...
@@ -48,10 +39,13 @@ export default {
...
@@ -48,10 +39,13 @@ export default {
type
:
String
,
type
:
String
,
required
:
true
,
required
:
true
,
},
},
searchKey
:
{
type
:
String
,
required
:
true
,
},
},
},
data
()
{
data
()
{
return
{
return
{
searchKey
:
''
,
labels
:
[],
labels
:
[],
isVisible
:
false
,
isVisible
:
false
,
};
};
...
@@ -71,12 +65,6 @@ export default {
...
@@ -71,12 +65,6 @@ export default {
return
this
.
searchKey
.
length
===
1
||
!
this
.
isVisible
;
return
this
.
searchKey
.
length
===
1
||
!
this
.
isVisible
;
},
},
update
:
(
data
)
=>
data
.
workspace
?.
labels
?.
nodes
||
[],
update
:
(
data
)
=>
data
.
workspace
?.
labels
?.
nodes
||
[],
async
result
()
{
if
(
this
.
$refs
.
searchInput
)
{
await
this
.
$nextTick
;
this
.
$refs
.
searchInput
.
focusInput
();
}
},
error
()
{
error
()
{
createFlash
({
message
:
__
(
'
Error fetching labels.
'
)
});
createFlash
({
message
:
__
(
'
Error fetching labels.
'
)
});
},
},
...
@@ -101,12 +89,6 @@ export default {
...
@@ -101,12 +89,6 @@ export default {
return
Boolean
(
this
.
searchKey
)
&&
this
.
visibleLabels
.
length
===
0
;
return
Boolean
(
this
.
searchKey
)
&&
this
.
visibleLabels
.
length
===
0
;
},
},
},
},
created
()
{
this
.
debouncedSearchKeyUpdate
=
debounce
(
this
.
setSearchKey
,
DEFAULT_DEBOUNCE_AND_THROTTLE_MS
);
},
beforeDestroy
()
{
this
.
debouncedSearchKeyUpdate
.
cancel
();
},
methods
:
{
methods
:
{
isLabelSelected
(
label
)
{
isLabelSelected
(
label
)
{
return
this
.
localSelectedLabelsIds
.
includes
(
getIdFromGraphQLId
(
label
.
id
));
return
this
.
localSelectedLabelsIds
.
includes
(
getIdFromGraphQLId
(
label
.
id
));
...
@@ -153,12 +135,8 @@ export default {
...
@@ -153,12 +135,8 @@ export default {
this
.
$emit
(
'
closeDropdown
'
,
this
.
localSelectedLabels
);
this
.
$emit
(
'
closeDropdown
'
,
this
.
localSelectedLabels
);
}
}
},
},
setSearchKey
(
value
)
{
this
.
searchKey
=
value
;
},
onDropdownAppear
()
{
onDropdownAppear
()
{
this
.
isVisible
=
true
;
this
.
isVisible
=
true
;
this
.
$refs
.
searchInput
.
focusInput
();
},
},
},
},
};
};
...
@@ -167,14 +145,6 @@ export default {
...
@@ -167,14 +145,6 @@ export default {
<
template
>
<
template
>
<gl-intersection-observer
@
appear=
"onDropdownAppear"
>
<gl-intersection-observer
@
appear=
"onDropdownAppear"
>
<gl-dropdown-form
class=
"labels-select-contents-list js-labels-list"
>
<gl-dropdown-form
class=
"labels-select-contents-list js-labels-list"
>
<gl-search-box-by-type
ref=
"searchInput"
:value=
"searchKey"
:disabled=
"labelsFetchInProgress"
data-qa-selector=
"dropdown_input_field"
data-testid=
"dropdown-input-field"
@
input=
"debouncedSearchKeyUpdate"
/>
<div
ref=
"labelsListContainer"
data-testid=
"dropdown-content"
>
<div
ref=
"labelsListContainer"
data-testid=
"dropdown-content"
>
<gl-loading-icon
<gl-loading-icon
v-if=
"labelsFetchInProgress"
v-if=
"labelsFetchInProgress"
...
...
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_footer.vue
0 → 100644
View file @
fa7d3e3e
<
script
>
import
{
GlDropdownItem
}
from
'
@gitlab/ui
'
;
export
default
{
components
:
{
GlDropdownItem
,
},
inject
:
[
'
allowLabelCreate
'
,
'
labelsManagePath
'
],
props
:
{
footerCreateLabelTitle
:
{
type
:
String
,
required
:
true
,
},
footerManageLabelTitle
:
{
type
:
String
,
required
:
true
,
},
},
};
</
script
>
<
template
>
<div
data-testid=
"dropdown-footer"
>
<gl-dropdown-item
v-if=
"allowLabelCreate"
data-testid=
"create-label-button"
@
click.capture.native.stop=
"$emit('toggleDropdownContentsCreateView')"
>
{{
footerCreateLabelTitle
}}
</gl-dropdown-item>
<gl-dropdown-item
:href=
"labelsManagePath"
@
click
.
capture
.
native
.
stop
>
{{
footerManageLabelTitle
}}
</gl-dropdown-item>
</div>
</
template
>
app/assets/javascripts/vue_shared/components/sidebar/labels_select_widget/dropdown_header.vue
0 → 100644
View file @
fa7d3e3e
<
script
>
import
{
GlButton
,
GlSearchBoxByType
}
from
'
@gitlab/ui
'
;
export
default
{
components
:
{
GlButton
,
GlSearchBoxByType
,
},
model
:
{
prop
:
'
searchKey
'
,
},
props
:
{
labelsCreateTitle
:
{
type
:
String
,
required
:
true
,
},
labelsListTitle
:
{
type
:
String
,
required
:
true
,
},
showDropdownContentsCreateView
:
{
type
:
Boolean
,
required
:
true
,
},
labelsFetchInProgress
:
{
type
:
Boolean
,
required
:
false
,
default
:
false
,
},
searchKey
:
{
type
:
String
,
required
:
true
,
},
},
computed
:
{
dropdownTitle
()
{
return
this
.
showDropdownContentsCreateView
?
this
.
labelsCreateTitle
:
this
.
labelsListTitle
;
},
},
methods
:
{
focusInput
()
{
this
.
$refs
.
searchInput
.
focusInput
();
},
},
};
</
script
>
<
template
>
<div
data-testid=
"dropdown-header"
>
<div
class=
"dropdown-title gl-display-flex gl-align-items-center gl-pt-0 gl-pb-3!"
>
<gl-button
v-if=
"showDropdownContentsCreateView"
:aria-label=
"__('Go back')"
variant=
"link"
size=
"small"
class=
"js-btn-back dropdown-header-button gl-p-0"
icon=
"arrow-left"
data-testid=
"go-back-button"
@
click.stop=
"$emit('toggleDropdownContentsCreateView')"
/>
<span
class=
"gl-flex-grow-1"
>
{{
dropdownTitle
}}
</span>
<gl-button
:aria-label=
"__('Close')"
variant=
"link"
size=
"small"
class=
"dropdown-header-button gl-p-0!"
icon=
"close"
data-testid=
"close-button"
@
click=
"$emit('closeDropdown')"
/>
</div>
<gl-search-box-by-type
v-if=
"!showDropdownContentsCreateView"
ref=
"searchInput"
:value=
"searchKey"
:disabled=
"labelsFetchInProgress"
data-qa-selector=
"dropdown_input_field"
data-testid=
"dropdown-input-field"
@
input=
"$emit('input', $event)"
/>
</div>
</
template
>
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view_spec.js
View file @
fa7d3e3e
...
@@ -43,6 +43,7 @@ describe('DropdownContentsLabelsView', () => {
...
@@ -43,6 +43,7 @@ describe('DropdownContentsLabelsView', () => {
initialState
=
mockConfig
,
initialState
=
mockConfig
,
queryHandler
=
successfulQueryHandler
,
queryHandler
=
successfulQueryHandler
,
injected
=
{},
injected
=
{},
searchKey
=
''
,
}
=
{})
=>
{
}
=
{})
=>
{
const
mockApollo
=
createMockApollo
([[
projectLabelsQuery
,
queryHandler
]]);
const
mockApollo
=
createMockApollo
([[
projectLabelsQuery
,
queryHandler
]]);
...
@@ -57,6 +58,7 @@ describe('DropdownContentsLabelsView', () => {
...
@@ -57,6 +58,7 @@ describe('DropdownContentsLabelsView', () => {
...
initialState
,
...
initialState
,
localSelectedLabels
,
localSelectedLabels
,
issuableType
:
IssuableType
.
Issue
,
issuableType
:
IssuableType
.
Issue
,
searchKey
,
},
},
stubs
:
{
stubs
:
{
GlSearchBoxByType
,
GlSearchBoxByType
,
...
@@ -68,7 +70,6 @@ describe('DropdownContentsLabelsView', () => {
...
@@ -68,7 +70,6 @@ describe('DropdownContentsLabelsView', () => {
wrapper
.
destroy
();
wrapper
.
destroy
();
});
});
const
findSearchInput
=
()
=>
wrapper
.
findComponent
(
GlSearchBoxByType
);
const
findLabels
=
()
=>
wrapper
.
findAllComponents
(
LabelItem
);
const
findLabels
=
()
=>
wrapper
.
findAllComponents
(
LabelItem
);
const
findLoadingIcon
=
()
=>
wrapper
.
findComponent
(
GlLoadingIcon
);
const
findLoadingIcon
=
()
=>
wrapper
.
findComponent
(
GlLoadingIcon
);
const
findObserver
=
()
=>
wrapper
.
findComponent
(
GlIntersectionObserver
);
const
findObserver
=
()
=>
wrapper
.
findComponent
(
GlIntersectionObserver
);
...
@@ -81,12 +82,6 @@ describe('DropdownContentsLabelsView', () => {
...
@@ -81,12 +82,6 @@ describe('DropdownContentsLabelsView', () => {
}
}
describe
(
'
when loading labels
'
,
()
=>
{
describe
(
'
when loading labels
'
,
()
=>
{
it
(
'
renders disabled search input field
'
,
async
()
=>
{
createComponent
();
await
makeObserverAppear
();
expect
(
findSearchInput
().
props
(
'
disabled
'
)).
toBe
(
true
);
});
it
(
'
renders loading icon
'
,
async
()
=>
{
it
(
'
renders loading icon
'
,
async
()
=>
{
createComponent
();
createComponent
();
await
makeObserverAppear
();
await
makeObserverAppear
();
...
@@ -107,10 +102,6 @@ describe('DropdownContentsLabelsView', () => {
...
@@ -107,10 +102,6 @@ describe('DropdownContentsLabelsView', () => {
await
waitForPromises
();
await
waitForPromises
();
});
});
it
(
'
renders enabled search input field
'
,
async
()
=>
{
expect
(
findSearchInput
().
props
(
'
disabled
'
)).
toBe
(
false
);
});
it
(
'
does not render loading icon
'
,
async
()
=>
{
it
(
'
does not render loading icon
'
,
async
()
=>
{
expect
(
findLoadingIcon
().
exists
()).
toBe
(
false
);
expect
(
findLoadingIcon
().
exists
()).
toBe
(
false
);
});
});
...
@@ -132,9 +123,9 @@ describe('DropdownContentsLabelsView', () => {
...
@@ -132,9 +123,9 @@ describe('DropdownContentsLabelsView', () => {
},
},
},
},
}),
}),
searchKey
:
'
123
'
,
});
});
await
makeObserverAppear
();
await
makeObserverAppear
();
findSearchInput
().
vm
.
$emit
(
'
input
'
,
'
123
'
);
await
waitForPromises
();
await
waitForPromises
();
await
nextTick
();
await
nextTick
();
...
...
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_spec.js
View file @
fa7d3e3e
...
@@ -4,6 +4,8 @@ import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_w
...
@@ -4,6 +4,8 @@ import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_w
import
DropdownContents
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
'
;
import
DropdownContents
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents.vue
'
;
import
DropdownContentsCreateView
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
'
;
import
DropdownContentsCreateView
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_create_view.vue
'
;
import
DropdownContentsLabelsView
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
'
;
import
DropdownContentsLabelsView
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_contents_labels_view.vue
'
;
import
DropdownHeader
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_header.vue
'
;
import
DropdownFooter
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_footer.vue
'
;
import
{
mockLabels
}
from
'
./mock_data
'
;
import
{
mockLabels
}
from
'
./mock_data
'
;
...
@@ -26,7 +28,7 @@ const GlDropdownStub = {
...
@@ -26,7 +28,7 @@ const GlDropdownStub = {
describe
(
'
DropdownContent
'
,
()
=>
{
describe
(
'
DropdownContent
'
,
()
=>
{
let
wrapper
;
let
wrapper
;
const
createComponent
=
({
props
=
{},
injected
=
{},
data
=
{}
}
=
{})
=>
{
const
createComponent
=
({
props
=
{},
data
=
{}
}
=
{})
=>
{
wrapper
=
shallowMount
(
DropdownContents
,
{
wrapper
=
shallowMount
(
DropdownContents
,
{
propsData
:
{
propsData
:
{
labelsCreateTitle
:
'
test
'
,
labelsCreateTitle
:
'
test
'
,
...
@@ -46,11 +48,6 @@ describe('DropdownContent', () => {
...
@@ -46,11 +48,6 @@ describe('DropdownContent', () => {
...
data
,
...
data
,
};
};
},
},
provide
:
{
allowLabelCreate
:
true
,
labelsManagePath
:
'
foo/bar
'
,
...
injected
,
},
stubs
:
{
stubs
:
{
GlDropdown
:
GlDropdownStub
,
GlDropdown
:
GlDropdownStub
,
},
},
...
@@ -63,13 +60,10 @@ describe('DropdownContent', () => {
...
@@ -63,13 +60,10 @@ describe('DropdownContent', () => {
const
findCreateView
=
()
=>
wrapper
.
findComponent
(
DropdownContentsCreateView
);
const
findCreateView
=
()
=>
wrapper
.
findComponent
(
DropdownContentsCreateView
);
const
findLabelsView
=
()
=>
wrapper
.
findComponent
(
DropdownContentsLabelsView
);
const
findLabelsView
=
()
=>
wrapper
.
findComponent
(
DropdownContentsLabelsView
);
const
findDropdownHeader
=
()
=>
wrapper
.
findComponent
(
DropdownHeader
);
const
findDropdownFooter
=
()
=>
wrapper
.
findComponent
(
DropdownFooter
);
const
findDropdown
=
()
=>
wrapper
.
findComponent
(
GlDropdownStub
);
const
findDropdown
=
()
=>
wrapper
.
findComponent
(
GlDropdownStub
);
const
findDropdownFooter
=
()
=>
wrapper
.
find
(
'
[data-testid="dropdown-footer"]
'
);
const
findDropdownHeader
=
()
=>
wrapper
.
find
(
'
[data-testid="dropdown-header"]
'
);
const
findCreateLabelButton
=
()
=>
wrapper
.
find
(
'
[data-testid="create-label-button"]
'
);
const
findGoBackButton
=
()
=>
wrapper
.
find
(
'
[data-testid="go-back-button"]
'
);
it
(
'
calls dropdown `show` method on `isVisible` prop change
'
,
async
()
=>
{
it
(
'
calls dropdown `show` method on `isVisible` prop change
'
,
async
()
=>
{
createComponent
();
createComponent
();
await
wrapper
.
setProps
({
await
wrapper
.
setProps
({
...
@@ -136,6 +130,16 @@ describe('DropdownContent', () => {
...
@@ -136,6 +130,16 @@ describe('DropdownContent', () => {
expect
(
findDropdownHeader
().
exists
()).
toBe
(
true
);
expect
(
findDropdownHeader
().
exists
()).
toBe
(
true
);
});
});
it
(
'
sets searchKey on input event from header
'
,
async
()
=>
{
createComponent
();
expect
(
wrapper
.
vm
.
searchKey
).
toEqual
(
''
);
findDropdownHeader
().
vm
.
$emit
(
'
input
'
,
'
123
'
);
await
nextTick
();
expect
(
wrapper
.
vm
.
searchKey
).
toEqual
(
'
123
'
);
});
describe
(
'
Create view
'
,
()
=>
{
describe
(
'
Create view
'
,
()
=>
{
beforeEach
(()
=>
{
beforeEach
(()
=>
{
createComponent
({
data
:
{
showDropdownContentsCreateView
:
true
}
});
createComponent
({
data
:
{
showDropdownContentsCreateView
:
true
}
});
...
@@ -149,16 +153,8 @@ describe('DropdownContent', () => {
...
@@ -149,16 +153,8 @@ describe('DropdownContent', () => {
expect
(
findDropdownFooter
().
exists
()).
toBe
(
false
);
expect
(
findDropdownFooter
().
exists
()).
toBe
(
false
);
});
});
it
(
'
does not render create label button
'
,
()
=>
{
it
(
'
changes the view to Labels view on `toggleDropdownContentsCreateView` event
'
,
async
()
=>
{
expect
(
findCreateLabelButton
().
exists
()).
toBe
(
false
);
findDropdownHeader
().
vm
.
$emit
(
'
toggleDropdownContentsCreateView
'
);
});
it
(
'
renders go back button
'
,
()
=>
{
expect
(
findGoBackButton
().
exists
()).
toBe
(
true
);
});
it
(
'
changes the view to Labels view on back button click
'
,
async
()
=>
{
findGoBackButton
().
vm
.
$emit
(
'
click
'
,
new
MouseEvent
(
'
click
'
));
await
nextTick
();
await
nextTick
();
expect
(
findCreateView
().
exists
()).
toBe
(
false
);
expect
(
findCreateView
().
exists
()).
toBe
(
false
);
...
@@ -198,32 +194,5 @@ describe('DropdownContent', () => {
...
@@ -198,32 +194,5 @@ describe('DropdownContent', () => {
expect
(
findDropdownFooter
().
exists
()).
toBe
(
true
);
expect
(
findDropdownFooter
().
exists
()).
toBe
(
true
);
});
});
it
(
'
does not render go back button
'
,
()
=>
{
expect
(
findGoBackButton
().
exists
()).
toBe
(
false
);
});
it
(
'
does not render create label button if `allowLabelCreate` is false
'
,
()
=>
{
createComponent
({
injected
:
{
allowLabelCreate
:
false
}
});
expect
(
findCreateLabelButton
().
exists
()).
toBe
(
false
);
});
describe
(
'
when `allowLabelCreate` is true
'
,
()
=>
{
beforeEach
(()
=>
{
createComponent
();
});
it
(
'
renders create label button
'
,
()
=>
{
expect
(
findCreateLabelButton
().
exists
()).
toBe
(
true
);
});
it
(
'
changes the view to Create on create label button click
'
,
async
()
=>
{
findCreateLabelButton
().
trigger
(
'
click
'
);
await
nextTick
();
expect
(
findLabelsView
().
exists
()).
toBe
(
false
);
});
});
});
});
});
});
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_footer_spec.js
0 → 100644
View file @
fa7d3e3e
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
{
nextTick
}
from
'
vue
'
;
import
DropdownFooter
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_footer.vue
'
;
describe
(
'
DropdownFooter
'
,
()
=>
{
let
wrapper
;
const
createComponent
=
({
props
=
{},
injected
=
{}
}
=
{})
=>
{
wrapper
=
shallowMount
(
DropdownFooter
,
{
propsData
:
{
footerCreateLabelTitle
:
'
create
'
,
footerManageLabelTitle
:
'
manage
'
,
...
props
,
},
provide
:
{
allowLabelCreate
:
true
,
labelsManagePath
:
'
foo/bar
'
,
...
injected
,
},
});
};
afterEach
(()
=>
{
wrapper
.
destroy
();
});
const
findCreateLabelButton
=
()
=>
wrapper
.
find
(
'
[data-testid="create-label-button"]
'
);
describe
(
'
Labels view
'
,
()
=>
{
beforeEach
(()
=>
{
createComponent
();
});
it
(
'
does not render create label button if `allowLabelCreate` is false
'
,
()
=>
{
createComponent
({
injected
:
{
allowLabelCreate
:
false
}
});
expect
(
findCreateLabelButton
().
exists
()).
toBe
(
false
);
});
describe
(
'
when `allowLabelCreate` is true
'
,
()
=>
{
beforeEach
(()
=>
{
createComponent
();
});
it
(
'
renders create label button
'
,
()
=>
{
expect
(
findCreateLabelButton
().
exists
()).
toBe
(
true
);
});
it
(
'
emits `toggleDropdownContentsCreateView` event on create label button click
'
,
async
()
=>
{
findCreateLabelButton
().
trigger
(
'
click
'
);
await
nextTick
();
expect
(
wrapper
.
emitted
(
'
toggleDropdownContentsCreateView
'
)).
toEqual
([[]]);
});
});
});
});
spec/frontend/vue_shared/components/sidebar/labels_select_widget/dropdown_header_spec.js
0 → 100644
View file @
fa7d3e3e
import
{
GlSearchBoxByType
}
from
'
@gitlab/ui
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
DropdownHeader
from
'
~/vue_shared/components/sidebar/labels_select_widget/dropdown_header.vue
'
;
describe
(
'
DropdownHeader
'
,
()
=>
{
let
wrapper
;
const
createComponent
=
({
showDropdownContentsCreateView
=
false
,
labelsFetchInProgress
=
false
,
}
=
{})
=>
{
wrapper
=
shallowMount
(
DropdownHeader
,
{
propsData
:
{
showDropdownContentsCreateView
,
labelsFetchInProgress
,
labelsCreateTitle
:
'
Create label
'
,
labelsListTitle
:
'
Select label
'
,
searchKey
:
''
,
},
stubs
:
{
GlSearchBoxByType
,
},
});
};
afterEach
(()
=>
{
wrapper
.
destroy
();
});
const
findSearchInput
=
()
=>
wrapper
.
findComponent
(
GlSearchBoxByType
);
const
findGoBackButton
=
()
=>
wrapper
.
find
(
'
[data-testid="go-back-button"]
'
);
beforeEach
(()
=>
{
createComponent
();
});
describe
(
'
Create view
'
,
()
=>
{
beforeEach
(()
=>
{
createComponent
({
showDropdownContentsCreateView
:
true
});
});
it
(
'
renders go back button
'
,
()
=>
{
expect
(
findGoBackButton
().
exists
()).
toBe
(
true
);
});
it
(
'
does not render search input field
'
,
async
()
=>
{
expect
(
findSearchInput
().
exists
()).
toBe
(
false
);
});
});
describe
(
'
Labels view
'
,
()
=>
{
beforeEach
(()
=>
{
createComponent
();
});
it
(
'
does not render go back button
'
,
()
=>
{
expect
(
findGoBackButton
().
exists
()).
toBe
(
false
);
});
it
(
'
when loading labels - renders disabled search input field
'
,
async
()
=>
{
createComponent
({
labelsFetchInProgress
:
true
});
expect
(
findSearchInput
().
props
(
'
disabled
'
)).
toBe
(
true
);
});
it
(
'
when labels are loaded - renders enabled search input field
'
,
async
()
=>
{
expect
(
findSearchInput
().
props
(
'
disabled
'
)).
toBe
(
false
);
});
});
});
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