Commit 9b4589cf authored by Florie Guibert's avatar Florie Guibert

Migrate Add To Do button to widget

Review feedback
parent 6cfa6b8e
<script> <script>
import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql'; import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql';
import TodoButton from '~/vue_shared/components/sidebar/todo_button.vue'; import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
import createDesignTodoMutation from '../graphql/mutations/create_design_todo.mutation.graphql'; import createDesignTodoMutation from '../graphql/mutations/create_design_todo.mutation.graphql';
import getDesignQuery from '../graphql/queries/get_design.query.graphql'; import getDesignQuery from '../graphql/queries/get_design.query.graphql';
import allVersionsMixin from '../mixins/all_versions'; import allVersionsMixin from '../mixins/all_versions';
......
<script> <script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui'; import { GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { produce } from 'immer'; import { produce } from 'immer';
import createFlash from '~/flash'; import createFlash from '~/flash';
import { __, sprintf } from '~/locale'; import { __, sprintf } from '~/locale';
import { todoQueries, TodoMutationTypes, todoMutations } from '~/sidebar/constants'; import { todoQueries, TodoMutationTypes, todoMutations } from '~/sidebar/constants';
import TodoButton from '~/vue_shared/components/sidebar/todo_button.vue'; import { todoLabel } from '~/vue_shared/components/sidebar/todo_toggle//utils';
import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
export default { export default {
components: { components: {
GlButton,
GlIcon, GlIcon,
TodoButton, TodoButton,
}, },
...@@ -96,7 +98,7 @@ export default { ...@@ -96,7 +98,7 @@ export default {
return this.hasTodo ? 'todo-done' : 'todo-add'; return this.hasTodo ? 'todo-done' : 'todo-add';
}, },
tootltipTitle() { tootltipTitle() {
return this.hasTodo ? __('Mark as done') : __('Add a to do'); return todoLabel(this.hasTodo);
}, },
}, },
methods: { methods: {
...@@ -173,16 +175,21 @@ export default { ...@@ -173,16 +175,21 @@ export default {
class="hide-collapsed" class="hide-collapsed"
@click.stop.prevent="toggleTodo" @click.stop.prevent="toggleTodo"
/> />
<div v-if="isClassicSidebar" class="sidebar-collapsed-icon sidebar-collapsed-container"> <gl-button
v-if="isClassicSidebar"
category="tertiary"
type="reset"
class="sidebar-collapsed-icon sidebar-collapsed-container gl-rounded-0! gl-shadow-none!"
@click.stop.prevent="toggleTodo"
>
<gl-icon <gl-icon
v-gl-tooltip v-gl-tooltip.left.viewport
:title="tootltipTitle" :title="tootltipTitle"
:size="16" :size="16"
:class="{ 'todo-undone': hasTodo }" :class="{ 'todo-undone': hasTodo }"
:name="collapsedButtonIcon" :name="collapsedButtonIcon"
:aria-label="collapsedButtonIcon" :aria-label="collapsedButtonIcon"
@click.stop.prevent="toggleTodo"
/> />
</div> </gl-button>
</div> </div>
</template> </template>
...@@ -2,6 +2,8 @@ import $ from 'jquery'; ...@@ -2,6 +2,8 @@ import $ from 'jquery';
import Vue from 'vue'; import Vue from 'vue';
import VueApollo from 'vue-apollo'; import VueApollo from 'vue-apollo';
import createFlash from '~/flash'; import createFlash from '~/flash';
import { TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/graphql_shared/constants';
import { convertToGraphQLId } from '~/graphql_shared/utils';
import initInviteMembersModal from '~/invite_members/init_invite_members_modal'; import initInviteMembersModal from '~/invite_members/init_invite_members_modal';
import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger'; import initInviteMembersTrigger from '~/invite_members/init_invite_members_trigger';
import { IssuableType } from '~/issue_show/constants'; import { IssuableType } from '~/issue_show/constants';
...@@ -22,7 +24,6 @@ import SidebarDropdownWidget from '~/sidebar/components/sidebar_dropdown_widget. ...@@ -22,7 +24,6 @@ import SidebarDropdownWidget from '~/sidebar/components/sidebar_dropdown_widget.
import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue'; import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
import { apolloProvider } from '~/sidebar/graphql'; import { apolloProvider } from '~/sidebar/graphql';
import trackShowInviteMemberLink from '~/sidebar/track_invite_members'; import trackShowInviteMemberLink from '~/sidebar/track_invite_members';
import { toIssueGid, toMergeRequestGid } from '~/sidebar/utils';
import Translate from '../vue_shared/translate'; import Translate from '../vue_shared/translate';
import SidebarAssignees from './components/assignees/sidebar_assignees.vue'; import SidebarAssignees from './components/assignees/sidebar_assignees.vue';
import CopyEmailToClipboard from './components/copy_email_to_clipboard.vue'; import CopyEmailToClipboard from './components/copy_email_to_clipboard.vue';
...@@ -64,7 +65,10 @@ function mountSidebarToDoWidget() { ...@@ -64,7 +65,10 @@ function mountSidebarToDoWidget() {
createElement('sidebar-todo-widget', { createElement('sidebar-todo-widget', {
props: { props: {
fullPath: projectPath, fullPath: projectPath,
issuableId: isInIssuePage() || isInDesignPage() ? toIssueGid(id) : toMergeRequestGid(id), issuableId:
isInIssuePage() || isInDesignPage()
? convertToGraphQLId(TYPE_ISSUE, id)
: convertToGraphQLId(TYPE_MERGE_REQUEST, id),
issuableIid: iid, issuableIid: iid,
issuableType: issuableType:
isInIssuePage() || isInDesignPage() ? IssuableType.Issue : IssuableType.MergeRequest, isInIssuePage() || isInDesignPage() ? IssuableType.Issue : IssuableType.MergeRequest,
......
export const toLabelGid = (id) => `gid://gitlab/Label/${id}`; export const toLabelGid = (id) => `gid://gitlab/Label/${id}`;
export const toIssueGid = (id) => `gid://gitlab/Issue/${id}`;
export const toMergeRequestGid = (id) => `gid://gitlab/MergeRequest/${id}`;
...@@ -4,7 +4,7 @@ import TodoButton from './todo_button.vue'; ...@@ -4,7 +4,7 @@ import TodoButton from './todo_button.vue';
export default { export default {
component: TodoButton, component: TodoButton,
title: 'vue_shared/components/todo_button', title: 'vue_shared/components/todo_toggle/todo_button',
}; };
const Template = (args, { argTypes }) => ({ const Template = (args, { argTypes }) => ({
......
<script> <script>
import { GlButton } from '@gitlab/ui'; import { GlButton } from '@gitlab/ui';
import { __ } from '~/locale'; import { todoLabel } from './utils';
export default { export default {
components: { components: {
...@@ -15,7 +15,7 @@ export default { ...@@ -15,7 +15,7 @@ export default {
}, },
computed: { computed: {
buttonLabel() { buttonLabel() {
return this.isTodo ? __('Mark as done') : __('Add a to do'); return todoLabel(this.isTodo);
}, },
}, },
methods: { methods: {
......
import { __ } from '~/locale';
export const todoLabel = (hasTodo) => {
return hasTodo ? __('Mark as done') : __('Add a to do');
};
...@@ -47,5 +47,5 @@ To add a story: ...@@ -47,5 +47,5 @@ To add a story:
Notes: Notes:
- Specify the `title` field of the story as the component's file path from the `javascripts/` directory, - Specify the `title` field of the story as the component's file path from the `javascripts/` directory,
e.g. if the component is located at `app/assets/javascripts/vue_shared/components/sidebar/todo_button.vue`, specify the `title` as e.g. if the component is located at `app/assets/javascripts/vue_shared/components/sidebar/todo_toggle/todo_button.vue`, specify the `title` as
`vue_shared/components/To-do Button`. This will ensure the Storybook navigation maps closely to our internal directory structure. `vue_shared/components/To-do Button`. This will ensure the Storybook navigation maps closely to our internal directory structure.
...@@ -2,7 +2,7 @@ import { shallowMount, mount } from '@vue/test-utils'; ...@@ -2,7 +2,7 @@ import { shallowMount, mount } from '@vue/test-utils';
import DesignTodoButton from '~/design_management/components/design_todo_button.vue'; import DesignTodoButton from '~/design_management/components/design_todo_button.vue';
import createDesignTodoMutation from '~/design_management/graphql/mutations/create_design_todo.mutation.graphql'; import createDesignTodoMutation from '~/design_management/graphql/mutations/create_design_todo.mutation.graphql';
import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql'; import todoMarkDoneMutation from '~/graphql_shared/mutations/todo_mark_done.mutation.graphql';
import TodoButton from '~/vue_shared/components/sidebar/todo_button.vue'; import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
import mockDesign from '../mock_data/design'; import mockDesign from '../mock_data/design';
const mockDesignWithPendingTodos = { const mockDesignWithPendingTodos = {
......
...@@ -7,7 +7,7 @@ import waitForPromises from 'helpers/wait_for_promises'; ...@@ -7,7 +7,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import createFlash from '~/flash'; import createFlash from '~/flash';
import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue'; import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue';
import epicTodoQuery from '~/sidebar/queries/epic_todo.query.graphql'; import epicTodoQuery from '~/sidebar/queries/epic_todo.query.graphql';
import TodoButton from '~/vue_shared/components/sidebar/todo_button.vue'; import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
import { todosResponse, noTodosResponse } from '../../mock_data'; import { todosResponse, noTodosResponse } from '../../mock_data';
jest.mock('~/flash'); jest.mock('~/flash');
......
import { GlButton } from '@gitlab/ui'; import { GlButton } from '@gitlab/ui';
import { shallowMount, mount } from '@vue/test-utils'; import { shallowMount, mount } from '@vue/test-utils';
import TodoButton from '~/vue_shared/components/sidebar/todo_button.vue'; import TodoButton from '~/vue_shared/components/sidebar/todo_toggle/todo_button.vue';
describe('Todo Button', () => { describe('Todo Button', () => {
let wrapper; let wrapper;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment