Skip to content

Commit cd787a3

Browse files
committed
Added Instance removal from admin
1 parent 2c11270 commit cd787a3

File tree

7 files changed

+122
-7
lines changed

7 files changed

+122
-7
lines changed

src/components/Internship/Model_B/Model_B_Student_DirectApplication.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,13 @@ const directApplication = async () => {
8181
8282
<template>
8383
<component :is="Layout">
84-
<SectionMain>
84+
<SectionMain class="relative">
8585
<SectionTitleLineWithButton :icon="mdiLaptop" title="Moja Praksa" main> </SectionTitleLineWithButton>
8686
<p><b>Akademska godina:</b> {{ mainStore.academicYear }}</p>
8787
<p><b>Voditelj:</b> {{ mainStore.voditelj_prakse }}</p>
88-
<hr />
88+
89+
<br />
90+
<img src="/illustrations/guy_with_glasses.svg" class="absolute right-0 top-0 mb-12 mr-6 mt-4 hidden w-1/12 max-w-full md:block" />
8991
<br />
9092
<SectionTitleLineWithButton :icon="mdiClipboardText" main title="Direktna prijava na zadatak"></SectionTitleLineWithButton>
9193
<div class="flex flex-wrap text-base">Voditelj je odobrio zadatak koji ste prijavili u dogovoru s poslodavcem. Kako biste nastavili, morate se direktno prijaviti ispod. Ako ste već odradili praksu, molimo da to navedete u napomeni.</div>

src/components/Tables/TableStudents.vue

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import { watch } from "vue";
44
55
import { tableButtonMenuOptions } from "@/tableButtonMenuOptions.js";
66
import { StudentMappings, UserTaskMappings } from "@/helpers/maps";
7+
import CardBoxModal from "@/components/Cardbox/CardBoxModal.vue";
8+
import { mdiEye, mdiMenuDown, mdiCloseOutline } from "@mdi/js";
79
import ButtonMenu from "@/components/Premium/ButtonMenu.vue";
810
import BaseButtons from "@/components/Base/BaseButtons.vue";
911
import BaseButton from "@/components/Base/BaseButton.vue";
1012
import UserAvatar from "@/components/User/UserAvatar.vue";
1113
import BaseLevel from "@/components/Base/BaseLevel.vue";
1214
import PillTag from "@/components/PillTag/PillTag.vue";
1315
import LoadingOverlay from "../LoadingOverlay.vue";
14-
import { mdiEye, mdiMenuDown } from "@mdi/js";
1516
import { adminStore } from "@/main.js";
1617
import { useRoute } from "vue-router";
1718
@@ -22,6 +23,7 @@ const route = useRoute();
2223
2324
const sortDirection = ref("asc");
2425
const sortColumn = ref("ime");
26+
let instanceDeleteModalActive = ref(false);
2527
2628
function sortStudents(studentsList) {
2729
const sortedStudents = [...studentsList];
@@ -53,6 +55,7 @@ defineProps({
5355
5456
const students = computed(() => adminStore.students);
5557
const selectedStudentInstanceID = ref(null);
58+
const selectedStudentInstanceIDForDelete = ref(null);
5659
5760
const studentsFetched = computed(() => adminStore.studentsFetched);
5861
const emit = defineEmits(["show-student-diagram"]);
@@ -116,6 +119,14 @@ function showDiagram(student) {
116119
emit("show-student-diagram", student);
117120
}
118121
122+
function deleteProcessInstance(student) {
123+
selectedStudentInstanceIDForDelete.value = student["process_instance_id"];
124+
adminStore.setSelectedStudentForDelete(student);
125+
126+
instanceDeleteModalActive.value = true;
127+
console.log(adminStore.selectedStudentForDelete);
128+
}
129+
119130
onMounted(async () => {
120131
await adminStore.getStudents();
121132
if (route.params.process_instance_id) {
@@ -302,12 +313,28 @@ function toggleSortDirection(column) {
302313
<td class="whitespace-nowrap before:hidden lg:w-1">
303314
<BaseButtons type="justify-start lg:justify-end" no-wrap>
304315
<BaseButton color="fipu_blue" :icon="mdiEye" small @click="showDiagram(student)" />
316+
<BaseButton color="danger" :icon="mdiCloseOutline" small @click="deleteProcessInstance(student)" />
305317
</BaseButtons>
306318
</td>
307319
</tr>
308320
</tbody>
309321
</table>
310-
322+
<div v-if="instanceDeleteModalActive">
323+
<CardBoxModal v-model="instanceDeleteModalActive" title="Brisanje procesne instance" button="danger" has-cancel @confirm="adminStore.removeInstanceData()" button-label="Obriši">
324+
<p>
325+
<b>OPREZ!</b> Ova radnja će obrisati kompletnu procesnu instancu prakse za studenta: <b>{{ adminStore.selectedStudentForDelete.ime }} {{ adminStore.selectedStudentForDelete.prezime }}</b> uključujući sve podatke koje je student unio,
326+
generirane prijavnice i dnevnik prakse. <b>Radnja je nepovratna.</b>
327+
</p>
328+
<br />
329+
<p><b>ID procesne instance:</b> {{ adminStore.selectedStudentForDelete.process_instance_id }}</p>
330+
<p><b>Baserow id_preferencije:</b> {{ adminStore.selectedStudentForDelete["process_instance_data"]["variables"]["id_preferencije"] }}</p>
331+
<p><b>Baserow id_alokacija:</b> {{ adminStore.selectedStudentForDelete["process_instance_data"]["variables"]["id_alokacija"] }}</p>
332+
<p><b>Baserow id_prijavnica:</b> {{ adminStore.selectedStudentForDelete["process_instance_data"]["variables"]["id_prijavnica"] }}</p>
333+
<p><b>Baserow id_dnevnik_prakse:</b> {{ adminStore.selectedStudentForDelete["process_instance_data"]["variables"]["id_dnevnik_prakse"] }}</p>
334+
<p class="mt-2">Jeste li sigurni da želite obrisati instancu i sve podatke?</p>
335+
<br />
336+
</CardBoxModal>
337+
</div>
311338
<div class="border-t border-gray-100 p-3 dark:border-slate-800 lg:px-6">
312339
<BaseLevel>
313340
<BaseButtons>

src/helpers/axios-wrapper.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,11 @@ function createAxiosInstance(API_URL) {
5151
const response = await AxiosInstance.patch(endpoint, data, { headers });
5252
return response.data;
5353
},
54-
delete: async (endpoint, headers = {}) => {
55-
const response = await AxiosInstance.delete(endpoint, { headers });
54+
delete: async (endpoint, data = {}, headers = {}) => {
55+
const response = await AxiosInstance.delete(endpoint, {
56+
headers,
57+
data,
58+
});
5659
return response.data;
5760
},
5861
};

src/services/baserow_client_api.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,5 +181,29 @@ const Admin = {
181181
return null;
182182
}
183183
},
184+
async completeInstanceRemoval(data) {
185+
try {
186+
if (!data.process_instance_id) {
187+
throw new Error('"process_instance_id" is required');
188+
}
189+
190+
Object.keys(data).forEach((key) => {
191+
if (key !== "process_instance_id" && (data[key] === undefined || data[key] === null)) {
192+
delete data[key];
193+
}
194+
});
195+
196+
if (Object.keys(data).length === 0) {
197+
throw new Error("No valid data to send");
198+
}
199+
console.log("data im sending:", data);
200+
let result = await AxiosWrapper.delete("complete-deletion", data);
201+
console.log("Baserow process instance complete deletion result:", result);
202+
return result;
203+
} catch (error) {
204+
console.log("Error:", error);
205+
return null;
206+
}
207+
},
184208
};
185209
export { Guest, Admin, Student };

src/services/bpmn_engine_api.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,18 @@ const ProcessInstance = {
9393
return null;
9494
}
9595
},
96+
97+
async removeInstance(instance_id) {
98+
try {
99+
let result = await AxiosWrapper.delete(`/instance/${instance_id}`);
100+
console.log(`Successfuly removed instance with id: ${instance_id} from BPMN engine.`);
101+
return result;
102+
} catch (error) {
103+
console.log("Error:", error);
104+
105+
return null;
106+
}
107+
},
96108
};
97109

98110
export { ProcessInstance, Model };

src/stores/admin_store.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { mainStore } from "@/main";
44
import { Model, ProcessInstance } from "@/services/bpmn_engine_api";
55
import { Admin, Student } from "@/services/baserow_client_api";
66
import { SendGrid } from "@/services/sendgrid_client_api";
7+
import { snackBarStore } from "@/main";
78
import Utils from "@/helpers/utils";
89

910
// Define interfaces for state properties
@@ -58,10 +59,19 @@ interface Event {
5859
student_email?: string;
5960
}
6061

62+
interface InstanceRemovalData {
63+
process_instance_id: string;
64+
id_preferencije?: string;
65+
id_alokacija?: string;
66+
id_prijavnica?: string;
67+
id_dnevnik_prakse?: string;
68+
}
69+
6170
export const useAdminStore = defineStore("admin", {
6271
state: () => ({
6372
students: [] as Student[],
6473
selectedStudent: null as Student | null,
74+
selectedStudentForDelete: null as Student | null,
6575
companies: [] as any[],
6676
studentsFetched: false,
6777
newAssignments: [] as any[],
@@ -160,6 +170,11 @@ export const useAdminStore = defineStore("admin", {
160170
setSelectedStudent(student: Student | null) {
161171
this.selectedStudent = student;
162172
},
173+
174+
setSelectedStudentForDelete(student: Student | null) {
175+
this.selectedStudentForDelete = student;
176+
},
177+
163178
async getProcessInstanceData(student: Student) {
164179
try {
165180
const response = await ProcessInstance.get(student.process_instance_id);
@@ -324,6 +339,38 @@ export const useAdminStore = defineStore("admin", {
324339
console.log("[admin_store].sendAnAdditionalEmail(): ", error);
325340
}
326341
},
342+
async removeInstanceData() {
343+
const data = {
344+
process_instance_id: this.selectedStudentForDelete.process_instance_id,
345+
id_alokacija: this.selectedStudentForDelete?.process_instance_data?.variables?.id_alokacija,
346+
id_preferencije: this.selectedStudentForDelete?.process_instance_data?.variables?.id_preferencije,
347+
id_prijavnica: this.selectedStudentForDelete?.process_instance_data?.variables?.id_prijavnica,
348+
id_dnevnik_prakse: this.selectedStudentForDelete?.process_instance_data?.variables?.id_dnevnik_prakse,
349+
} as InstanceRemovalData;
350+
351+
console.log("data:::", data);
352+
353+
try {
354+
let process_instance_id = data.process_instance_id;
355+
356+
const response_engine = await ProcessInstance.removeInstance(process_instance_id);
357+
358+
let response_baserow = null;
359+
if (process_instance_id || data.id_alokacija || data.id_preferencije || data.id_prijavnica || data.id_dnevnik_prakse) {
360+
response_baserow = await Admin.completeInstanceRemoval(data);
361+
}
362+
363+
if (response_engine && (response_baserow !== null || data.id_alokacija === undefined)) {
364+
snackBarStore.pushMessage("Uspješno izbrisana instanca!", "success");
365+
return true;
366+
} else {
367+
return false;
368+
}
369+
} catch (error) {
370+
console.error("[admin_store].removeInstanceData(): ", error);
371+
throw error; // Rethrow the error so it can be handled upstream
372+
}
373+
},
327374
},
328375
persist: {
329376
storage: sessionStorage,

src/stores/main_store.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface Assignment {
1212

1313
export const useMainStore = defineStore("main", {
1414
state: () => ({
15-
praksa_version: "1.0.3",
15+
praksa_version: "1.1.0",
1616
academicYear: "2024/2025",
1717
voditelj_prakse: "doc. dr. sc. Ivan Lorencin",
1818

0 commit comments

Comments
 (0)