gitlab-org--gitlab-foss/app/assets/javascripts/repo/components/repo_sidebar.vue

132 lines
3.6 KiB
Vue
Raw Normal View History

2017-07-24 17:42:11 +00:00
<script>
import Service from '../services/repo_service';
import Helper from '../helpers/repo_helper';
import Store from '../stores/repo_store';
2017-07-24 17:42:11 +00:00
import RepoPreviousDirectory from './repo_prev_directory.vue';
import RepoFileOptions from './repo_file_options.vue';
import RepoFile from './repo_file.vue';
import RepoLoadingFile from './repo_loading_file.vue';
import RepoMixin from '../mixins/repo_mixin';
2017-07-24 17:42:11 +00:00
2017-08-15 18:16:42 +00:00
export default {
mixins: [RepoMixin],
2017-07-24 17:42:11 +00:00
components: {
'repo-file-options': RepoFileOptions,
'repo-previous-directory': RepoPreviousDirectory,
'repo-file': RepoFile,
'repo-loading-file': RepoLoadingFile,
},
created() {
2017-10-03 09:01:36 +00:00
window.addEventListener('popstate', this.checkHistory);
},
destroyed() {
window.removeEventListener('popstate', this.checkHistory);
2017-07-24 17:42:11 +00:00
},
data: () => Store,
methods: {
2017-10-03 09:01:36 +00:00
checkHistory() {
let selectedFile = this.files.find(file => location.pathname.indexOf(file.url) > -1);
if (!selectedFile) {
// Maybe it is not in the current tree but in the opened tabs
2017-10-05 10:29:31 +00:00
selectedFile = Helper.getFileFromPath(location.pathname);
2017-10-03 09:01:36 +00:00
}
let lineNumber = null;
if (location.hash.indexOf('#L') > -1) lineNumber = Number(location.hash.substr(2));
2017-10-03 09:01:36 +00:00
if (selectedFile) {
if (selectedFile.url !== this.activeFile.url) {
this.fileClicked(selectedFile, lineNumber);
} else {
Store.setActiveLine(lineNumber);
}
2017-10-03 09:01:36 +00:00
} else {
// Not opened at all lets open new tab
this.fileClicked({
2017-07-24 17:42:11 +00:00
url: location.href,
}, lineNumber);
2017-10-03 09:01:36 +00:00
}
2017-07-24 17:42:11 +00:00
},
fileClicked(clickedFile, lineNumber) {
2017-07-24 17:42:11 +00:00
let file = clickedFile;
2017-08-15 19:53:41 +00:00
if (file.loading) return;
file.loading = true;
if (file.type === 'tree' && file.opened) {
file = Store.removeChildFilesOfTree(file);
file.loading = false;
Store.setActiveLine(lineNumber);
} else {
const openFile = Helper.getFileFromPath(file.url);
if (openFile) {
file.loading = false;
Store.setActiveFiles(openFile);
Store.setActiveLine(lineNumber);
} else {
Service.url = file.url;
Helper.getContent(file)
.then(() => {
file.loading = false;
Helper.scrollTabsRight();
Store.setActiveLine(lineNumber);
})
.catch(Helper.loadingError);
}
2017-07-24 17:42:11 +00:00
}
},
goToPreviousDirectoryClicked(prevURL) {
Service.url = prevURL;
Helper.getContent(null)
.then(() => Helper.scrollTabsRight())
.catch(Helper.loadingError);
},
2017-07-24 17:42:11 +00:00
},
};
</script>
<template>
2017-08-15 18:16:42 +00:00
<div id="sidebar" :class="{'sidebar-mini' : isMini}">
2017-07-24 17:42:11 +00:00
<table class="table">
<thead v-if="!isMini">
2017-07-24 18:18:25 +00:00
<tr>
2017-07-26 12:37:27 +00:00
<th class="name">Name</th>
2017-10-03 20:07:52 +00:00
<th class="hidden-sm hidden-xs last-commit">Last commit</th>
<th class="hidden-xs last-update text-right">Last update</th>
2017-07-24 18:18:25 +00:00
</tr>
2017-07-24 17:42:11 +00:00
</thead>
<tbody>
<repo-file-options
:is-mini="isMini"
2017-08-18 22:27:46 +00:00
:project-name="projectName"
/>
2017-07-24 17:42:11 +00:00
<repo-previous-directory
2017-07-26 23:41:27 +00:00
v-if="isRoot"
2017-07-24 17:42:11 +00:00
:prev-url="prevURL"
@linkclicked="goToPreviousDirectoryClicked(prevURL)"/>
2017-07-24 17:42:11 +00:00
<repo-loading-file
v-for="n in 5"
:key="n"
2017-07-24 17:42:11 +00:00
:loading="loading"
:has-files="!!files.length"
2017-08-18 22:27:46 +00:00
:is-mini="isMini"
/>
2017-07-24 17:42:11 +00:00
<repo-file
v-for="file in files"
:key="file.id"
:file="file"
:is-mini="isMini"
@linkclicked="fileClicked(file)"
2017-07-24 17:42:11 +00:00
:is-tree="isTree"
:has-files="!!files.length"
2017-08-18 22:27:46 +00:00
:active-file="activeFile"
/>
2017-07-24 17:42:11 +00:00
</tbody>
</table>
</div>
</template>