agola-web/src/views/Project.vue

307 lines
7.9 KiB
Vue
Raw Normal View History

2018-12-09 13:21:20 +00:00
<template>
<div>
<projbreadcrumbs
:ownertype="ownertype"
:ownername="ownername"
:projectref="projectref"
/>
<div class="mb-8">
<span class="text-3xl">{{ projectName() }}</span>
</div>
<div class="flex justify-between">
<ul class="flex-grow tab">
<li class="tab-element-disabled">
<i class="mr-1 mdi mdi-run-fast" />
2019-05-06 11:43:15 +00:00
<span>Runs</span>
</li>
<li>
<tabarrow />
2019-05-06 11:43:15 +00:00
</li>
2018-12-09 13:21:20 +00:00
<li
class="tab-element"
:class="[
{
'tab-element-selected':
$route.name.match('project runs') ||
$route.name.endsWith('project'),
},
]"
2018-12-09 13:21:20 +00:00
>
2019-05-06 11:43:15 +00:00
<router-link :to="projectRunsLink(ownertype, ownername, projectref)">
<i class="mr-1 mdi mdi-asterisk" />
2019-05-06 11:43:15 +00:00
<span>All</span>
</router-link>
</li>
<li
class="tab-element"
:class="[
{
'tab-element-selected': $route.name.match(
'project branches runs'
),
},
]"
>
<router-link
:to="projectBranchesRunsLink(ownertype, ownername, projectref)"
>
<i class="mr-1 mdi mdi-source-branch" />
2019-05-06 11:43:15 +00:00
<span>Branches</span>
</router-link>
</li>
<li
class="tab-element"
:class="[
{ 'tab-element-selected': $route.name.match('project tags runs') },
]"
>
<router-link
:to="projectTagsRunsLink(ownertype, ownername, projectref)"
>
<i class="mr-1 mdi mdi-tag" />
2019-05-06 11:43:15 +00:00
<span>Tags</span>
</router-link>
</li>
<li
class="tab-element"
:class="[
{
'tab-element-selected': $route.name.match(
'project pull requests runs'
),
},
]"
>
<router-link
:to="projectPRsRunsLink(ownertype, ownername, projectref)"
>
<i class="mr-1 mdi mdi-source-pull" />
2019-05-06 11:43:15 +00:00
<span>Pull Requests</span>
</router-link>
2018-12-09 13:21:20 +00:00
</li>
<li
v-if="
run &&
($route.name.endsWith('project run') ||
$route.name.endsWith('project run task'))
"
>
<tabarrow />
2018-12-09 13:21:20 +00:00
</li>
<li
class="tab-element"
v-if="
run &&
($route.name.endsWith('project run') ||
$route.name.endsWith('project run task'))
"
:class="[
{ 'tab-element-selected': $route.name.endsWith('project run') },
]"
2018-12-09 13:21:20 +00:00
>
<router-link
:to="
projectRunLink(
ownertype,
ownername,
projectref,
$route.params.runid
)
"
>
<p>
Run
<strong>#{{ run.counter }}</strong>
</p>
</router-link>
2018-12-09 13:21:20 +00:00
</li>
<li v-if="run && $route.name.endsWith('project run task')">
<tabarrow />
2018-12-09 13:21:20 +00:00
</li>
<li
class="tab-element"
v-if="run && $route.name.endsWith('project run task')"
:class="[
{
'tab-element-selected': $route.name.endsWith('project run task'),
},
]"
>
2018-12-09 13:21:20 +00:00
<router-link
:to="
projectRunTaskLink(
ownertype,
ownername,
projectref,
$route.params.runid,
$route.params.taskid
)
"
>
<p>
Task
<strong>{{ run.tasks[$route.params.taskid].name }}</strong>
</p>
</router-link>
2018-12-09 13:21:20 +00:00
</li>
<li
v-if="$route.name.endsWith('project settings')"
class="tab-element"
:class="[
{
'tab-element-selected': $route.name.endsWith('project settings'),
},
]"
>
<router-link
:to="projectSettingsLink(ownertype, ownername, projectref)"
>
<i class="mr-1 mdi mdi-settings" />
2019-05-06 11:43:15 +00:00
<span>Project Settings</span>
</router-link>
</li>
</ul>
<ul class="flex tab">
<li>
<div class="relative">
<div
class="flex -mt-3"
v-click-outside="() => (dropdownActive = false)"
@click="dropdownActive = !dropdownActive"
>
<button
class="relative flex items-center focus:outline-none bg-transparent hover:bg-gray-300 text-dark font-semibold hover:text-dark py-1 px-4 border border-gray-500 rounded"
>
<i class="mr-4 mdi mdi-settings" />
<i class="mdi mdi-chevron-down"></i>
</button>
</div>
<div
v-if="dropdownActive"
class="z-10 origin-top-right absolute right-0 mt-2 w-64 bg-white rounded-lg border shadow-md py-2"
>
<ul>
<li>
<router-link
class="block px-4 py-2 hover:bg-blue-500 hover:text-white"
:to="projectSettingsLink(ownertype, ownername, projectref)"
>
<i class="mr-1 mdi mdi-settings" />
<span>Project Settings</span>
</router-link>
</li>
</ul>
</div>
</div>
</li>
</ul>
2018-12-09 13:21:20 +00:00
</div>
<router-view class="mt-8"></router-view>
2018-12-09 13:21:20 +00:00
</div>
</template>
<script>
import * as vClickOutside from 'v-click-outside-x';
2018-12-09 13:21:20 +00:00
import {
projectLink,
projectRunsLink,
projectBranchesRunsLink,
projectTagsRunsLink,
projectPRsRunsLink,
2018-12-09 13:21:20 +00:00
projectRunLink,
projectRunTaskLink,
projectSettingsLink,
} from '@/util/link.js';
2018-12-09 13:21:20 +00:00
import { fetchRun } from '@/util/data.js';
import projbreadcrumbs from '@/components/projbreadcrumbs.vue';
import tabarrow from '@/components/tabarrow.vue';
2018-12-09 13:21:20 +00:00
export default {
name: 'Project',
components: { projbreadcrumbs, tabarrow },
directives: {
clickOutside: vClickOutside.directive,
},
2018-12-09 13:21:20 +00:00
props: {
ownertype: String,
ownername: String,
projectref: Array,
2018-12-09 13:21:20 +00:00
},
data() {
return {
fetchAbort: null,
dropdownActive: false,
run: null,
};
},
watch: {
$route: async function (route) {
if (this.fetchAbort) {
this.fetchAbort.abort();
}
this.fetchAbort = new AbortController();
this.run = null;
if (route.params.runid) {
let { data, error, aborted } = await fetchRun(
route.params.runid,
this.fetchAbort.signal
);
if (aborted) {
return;
}
if (error) {
this.$store.dispatch('setError', error);
return;
}
this.run = data;
}
},
},
2018-12-09 13:21:20 +00:00
methods: {
projectLink: projectLink,
projectRunsLink: projectRunsLink,
projectBranchesRunsLink: projectBranchesRunsLink,
projectTagsRunsLink: projectTagsRunsLink,
projectPRsRunsLink: projectPRsRunsLink,
2018-12-09 13:21:20 +00:00
projectRunLink: projectRunLink,
projectRunTaskLink: projectRunTaskLink,
projectSettingsLink: projectSettingsLink,
projectName() {
return this.projectref[this.projectref.length - 1];
},
},
created: async function () {
this.fetchAbort = new AbortController();
if (this.$route.params.runid) {
2019-09-23 08:17:58 +00:00
let { data, error, aborted } = await fetchRun(
this.$route.params.runid,
this.fetchAbort.signal
);
if (aborted) {
return;
}
if (error) {
this.$store.dispatch('setError', error);
return;
}
this.run = data;
}
},
beforeDestroy() {
if (this.fetchAbort) {
this.fetchAbort.abort();
}
},
2018-12-09 13:21:20 +00:00
};
</script>
<style scoped lang="scss"></style>