debian-mirror-gitlab/app/assets/javascripts/ide/components/panes/right.vue

151 lines
3.7 KiB
Vue
Raw Normal View History

2018-11-08 19:23:39 +05:30
<script>
2018-11-18 11:00:15 +05:30
import { mapActions, mapState, mapGetters } from 'vuex';
2018-12-05 23:21:45 +05:30
import _ from 'underscore';
import { __ } from '~/locale';
2018-11-08 19:23:39 +05:30
import tooltip from '../../../vue_shared/directives/tooltip';
import Icon from '../../../vue_shared/components/icon.vue';
import { rightSidebarViews } from '../../constants';
import PipelinesList from '../pipelines/list.vue';
import JobsDetail from '../jobs/detail.vue';
import MergeRequestInfo from '../merge_requests/info.vue';
import ResizablePanel from '../resizable_panel.vue';
2018-11-18 11:00:15 +05:30
import Clientside from '../preview/clientside.vue';
2018-11-08 19:23:39 +05:30
export default {
directives: {
tooltip,
},
components: {
Icon,
PipelinesList,
JobsDetail,
ResizablePanel,
MergeRequestInfo,
2018-11-18 11:00:15 +05:30
Clientside,
2018-11-08 19:23:39 +05:30
},
2018-12-05 23:21:45 +05:30
props: {
extensionTabs: {
type: Array,
required: false,
default: () => [],
},
},
2018-11-08 19:23:39 +05:30
computed: {
2018-12-05 23:21:45 +05:30
...mapState(['currentMergeRequestId', 'clientsidePreviewEnabled']),
...mapState('rightPane', ['isOpen', 'currentView']),
2018-11-18 11:00:15 +05:30
...mapGetters(['packageJson']),
2018-12-05 23:21:45 +05:30
...mapGetters('rightPane', ['isActiveView', 'isAliveView']),
2018-11-18 11:00:15 +05:30
showLivePreview() {
return this.packageJson && this.clientsidePreviewEnabled;
},
2018-12-05 23:21:45 +05:30
defaultTabs() {
return [
{
show: this.currentMergeRequestId,
title: __('Merge Request'),
views: [
rightSidebarViews.mergeRequestInfo,
],
icon: 'text-description',
},
{
show: true,
title: __('Pipelines'),
views: [
rightSidebarViews.pipelines,
rightSidebarViews.jobsDetail,
],
icon: 'rocket',
},
{
show: this.showLivePreview,
title: __('Live preview'),
views: [
rightSidebarViews.clientSidePreview,
],
icon: 'live-preview',
},
];
},
tabs() {
return this.defaultTabs
.concat(this.extensionTabs)
.filter(tab => tab.show);
},
tabViews() {
return _.flatten(this.tabs.map(tab => tab.views));
},
aliveTabViews() {
return this.tabViews.filter(view => this.isAliveView(view.name));
},
2018-11-08 19:23:39 +05:30
},
methods: {
2018-12-05 23:21:45 +05:30
...mapActions('rightPane', ['toggleOpen', 'open']),
clickTab(e, tab) {
2018-11-08 19:23:39 +05:30
e.target.blur();
2018-12-05 23:21:45 +05:30
if (this.isActiveTab(tab)) {
this.toggleOpen();
} else {
this.open(tab.views[0]);
}
},
isActiveTab(tab) {
return tab.views.some(view => this.isActiveView(view.name));
2018-11-08 19:23:39 +05:30
},
},
};
</script>
<template>
<div
class="multi-file-commit-panel ide-right-sidebar"
>
<resizable-panel
2018-12-05 23:21:45 +05:30
v-show="isOpen"
2018-11-08 19:23:39 +05:30
:collapsible="false"
:initial-width="350"
:min-size="350"
2018-12-05 23:21:45 +05:30
:class="`ide-right-sidebar-${currentView}`"
2018-11-08 19:23:39 +05:30
side="right"
2018-11-18 11:00:15 +05:30
class="multi-file-commit-panel-inner"
2018-11-08 19:23:39 +05:30
>
2018-12-05 23:21:45 +05:30
<div
v-for="tabView in aliveTabViews"
v-show="isActiveView(tabView.name)"
:key="tabView.name"
class="h-100"
>
<component :is="tabView.name" />
</div>
2018-11-08 19:23:39 +05:30
</resizable-panel>
<nav class="ide-activity-bar">
<ul class="list-unstyled">
<li
2018-12-05 23:21:45 +05:30
v-for="tab of tabs"
:key="tab.title"
2018-11-08 19:23:39 +05:30
>
<button
v-tooltip
2018-12-05 23:21:45 +05:30
:title="tab.title"
:aria-label="tab.title"
2018-11-18 11:00:15 +05:30
:class="{
2018-12-05 23:21:45 +05:30
active: isActiveTab(tab) && isOpen
2018-11-18 11:00:15 +05:30
}"
data-container="body"
data-placement="left"
class="ide-sidebar-link is-right"
type="button"
2018-12-05 23:21:45 +05:30
@click="clickTab($event, tab)"
2018-11-18 11:00:15 +05:30
>
<icon
:size="16"
2018-12-05 23:21:45 +05:30
:name="tab.icon"
2018-11-18 11:00:15 +05:30
/>
</button>
</li>
2018-11-08 19:23:39 +05:30
</ul>
</nav>
</div>
</template>