Some checks failed
Build & Push Monica Image to Gitea Registry / build-and-push (push) Failing after 9s
129 lines
3.0 KiB
Vue
129 lines
3.0 KiB
Vue
<style scoped>
|
|
.participant {
|
|
background: #E5F3F9;
|
|
border-radius: 7px;
|
|
}
|
|
.participant-list {
|
|
height: 150px;
|
|
}
|
|
input[type=text] {
|
|
background-color: #f5f5f5;
|
|
}
|
|
input[type=text]:focus {
|
|
background-color: #fff;
|
|
}
|
|
.potential-participant:hover {
|
|
background-color: #f1f5fd;
|
|
}
|
|
</style>
|
|
|
|
<template>
|
|
<div class="relative">
|
|
<ul v-show="chosenParticipants.length !== 0" class="mr2 mb3">
|
|
<li v-for="chosenParticipant in chosenParticipants"
|
|
:key="chosenParticipant.id"
|
|
class="dib participant br5 mr2"
|
|
>
|
|
<span class="ph2 pv1 dib">
|
|
{{ chosenParticipant.name }}
|
|
</span>
|
|
<span class="bl ph2 pv1 f6 pointer" @click.prevent="remove(chosenParticipant)">
|
|
❌
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
<div v-show="participants.length !== 0" class="ba b--gray-monica">
|
|
<span class="db bb b--gray-monica pa2">
|
|
<input v-model="search" type="text" :placeholder="$t('app.filter')" class="br2 f5 w-100 ba b--black-20 pa2 outline-0" />
|
|
</span>
|
|
<ul class="overflow-auto participant-list">
|
|
<li v-for="fparticipant in filteredList"
|
|
:key="fparticipant.id"
|
|
class="bb b--gray-monica pa2 pointer potential-participant"
|
|
@click.prevent="select(fparticipant)"
|
|
>
|
|
{{ fparticipant.name }}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
|
|
export default {
|
|
|
|
props: {
|
|
initialParticipants: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
hash: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
search: '',
|
|
participants: [],
|
|
chosenParticipants: [],
|
|
};
|
|
},
|
|
|
|
computed: {
|
|
filteredList() {
|
|
// filter the list when searching
|
|
// also, sort the list by name
|
|
var list;
|
|
list = this.participants.filter(participant => {
|
|
return participant.name.toLowerCase().includes(this.search.toLowerCase())
|
|
&& this.chosenParticipants.find(p => p.id === participant.id) === undefined;
|
|
});
|
|
|
|
function compare(a, b) {
|
|
if (a.name < b.name) {
|
|
return -1;
|
|
}
|
|
if (a.name > b.name) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
return list.sort(compare);
|
|
}
|
|
},
|
|
|
|
mounted() {
|
|
this.prepareComponent();
|
|
this.chosenParticipants = this.initialParticipants;
|
|
},
|
|
|
|
methods: {
|
|
prepareComponent() {
|
|
this.getParticipants();
|
|
},
|
|
|
|
getParticipants: function () {
|
|
axios.get('people/' + this.hash + '/activities/contacts')
|
|
.then(response => {
|
|
this.participants = _.toArray(response.data);
|
|
});
|
|
},
|
|
|
|
select(participant) {
|
|
this.chosenParticipants.push(participant);
|
|
this.participants.splice(this.participants.indexOf(participant), 1);
|
|
this.$emit('update', this.chosenParticipants);
|
|
},
|
|
|
|
remove(participant) {
|
|
this.participants.push(participant);
|
|
this.chosenParticipants.splice(this.chosenParticipants.indexOf(participant), 1);
|
|
},
|
|
}
|
|
};
|
|
</script>
|