|
@@ -6,28 +6,39 @@
|
|
|
:data="data"
|
|
:data="data"
|
|
|
:clickable="true"
|
|
:clickable="true"
|
|
|
:loadingAnimation="loading"
|
|
:loadingAnimation="loading"
|
|
|
|
|
+ :exportable="false"
|
|
|
locale="fr"
|
|
locale="fr"
|
|
|
@row-click="onRowClick"
|
|
@row-click="onRowClick"
|
|
|
|
|
+ :customButtons="customButton"
|
|
|
></data-table>
|
|
></data-table>
|
|
|
<editeur-benevole
|
|
<editeur-benevole
|
|
|
:benevole="currentBenevole"
|
|
:benevole="currentBenevole"
|
|
|
@create="createBenevole"
|
|
@create="createBenevole"
|
|
|
@delete="deleteBenevole"
|
|
@delete="deleteBenevole"
|
|
|
/>
|
|
/>
|
|
|
|
|
+ <input type="file" ref="loadcsv" @change="importBenevoleTemplate" style="display: none" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
|
import Competence from "@/models/Competence";
|
|
import Competence from "@/models/Competence";
|
|
|
import EditeurBenevole from "@/components/EditeurBenevole.vue";
|
|
import EditeurBenevole from "@/components/EditeurBenevole.vue";
|
|
|
-import DataTable, { DataTableData, DataTableObject } from "@/components/DataTable.vue";
|
|
|
|
|
|
|
+import DataTable, {
|
|
|
|
|
+ CustomButton,
|
|
|
|
|
+ DataTableData,
|
|
|
|
|
+ DataTableObject,
|
|
|
|
|
+} from "@/components/DataTable.vue";
|
|
|
import { defineComponent } from "vue";
|
|
import { defineComponent } from "vue";
|
|
|
import { MutationTypes } from "@/store/Mutations";
|
|
import { MutationTypes } from "@/store/Mutations";
|
|
|
import Benevole from "@/models/Benevole";
|
|
import Benevole from "@/models/Benevole";
|
|
|
|
|
+import csv from "@/utils/csv";
|
|
|
|
|
+import dayjs from "dayjs";
|
|
|
|
|
+import Toast from "@/utils/Toast";
|
|
|
|
|
|
|
|
|
|
+const csvDefaultcolumn = "id,prenom,nom,telephone,email,commentaire";
|
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
|
name: "EditeurCreneau",
|
|
name: "EditeurCreneau",
|
|
|
- components: { "data-table": DataTable, EditeurBenevole },
|
|
|
|
|
|
|
+ components: { DataTable, EditeurBenevole },
|
|
|
data: () => ({
|
|
data: () => ({
|
|
|
columns: [
|
|
columns: [
|
|
|
{
|
|
{
|
|
@@ -70,8 +81,12 @@ export default defineComponent({
|
|
|
],
|
|
],
|
|
|
currentBenevole: undefined as Benevole | undefined,
|
|
currentBenevole: undefined as Benevole | undefined,
|
|
|
loading: true,
|
|
loading: true,
|
|
|
|
|
+ customButton: [] as Array<CustomButton>,
|
|
|
}),
|
|
}),
|
|
|
computed: {
|
|
computed: {
|
|
|
|
|
+ csvInputElt(): HTMLInputElement {
|
|
|
|
|
+ return this.$refs.loadcsv as HTMLInputElement;
|
|
|
|
|
+ },
|
|
|
competenceList(): Array<Competence> {
|
|
competenceList(): Array<Competence> {
|
|
|
return this.$store.state.competenceList;
|
|
return this.$store.state.competenceList;
|
|
|
},
|
|
},
|
|
@@ -125,9 +140,111 @@ export default defineComponent({
|
|
|
onRowClick(row: { id: number }) {
|
|
onRowClick(row: { id: number }) {
|
|
|
this.currentBenevole = this.$store.getters.getBenevoleById(row.id);
|
|
this.currentBenevole = this.$store.getters.getBenevoleById(row.id);
|
|
|
},
|
|
},
|
|
|
|
|
+ getImportTemplate() {
|
|
|
|
|
+ const competences = this.$store.state.competenceList;
|
|
|
|
|
+ let csvContent = `${csvDefaultcolumn},${competences.map((c) => c.name).join(",")}\r\n`;
|
|
|
|
|
+ this.benevoleList.forEach(
|
|
|
|
|
+ (b) =>
|
|
|
|
|
+ (csvContent +=
|
|
|
|
|
+ [
|
|
|
|
|
+ b.id,
|
|
|
|
|
+ b.name,
|
|
|
|
|
+ b.surname,
|
|
|
|
|
+ b.phone,
|
|
|
|
|
+ b.email,
|
|
|
|
|
+ b.comment,
|
|
|
|
|
+ ...competences.map((c) => (b.competenceIdList.includes(c.id) ? "X" : "")),
|
|
|
|
|
+ ].join(",") + "\r\n")
|
|
|
|
|
+ );
|
|
|
|
|
+ const dummy = document.createElement("a");
|
|
|
|
|
+ dummy.href = "data:text/csv;charset=utf-8, " + encodeURI(csvContent);
|
|
|
|
|
+ dummy.download = "Benevole-import" + dayjs().format("-YYYY-MM-DD-hh-mm-ss[.csv]");
|
|
|
|
|
+ document.body.appendChild(dummy);
|
|
|
|
|
+ dummy.click();
|
|
|
|
|
+ },
|
|
|
|
|
+ importBenevoleTemplate() {
|
|
|
|
|
+ const fs = this.csvInputElt.files;
|
|
|
|
|
+ if (fs && fs.length > 0) {
|
|
|
|
|
+ let reader = new FileReader();
|
|
|
|
|
+ reader.readAsText(fs[0]);
|
|
|
|
|
+ reader.onload = () => {
|
|
|
|
|
+ let csvtxt = reader.result as string;
|
|
|
|
|
+ const arr = csv.toArray(csvtxt);
|
|
|
|
|
+ const defaultKey = csvDefaultcolumn.split(",");
|
|
|
|
|
+ const competencesMap: { [k: string]: Competence } = {};
|
|
|
|
|
+ for (let key of arr[0]) {
|
|
|
|
|
+ if (!defaultKey.includes(key)) {
|
|
|
|
|
+ key = key.trim();
|
|
|
|
|
+ // check if a competence exist with this name
|
|
|
|
|
+ let c = this.competenceList.find((c) => c.name == key);
|
|
|
|
|
+ if (c == undefined) {
|
|
|
|
|
+ Toast({ html: "Compétence inconnue: " + key, classes: "warning" });
|
|
|
|
|
+ c = Competence.fromObject({ name: key, description: "" });
|
|
|
|
|
+ this.$store.commit(MutationTypes.addConstraint, c);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (c) {
|
|
|
|
|
+ competencesMap[key] = c;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ const objectList = csv.toObject(csvtxt);
|
|
|
|
|
+ for (let item of objectList) {
|
|
|
|
|
+ const id = parseInt(item.id);
|
|
|
|
|
+
|
|
|
|
|
+ let b: Benevole | undefined = undefined;
|
|
|
|
|
+ if (id) b = this.$store.getters.getBenevoleById(id);
|
|
|
|
|
+ if (b == undefined) {
|
|
|
|
|
+ b = Benevole.fromObject({
|
|
|
|
|
+ id: id ?? undefined,
|
|
|
|
|
+ name: item.prenom,
|
|
|
|
|
+ surname: item.nom,
|
|
|
|
|
+ phone: item.telephone,
|
|
|
|
|
+ email: item.email,
|
|
|
|
|
+ comment: item.commentaire,
|
|
|
|
|
+ });
|
|
|
|
|
+ this.$store.commit(MutationTypes.addBenevole, b);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ let map: Array<{ k: string; v: keyof Benevole }> = [
|
|
|
|
|
+ { k: "prenom", v: "name" },
|
|
|
|
|
+ { k: "nom", v: "surname" },
|
|
|
|
|
+ { k: "telephone", v: "phone" },
|
|
|
|
|
+ { k: "commentaire", v: "comment" },
|
|
|
|
|
+ { k: "email", v: "email" },
|
|
|
|
|
+ ];
|
|
|
|
|
+ map.forEach((o) =>
|
|
|
|
|
+ this.$store.commit(MutationTypes.editBenevole, {
|
|
|
|
|
+ id: (b as Benevole).id,
|
|
|
|
|
+ field: o.v,
|
|
|
|
|
+ value: item[o.k],
|
|
|
|
|
+ })
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ const competenceIdList = [];
|
|
|
|
|
+ for (let key in competencesMap) {
|
|
|
|
|
+ if (item[key].trim() == "X") {
|
|
|
|
|
+ competenceIdList.push(competencesMap[key].id);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ this.$store.commit(MutationTypes.editBenevole, {
|
|
|
|
|
+ id: b.id,
|
|
|
|
|
+ field: "competenceIdList",
|
|
|
|
|
+ value: competenceIdList,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
},
|
|
},
|
|
|
mounted() {
|
|
mounted() {
|
|
|
this.loading = false;
|
|
this.loading = false;
|
|
|
|
|
+ this.customButton.push({ icon: "file_download", hide: false, onclick: this.getImportTemplate });
|
|
|
|
|
+ this.customButton.push({
|
|
|
|
|
+ icon: "file_upload",
|
|
|
|
|
+ hide: false,
|
|
|
|
|
+ onclick: () => {
|
|
|
|
|
+ this.csvInputElt.click();
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
},
|
|
},
|
|
|
});
|
|
});
|
|
|
</script>
|
|
</script>
|