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
ae98def3
Commit
ae98def3
authored
Nov 29, 2017
by
Phil Hughes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EE port of multi-file-editor-css-fixes
parent
ed0f3234
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
717 additions
and
386 deletions
+717
-386
app/assets/javascripts/repo/components/commit_sidebar/list.vue
...ssets/javascripts/repo/components/commit_sidebar/list.vue
+89
-0
app/assets/javascripts/repo/components/commit_sidebar/list_collapsed.vue
...scripts/repo/components/commit_sidebar/list_collapsed.vue
+35
-0
app/assets/javascripts/repo/components/commit_sidebar/list_item.vue
.../javascripts/repo/components/commit_sidebar/list_item.vue
+36
-0
app/assets/javascripts/repo/components/repo.vue
app/assets/javascripts/repo/components/repo.vue
+18
-14
app/assets/javascripts/repo/components/repo_commit_section.vue
...ssets/javascripts/repo/components/repo_commit_section.vue
+84
-75
app/assets/javascripts/repo/components/repo_file.vue
app/assets/javascripts/repo/components/repo_file.vue
+2
-3
app/assets/javascripts/repo/components/repo_file_buttons.vue
app/assets/javascripts/repo/components/repo_file_buttons.vue
+5
-5
app/assets/javascripts/repo/components/repo_preview.vue
app/assets/javascripts/repo/components/repo_preview.vue
+4
-2
app/assets/javascripts/repo/components/repo_sidebar.vue
app/assets/javascripts/repo/components/repo_sidebar.vue
+3
-7
app/assets/javascripts/repo/components/repo_tab.vue
app/assets/javascripts/repo/components/repo_tab.vue
+17
-12
app/assets/javascripts/repo/components/repo_tabs.vue
app/assets/javascripts/repo/components/repo_tabs.vue
+1
-3
app/assets/javascripts/repo/stores/getters.js
app/assets/javascripts/repo/stores/getters.js
+4
-0
app/assets/stylesheets/pages/repo.scss
app/assets/stylesheets/pages/repo.scss
+205
-227
app/views/projects/tree/show.html.haml
app/views/projects/tree/show.html.haml
+1
-1
app/views/shared/repo/_repo.html.haml
app/views/shared/repo/_repo.html.haml
+1
-0
spec/features/projects/tree/create_directory_spec.rb
spec/features/projects/tree/create_directory_spec.rb
+3
-1
spec/features/projects/tree/create_file_spec.rb
spec/features/projects/tree/create_file_spec.rb
+3
-1
spec/features/projects/tree/upload_file_spec.rb
spec/features/projects/tree/upload_file_spec.rb
+2
-2
spec/javascripts/repo/components/commit_sidebar/list_collapsed_spec.js
...pts/repo/components/commit_sidebar/list_collapsed_spec.js
+33
-0
spec/javascripts/repo/components/commit_sidebar/list_item_spec.js
...ascripts/repo/components/commit_sidebar/list_item_spec.js
+53
-0
spec/javascripts/repo/components/commit_sidebar/list_spec.js
spec/javascripts/repo/components/commit_sidebar/list_spec.js
+72
-0
spec/javascripts/repo/components/repo_commit_section_spec.js
spec/javascripts/repo/components/repo_commit_section_spec.js
+11
-11
spec/javascripts/repo/components/repo_sidebar_spec.js
spec/javascripts/repo/components/repo_sidebar_spec.js
+0
-13
spec/javascripts/repo/components/repo_tab_spec.js
spec/javascripts/repo/components/repo_tab_spec.js
+6
-6
spec/javascripts/repo/components/repo_tabs_spec.js
spec/javascripts/repo/components/repo_tabs_spec.js
+2
-3
spec/javascripts/repo/stores/getters_spec.js
spec/javascripts/repo/stores/getters_spec.js
+27
-0
No files found.
app/assets/javascripts/repo/components/commit_sidebar/list.vue
0 → 100644
View file @
ae98def3
<
script
>
import
icon
from
'
../../../vue_shared/components/icon.vue
'
;
import
listItem
from
'
./list_item.vue
'
;
import
listCollapsed
from
'
./list_collapsed.vue
'
;
export
default
{
components
:
{
icon
,
listItem
,
listCollapsed
,
},
props
:
{
title
:
{
type
:
String
,
required
:
true
,
},
fileList
:
{
type
:
Array
,
required
:
true
,
},
collapsed
:
{
type
:
Boolean
,
required
:
true
,
},
},
methods
:
{
toggleCollapsed
()
{
this
.
$emit
(
'
toggleCollapsed
'
);
},
},
};
</
script
>
<
template
>
<div
class=
"multi-file-commit-panel-section"
>
<header
class=
"multi-file-commit-panel-header"
:class=
"
{
'is-collapsed': collapsed,
}"
>
<icon
name=
"list-bulleted"
:size=
"18"
css-classes=
"append-right-default"
/>
<template
v-if=
"!collapsed"
>
{{
title
}}
<button
type=
"button"
class=
"btn btn-transparent multi-file-commit-panel-collapse-btn"
@
click=
"toggleCollapsed"
>
<i
aria-hidden=
"true"
class=
"fa fa-angle-double-right"
>
</i>
</button>
</
template
>
</header>
<div
class=
"multi-file-commit-list"
>
<list-collapsed
v-if=
"collapsed"
/>
<
template
v-else
>
<ul
v-if=
"fileList.length"
class=
"list-unstyled append-bottom-0"
>
<li
v-for=
"file in fileList"
:key=
"file.key"
>
<list-item
:file=
"file"
/>
</li>
</ul>
<div
v-else
class=
"help-block prepend-top-0"
>
No changes
</div>
</
template
>
</div>
</div>
</template>
app/assets/javascripts/repo/components/commit_sidebar/list_collapsed.vue
0 → 100644
View file @
ae98def3
<
script
>
import
{
mapGetters
}
from
'
vuex
'
;
import
icon
from
'
../../../vue_shared/components/icon.vue
'
;
export
default
{
components
:
{
icon
,
},
computed
:
{
...
mapGetters
([
'
addedFiles
'
,
'
modifiedFiles
'
,
]),
},
};
</
script
>
<
template
>
<div
class=
"multi-file-commit-list-collapsed text-center"
>
<icon
name=
"file-addition"
:size=
"18"
css-classes=
"multi-file-addition append-bottom-10"
/>
{{
addedFiles
.
length
}}
<icon
name=
"file-modified"
:size=
"18"
css-classes=
"multi-file-modified prepend-top-10 append-bottom-10"
/>
{{
modifiedFiles
.
length
}}
</div>
</
template
>
app/assets/javascripts/repo/components/commit_sidebar/list_item.vue
0 → 100644
View file @
ae98def3
<
script
>
import
icon
from
'
../../../vue_shared/components/icon.vue
'
;
export
default
{
components
:
{
icon
,
},
props
:
{
file
:
{
type
:
Object
,
required
:
true
,
},
},
computed
:
{
iconName
()
{
return
this
.
file
.
tempFile
?
'
file-addition
'
:
'
file-modified
'
;
},
iconClass
()
{
return
`multi-file-
${
this
.
file
.
tempFile
?
'
addition
'
:
'
modified
'
}
append-right-8`
;
},
},
};
</
script
>
<
template
>
<div
class=
"multi-file-commit-list-item"
>
<icon
:name=
"iconName"
:size=
"16"
:css-classes=
"iconClass"
/>
<span
class=
"multi-file-commit-list-path"
>
{{
file
.
path
}}
</span>
</div>
</
template
>
app/assets/javascripts/repo/components/repo.vue
View file @
ae98def3
...
...
@@ -40,20 +40,24 @@ export default {
</
script
>
<
template
>
<div
class=
"repository-view"
>
<div
class=
"tree-content-holder"
:class=
"
{'tree-content-holder-mini' : isCollapsed}">
<repo-sidebar/>
<div
v-if=
"isCollapsed"
class=
"panel-right"
>
<repo-tabs/>
<component
:is=
"currentBlobView"
/>
<repo-file-buttons/>
</div>
<div
class=
"multi-file"
:class=
"
{
'is-collapsed': isCollapsed
}"
>
<repo-sidebar/>
<div
v-if=
"isCollapsed"
class=
"multi-file-edit-pane"
>
<repo-tabs
/>
<component
class=
"multi-file-edit-pane-content"
:is=
"currentBlobView"
/>
<repo-file-buttons
/>
</div>
<repo-commit-section
v-if=
"changedFiles.length"
/>
<repo-commit-section
/>
</div>
</
template
>
app/assets/javascripts/repo/components/repo_commit_section.vue
View file @
ae98def3
<
script
>
import
{
mapGetters
,
mapState
,
mapActions
}
from
'
vuex
'
;
import
tooltip
from
'
../../vue_shared/directives/tooltip
'
;
import
icon
from
'
../../vue_shared/components/icon.vue
'
;
import
PopupDialog
from
'
../../vue_shared/components/popup_dialog.vue
'
;
import
{
n__
}
from
'
../../local
e
'
;
import
commitFilesList
from
'
./commit_sidebar/list.vu
e
'
;
export
default
{
components
:
{
PopupDialog
,
icon
,
commitFilesList
,
},
directives
:
{
tooltip
,
},
data
()
{
return
{
...
...
@@ -13,6 +20,7 @@ export default {
submitCommitsLoading
:
false
,
startNewMR
:
false
,
commitMessage
:
''
,
collapsed
:
true
,
};
},
computed
:
{
...
...
@@ -23,10 +31,10 @@ export default {
'
changedFiles
'
,
]),
commitButtonDisabled
()
{
return
!
this
.
commitMessage
||
this
.
submitCommitsLoading
;
return
this
.
commitMessage
===
''
||
this
.
submitCommitsLoading
||
!
this
.
changedFiles
.
length
;
},
commit
ButtonTex
t
()
{
return
n__
(
'
Commit %d file
'
,
'
Commit %d files
'
,
this
.
changedFiles
.
length
)
;
commit
MessageCoun
t
()
{
return
this
.
commitMessage
.
length
;
},
},
methods
:
{
...
...
@@ -77,12 +85,20 @@ export default {
this
.
submitCommitsLoading
=
false
;
});
},
toggleCollapsed
()
{
this
.
collapsed
=
!
this
.
collapsed
;
},
},
};
</
script
>
<
template
>
<div
id=
"commit-area"
>
<div
class=
"multi-file-commit-panel"
:class=
"
{
'is-collapsed': collapsed,
}"
>
<popup-dialog
v-if=
"showNewBranchDialog"
:primary-button-label=
"__('Create new branch')"
...
...
@@ -92,78 +108,71 @@ export default {
@
toggle=
"showNewBranchDialog = false"
@
submit=
"makeCommit(true)"
/>
<button
v-if=
"collapsed"
type=
"button"
class=
"btn btn-transparent multi-file-commit-panel-collapse-btn is-collapsed prepend-top-10 append-bottom-10"
@
click=
"toggleCollapsed"
>
<i
aria-hidden=
"true"
class=
"fa fa-angle-double-left"
>
</i>
</button>
<commit-files-list
title=
"Staged"
:file-list=
"changedFiles"
:collapsed=
"collapsed"
@
toggleCollapsed=
"toggleCollapsed"
/>
<form
class=
"form-horizontal"
@
submit.prevent=
"tryCommit()"
>
<fieldset>
<div
class=
"form-group"
>
<label
class=
"col-md-4 control-label staged-files"
>
Staged files (
{{
changedFiles
.
length
}}
)
</label>
<div
class=
"col-md-6"
>
<ul
class=
"list-unstyled changed-files"
>
<li
v-for=
"(file, index) in changedFiles"
:key=
"index"
>
<span
class=
"help-block"
>
{{
file
.
path
}}
</span>
</li>
</ul>
</div>
</div>
<div
class=
"form-group"
>
<label
class=
"col-md-4 control-label"
for=
"commit-message"
>
Commit message
</label>
<div
class=
"col-md-6"
>
<textarea
id=
"commit-message"
class=
"form-control"
name=
"commit-message"
v-model=
"commitMessage"
>
</textarea>
</div>
</div>
<div
class=
"form-group target-branch"
>
<label
class=
"col-md-4 control-label"
for=
"target-branch"
>
Target branch
</label>
<div
class=
"col-md-6"
>
<span
class=
"help-block"
>
{{
currentBranch
}}
</span>
</div>
</div>
<div
class=
"col-md-offset-4 col-md-6"
>
<button
type=
"submit"
:disabled=
"commitButtonDisabled"
class=
"btn btn-success"
>
<i
v-if=
"submitCommitsLoading"
class=
"js-commit-loading-icon fa fa-spinner fa-spin"
aria-hidden=
"true"
aria-label=
"loading"
>
</i>
<span
class=
"commit-summary"
>
{{
commitButtonText
}}
</span>
</button>
</div>
<div
class=
"col-md-offset-4 col-md-6"
>
<div
class=
"checkbox"
>
<label>
<input
type=
"checkbox"
v-model=
"startNewMR"
>
<span>
Start a
<strong>
new merge request
</strong>
with these changes
</span>
</label>
</div>
class=
"form-horizontal multi-file-commit-form"
@
submit.prevent=
"tryCommit"
v-if=
"!collapsed"
>
<div
class=
"multi-file-commit-fieldset"
>
<textarea
class=
"form-control multi-file-commit-message"
name=
"commit-message"
v-model=
"commitMessage"
placeholder=
"Commit message"
>
</textarea>
</div>
<div
class=
"multi-file-commit-fieldset"
>
<label
v-tooltip
title=
"Create a new merge request with these changes"
data-container=
"body"
data-placement=
"top"
>
<input
type=
"checkbox"
v-model=
"startNewMR"
/>
Merge Request
</label>
<button
type=
"submit"
:disabled=
"commitButtonDisabled"
class=
"btn btn-default btn-sm append-right-10 prepend-left-10"
>
<i
v-if=
"submitCommitsLoading"
class=
"js-commit-loading-icon fa fa-spinner fa-spin"
aria-hidden=
"true"
aria-label=
"loading"
>
</i>
Commit
</button>
<div
class=
"multi-file-commit-message-count"
>
{{
commitMessageCount
}}
</div>
</
fieldset
>
</
div
>
</form>
</div>
</
template
>
app/assets/javascripts/repo/components/repo_file.vue
View file @
ae98def3
...
...
@@ -57,7 +57,7 @@
class=
"file"
@
click.prevent=
"clickedTreeRow(file)"
>
<td
class=
"multi-file-table-
col-
name"
class=
"multi-file-table-name"
:colspan=
"submoduleColSpan"
>
<i
...
...
@@ -90,12 +90,11 @@
</td>
<
template
v-if=
"!isCollapsed && !isSubmodule"
>
<td
class=
"hidden-sm hidden-xs"
>
<td
class=
"
multi-file-table-col-commit-message
hidden-sm hidden-xs"
>
<a
v-if=
"file.lastCommit.message"
@
click
.
stop
:href=
"file.lastCommit.url"
class=
"commit-message"
>
{{
file
.
lastCommit
.
message
}}
</a>
...
...
app/assets/javascripts/repo/components/repo_file_buttons.vue
View file @
ae98def3
...
...
@@ -22,12 +22,12 @@ export default {
<
template
>
<div
v-if=
"showButtons"
class=
"
repo-file-buttons
"
class=
"
multi-file-editor-btn-group
"
>
<a
:href=
"activeFile.rawPath"
target=
"_blank"
class=
"btn btn-default raw"
class=
"btn btn-default
btn-sm
raw"
rel=
"noopener noreferrer"
>
{{
rawDownloadButtonLabel
}}
</a>
...
...
@@ -38,17 +38,17 @@ export default {
aria-label=
"File actions"
>
<a
:href=
"activeFile.blamePath"
class=
"btn btn-default blame"
>
class=
"btn btn-default b
tn-sm b
lame"
>
Blame
</a>
<a
:href=
"activeFile.commitsPath"
class=
"btn btn-default history"
>
class=
"btn btn-default
btn-sm
history"
>
History
</a>
<a
:href=
"activeFile.permalink"
class=
"btn btn-default permalink"
>
class=
"btn btn-default
btn-sm
permalink"
>
Permalink
</a>
</div>
...
...
app/assets/javascripts/repo/components/repo_preview.vue
View file @
ae98def3
...
...
@@ -32,10 +32,12 @@ export default {
</
script
>
<
template
>
<div
class=
"blob-viewer-container"
>
<div>
<div
v-if=
"!activeFile.renderError"
v-html=
"activeFile.html"
>
v-html=
"activeFile.html"
class=
"multi-file-preview-holder"
>
</div>
<div
v-else-if=
"activeFile.tempFile"
...
...
app/assets/javascripts/repo/components/repo_sidebar.vue
View file @
ae98def3
...
...
@@ -44,20 +44,16 @@ export default {
</
script
>
<
template
>
<div
id=
"sidebar"
:class=
"
{'sidebar-mini' : isCollapsed}
">
<div
class=
"ide-file-list
"
>
<table
class=
"table"
>
<thead>
<tr>
<th
v-if=
"isCollapsed"
class=
"repo-file-options title"
>
<strong
class=
"clgray"
>
{{
projectName
}}
</strong>
</th>
<template
v-else
>
<th
class=
"name multi-file-table-
col-
name"
>
<th
class=
"name multi-file-table-name"
>
Name
</th>
<th
class=
"hidden-sm hidden-xs last-commit"
>
...
...
@@ -79,7 +75,7 @@ export default {
:key=
"n"
/>
<repo-file
v-for=
"
(file, index)
in treeList"
v-for=
"
file
in treeList"
:key=
"file.key"
:file=
"file"
/>
...
...
app/assets/javascripts/repo/components/repo_tab.vue
View file @
ae98def3
...
...
@@ -41,30 +41,35 @@ export default {
<
template
>
<li
:class=
"
{ active : tab.active }"
@
click=
"setFileActive(tab)"
>
<button
type=
"button"
class=
"
close-btn
"
class=
"
multi-file-tab-close
"
@
click.stop.prevent=
"closeFile(
{ file: tab })"
:aria-label="closeLabel">
:aria-label="closeLabel"
:class="{
'modified': tab.changed,
}"
:disabled="tab.changed"
>
<i
class=
"fa"
:class=
"changedClass"
aria-hidden=
"true"
>
aria-hidden=
"true"
>
</i>
</button>
<
a
href=
"#
"
class=
"repo-tab
"
<
div
class=
"multi-file-tab
"
:class=
"
{active : tab.active }
"
:title="tab.url"
@
click.prevent.stop=
"setFileActive(tab)"
>
{{
tab
.
name
}}
>
{{
tab
.
name
}}
<fileStatusIcon
:file=
"tab"
>
</fileStatusIcon
>
</
a
>
:file=
"tab"
/
>
</
div
>
</li>
</
template
>
app/assets/javascripts/repo/components/repo_tabs.vue
View file @
ae98def3
...
...
@@ -16,14 +16,12 @@
<
template
>
<ul
id=
"tabs"
class=
"list-unstyled"
class=
"multi-file-tabs list-unstyled append-bottom-0"
>
<repo-tab
v-for=
"tab in openFiles"
:key=
"tab.id"
:tab=
"tab"
/>
<li
class=
"tabs-divider"
/>
</ul>
</
template
>
app/assets/javascripts/repo/stores/getters.js
View file @
ae98def3
...
...
@@ -34,3 +34,7 @@ export const canEditFile = (state) => {
openedFiles
.
length
&&
(
currentActiveFile
&&
!
currentActiveFile
.
renderError
&&
!
currentActiveFile
.
binary
);
};
export
const
addedFiles
=
state
=>
changedFiles
(
state
).
filter
(
f
=>
f
.
tempFile
);
export
const
modifiedFiles
=
state
=>
changedFiles
(
state
).
filter
(
f
=>
!
f
.
tempFile
);
app/assets/stylesheets/pages/repo.scss
View file @
ae98def3
...
...
@@ -35,259 +35,225 @@
}
}
.repository-view
{
border
:
1px
solid
$border-color
;
border-radius
:
$border-radius-default
;
color
:
$almost-black
;
.multi-file
{
display
:
flex
;
height
:
calc
(
100vh
-
145px
);
border-top
:
1px
solid
$white-dark
;
border-bottom
:
1px
solid
$white-dark
;
&
.is-collapsed
{
.ide-file-list
{
max-width
:
250px
;
}
}
.code.white
pre
.hll
{
background-color
:
$well-light-border
!
important
;
.file-status-icon
{
width
:
10px
;
height
:
10px
;
}
}
.tree-content-holder
{
display
:
-
webkit-flex
;
display
:
flex
;
min-height
:
300px
;
.ide-file-list
{
flex
:
1
;
overflow
:
scroll
;
.file
{
cursor
:
pointer
;
}
.tree-content-holder-mini
{
height
:
100vh
;
a
{
color
:
$gl-text-color
;
}
.panel-right
{
display
:
-
webkit-flex
;
display
:
flex
;
-webkit-flex-direction
:
column
;
flex-direction
:
column
;
width
:
80%
;
height
:
100%
;
th
{
position
:
sticky
;
top
:
0
;
}
}
.monaco-editor.vs
{
.current-line
{
border
:
0
;
background
:
$well-light-border
;
}
.multi-file-table-name
,
.multi-file-table-col-commit-message
{
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
max-width
:
0
;
}
.line-numbers
{
cursor
:
pointer
;
.multi-file-table-name
{
width
:
350px
;
}
&
:hover
{
text-decoration
:
underline
;
}
}
}
.multi-file-table-col-commit-message
{
width
:
50%
;
}
.blob-no-preview
{
.vertical-center
{
justify-content
:
center
;
width
:
100%
;
}
}
.multi-file-edit-pane
{
display
:
flex
;
flex-direction
:
column
;
flex
:
1
;
border-left
:
1px
solid
$white-dark
;
overflow
:
hidden
;
}
&
.blob-editor-container
{
overflow
:
hidden
;
}
.multi-file-tabs
{
display
:
flex
;
overflow
:
scroll
;
background-color
:
$white-normal
;
box-shadow
:
inset
0
-1px
$white-dark
;
.blob-viewer-container
{
-webkit-flex
:
1
;
flex
:
1
;
overflow
:
auto
;
>
div
,
.file-content
:not
(
.wiki
)
{
display
:
flex
;
}
>
div
,
.file-content
,
.blob-viewer
,
.line-number
,
.blob-content
,
.code
{
min-height
:
100%
;
width
:
100%
;
}
.line-numbers
{
min-width
:
44px
;
}
.blob-content
{
flex
:
1
;
overflow-x
:
auto
;
}
}
>
li
{
position
:
relative
;
}
}
#tabs
{
position
:
relative
;
flex-shrink
:
0
;
display
:
flex
;
width
:
100%
;
padding-left
:
0
;
margin-bottom
:
0
;
white-space
:
nowrap
;
overflow-y
:
hidden
;
overflow-x
:
auto
;
li
{
position
:
relative
;
background
:
$gray-normal
;
padding
:
#{
$gl-padding
/
2
}
$gl-padding
;
border-right
:
1px
solid
$white-dark
;
border-bottom
:
1px
solid
$white-dark
;
cursor
:
pointer
;
&
.active
{
background
:
$white-light
;
border-bottom
:
0
;
}
a
{
@include
str-truncated
(
100px
);
color
:
$gl-text-color
;
vertical-align
:
middle
;
text-decoration
:
none
;
margin-right
:
12px
;
&
:focus
{
outline
:
none
;
}
}
.close-btn
{
position
:
absolute
;
right
:
8px
;
top
:
50%
;
padding
:
0
;
background
:
none
;
border
:
0
;
font-size
:
$gl-font-size
;
transform
:
translateY
(
-50%
);
}
.close-icon
:hover
{
color
:
$hint-color
;
}
.close-icon
,
.unsaved-icon
{
color
:
$gray-darkest
;
}
.unsaved-icon
{
color
:
$brand-success
;
}
&
.tabs-divider
{
width
:
100%
;
background-color
:
$white-light
;
border-right
:
0
;
border-top-right-radius
:
2px
;
}
}
}
.multi-file-tab
{
@include
str-truncated
(
150px
);
padding
:
(
$gl-padding
/
2
)
(
$gl-padding
+
12
)
(
$gl-padding
/
2
)
$gl-padding
;
background-color
:
$gray-normal
;
border-right
:
1px
solid
$white-dark
;
border-bottom
:
1px
solid
$white-dark
;
cursor
:
pointer
;
&
.active
{
background-color
:
$white-light
;
border-bottom-color
:
$white-light
;
}
}
.repo-file-buttons
{
background-color
:
$white-light
;
padding
:
5px
10px
;
border-top
:
1px
solid
$white-normal
;
}
.multi-file-tab-close
{
position
:
absolute
;
right
:
8px
;
top
:
50%
;
padding
:
0
;
background
:
none
;
border
:
0
;
font-size
:
$gl-font-size
;
color
:
$gray-darkest
;
transform
:
translateY
(
-50%
);
&
:not
(
.modified
)
:hover
,
&
:not
(
.modified
)
:focus
{
color
:
$hint-color
;
}
#binary-viewer
{
height
:
80vh
;
overflow
:
auto
;
margin
:
0
;
.blob-viewer
{
padding-top
:
20px
;
padding-left
:
20px
;
}
.binary-unknown
{
text-align
:
center
;
padding-top
:
100px
;
background
:
$gray-light
;
height
:
100%
;
font-size
:
17px
;
span
{
display
:
block
;
}
}
}
&
.modified
{
color
:
$indigo-700
;
}
}
#commit-area
{
background
:
$gray-light
;
padding
:
20px
;
.multi-file-edit-pane-content
{
flex
:
1
;
height
:
0
;
}
.help-block
{
padding-top
:
7px
;
margin-top
:
0
;
.multi-file-editor-btn-group
{
padding
:
$grid-size
;
border-top
:
1px
solid
$white-dark
;
}
// Not great, but this is to deal with our current output
.multi-file-preview-holder
{
height
:
100%
;
overflow
:
scroll
;
.blob-viewer
{
height
:
100%
;
}
.file-content.code
{
display
:
flex
;
i
{
margin-left
:
-10px
;
}
}
#view-toggler
{
height
:
41px
;
position
:
relative
;
display
:
block
;
border-bottom
:
1px
solid
$white-normal
;
background
:
$white-light
;
margin-top
:
-5px
;
.line-numbers
{
min-width
:
50px
;
}
#binary-viewer
{
img
{
max-width
:
100%
;
}
.file-content
,
.line-numbers
,
.blob-content
,
.code
{
min-height
:
100%
;
}
}
#sidebar
{
flex
:
1
;
height
:
100%
;
.multi-file-commit-panel
{
display
:
flex
;
flex-direction
:
column
;
height
:
100%
;
width
:
290px
;
padding
:
$gl-padding
;
background-color
:
$gray-light
;
border-left
:
1px
solid
$white-dark
;
&
.is-collapsed
{
width
:
60px
;
padding
:
0
;
}
}
&
.sidebar-mini
{
width
:
20%
;
border-right
:
1px
solid
$white-normal
;
overflow
:
auto
;
}
.multi-file-commit-panel-section
{
display
:
flex
;
flex-direction
:
column
;
flex
:
1
;
}
.table
{
margin-bottom
:
0
;
}
.multi-file-commit-panel-header
{
display
:
flex
;
align-items
:
center
;
padding
:
0
0
12px
;
margin-bottom
:
12px
;
border-bottom
:
1px
solid
$white-dark
;
tr
{
.repo-file-options
{
padding
:
2px
16px
;
width
:
100%
;
}
.title
{
font-size
:
10px
;
text-transform
:
uppercase
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
vertical-align
:
middle
;
}
.file-icon
{
margin-right
:
5px
;
}
td
{
white-space
:
nowrap
;
}
}
&
.is-collapsed
{
border-bottom
:
1px
solid
$white-dark
;
.file
{
cursor
:
pointer
;
svg
{
margin-left
:
auto
;
margin-right
:
auto
;
}
}
}
a
{
@include
str-truncated
(
250px
);
color
:
$almost-black
;
}
.multi-file-commit-panel-collapse-btn
{
padding-top
:
0
;
padding-bottom
:
0
;
margin-left
:
auto
;
font-size
:
20px
;
&
.is-collapsed
{
margin-right
:
auto
;
}
}
.multi-file-commit-list
{
flex
:
1
;
overflow
:
scroll
;
}
.multi-file-commit-list-item
{
display
:
flex
;
align-items
:
center
;
}
.multi-file-addition
{
fill
:
$green-500
;
}
.multi-file-modified
{
fill
:
$orange-500
;
}
.multi-file-commit-list-collapsed
{
display
:
flex
;
flex-direction
:
column
;
>
svg
{
margin-left
:
auto
;
margin-right
:
auto
;
}
.file-status-icon
{
...
...
@@ -298,14 +264,26 @@
}
.render-error
{
min-height
:
calc
(
100vh
-
62px
);
.multi-file-commit-list-path
{
@include
str-truncated
(
100%
);
}
p
{
width
:
100%
;
.multi-file-commit-form
{
padding-top
:
12px
;
border-top
:
1px
solid
$white-dark
;
}
.multi-file-commit-fieldset
{
display
:
flex
;
align-items
:
center
;
padding-bottom
:
12px
;
.btn
{
flex
:
1
;
}
}
.multi-file-table-col-name
{
width
:
350px
;
.multi-file-commit-message.form-control
{
height
:
80px
;
resize
:
none
;
}
app/views/projects/tree/show.html.haml
View file @
ae98def3
...
...
@@ -11,6 +11,6 @@
=
webpack_bundle_tag
'common_vue'
=
webpack_bundle_tag
'repo'
%div
{
class:
[
container_class
,
(
"limit-container-width"
unless
fluid_layout
)]
}
%div
{
class:
[
(
container_class
unless
show_new_repo?
)
,
(
"limit-container-width"
unless
fluid_layout
)]
}
=
render
'projects/last_push'
=
render
'projects/files'
,
commit:
@last_commit
,
project:
@project
,
ref:
@ref
,
content_url:
project_tree_path
(
@project
,
@id
)
app/views/shared/repo/_repo.html.haml
View file @
ae98def3
-
@no_container
=
true
;
#repo
{
data:
{
root:
@path
.
empty?
.
to_s
,
root_url:
project_tree_path
(
project
),
url:
content_url
,
...
...
spec/features/projects/tree/create_directory_spec.rb
View file @
ae98def3
...
...
@@ -26,9 +26,11 @@ feature 'Multi-file editor new directory', :js do
click_button
(
'Create directory'
)
end
find
(
'.multi-file-commit-panel-collapse-btn'
).
click
fill_in
(
'commit-message'
,
with:
'commit message'
)
click_button
(
'Commit
1 file
'
)
click_button
(
'Commit'
)
expect
(
page
).
to
have_selector
(
'td'
,
text:
'commit message'
)
end
...
...
spec/features/projects/tree/create_file_spec.rb
View file @
ae98def3
...
...
@@ -26,9 +26,11 @@ feature 'Multi-file editor new file', :js do
click_button
(
'Create file'
)
end
find
(
'.multi-file-commit-panel-collapse-btn'
).
click
fill_in
(
'commit-message'
,
with:
'commit message'
)
click_button
(
'Commit
1 file
'
)
click_button
(
'Commit'
)
expect
(
page
).
to
have_selector
(
'td'
,
text:
'commit message'
)
end
...
...
spec/features/projects/tree/upload_file_spec.rb
View file @
ae98def3
...
...
@@ -26,7 +26,7 @@ feature 'Multi-file editor upload file', :js do
find
(
'.add-to-tree'
).
click
expect
(
page
).
to
have_selector
(
'.
repo
-tab'
,
text:
'doc_sample.txt'
)
expect
(
page
).
to
have_selector
(
'.
multi-file
-tab'
,
text:
'doc_sample.txt'
)
expect
(
find
(
'.blob-editor-container .lines-content'
)[
'innerText'
]).
to
have_content
(
File
.
open
(
txt_file
,
&
:readline
))
end
...
...
@@ -39,7 +39,7 @@ feature 'Multi-file editor upload file', :js do
find
(
'.add-to-tree'
).
click
expect
(
page
).
to
have_selector
(
'.
repo
-tab'
,
text:
'dk.png'
)
expect
(
page
).
to
have_selector
(
'.
multi-file
-tab'
,
text:
'dk.png'
)
expect
(
page
).
not_to
have_selector
(
'.monaco-editor'
)
expect
(
page
).
to
have_content
(
'The source could not be displayed for this temporary file.'
)
end
...
...
spec/javascripts/repo/components/commit_sidebar/list_collapsed_spec.js
0 → 100644
View file @
ae98def3
import
Vue
from
'
vue
'
;
import
store
from
'
~/repo/stores
'
;
import
listCollapsed
from
'
~/repo/components/commit_sidebar/list_collapsed.vue
'
;
import
{
createComponentWithStore
}
from
'
../../../helpers/vue_mount_component_helper
'
;
import
{
file
}
from
'
../../helpers
'
;
describe
(
'
Multi-file editor commit sidebar list collapsed
'
,
()
=>
{
let
vm
;
beforeEach
(()
=>
{
const
Component
=
Vue
.
extend
(
listCollapsed
);
vm
=
createComponentWithStore
(
Component
,
store
);
vm
.
$store
.
state
.
openFiles
.
push
(
file
(),
file
());
vm
.
$store
.
state
.
openFiles
[
0
].
tempFile
=
true
;
vm
.
$store
.
state
.
openFiles
.
forEach
((
f
)
=>
{
Object
.
assign
(
f
,
{
changed
:
true
,
});
});
vm
.
$mount
();
});
afterEach
(()
=>
{
vm
.
$destroy
();
});
it
(
'
renders added & modified files count
'
,
()
=>
{
expect
(
vm
.
$el
.
textContent
.
replace
(
/
\s
+/g
,
'
'
).
trim
()).
toBe
(
'
1 1
'
);
});
});
spec/javascripts/repo/components/commit_sidebar/list_item_spec.js
0 → 100644
View file @
ae98def3
import
Vue
from
'
vue
'
;
import
listItem
from
'
~/repo/components/commit_sidebar/list_item.vue
'
;
import
mountComponent
from
'
../../../helpers/vue_mount_component_helper
'
;
import
{
file
}
from
'
../../helpers
'
;
describe
(
'
Multi-file editor commit sidebar list item
'
,
()
=>
{
let
vm
;
let
f
;
beforeEach
(()
=>
{
const
Component
=
Vue
.
extend
(
listItem
);
f
=
file
();
vm
=
mountComponent
(
Component
,
{
file
:
f
,
});
});
afterEach
(()
=>
{
vm
.
$destroy
();
});
it
(
'
renders file path
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.multi-file-commit-list-path
'
).
textContent
.
trim
()).
toBe
(
f
.
path
);
});
describe
(
'
computed
'
,
()
=>
{
describe
(
'
iconName
'
,
()
=>
{
it
(
'
returns modified when not a tempFile
'
,
()
=>
{
expect
(
vm
.
iconName
).
toBe
(
'
file-modified
'
);
});
it
(
'
returns addition when not a tempFile
'
,
()
=>
{
f
.
tempFile
=
true
;
expect
(
vm
.
iconName
).
toBe
(
'
file-addition
'
);
});
});
describe
(
'
iconClass
'
,
()
=>
{
it
(
'
returns modified when not a tempFile
'
,
()
=>
{
expect
(
vm
.
iconClass
).
toContain
(
'
multi-file-modified
'
);
});
it
(
'
returns addition when not a tempFile
'
,
()
=>
{
f
.
tempFile
=
true
;
expect
(
vm
.
iconClass
).
toContain
(
'
multi-file-addition
'
);
});
});
});
});
spec/javascripts/repo/components/commit_sidebar/list_spec.js
0 → 100644
View file @
ae98def3
import
Vue
from
'
vue
'
;
import
store
from
'
~/repo/stores
'
;
import
commitSidebarList
from
'
~/repo/components/commit_sidebar/list.vue
'
;
import
{
createComponentWithStore
}
from
'
../../../helpers/vue_mount_component_helper
'
;
import
{
file
}
from
'
../../helpers
'
;
describe
(
'
Multi-file editor commit sidebar list
'
,
()
=>
{
let
vm
;
beforeEach
(()
=>
{
const
Component
=
Vue
.
extend
(
commitSidebarList
);
vm
=
createComponentWithStore
(
Component
,
store
,
{
title
:
'
Staged
'
,
fileList
:
[],
collapsed
:
false
,
}).
$mount
();
});
afterEach
(()
=>
{
vm
.
$destroy
();
});
describe
(
'
empty file list
'
,
()
=>
{
it
(
'
renders no changes text
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.help-block
'
).
textContent
.
trim
()).
toBe
(
'
No changes
'
);
});
});
describe
(
'
with a list of files
'
,
()
=>
{
beforeEach
((
done
)
=>
{
const
f
=
file
(
'
file name
'
);
f
.
changed
=
true
;
vm
.
fileList
.
push
(
f
);
Vue
.
nextTick
(
done
);
});
it
(
'
renders list
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelectorAll
(
'
li
'
).
length
).
toBe
(
1
);
});
});
describe
(
'
collapsed
'
,
()
=>
{
beforeEach
((
done
)
=>
{
vm
.
collapsed
=
true
;
Vue
.
nextTick
(
done
);
});
it
(
'
adds collapsed class
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.is-collapsed
'
)).
not
.
toBeNull
();
});
it
(
'
hides list
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.list-unstyled
'
)).
toBeNull
();
expect
(
vm
.
$el
.
querySelector
(
'
.help-block
'
)).
toBeNull
();
});
it
(
'
hides collapse button
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.multi-file-commit-panel-collapse-btn
'
)).
toBeNull
();
});
});
it
(
'
clicking toggle collapse button emits toggle event
'
,
()
=>
{
spyOn
(
vm
,
'
$emit
'
);
vm
.
$el
.
querySelector
(
'
.multi-file-commit-panel-collapse-btn
'
).
click
();
expect
(
vm
.
$emit
).
toHaveBeenCalledWith
(
'
toggleCollapsed
'
);
});
});
spec/javascripts/repo/components/repo_commit_section_spec.js
View file @
ae98def3
...
...
@@ -25,8 +25,12 @@ describe('RepoCommitSection', () => {
return
comp
.
$mount
();
}
beforeEach
(()
=>
{
beforeEach
((
done
)
=>
{
vm
=
createComponent
();
vm
.
collapsed
=
false
;
Vue
.
nextTick
(
done
);
});
afterEach
(()
=>
{
...
...
@@ -36,12 +40,11 @@ describe('RepoCommitSection', () => {
});
it
(
'
renders a commit section
'
,
()
=>
{
const
changedFileElements
=
[...
vm
.
$el
.
querySelectorAll
(
'
.changed-files > li
'
)];
const
submitCommit
=
vm
.
$el
.
querySelector
(
'
.btn
'
);
const
targetBranch
=
vm
.
$el
.
querySelector
(
'
.target-branch
'
);
const
changedFileElements
=
[...
vm
.
$el
.
querySelectorAll
(
'
.multi-file-commit-list li
'
)];
const
submitCommit
=
vm
.
$el
.
querySelector
(
'
form .btn
'
);
expect
(
vm
.
$el
.
querySelector
(
'
:scope > form
'
)).
toBeTruthy
();
expect
(
vm
.
$el
.
querySelector
(
'
.
staged-files
'
).
textContent
.
trim
()).
toEqual
(
'
Staged files (2)
'
);
expect
(
vm
.
$el
.
querySelector
(
'
.multi-file-commit-form
'
)).
not
.
toBeNull
();
expect
(
vm
.
$el
.
querySelector
(
'
.
multi-file-commit-panel-section header
'
).
textContent
.
trim
()).
toEqual
(
'
Staged
'
);
expect
(
changedFileElements
.
length
).
toEqual
(
2
);
changedFileElements
.
forEach
((
changedFile
,
i
)
=>
{
...
...
@@ -49,10 +52,7 @@ describe('RepoCommitSection', () => {
});
expect
(
submitCommit
.
disabled
).
toBeTruthy
();
expect
(
submitCommit
.
querySelector
(
'
.fa-spinner.fa-spin
'
)).
toBeFalsy
();
expect
(
vm
.
$el
.
querySelector
(
'
.commit-summary
'
).
textContent
.
trim
()).
toEqual
(
'
Commit 2 files
'
);
expect
(
targetBranch
.
querySelector
(
'
:scope > label
'
).
textContent
.
trim
()).
toEqual
(
'
Target branch
'
);
expect
(
targetBranch
.
querySelector
(
'
.help-block
'
).
textContent
.
trim
()).
toEqual
(
'
master
'
);
expect
(
submitCommit
.
querySelector
(
'
.fa-spinner.fa-spin
'
)).
toBeNull
();
});
describe
(
'
when submitting
'
,
()
=>
{
...
...
@@ -69,7 +69,7 @@ describe('RepoCommitSection', () => {
});
it
(
'
allows you to submit
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.btn
'
).
disabled
).
toBeTruthy
();
expect
(
vm
.
$el
.
querySelector
(
'
form
.btn
'
).
disabled
).
toBeTruthy
();
});
it
(
'
submits commit
'
,
(
done
)
=>
{
...
...
spec/javascripts/repo/components/repo_sidebar_spec.js
View file @
ae98def3
...
...
@@ -29,7 +29,6 @@ describe('RepoSidebar', () => {
const
thead
=
vm
.
$el
.
querySelector
(
'
thead
'
);
const
tbody
=
vm
.
$el
.
querySelector
(
'
tbody
'
);
expect
(
vm
.
$el
.
id
).
toEqual
(
'
sidebar
'
);
expect
(
vm
.
$el
.
classList
.
contains
(
'
sidebar-mini
'
)).
toBeFalsy
();
expect
(
thead
.
querySelector
(
'
.name
'
).
textContent
.
trim
()).
toEqual
(
'
Name
'
);
expect
(
thead
.
querySelector
(
'
.last-commit
'
).
textContent
.
trim
()).
toEqual
(
'
Last commit
'
);
...
...
@@ -40,18 +39,6 @@ describe('RepoSidebar', () => {
expect
(
tbody
.
querySelector
(
'
.file
'
)).
toBeTruthy
();
});
it
(
'
does not render a thead, renders repo-file-options and sets sidebar-mini class if isMini
'
,
(
done
)
=>
{
vm
.
$store
.
state
.
openFiles
.
push
(
vm
.
$store
.
state
.
tree
[
0
]);
Vue
.
nextTick
(()
=>
{
expect
(
vm
.
$el
.
classList
.
contains
(
'
sidebar-mini
'
)).
toBeTruthy
();
expect
(
vm
.
$el
.
querySelector
(
'
thead
'
)).
toBeTruthy
();
expect
(
vm
.
$el
.
querySelector
(
'
thead .repo-file-options
'
)).
toBeTruthy
();
done
();
});
});
it
(
'
renders 5 loading files if tree is loading
'
,
(
done
)
=>
{
vm
.
$store
.
state
.
tree
=
[];
vm
.
$store
.
state
.
loading
=
true
;
...
...
spec/javascripts/repo/components/repo_tab_spec.js
View file @
ae98def3
...
...
@@ -24,8 +24,8 @@ describe('RepoTab', () => {
tab
:
file
(),
});
vm
.
$store
.
state
.
openFiles
.
push
(
vm
.
tab
);
const
close
=
vm
.
$el
.
querySelector
(
'
.
close-btn
'
);
const
name
=
vm
.
$el
.
querySelector
(
`
a
[title="
${
vm
.
tab
.
url
}
"]`
);
const
close
=
vm
.
$el
.
querySelector
(
'
.
multi-file-tab-close
'
);
const
name
=
vm
.
$el
.
querySelector
(
`[title="
${
vm
.
tab
.
url
}
"]`
);
expect
(
close
.
querySelector
(
'
.fa-times
'
)).
toBeTruthy
();
expect
(
name
.
textContent
.
trim
()).
toEqual
(
vm
.
tab
.
name
);
...
...
@@ -50,7 +50,7 @@ describe('RepoTab', () => {
spyOn
(
vm
,
'
closeFile
'
);
vm
.
$el
.
querySelector
(
'
.
close-btn
'
).
click
();
vm
.
$el
.
querySelector
(
'
.
multi-file-tab-close
'
).
click
();
expect
(
vm
.
closeFile
).
toHaveBeenCalledWith
({
file
:
vm
.
tab
});
});
...
...
@@ -62,7 +62,7 @@ describe('RepoTab', () => {
tab
,
});
expect
(
vm
.
$el
.
querySelector
(
'
.
close-btn .fa-circle
'
)).
toBeTruthy
();
expect
(
vm
.
$el
.
querySelector
(
'
.
multi-file-tab-close .fa-circle
'
)).
not
.
toBeNull
();
});
describe
(
'
locked file
'
,
()
=>
{
...
...
@@ -107,7 +107,7 @@ describe('RepoTab', () => {
vm
.
$store
.
state
.
openFiles
.
push
(
tab
);
vm
.
$store
.
dispatch
(
'
setFileActive
'
,
tab
);
vm
.
$el
.
querySelector
(
'
.
close-btn
'
).
click
();
vm
.
$el
.
querySelector
(
'
.
multi-file-tab-close
'
).
click
();
vm
.
$nextTick
(()
=>
{
expect
(
tab
.
opened
).
toBeTruthy
();
...
...
@@ -125,7 +125,7 @@ describe('RepoTab', () => {
vm
.
$store
.
state
.
openFiles
.
push
(
tab
);
vm
.
$store
.
dispatch
(
'
setFileActive
'
,
tab
);
vm
.
$el
.
querySelector
(
'
.
close-btn
'
).
click
();
vm
.
$el
.
querySelector
(
'
.
multi-file-tab-close
'
).
click
();
vm
.
$nextTick
(()
=>
{
expect
(
tab
.
opened
).
toBeFalsy
();
...
...
spec/javascripts/repo/components/repo_tabs_spec.js
View file @
ae98def3
...
...
@@ -25,12 +25,11 @@ describe('RepoTabs', () => {
vm
.
$store
.
state
.
openFiles
=
openedFiles
;
vm
.
$nextTick
(()
=>
{
const
tabs
=
[...
vm
.
$el
.
querySelectorAll
(
'
:scope > li
'
)];
const
tabs
=
[...
vm
.
$el
.
querySelectorAll
(
'
.multi-file-tab
'
)];
expect
(
tabs
.
length
).
toEqual
(
3
);
expect
(
tabs
.
length
).
toEqual
(
2
);
expect
(
tabs
[
0
].
classList
.
contains
(
'
active
'
)).
toBeTruthy
();
expect
(
tabs
[
1
].
classList
.
contains
(
'
active
'
)).
toBeFalsy
();
expect
(
tabs
[
2
].
classList
.
contains
(
'
tabs-divider
'
)).
toBeTruthy
();
done
();
});
...
...
spec/javascripts/repo/stores/getters_spec.js
View file @
ae98def3
...
...
@@ -116,4 +116,31 @@ describe('Multi-file store getters', () => {
expect
(
getters
.
canEditFile
(
localState
)).
toBeFalsy
();
});
});
describe
(
'
modifiedFiles
'
,
()
=>
{
it
(
'
returns a list of modified files
'
,
()
=>
{
localState
.
openFiles
.
push
(
file
());
localState
.
openFiles
.
push
(
file
(
'
changed
'
));
localState
.
openFiles
[
1
].
changed
=
true
;
const
modifiedFiles
=
getters
.
modifiedFiles
(
localState
);
expect
(
modifiedFiles
.
length
).
toBe
(
1
);
expect
(
modifiedFiles
[
0
].
name
).
toBe
(
'
changed
'
);
});
});
describe
(
'
addedFiles
'
,
()
=>
{
it
(
'
returns a list of added files
'
,
()
=>
{
localState
.
openFiles
.
push
(
file
());
localState
.
openFiles
.
push
(
file
(
'
added
'
));
localState
.
openFiles
[
1
].
changed
=
true
;
localState
.
openFiles
[
1
].
tempFile
=
true
;
const
modifiedFiles
=
getters
.
addedFiles
(
localState
);
expect
(
modifiedFiles
.
length
).
toBe
(
1
);
expect
(
modifiedFiles
[
0
].
name
).
toBe
(
'
added
'
);
});
});
});
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