Files
CRM/resources/js/components/people/Participant.vue
Kroonk a213a1dba0
Some checks failed
Build & Push Monica Image to Gitea Registry / build-and-push (push) Failing after 9s
refactor: replace custom CRM with Monica fork
2026-05-22 16:19:55 +02:00

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>