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
8a21c31b
Unverified
Commit
8a21c31b
authored
May 04, 2018
by
Phil Hughes
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '44846-improve-web-ide-left-panel-and-modes' into ide-sidebar-commit-box
parents
616c1c72
9f2f8679
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
160 additions
and
79 deletions
+160
-79
list_item.vue
...s/javascripts/ide/components/commit_sidebar/list_item.vue
+2
-1
editor_mode_dropdown.vue
...ssets/javascripts/ide/components/editor_mode_dropdown.vue
+14
-66
ide_review.vue
app/assets/javascripts/ide/components/ide_review.vue
+39
-3
ide_side_bar.vue
app/assets/javascripts/ide/components/ide_side_bar.vue
+22
-0
repo_editor.vue
app/assets/javascripts/ide/components/repo_editor.vue
+5
-4
constants.js
app/assets/javascripts/ide/constants.js
+6
-0
ide_router.js
app/assets/javascripts/ide/ide_router.js
+3
-2
file.js
app/assets/javascripts/ide/stores/actions/file.js
+2
-1
state.js
app/assets/javascripts/ide/stores/state.js
+2
-2
repo.scss
app/assets/stylesheets/pages/repo.scss
+28
-0
ide_review_spec.js
spec/javascripts/ide/components/ide_review_spec.js
+36
-0
mock_data.js
spec/javascripts/ide/mock_data.js
+1
-0
No files found.
app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
View file @
8a21c31b
...
...
@@ -3,6 +3,7 @@ import { mapActions } from 'vuex';
import
Icon
from
'~/vue_shared/components/icon.vue'
;
import
StageButton
from
'./stage_button.vue'
;
import
UnstageButton
from
'./unstage_button.vue'
;
import
{
viewerTypes
}
from
'../../constants'
;
export
default
{
components
:
{
...
...
@@ -53,7 +54,7 @@ export default {
keyPrefix
:
this
.
keyPrefix
.
toLowerCase
(),
}).
then
(
changeViewer
=>
{
if
(
changeViewer
)
{
this
.
updateViewer
(
'diff'
);
this
.
updateViewer
(
viewerTypes
.
diff
);
}
});
},
...
...
app/assets/javascripts/ide/components/editor_mode_dropdown.vue
View file @
8a21c31b
<
script
>
import
Icon
from
'~/vue_shared/components/icon.vue'
;
import
{
__
,
sprintf
}
from
'~/locale'
;
import
{
viewerTypes
}
from
'../constants'
;
export
default
{
components
:
{
Icon
,
},
props
:
{
hasChanges
:
{
type
:
Boolean
,
required
:
false
,
default
:
false
,
},
mergeRequestId
:
{
type
:
String
,
required
:
false
,
default
:
''
,
},
viewer
:
{
type
:
String
,
required
:
true
,
},
showShadow
:
{
type
:
Boolean
,
mergeRequestId
:
{
type
:
Number
,
required
:
true
,
},
},
...
...
@@ -38,84 +25,45 @@ export default {
this
.
$emit
(
'click'
,
mode
);
},
},
viewerTypes
,
};
</
script
>
<
template
>
<div
class=
"dropdown"
:class=
"
{
shadow: showShadow,
}"
>
<button
type=
"button"
class=
"btn btn-primary btn-sm"
:class=
"
{
'btn-inverted': hasChanges,
}"
class=
"btn btn-link"
data-toggle=
"dropdown"
>
<template
v-if=
"viewer === 'mrdiff' && mergeRequestId"
>
{{
mergeReviewLine
}}
</
template
>
<
template
v-else-if=
"viewer === 'editor'"
>
{{
__
(
'Editing'
)
}}
</
template
>
<
template
v-else
>
{{
__
(
'Reviewing'
)
}}
</
template
>
<icon
name=
"angle-down"
:size=
"12"
css-classes=
"caret-down"
/>
{{
__
(
'Edit'
)
}}
</button>
<div
class=
"dropdown-menu dropdown-menu-selectable dropdown-open-left"
>
<ul>
<
template
v-if=
"mergeRequestId"
>
<li>
<a
href=
"#"
@
click
.
prevent=
"changeMode('mrdiff')"
:class=
"
{
'is-active': viewer === 'mrdiff',
}"
>
<strong
class=
"dropdown-menu-inner-title"
>
{{
mergeReviewLine
}}
</strong>
<span
class=
"dropdown-menu-inner-content"
>
{{
__
(
'Compare changes with the merge request target branch'
)
}}
</span>
</a>
</li>
<li
role=
"separator"
class=
"divider"
>
</li>
</
template
>
<li>
<a
href=
"#"
@
click
.
prevent=
"changeMode(
'editor'
)"
@
click
.
prevent=
"changeMode(
$options.viewerTypes.mr
)"
:class=
"
{
'is-active': viewer ===
'editor'
,
'is-active': viewer ===
$options.viewerTypes.mr
,
}"
>
<strong
class=
"dropdown-menu-inner-title"
>
{{ __('Editing') }}
</strong>
<strong
class=
"dropdown-menu-inner-title"
>
{{
mergeReviewLine
}}
</strong>
<span
class=
"dropdown-menu-inner-content"
>
{{ __('
View and edit lines
') }}
{{
__
(
'
Compare changes with the merge request target branch
'
)
}}
</span>
</a>
</li>
<li>
<a
href=
"#"
@
click
.
prevent=
"changeMode(
'diff'
)"
@
click
.
prevent=
"changeMode(
$options.viewerTypes.diff
)"
:class=
"
{
'is-active': viewer ===
'diff'
,
'is-active': viewer ===
$options.viewerTypes.diff
,
}"
>
<strong
class=
"dropdown-menu-inner-title"
>
{{
__
(
'Reviewing'
)
}}
</strong>
...
...
app/assets/javascripts/ide/components/ide_review.vue
View file @
8a21c31b
<
script
>
import
{
mapGetters
,
mapState
,
mapActions
}
from
'vuex'
;
import
IdeTreeList
from
'./ide_tree_list.vue'
;
import
EditorModeDropdown
from
'./editor_mode_dropdown.vue'
;
import
{
viewerTypes
}
from
'../constants'
;
export
default
{
components
:
{
IdeTreeList
,
EditorModeDropdown
,
},
computed
:
{
...
mapGetters
([
'currentMergeRequest'
]),
...
mapState
([
'viewer'
]),
showLatestChangesText
()
{
return
!
this
.
currentMergeRequest
||
this
.
viewer
===
viewerTypes
.
diff
;
},
showMergeRequestText
()
{
return
this
.
currentMergeRequest
&&
this
.
viewer
===
viewerTypes
.
mr
;
},
},
mounted
()
{
this
.
$nextTick
(()
=>
{
this
.
updateViewer
(
this
.
currentMergeRequest
?
viewerTypes
.
mr
:
viewerTypes
.
diff
);
});
},
methods
:
{
...
mapActions
([
'updateViewer'
]),
},
};
</
script
>
<
template
>
<ide-tree-list
viewer-type=
"diff
"
:viewer-type=
"viewer
"
header-class=
"ide-review-header"
:disable-action-dropdown=
"true"
>
<template
slot=
"header"
>
{{
__
(
'Review'
)
}}
<div
class=
"ide-review-button-holder"
>
{{
__
(
'Review'
)
}}
<editor-mode-dropdown
v-if=
"currentMergeRequest"
:viewer=
"viewer"
:merge-request-id=
"currentMergeRequest.iid"
@
click=
"updateViewer"
/>
</div>
<div
class=
"prepend-top-5 ide-review-sub-header"
>
{{
__
(
'Lastest changes'
)
}}
<template
v-if=
"showLatestChangesText"
>
{{
__
(
'Latest changes'
)
}}
</
template
>
<
template
v-else-if=
"showMergeRequestText"
>
{{
__
(
'Merge request'
)
}}
(
<a
:href=
"currentMergeRequest.web_url"
>
!
{{
currentMergeRequest
.
iid
}}
</a>
)
</
template
>
</div>
</template>
</ide-tree-list>
...
...
app/assets/javascripts/ide/components/ide_side_bar.vue
View file @
8a21c31b
...
...
@@ -2,6 +2,7 @@
import
{
mapState
,
mapGetters
}
from
'vuex'
;
import
ProjectAvatarImage
from
'~/vue_shared/components/project_avatar/image.vue'
;
import
Icon
from
'~/vue_shared/components/icon.vue'
;
import
tooltip
from
'~/vue_shared/directives/tooltip'
;
import
PanelResizer
from
'~/vue_shared/components/panel_resizer.vue'
;
import
SkeletonLoadingContainer
from
'~/vue_shared/components/skeleton_loading_container.vue'
;
import
Identicon
from
'../../vue_shared/components/identicon.vue'
;
...
...
@@ -15,6 +16,9 @@ import SuccessMessage from './commit_sidebar/success_message.vue';
import
{
activityBarViews
}
from
'../constants'
;
export
default
{
directives
:
{
tooltip
,
},
components
:
{
Icon
,
PanelResizer
,
...
...
@@ -29,6 +33,11 @@ export default {
IdeReview
,
SuccessMessage
,
},
data
()
{
return
{
showTooltip
:
false
,
};
},
computed
:
{
...
mapState
([
'loading'
,
...
...
@@ -45,6 +54,16 @@ export default {
(
this
.
lastCommitMsg
&&
!
this
.
someUncommitedChanges
)
);
},
branchTooltipTitle
()
{
return
this
.
showTooltip
?
this
.
currentBranchId
:
undefined
;
},
},
watch
:
{
currentBranchId
()
{
this
.
$nextTick
(()
=>
{
this
.
showTooltip
=
this
.
$refs
.
branchId
.
scrollWidth
>
this
.
$refs
.
branchId
.
offsetWidth
;
});
},
},
};
</
script
>
...
...
@@ -97,6 +116,9 @@ export default {
</div>
<div
class=
"sidebar-context-title ide-sidebar-branch-title"
ref=
"branchId"
v-tooltip
:title=
"branchTooltipTitle"
>
<icon
name=
"branch"
...
...
app/assets/javascripts/ide/components/repo_editor.vue
View file @
8a21c31b
...
...
@@ -3,7 +3,7 @@
import
{
mapState
,
mapGetters
,
mapActions
}
from
'vuex'
;
import
flash
from
'~/flash'
;
import
ContentViewer
from
'~/vue_shared/components/content_viewer/content_viewer.vue'
;
import
{
activityBarViews
}
from
'../constants'
;
import
{
activityBarViews
,
viewerTypes
}
from
'../constants'
;
import
monacoLoader
from
'../monaco_loader'
;
import
Editor
from
'../lib/editor'
;
import
IdeFileButtons
from
'./ide_file_buttons.vue'
;
...
...
@@ -121,7 +121,7 @@ export default {
this
.
editor
.
dispose
();
this
.
$nextTick
(()
=>
{
if
(
this
.
viewer
===
'editor'
)
{
if
(
this
.
viewer
===
viewerTypes
.
edit
)
{
this
.
editor
.
createInstance
(
this
.
$refs
.
editor
);
}
else
{
this
.
editor
.
createDiffInstance
(
this
.
$refs
.
editor
,
!
this
.
isReviewModeActive
);
...
...
@@ -140,7 +140,7 @@ export default {
this
.
file
.
staged
&&
this
.
file
.
key
.
indexOf
(
'unstaged-'
)
===
0
?
head
:
null
,
);
if
(
this
.
viewer
===
'mrdiff'
)
{
if
(
this
.
viewer
===
viewerTypes
.
mr
)
{
this
.
editor
.
attachMergeRequestModel
(
this
.
model
);
}
else
{
this
.
editor
.
attachModel
(
this
.
model
);
...
...
@@ -181,6 +181,7 @@ export default {
});
},
},
viewerTypes
,
};
</
script
>
...
...
@@ -199,7 +200,7 @@ export default {
href=
"javascript:void(0);"
role=
"button"
@
click
.
prevent=
"setFileViewMode(
{ file, viewMode: 'edit' })">
<template
v-if=
"viewer ===
'editor'
"
>
<template
v-if=
"viewer ===
$options.viewerTypes.edit
"
>
{{
__
(
'Edit'
)
}}
</
template
>
<
template
v-else
>
...
...
app/assets/javascripts/ide/constants.js
View file @
8a21c31b
...
...
@@ -16,3 +16,9 @@ export const activityBarViews = {
commit
:
'commit-section'
,
review
:
'ide-review'
,
};
export
const
viewerTypes
=
{
mr
:
'mrdiff'
,
edit
:
'editor'
,
diff
:
'diff'
,
};
app/assets/javascripts/ide/ide_router.js
View file @
8a21c31b
...
...
@@ -2,6 +2,7 @@ import Vue from 'vue';
import
VueRouter
from
'vue-router'
;
import
flash
from
'~/flash'
;
import
store
from
'./stores'
;
import
{
activityBarViews
}
from
'./constants'
;
Vue
.
use
(
VueRouter
);
...
...
@@ -101,14 +102,14 @@ router.beforeEach((to, from, next) => {
throw
e
;
});
}
else
if
(
to
.
params
.
mrid
)
{
store
.
dispatch
(
'updateViewer'
,
'mrdiff'
);
store
.
dispatch
(
'getMergeRequestData'
,
{
projectId
:
fullProjectId
,
mergeRequestId
:
to
.
params
.
mrid
,
})
.
then
(
mr
=>
{
store
.
dispatch
(
'updateActivityBarView'
,
activityBarViews
.
review
);
store
.
dispatch
(
'getBranchData'
,
{
projectId
:
fullProjectId
,
branchId
:
mr
.
source_branch
,
...
...
app/assets/javascripts/ide/stores/actions/file.js
View file @
8a21c31b
...
...
@@ -5,6 +5,7 @@ import service from '../../services';
import
*
as
types
from
'../mutation_types'
;
import
router
from
'../../ide_router'
;
import
{
setPageTitle
}
from
'../utils'
;
import
{
viewerTypes
}
from
'../../constants'
;
export
const
closeFile
=
({
commit
,
state
,
dispatch
},
file
)
=>
{
const
path
=
file
.
path
;
...
...
@@ -23,7 +24,7 @@ export const closeFile = ({ commit, state, dispatch }, file) => {
const
nextFileToOpen
=
state
.
openFiles
[
nextIndexToOpen
];
if
(
nextFileToOpen
.
pending
)
{
dispatch
(
'updateViewer'
,
'diff'
);
dispatch
(
'updateViewer'
,
viewerTypes
.
diff
);
dispatch
(
'openPendingTab'
,
{
file
:
nextFileToOpen
,
keyPrefix
:
nextFileToOpen
.
staged
?
'staged'
:
'unstaged'
,
...
...
app/assets/javascripts/ide/stores/state.js
View file @
8a21c31b
import
{
activityBarViews
}
from
'../constants'
;
import
{
activityBarViews
,
viewerTypes
}
from
'../constants'
;
export
default
()
=>
({
currentProjectId
:
''
,
...
...
@@ -18,7 +18,7 @@ export default () => ({
rightPanelCollapsed
:
false
,
panelResizing
:
false
,
entries
:
{},
viewer
:
'editor'
,
viewer
:
viewerTypes
.
edit
,
delayViewerUpdated
:
false
,
currentActivityView
:
activityBarViews
.
edit
,
unusedSeal
:
true
,
...
...
app/assets/stylesheets/pages/repo.scss
View file @
8a21c31b
...
...
@@ -1020,6 +1020,14 @@
.ide-review-header
{
flex-direction
:
column
;
align-items
:
flex-start
;
.dropdown
{
margin-left
:
auto
;
}
a
{
color
:
$gl-link-color
;
}
}
.ide-review-sub-header
{
...
...
@@ -1049,3 +1057,23 @@
flex-direction
:
column
;
justify-content
:
center
;
}
.ide-review-button-holder
{
display
:
flex
;
width
:
100%
;
align-items
:
center
;
}
.ide-context-header
{
.avatar
{
flex
:
0
0
40px
;
}
}
.ide-sidebar-project-title
{
min-width
:
0
;
.sidebar-context-title
{
white-space
:
nowrap
;
}
}
spec/javascripts/ide/components/ide_review_spec.js
View file @
8a21c31b
...
...
@@ -2,6 +2,7 @@ import Vue from 'vue';
import
IdeReview
from
'~/ide/components/ide_review.vue'
;
import
store
from
'~/ide/stores'
;
import
{
createComponentWithStore
}
from
'../../helpers/vue_mount_component_helper'
;
import
{
trimText
}
from
'../../helpers/vue_component_helper'
;
import
{
resetStore
,
file
}
from
'../helpers'
;
import
{
projectData
}
from
'../mock_data'
;
...
...
@@ -30,4 +31,39 @@ describe('IDE review mode', () => {
it
(
'renders list of files'
,
()
=>
{
expect
(
vm
.
$el
.
textContent
).
toContain
(
'fileName'
);
});
describe
(
'merge request'
,
()
=>
{
beforeEach
(
done
=>
{
store
.
state
.
currentMergeRequestId
=
'1'
;
store
.
state
.
projects
.
abcproject
.
mergeRequests
[
'1'
]
=
{
iid
:
123
,
web_url
:
'testing123'
,
};
vm
.
$nextTick
(
done
);
});
it
(
'renders edit dropdown'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'.btn'
)).
not
.
toBe
(
null
);
});
it
(
'renders merge request link & IID'
,
()
=>
{
const
link
=
vm
.
$el
.
querySelector
(
'.ide-review-sub-header'
);
expect
(
link
.
querySelector
(
'a'
).
getAttribute
(
'href'
)).
toBe
(
'testing123'
);
expect
(
trimText
(
link
.
textContent
)).
toBe
(
'Merge request (!123)'
);
});
it
(
'changes text to latest changes when viewer is not mrdiff'
,
done
=>
{
store
.
state
.
viewer
=
'diff'
;
vm
.
$nextTick
(()
=>
{
expect
(
trimText
(
vm
.
$el
.
querySelector
(
'.ide-review-sub-header'
).
textContent
)).
toBe
(
'Latest changes'
,
);
done
();
});
});
});
});
spec/javascripts/ide/mock_data.js
View file @
8a21c31b
...
...
@@ -11,4 +11,5 @@ export const projectData = {
treeId
:
'abcproject/master'
,
},
},
mergeRequests
:
{},
};
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