Juan Felipe Zapata Moreno 023fd8d2f8 Habilidades Puntuadas (#2)
Co-authored-by: Juan Felipe Zapata Moreno <zapata_pipe@hotmail.com>
Reviewed-on: #2
Co-authored-by: Juan Felipe Zapata Moreno <juan.zapata@golsystems.com.mx>
Co-committed-by: Juan Felipe Zapata Moreno <juan.zapata@golsystems.com.mx>
2025-07-17 19:50:45 +00:00

170 lines
4.4 KiB
Vue

<script setup>
import { goTo, transl } from "./Component";
import { Link, useForm } from "@inertiajs/vue3";
import { ref, computed, onMounted } from "vue";
import PageHeader from "@/Components/Dashboard/PageHeader.vue";
import GoogleIcon from "@/Components/Shared/GoogleIcon.vue";
import DashboardLayout from "@/Layouts/DashboardLayout.vue";
import DepartmentSelector from "@/Components/App/DepartmentSelector.vue";
import MainRoleSelector from "@/Components/App/MainRoleSelector.vue";
import SkillAssignment from "@/Components/App/SkillAssignment.vue";
const props = defineProps({
mainRoles: {
type: Array,
default: () => []
},
skills: {
type: Array,
default: () => []
},
scores: {
type: Array,
default: () => []
},
selectedRole: {
type: Object,
default: null
},
selectedDepartment: {
type: Object,
default: null
}
});
const selectedDepartment = ref(props.selectedDepartment);
const selectedMainRole = ref(props.selectedRole);
const form = useForm({
main_role_id: props.selectedRole?.id || '',
skills: []
});
// Obtener departamentos únicos
const departments = computed(() => {
const uniqueDepartments = [];
const seenIds = new Set();
props.mainRoles.forEach(role => {
if (role.department && !seenIds.has(role.department.id)) {
seenIds.add(role.department.id);
uniqueDepartments.push(role.department);
}
});
return uniqueDepartments;
});
// Filtrar habilidades por departamento seleccionado
const departmentSkills = computed(() => {
if (!selectedDepartment.value) return [];
return props.skills.filter(skill =>
skill.department_id === selectedDepartment.value.id
);
});
const handleDepartmentSelect = (department) => {
selectedDepartment.value = department;
selectedMainRole.value = null;
form.main_role_id = '';
};
const handleRoleSelect = (role) => {
selectedMainRole.value = role;
form.main_role_id = role.id;
};
const submit = (skillsData) => {
form.skills = skillsData;
form.post(route(goTo("store")), {
onSuccess: () => {
// Redireccionar al index
},
onError: () => {
// Mostrar mensaje de error
},
});
};
const goBack = () => {
if (selectedMainRole.value) {
selectedMainRole.value = null;
form.main_role_id = '';
} else if (selectedDepartment.value) {
selectedDepartment.value = null;
}
};
onMounted(() => {
// Si tenemos rol seleccionado, asegurar que el departamento también esté seleccionado
if (props.selectedRole && props.selectedRole.department) {
selectedDepartment.value = props.selectedRole.department;
selectedMainRole.value = props.selectedRole;
form.main_role_id = props.selectedRole.id;
}
});
</script>
<template>
<DashboardLayout :title="transl('create.title')">
<PageHeader>
<Link :href="route(goTo('index'))">
<GoogleIcon
:title="$t('return')"
class="btn-icon-primary"
name="arrow_back"
outline
/>
</Link>
</PageHeader>
<div class="w-full pb-8">
<div class="mt-8">
<p v-text="transl('create.description')" />
</div>
</div>
<div class="w-full">
<!-- Navegación hacia atrás -->
<div v-if="selectedDepartment || selectedMainRole" class="mb-6">
<button
@click="goBack"
class="text-primary hover:underline flex items-center gap-2"
>
<GoogleIcon name="arrow_back" class="w-4 h-4" />
<span v-if="selectedMainRole">Cambiar rol principal</span>
<span v-else-if="selectedDepartment">Cambiar departamento</span>
</button>
</div>
<!-- Paso 1: Selector de Departamento -->
<DepartmentSelector
v-if="!selectedDepartment"
:departments="departments"
@select="handleDepartmentSelect"
/>
<!-- Paso 2: Selector de Rol Principal -->
<MainRoleSelector
v-else-if="selectedDepartment && !selectedMainRole"
:selectedDepartment="selectedDepartment"
:mainRoles="mainRoles"
@select="handleRoleSelect"
/>
<!-- Paso 3: Asignación de Habilidades -->
<SkillAssignment
v-else-if="selectedDepartment && selectedMainRole"
:form="form"
:skills="departmentSkills"
:scores="scores"
:selectedDepartment="selectedDepartment"
:selectedMainRole="selectedMainRole"
@submit="submit"
/>
</div>
</DashboardLayout>
</template>