Commit 2a737e6e authored by jackie / Andrea Ida Malkah Klaura's avatar jackie / Andrea Ida Malkah Klaura
Browse files

Merge branch 'feature-showmanager-superuser' into develop

parents cc5f69b8 41a4e4f0
......@@ -274,6 +274,7 @@
<hr>
<h2>Allgemeine Einstellungen zur Sendereihe:</h2>
<b-row>
<b-col lg="6">
<p>
......@@ -399,6 +400,56 @@
</b-col>
</b-row>
<hr v-if="$parent.user.steeringUser.is_superuser">
<b-row v-if="$parent.user.steeringUser.is_superuser">
<b-col lg="2">
<b-badge
variant="info"
style="width:80%;"
>
Owners:
</b-badge> <img
src="../assets/16x16/emblem-system.png"
alt="edit"
@click="$refs.appModalSuperuser.showModalOwners(shows[currentShow])"
>
</b-col>
<b-col lg="10">
<div v-if="loaded.owners">
<p v-if="shows[currentShow].owners.length === 0">
<small><i>(none set)</i></small>
</p>
<p v-else>
<!-- TODO: make link on name; when user clicks, open modal to edit host -->
<ul>
<li
v-for="owner in current.owners"
:key="owner.id"
>
{{ owner.first_name }} {{ owner.last_name }}
<b-badge variant="light">
username:
</b-badge> <small>{{ owner.username }}</small>
<span v-if="owner.email.length > 0">
<b-badge variant="light">
email:
</b-badge> <small>{{ owner.email }}</small>
</span>
</li>
</ul>
</p>
</div>
<div v-else>
<img
src="../assets/radio.gif"
height="24px"
alt="loading data"
><br>
</div>
</b-col>
</b-row>
<hr v-if="$parent.user.steeringUser.is_superuser">
<b-row>
<b-col lg="2">
<b-badge style="width:80%;">
......@@ -671,7 +722,8 @@ export default {
topics: false,
musicfocus: false,
fundingcategory: false,
type: false
type: false,
owners: false,
},
// the current object is used to hold all the necessary data to describe
......@@ -695,7 +747,8 @@ export default {
note: {},
notes: [],
image: '',
logo: ''
logo: '',
owners: [],
},
// this is used to configure the table with all the filtered timeslots
......@@ -812,6 +865,7 @@ export default {
this.loaded.languages = false
this.loaded.musicfocus = false
this.loaded.fundingcategory = false
this.loaded.owners = false
// set the current show and its ID to whatever we want to switch to now
this.currentShow = index
this.currentShowID = this.shows[this.currentShow].id
......@@ -829,6 +883,9 @@ export default {
this.getMusicfocus()
this.getFundingCategory()
this.getType()
if (this.$parent.user.steeringUser.is_superuser) {
this.getOwners()
}
// now fetch the timeslots (including notes) for a given show from PV backend
this.getTimeslots(this.dateStart, this.dateEnd, this.numSlots)
},
......@@ -1124,6 +1181,29 @@ export default {
if (!loadingError) { this.loaded.type = true }
},
getOwners: function () {
this.current.owners = []
let loadingError = false
if (this.shows[this.currentShow].owners.length === 0) {
this.loaded.owners = true
} else {
for (let i in this.shows[this.currentShow].owners) {
axios.get(process.env.VUE_APP_API_STEERING + 'users/' + this.shows[this.currentShow].owners[i] + '/', {
withCredentials: true,
headers: { 'Authorization': 'Bearer ' + this.$parent.user.access_token }
}).then(response => {
this.current.owners.push(response.data)
}).catch(error => {
loadingError = true
this.$log.error(error.response.status + ' ' + error.response.statusText)
this.$log.error(error.response)
alert('Error: could not load owner data. See console for details.')
})
}
if (!loadingError) { this.loaded.owners = true }
}
},
// Just a placeholder function we can use in the UI, to signal if something
// is not yet implemented
notYetImplemented: function () {
......
......@@ -99,6 +99,124 @@
Are you sure you want to continue?
</div>
</b-modal>
<!-- Modal to edit show owners -->
<b-modal
ref="modalOwners"
title="Edit owners of the show"
size="lg"
@ok="updateOwners"
>
<div v-if="loaded.users">
<p>
Users with access to <b>{{ show.name }}</b>:
</p>
<div v-if="owners.length === 0">
<ul>
<li>
<small><i>(none set)</i></small>
</li>
</ul>
</div>
<div v-else>
<b-table
striped
hover
:items="owners"
:fields="ownersTableFields"
>
<template
slot="name"
slot-scope="data"
>
{{ data.item.first_name }} {{ data.item.last_name }}
</template>
<template
slot="username"
slot-scope="data"
>
<small>{{ data.value }}</small>
</template>
<template
slot="email"
slot-scope="data"
>
<small>{{ data.value }}</small>
</template>
<template
slot="options"
slot-scope="data"
>
<b-button
variant="danger"
size="sm"
@click="deleteOwner(data.item.id)"
>
Delete
</b-button>
</template>
</b-table>
</div>
<hr>
<!-- TODO: as the list of users might be quite large we need some sort
of pagination and/or a search box. also those users who already have
access should not be listed (or at least the add button should be disabled)
-->
<p>
You can
<b-badge variant="success">
add new users
</b-badge>
from the table below:
</p>
<b-table
striped
hover
:items="users"
:fields="ownersTableFields"
>
<template
slot="name"
slot-scope="data"
>
{{ data.item.first_name }} {{ data.item.last_name }}
</template>
<template
slot="username"
slot-scope="data"
>
<small>{{ data.value }}</small>
</template>
<template
slot="email"
slot-scope="data"
>
<small>{{ data.value }}</small>
</template>
<template
slot="options"
slot-scope="data"
>
<b-button
variant="success"
size="sm"
@click="addOwner(data.item.id)"
>
Add
</b-button>
</template>
</b-table>
</div>
<div v-else>
<img
src="../assets/radio.gif"
height="32px"
alt="loading user data"
>
</div>
</b-modal>
</div>
</template>
......@@ -127,12 +245,17 @@ export default {
id: null,
name: '',
},
show: null,
loaded: {
types: false,
fundingcategories: false,
users: false,
},
types: [],
fundingcategories: [],
users: [],
owners: [],
ownersTableFields: ['name', 'username', 'email', 'options']
}
},
......@@ -231,6 +354,50 @@ export default {
})
},
// remove an owner from the list of show owners
deleteOwner (id) {
// we only have to find the item in our array and splice it out
// saving is done when the updateOwners method is called
let i = this.owners.findIndex(o => o.id === id)
this.owners.splice(i, 1)
},
// add a user as an owner to the list of show owners
addOwner (id) {
// we only have to push the user object to our owners array, if it is
// not already there. saving is done by the updateOwners method.
if (this.owners.findIndex(o => o.id === id) >= 0) {
alert('This user already has access to the show.')
} else {
this.owners.push(this.users.find(u => u.id === id))
}
},
// set new list of show owners by updating the show
updateOwners (event) {
// prevent the modal from closing automatically on click
event.preventDefault()
// now we have to fill the show's owner list anew with the selected owners
this.show.owners = []
for (let i in this.owners) {
this.show.owners.push(this.owners[i].id)
}
// ready to update the show
let uri = process.env.VUE_APP_API_STEERING_SHOWS + this.show.id + '/'
axios.put(uri, this.show, {
withCredentials: true,
headers: { 'Authorization': 'Bearer ' + this.$parent.$parent.user.access_token }
}).then(() => {
this.$refs.modalOwners.hide()
this.$parent.loadAndSwitch(this.show.id)
}).catch(error => {
this.$log.error(error.response.status + ' ' + error.response.statusText)
this.$log.error(error.response)
alert('Error: could not update show owners. See console for details.')
// and we leave the modal open, so no call to its .hide function here
})
},
// clear and fetch modal data and open the modal to add new shows
showModalAddShow () {
this.newShow.name = ''
......@@ -248,6 +415,14 @@ export default {
this.$refs.modalDeleteShow.show()
},
// open the modal to edit a show's owners
showModalOwners (show) {
this.show = show
this.owners = []
this.loadUsers()
this.$refs.modalOwners.show()
},
// fetch all available (that is: active) show type from steering
loadTypes () {
this.loaded.types = false
......@@ -279,6 +454,25 @@ export default {
alert('Error: could not load available funding categories. See console for details.')
})
},
// fetch all users from steering
loadUsers () {
this.loaded.users = false
axios.get(process.env.VUE_APP_API_STEERING + 'users', {
withCredentials: true,
headers: { 'Authorization': 'Bearer ' + this.$parent.$parent.user.access_token }
}).then(response => {
this.users = response.data
for (let i in this.show.owners) {
this.owners.push(this.users.find(user => user.id === this.show.owners[i]))
}
this.loaded.users = true
}).catch(error => {
this.$log.error(error.response.status + ' ' + error.response.statusText)
this.$log.error(error.response)
alert('Error: could not load users. See console for details.')
})
},
}
}
</script>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment