Juan Felipe Zapata Moreno df8a4c258a Habilidades Puntuadas
2025-07-07 16:37:22 -06:00

164 lines
4.2 KiB
Vue

<script setup>
import { goTo, transl } from "./Component";
import { Link, useForm } from "@inertiajs/vue3";
import { ref, computed } from "vue";
import PrimaryButton from "@/Components/Dashboard/Button/Primary.vue";
import SecondaryButton from "@/Components/Dashboard/Button/Secondary.vue";
import PageHeader from "@/Components/Dashboard/PageHeader.vue";
import GoogleIcon from "@/Components/Shared/GoogleIcon.vue";
import DashboardLayout from "@/Layouts/DashboardLayout.vue";
// Componentes específicos para el flujo
import StepIndicator from "@/Components/App/StepIndicator.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: Object,
skills: Object,
scores: Object,
});
// Estado del flujo
const currentStep = ref(1);
const selectedDepartment = ref(null);
const selectedMainRole = ref(null);
const form = useForm({
main_role_id: "",
skill_id: "",
scored_id: "",
});
// Datos computados
const uniqueDepartments = computed(() => {
const deps = [];
const seen = new Set();
props.mainRoles.forEach((role) => {
if (role.department && !seen.has(role.department.id)) {
seen.add(role.department.id);
deps.push(role.department);
}
});
return deps;
});
// Métodos de navegación
const handleDepartmentSelect = (department) => {
selectedDepartment.value = department;
currentStep.value = 2;
};
const handleMainRoleSelect = (mainRole) => {
selectedMainRole.value = mainRole;
form.main_role_id = mainRole.id;
currentStep.value = 3;
};
const goBack = () => {
if (currentStep.value === 3) {
selectedMainRole.value = null;
form.main_role_id = "";
form.skill_id = "";
form.scored_id = "";
currentStep.value = 2;
} else if (currentStep.value === 2) {
selectedDepartment.value = null;
selectedMainRole.value = null;
form.reset();
currentStep.value = 1;
}
};
const resetFlow = () => {
selectedDepartment.value = null;
selectedMainRole.value = null;
form.reset();
currentStep.value = 1;
};
const submit = (skillArray) => {
const skillsData = skillArray.map(skill => ({
skill_id: skill.skill_id,
scored_id: skill.scored_id,
}));
form
.transform((data) => ({
main_role_id: data.main_role_id,
skills: skillsData
}))
.post(route(goTo("store")), {
onSuccess: () => {
Notify.success(transl("create.onSuccess"));
resetFlow();
},
onError: () => Notify.error(transl("create.onError")),
});
};
</script>
<template>
<DashboardLayout :title="transl('create.title')">
<PageHeader>
<div class="flex items-center space-x-2">
<Link :href="route(goTo('index'))">
<GoogleIcon
:title="$t('return')"
class="btn-icon-primary"
name="arrow_back"
outline
/>
</Link>
</div>
</PageHeader>
<!-- Indicador de progreso componentizado -->
<div class="mt-6">
<StepIndicator :current-step="currentStep" />
<div class="flex justify-center gap-2">
<SecondaryButton v-if="currentStep > 1" @click="goBack" type="button">
<GoogleIcon name="keyboard_backspace" class="mr-2" />
{{ $t("Regresar") }}
</SecondaryButton>
<SecondaryButton
v-if="currentStep > 1"
@click="resetFlow"
type="button"
>
<GoogleIcon name="refresh" class="mr-2" />
{{ $t("Inicio") }}
</SecondaryButton>
</div>
</div>
<!-- Componentes de pasos -->
<DepartmentSelector
v-if="currentStep === 1"
:departments="uniqueDepartments"
@select="handleDepartmentSelect"
/>
<MainRoleSelector
v-if="currentStep === 2"
:main-roles="mainRoles"
:selected-department="selectedDepartment"
@select="handleMainRoleSelect"
/>
<SkillAssignment
v-if="currentStep === 3"
:form="form"
:skills="skills"
:scores="scores"
:selected-department="selectedDepartment"
:selected-main-role="selectedMainRole"
@submit="submit"
/>
</DashboardLayout>
</template>