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
18c9cad0
Commit
18c9cad0
authored
Jul 04, 2018
by
Kushal Pandya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Sidebar Todo Component
parent
6e599ede
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
256 additions
and
0 deletions
+256
-0
app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
...ssets/javascripts/sidebar/components/todo_toggle/todo.vue
+98
-0
spec/javascripts/sidebar/todo_spec.js
spec/javascripts/sidebar/todo_spec.js
+158
-0
No files found.
app/assets/javascripts/sidebar/components/todo_toggle/todo.vue
0 → 100644
View file @
18c9cad0
<
script
>
import
{
__
}
from
'
~/locale
'
;
import
tooltip
from
'
~/vue_shared/directives/tooltip
'
;
import
Icon
from
'
~/vue_shared/components/icon.vue
'
;
import
LoadingIcon
from
'
~/vue_shared/components/loading_icon.vue
'
;
const
MARK_TEXT
=
__
(
'
Mark todo as done
'
);
const
TODO_TEXT
=
__
(
'
Add todo
'
);
export
default
{
directives
:
{
tooltip
,
},
components
:
{
Icon
,
LoadingIcon
,
},
props
:
{
issuableId
:
{
type
:
Number
,
required
:
true
,
},
issuableType
:
{
type
:
String
,
required
:
true
,
},
isTodo
:
{
type
:
Boolean
,
required
:
false
,
default
:
true
,
},
isActionActive
:
{
type
:
Boolean
,
required
:
false
,
default
:
false
,
},
collapsed
:
{
type
:
Boolean
,
required
:
false
,
default
:
false
,
},
},
computed
:
{
buttonClasses
()
{
return
this
.
collapsed
?
'
btn-blank btn-todo sidebar-collapsed-icon dont-change-state
'
:
'
btn btn-default btn-todo issuable-header-btn float-right
'
;
},
buttonLabel
()
{
return
this
.
isTodo
?
MARK_TEXT
:
TODO_TEXT
;
},
collapsedButtonIconClasses
()
{
return
this
.
isTodo
?
'
todo-undone
'
:
''
;
},
collapsedButtonIcon
()
{
return
this
.
isTodo
?
'
todo-done
'
:
'
todo-add
'
;
},
},
methods
:
{
handleButtonClick
()
{
this
.
$emit
(
'
toggleTodo
'
);
},
},
};
</
script
>
<
template
>
<button
v-tooltip
:class=
"buttonClasses"
:title=
"buttonLabel"
:aria-label=
"buttonLabel"
:data-issuable-id=
"issuableId"
:data-issuable-type=
"issuableType"
type=
"button"
data-container=
"body"
data-placement=
"left"
data-boundary=
"viewport"
@
click=
"handleButtonClick"
>
<icon
v-show=
"collapsed"
:css-classes=
"collapsedButtonIconClasses"
:name=
"collapsedButtonIcon"
/>
<span
v-show=
"!collapsed"
class=
"issuable-todo-inner"
>
{{
buttonLabel
}}
</span>
<loading-icon
v-show=
"isActionActive"
:inline=
"true"
/>
</button>
</
template
>
spec/javascripts/sidebar/todo_spec.js
0 → 100644
View file @
18c9cad0
import
Vue
from
'
vue
'
;
import
SidebarTodos
from
'
~/sidebar/components/todo_toggle/todo.vue
'
;
import
mountComponent
from
'
spec/helpers/vue_mount_component_helper
'
;
const
createComponent
=
({
issuableId
=
1
,
issuableType
=
'
epic
'
,
isTodo
,
isActionActive
,
collapsed
,
})
=>
{
const
Component
=
Vue
.
extend
(
SidebarTodos
);
return
mountComponent
(
Component
,
{
issuableId
,
issuableType
,
isTodo
,
isActionActive
,
collapsed
,
});
};
describe
(
'
SidebarTodo
'
,
()
=>
{
let
vm
;
beforeEach
(()
=>
{
vm
=
createComponent
({});
});
afterEach
(()
=>
{
vm
.
$destroy
();
});
describe
(
'
computed
'
,
()
=>
{
describe
(
'
buttonClasses
'
,
()
=>
{
it
(
'
returns todo button classes for when `collapsed` prop is `false`
'
,
()
=>
{
expect
(
vm
.
buttonClasses
).
toBe
(
'
btn btn-default btn-todo issuable-header-btn float-right
'
);
});
it
(
'
returns todo button classes for when `collapsed` prop is `true`
'
,
done
=>
{
vm
.
collapsed
=
true
;
Vue
.
nextTick
()
.
then
(()
=>
{
expect
(
vm
.
buttonClasses
).
toBe
(
'
btn-blank btn-todo sidebar-collapsed-icon dont-change-state
'
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
describe
(
'
buttonLabel
'
,
()
=>
{
it
(
'
returns todo button text for marking todo as done when `isTodo` prop is `true`
'
,
()
=>
{
expect
(
vm
.
buttonLabel
).
toBe
(
'
Mark todo as done
'
);
});
it
(
'
returns todo button text for add todo when `isTodo` prop is `false`
'
,
done
=>
{
vm
.
isTodo
=
false
;
Vue
.
nextTick
()
.
then
(()
=>
{
expect
(
vm
.
buttonLabel
).
toBe
(
'
Add todo
'
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
describe
(
'
collapsedButtonIconClasses
'
,
()
=>
{
it
(
'
returns collapsed button icon class when `isTodo` prop is `true`
'
,
()
=>
{
expect
(
vm
.
collapsedButtonIconClasses
).
toBe
(
'
todo-undone
'
);
});
it
(
'
returns empty string when `isTodo` prop is `false`
'
,
done
=>
{
vm
.
isTodo
=
false
;
Vue
.
nextTick
()
.
then
(()
=>
{
expect
(
vm
.
collapsedButtonIconClasses
).
toBe
(
''
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
describe
(
'
collapsedButtonIcon
'
,
()
=>
{
it
(
'
returns button icon name when `isTodo` prop is `true`
'
,
()
=>
{
expect
(
vm
.
collapsedButtonIcon
).
toBe
(
'
todo-done
'
);
});
it
(
'
returns button icon name when `isTodo` prop is `false`
'
,
done
=>
{
vm
.
isTodo
=
false
;
Vue
.
nextTick
()
.
then
(()
=>
{
expect
(
vm
.
collapsedButtonIcon
).
toBe
(
'
todo-add
'
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
});
describe
(
'
methods
'
,
()
=>
{
describe
(
'
handleButtonClick
'
,
()
=>
{
it
(
'
emits `toggleTodo` event on component
'
,
()
=>
{
spyOn
(
vm
,
'
$emit
'
);
vm
.
handleButtonClick
();
expect
(
vm
.
$emit
).
toHaveBeenCalledWith
(
'
toggleTodo
'
);
});
});
});
describe
(
'
template
'
,
()
=>
{
it
(
'
renders component container element
'
,
()
=>
{
const
dataAttributes
=
{
issuableId
:
'
1
'
,
issuableType
:
'
epic
'
,
originalTitle
:
'
Mark todo as done
'
,
placement
:
'
left
'
,
container
:
'
body
'
,
boundary
:
'
viewport
'
,
};
expect
(
vm
.
$el
.
nodeName
).
toBe
(
'
BUTTON
'
);
const
elDataAttrs
=
vm
.
$el
.
dataset
;
Object
.
keys
(
elDataAttrs
).
forEach
((
attr
)
=>
{
expect
(
elDataAttrs
[
attr
]).
toBe
(
dataAttributes
[
attr
]);
});
});
it
(
'
renders button label element when `collapsed` prop is `false`
'
,
()
=>
{
const
buttonLabelEl
=
vm
.
$el
.
querySelector
(
'
span.issuable-todo-inner
'
);
expect
(
buttonLabelEl
).
not
.
toBeNull
();
expect
(
buttonLabelEl
.
innerText
.
trim
()).
toBe
(
'
Mark todo as done
'
);
});
it
(
'
renders button icon when `collapsed` prop is `true`
'
,
done
=>
{
vm
.
collapsed
=
true
;
Vue
.
nextTick
()
.
then
(()
=>
{
const
buttonIconEl
=
vm
.
$el
.
querySelector
(
'
svg
'
);
expect
(
buttonIconEl
).
not
.
toBeNull
();
expect
(
buttonIconEl
.
querySelector
(
'
use
'
).
getAttribute
(
'
xlink:href
'
)).
toContain
(
'
todo-done
'
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
renders loading icon when `isActionActive` prop is true
'
,
done
=>
{
vm
.
isActionActive
=
true
;
Vue
.
nextTick
()
.
then
(()
=>
{
const
loadingEl
=
vm
.
$el
.
querySelector
(
'
span.loading-container
'
);
expect
(
loadingEl
).
not
.
toBeNull
();
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
});
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