2019-04-03 15:51:41 +00:00
|
|
|
<template>
|
|
|
|
|
<div>
|
2019-05-13 15:59:23 +00:00
|
|
|
<h4 class="title is-4">Linked Accounts</h4>
|
|
|
|
|
<div class="message is-danger">
|
|
|
|
|
<div
|
|
|
|
|
class="message-body"
|
|
|
|
|
>Removing a Linked Account will also block all the projects that uses this Linked Account to access their remote repository</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div v-if="user.linked_accounts">
|
|
|
|
|
<div class="item-list" v-for="(la, index) in user.linked_accounts" v-bind:key="index">
|
|
|
|
|
<nav class="level item">
|
|
|
|
|
<div class="level-left">
|
|
|
|
|
<div class="level-item">
|
|
|
|
|
<div>
|
|
|
|
|
<span class="name">{{la.remote_user_name}}</span>
|
|
|
|
|
<span class="remotesource-name">( {{laRemoteSourceName(la)}} )</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="level-right">
|
|
|
|
|
<div class="level-item">
|
|
|
|
|
<button class="button is-primary" @click="deleteLinkedAccount(la)">Delete</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</nav>
|
|
|
|
|
</div>
|
|
|
|
|
<div v-if="deleteLinkedAccountError" class="message is-danger">
|
|
|
|
|
<div class="message-body">{{ deleteLinkedAccountError }}</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div v-else>No linked accounts</div>
|
|
|
|
|
<hr>
|
2019-04-03 15:51:41 +00:00
|
|
|
<h4 class="title is-4">User Tokens</h4>
|
|
|
|
|
<div v-if="user.tokens">
|
|
|
|
|
<div class="item-list" v-for="token in user.tokens" v-bind:key="token">
|
|
|
|
|
<div class="field is-grouped">
|
|
|
|
|
<div class="control">
|
|
|
|
|
<input class="input" disabled type="text" placeholder="Token name" :value="token">
|
|
|
|
|
</div>
|
|
|
|
|
<button class="button is-primary" @click="deleteUserToken(token)">Delete</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2019-05-13 14:29:47 +00:00
|
|
|
<div v-if="deleteUserTokenError" class="message is-danger">
|
|
|
|
|
<div class="message-body">{{ deleteUserTokenError }}</div>
|
|
|
|
|
</div>
|
2019-04-03 15:51:41 +00:00
|
|
|
</div>
|
2019-05-13 14:29:47 +00:00
|
|
|
<div v-else>No user tokens</div>
|
2019-04-03 15:51:41 +00:00
|
|
|
<hr>
|
|
|
|
|
<div v-if="token" class="notification is-success">
|
|
|
|
|
<button class="delete" @click="closeNewTokenNotification()"></button>
|
|
|
|
|
User token created: {{token}}
|
|
|
|
|
</div>
|
2019-05-13 14:29:47 +00:00
|
|
|
<h5 class="title is-5">Create new User Token</h5>
|
2019-04-03 15:51:41 +00:00
|
|
|
<div class="field is-grouped">
|
|
|
|
|
<div class="control">
|
|
|
|
|
<input class="input is-primary" type="text" placeholder="Token name" v-model="newtokenname">
|
|
|
|
|
</div>
|
|
|
|
|
<button class="button is-primary" @click="createUserToken()">Create Token</button>
|
|
|
|
|
</div>
|
2019-05-13 14:29:47 +00:00
|
|
|
<div v-if="createUserTokenError" class="message is-danger">
|
|
|
|
|
<div class="message-body">{{ createUserTokenError }}</div>
|
|
|
|
|
</div>
|
2019-04-03 15:51:41 +00:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import {
|
|
|
|
|
fetchCurrentUser,
|
2019-05-13 14:29:47 +00:00
|
|
|
fetchRemoteSources,
|
2019-04-03 15:51:41 +00:00
|
|
|
createUserToken,
|
2019-05-13 15:59:23 +00:00
|
|
|
deleteUserToken,
|
|
|
|
|
deleteLinkedAccount
|
2019-04-03 15:51:41 +00:00
|
|
|
} from "@/util/data.js";
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
components: {},
|
|
|
|
|
name: "usersettings",
|
|
|
|
|
props: {},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
2019-05-13 14:29:47 +00:00
|
|
|
createUserTokenError: null,
|
|
|
|
|
deleteUserTokenError: null,
|
2019-05-13 15:59:23 +00:00
|
|
|
deleteLinkedAccountError: null,
|
2019-04-03 15:51:41 +00:00
|
|
|
user: [],
|
2019-05-13 14:29:47 +00:00
|
|
|
remotesources: [],
|
2019-04-03 15:51:41 +00:00
|
|
|
token: null,
|
|
|
|
|
newtokenname: null
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
2019-05-13 14:29:47 +00:00
|
|
|
resetErrors() {
|
|
|
|
|
this.createUserTokenError = null;
|
|
|
|
|
this.deleteUserTokenError = null;
|
2019-05-13 15:59:23 +00:00
|
|
|
this.deleteLinkedAccountError = null;
|
2019-05-13 14:29:47 +00:00
|
|
|
},
|
|
|
|
|
async fetchCurrentUser() {
|
|
|
|
|
let { data, error } = await fetchCurrentUser();
|
|
|
|
|
if (error) {
|
|
|
|
|
this.$store.dispatch("setError", error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.user = data;
|
|
|
|
|
},
|
|
|
|
|
async fetchRemoteSources() {
|
|
|
|
|
let { data, error } = await fetchRemoteSources();
|
|
|
|
|
if (error) {
|
|
|
|
|
this.$store.dispatch("setError", error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.remotesources = data;
|
|
|
|
|
},
|
2019-05-13 15:59:23 +00:00
|
|
|
laRemoteSourceName(la) {
|
|
|
|
|
for (var i = 0; i < this.remotesources.length; i++) {
|
|
|
|
|
let rs = this.remotesources[i];
|
|
|
|
|
if (rs.id == la.remote_source_id) {
|
|
|
|
|
return rs.name;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
2019-04-03 15:51:41 +00:00
|
|
|
async createUserToken() {
|
2019-05-13 14:29:47 +00:00
|
|
|
this.resetErrors();
|
|
|
|
|
|
|
|
|
|
let { data, error } = await createUserToken(
|
|
|
|
|
this.user.username,
|
|
|
|
|
this.newtokenname
|
|
|
|
|
);
|
|
|
|
|
if (error) {
|
|
|
|
|
this.createUserTokenError = error;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.token = data.token;
|
2019-04-03 15:51:41 +00:00
|
|
|
this.newtokenname = null;
|
2019-05-13 14:29:47 +00:00
|
|
|
this.fetchCurrentUser();
|
2019-04-03 15:51:41 +00:00
|
|
|
},
|
2019-05-13 15:59:23 +00:00
|
|
|
closeNewTokenNotification() {
|
|
|
|
|
this.token = null;
|
|
|
|
|
},
|
2019-04-03 15:51:41 +00:00
|
|
|
async deleteUserToken(tokenname) {
|
2019-05-13 14:29:47 +00:00
|
|
|
this.resetErrors();
|
|
|
|
|
|
|
|
|
|
let { error } = await deleteUserToken(this.user.username, tokenname);
|
|
|
|
|
if (error) {
|
|
|
|
|
this.deleteUserTokenError = error;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.fetchCurrentUser();
|
2019-04-03 15:51:41 +00:00
|
|
|
},
|
2019-05-13 15:59:23 +00:00
|
|
|
async deleteLinkedAccount(la) {
|
|
|
|
|
this.resetErrors();
|
|
|
|
|
|
|
|
|
|
let { error } = await deleteLinkedAccount(this.user.username, la.id);
|
|
|
|
|
if (error) {
|
|
|
|
|
this.deleteLinkedAccountError = error;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.fetchCurrentUser();
|
2019-04-03 15:51:41 +00:00
|
|
|
}
|
|
|
|
|
},
|
2019-05-13 14:29:47 +00:00
|
|
|
created: function() {
|
|
|
|
|
this.fetchCurrentUser();
|
|
|
|
|
this.fetchRemoteSources();
|
2019-04-03 15:51:41 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
@import "@/css/_variables.scss";
|
2019-05-13 14:29:47 +00:00
|
|
|
|
|
|
|
|
.item-list {
|
|
|
|
|
.item {
|
2019-05-13 15:59:23 +00:00
|
|
|
border-bottom: 1px solid $grey-lighter;
|
2019-05-13 14:29:47 +00:00
|
|
|
padding: 10px;
|
|
|
|
|
}
|
|
|
|
|
.name {
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
}
|
2019-05-13 15:59:23 +00:00
|
|
|
.remotesource-name {
|
|
|
|
|
margin-left: 1rem;
|
|
|
|
|
}
|
2019-05-13 14:29:47 +00:00
|
|
|
}
|
2019-04-03 15:51:41 +00:00
|
|
|
</style>
|
|
|
|
|
|