2022-09-16 21:11:44 +02:00
|
|
|
<template>
|
2022-09-19 15:11:13 +02:00
|
|
|
<div class="flex flex-col gap-5 mx-auto p-2 w-full max-w-md">
|
|
|
|
<div class="mb-5">
|
2022-09-18 10:47:43 +02:00
|
|
|
<form @submit.prevent="submitLedenlijst" class="flex flex-col">
|
|
|
|
<input required="true" @change="handleFileChanged" accept=".csv" class="my-2" type="file">
|
|
|
|
<span class="text-sm"><i>Met de volgende kolommen: Relatiecode, Volledige naam(1), Roepnaam, E-mail, 2e E-mail, Verenigingssporten, Diploma</i></span>
|
2023-01-27 15:15:45 +01:00
|
|
|
<button :disabled="disableButtons" class="btn mx-auto mt-2">Publish Ledenlijst</button>
|
2022-09-18 10:47:43 +02:00
|
|
|
</form>
|
|
|
|
</div>
|
2022-09-19 15:11:13 +02:00
|
|
|
<div class="flex flex-col gap-3">
|
2022-09-19 22:06:26 +02:00
|
|
|
<input v-model="searchTerm" class="input mb-2 font-bold" type="search" placeholder="Search">
|
2022-09-19 15:11:13 +02:00
|
|
|
<div v-for="lid in filteredLedenlijst" :key="lid.relatiecode">
|
|
|
|
<div class="item container flex flex-wrap">
|
|
|
|
<b class="w-24">{{ lid.relatiecode }}</b> {{ lid.fullName }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2022-09-16 21:11:44 +02:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
2022-12-17 13:01:49 +01:00
|
|
|
import { doc, getDocs, collection, writeBatch, runTransaction } from "firebase/firestore";
|
2022-09-18 20:07:37 +02:00
|
|
|
import { useToast } from 'vue-toastification'
|
|
|
|
|
2022-09-16 21:11:44 +02:00
|
|
|
definePageMeta({
|
|
|
|
title: 'Ledenlijst',
|
|
|
|
key: 'back'
|
|
|
|
})
|
2022-09-18 10:47:43 +02:00
|
|
|
|
2022-12-17 13:01:49 +01:00
|
|
|
const { db, ledenlijst, users } = inject('firebase')
|
2022-09-19 15:11:13 +02:00
|
|
|
|
2022-09-18 20:07:37 +02:00
|
|
|
const toast = useToast()
|
|
|
|
|
2022-09-18 10:47:43 +02:00
|
|
|
const file = ref(null)
|
|
|
|
const disableButtons = ref(false)
|
2022-09-19 15:11:13 +02:00
|
|
|
const searchTerm = ref('')
|
2023-01-27 15:08:58 +01:00
|
|
|
const newLedenlijst = ref([])
|
2022-09-19 15:11:13 +02:00
|
|
|
|
|
|
|
onMounted(async () => {
|
2023-01-26 11:34:52 +01:00
|
|
|
if (!ledenlijst.value.length) {
|
|
|
|
try {
|
|
|
|
const querySnapshot = await getDocs(collection(db, "ledenlijst"));
|
|
|
|
querySnapshot.forEach((doc) => {
|
|
|
|
ledenlijst.value.push(doc.data())
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
console.log(e)
|
2022-09-19 15:11:13 +02:00
|
|
|
}
|
2023-01-26 11:34:52 +01:00
|
|
|
|
|
|
|
ledenlijst.value.sort((a, b) => a.fullName.localeCompare(b.fullName))
|
|
|
|
}
|
2022-09-19 15:11:13 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
const filteredLedenlijst = computed(() => {
|
2023-01-26 11:34:52 +01:00
|
|
|
return ledenlijst.value.filter(lid => lid.fullName.toLowerCase().includes(searchTerm.value.toLowerCase()))
|
2022-09-19 15:11:13 +02:00
|
|
|
})
|
2022-09-18 10:47:43 +02:00
|
|
|
|
|
|
|
const handleFileChanged = (event) => {
|
2023-01-26 11:34:52 +01:00
|
|
|
const target = event.target;
|
2022-09-18 10:47:43 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
if (target && target.files) {
|
|
|
|
file.value = target.files[0];
|
|
|
|
}
|
2022-09-18 10:47:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const submitLedenlijst = () => {
|
2023-01-26 11:34:52 +01:00
|
|
|
disableButtons.value = true
|
2022-09-18 10:47:43 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
let reader = new FileReader()
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
reader.onload = function() {
|
|
|
|
csvToJson(reader.result);
|
|
|
|
};
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
reader.onerror = function() {
|
|
|
|
console.log(reader.error);
|
|
|
|
};
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
reader.readAsText(file.value)
|
2022-09-18 20:07:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const csvToJson = (csv) => {
|
2023-01-26 11:34:52 +01:00
|
|
|
let arr = csv.split('\n');
|
|
|
|
|
|
|
|
var result = [];
|
|
|
|
var headers = arr[0].split(';');
|
|
|
|
for(var i = 1; i < arr.length; i++) {
|
|
|
|
var data = arr[i].split(';');
|
|
|
|
var obj = {};
|
|
|
|
for(var j = 0; j < data.length; j++) {
|
|
|
|
obj[headers[j].trim()] = data[j].trim();
|
2022-12-29 12:54:58 +01:00
|
|
|
}
|
2023-01-26 11:34:52 +01:00
|
|
|
result.push(obj);
|
|
|
|
}
|
2022-12-29 12:54:58 +01:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
if (!Object.hasOwn(result[0], 'Relatiecode') || !Object.hasOwn(result[0], 'Volledige naam (1)') || !Object.hasOwn(result[0], 'E-mail') || !Object.hasOwn(result[0], '2e E-mail') || !Object.hasOwn(result[0], 'Verenigingssporten') || !Object.hasOwn(result[0], 'Diploma dropdown 1')) return toast.error('Missing properties')
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-27 15:08:58 +01:00
|
|
|
newLedenlijst.value = []
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
for (let i in result) {
|
|
|
|
let groups = []
|
|
|
|
let correctGroups = null
|
2023-01-27 15:08:58 +01:00
|
|
|
if (!result[i].Relatiecode) break;
|
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
if (result[i].Verenigingssporten.includes(',')) correctGroups = result[i].Verenigingssporten.split(',')
|
|
|
|
else correctGroups = [result[i].Verenigingssporten]
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-26 11:34:52 +01:00
|
|
|
correctGroups.forEach(group => {
|
|
|
|
const x = group.split(' - ')
|
|
|
|
|
|
|
|
if (x[2] === 'Week') groups.push('Vrijdag')
|
|
|
|
else if (x[2] === 'Zaterdag' && x[1] !== 'Wedstrijd') groups.push('Zaterdag')
|
|
|
|
|
|
|
|
groups.push(x[1])
|
|
|
|
})
|
|
|
|
|
|
|
|
if (groups[2] === 'Week') groups[2] = 'Vrijdag'
|
2022-09-18 20:07:37 +02:00
|
|
|
|
2023-01-27 15:08:58 +01:00
|
|
|
newLedenlijst.value.push({ relatiecode: result[i].Relatiecode, fullName: result[i]['Volledige naam (1)'], email: [result[i]['E-mail'], result[i]['2e E-mail']], groups: [...new Set(groups)], diploma: result[i]['Diploma dropdown 1'] })
|
2023-01-26 11:34:52 +01:00
|
|
|
}
|
|
|
|
uploadLedenlijst()
|
2022-09-19 15:11:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const uploadLedenlijst = async () => {
|
2023-01-27 15:08:58 +01:00
|
|
|
try {
|
|
|
|
const batch = writeBatch(db)
|
2022-09-19 15:11:13 +02:00
|
|
|
|
2023-01-27 15:08:58 +01:00
|
|
|
newLedenlijst.value.forEach(lid => {
|
|
|
|
const docRef = doc(db, "ledenlijst", lid.relatiecode)
|
2022-09-19 15:11:13 +02:00
|
|
|
|
2023-01-27 15:08:58 +01:00
|
|
|
const exists = ledenlijst.value.filter(a => a.relatiecode === lid.relatiecode).length > 1
|
2022-09-19 15:11:13 +02:00
|
|
|
|
2023-01-27 15:08:58 +01:00
|
|
|
if (!exists) {
|
|
|
|
return batch.set(docRef, lid);
|
|
|
|
}
|
|
|
|
|
|
|
|
batch.update(docRef, { fullName: lid.relatiecode, email: lid.email, groups: lid.groups, diploma: lid.diploma})
|
|
|
|
})
|
|
|
|
|
|
|
|
const deleteLeden = ledenlijst.value.filter(a => newLedenlijst.value.map(x => x.relatiecode).indexOf(a.relatiecode) === -1)
|
2022-12-17 13:01:49 +01:00
|
|
|
|
2023-01-27 15:08:58 +01:00
|
|
|
deleteLeden.forEach(lid => {
|
|
|
|
const docRef = doc(db, "ledenlijst", lid.relatiecode)
|
|
|
|
|
|
|
|
batch.delete(docRef)
|
|
|
|
})
|
|
|
|
|
|
|
|
await batch.commit();
|
|
|
|
|
|
|
|
toast.success('Published ledenlijst')
|
|
|
|
} catch (e) {
|
|
|
|
toast.error("Error updating ledenlijst");
|
|
|
|
console.log(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
ledenlijst.value = newLedenlijst.value
|
|
|
|
|
|
|
|
updateUsers()
|
2022-12-17 13:01:49 +01:00
|
|
|
}
|
|
|
|
|
2022-09-19 15:11:13 +02:00
|
|
|
|
2022-12-17 13:01:49 +01:00
|
|
|
const updateUsers = async () => {
|
|
|
|
try {
|
|
|
|
const querySnapshot = await getDocs(collection(db, "users"));
|
|
|
|
querySnapshot.forEach((doc) => {
|
|
|
|
const data = doc.data()
|
|
|
|
data.id = doc.id
|
|
|
|
users.value.push(data)
|
|
|
|
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
console.log(e)
|
|
|
|
|
|
|
|
toast.error('Error getting users')
|
|
|
|
}
|
|
|
|
|
|
|
|
const batch = writeBatch(db);
|
|
|
|
|
|
|
|
users.value.forEach(user => {
|
|
|
|
const lid = ledenlijst.value.filter(a => a.email.includes(user.email))
|
|
|
|
const newRelatiecodes = lid.map(a => a.relatiecode)
|
|
|
|
|
|
|
|
user.allRelatiecodes = newRelatiecodes
|
|
|
|
user.relatiecodes.forEach((relatiecode, index) => {
|
2023-01-27 15:08:58 +01:00
|
|
|
if (!newRelatiecodes.includes(relatiecode)) { user.relatiecodes.splice(index, 1); console.log('removed item', relatiecode)}
|
2022-12-17 13:01:49 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
const userRef = doc(db, "users", user.id)
|
|
|
|
batch.update(userRef, user)
|
|
|
|
})
|
|
|
|
|
|
|
|
await batch.commit();
|
|
|
|
|
|
|
|
disableButtons.value = false
|
2022-09-18 10:47:43 +02:00
|
|
|
}
|
2022-12-17 13:01:49 +01:00
|
|
|
</script>
|