294 lines
11 KiB
Vue
294 lines
11 KiB
Vue
<script setup>
|
|
import { computed, onMounted, reactive, ref } from 'vue';
|
|
import CustomInput from './ui/CustomInput.vue';
|
|
import States from './ui/States.vue';
|
|
import Cities from './ui/Cities.vue';
|
|
import Spiner from './ui/Spiner.vue';
|
|
import { validateEmail } from '../helpers/validations';
|
|
import { useAuthStore } from '../stores/auth';
|
|
import { useCompanyStore } from '../stores/company';
|
|
import Swal from 'sweetalert2';
|
|
|
|
const props = defineProps({
|
|
user: {
|
|
type: Object,
|
|
required: false
|
|
}
|
|
});
|
|
|
|
onMounted(() => {
|
|
if(props.user) {
|
|
console.log(props.user)
|
|
userForm.name = props.user.first_name;
|
|
userForm.last_name = props.user.last_name;
|
|
userForm.email = props.user.email;
|
|
userForm.phone = props.user.phone;
|
|
// userForm.phone2 = props.user.phone2;
|
|
userForm.job_role = props.user.job_role;
|
|
// userForm.categories = props.user.categories;
|
|
userForm.user_city = props.user.user_city?.map(m =>{
|
|
return { city_name: m };
|
|
});
|
|
userForm.user_state = props.user.user_state?.map(m =>{
|
|
return { state_name:m };
|
|
});
|
|
// userForm.truck_type = props.user.truck_type?.map(m =>{
|
|
// return { meta_value:m };
|
|
// });
|
|
userForm.user_description = props.user.user_description;
|
|
} else {
|
|
Object.assign(userForm, initState);
|
|
}
|
|
})
|
|
|
|
const authStore = useAuthStore();
|
|
const companyStore = useCompanyStore();
|
|
|
|
const initState = {
|
|
name: '',
|
|
last_name: '',
|
|
email: '',
|
|
phone: '',
|
|
// phone2: '',
|
|
job_role: '',
|
|
// categories: [],
|
|
user_city: [],
|
|
user_state: [],
|
|
// truck_type: [],
|
|
user_description: '',
|
|
};
|
|
|
|
const userForm = reactive({
|
|
...initState
|
|
})
|
|
|
|
const errors = ref({
|
|
name: null,
|
|
last_name: null,
|
|
email: null,
|
|
phone: null,
|
|
})
|
|
|
|
const formRef = ref(null);
|
|
const loading = ref(false);
|
|
|
|
const title = computed(() => {
|
|
return (props.user) ? 'Editar usuario' : 'Crear usuario';
|
|
});
|
|
|
|
defineEmits(['reset-user']);
|
|
|
|
const saveUser = async() => {
|
|
validations()
|
|
if(errors.value.name || errors.value.last_name || errors.value.email || errors.value.phone){
|
|
return;
|
|
} else {
|
|
let userData ={
|
|
first_name: userForm.name,
|
|
last_name: userForm.last_name,
|
|
email: userForm.email,
|
|
phone: userForm.phone,
|
|
// phone2: userForm.phone2,
|
|
job_role: userForm.job_role,
|
|
permissions: authStore.user.permissions,
|
|
company: authStore.user.company,
|
|
// categories: userForm.categories?.length <= 0 ? null : userForm.categories?.map((e) => e._id),
|
|
user_city: userForm.user_city?.length <= 0 ? null : userForm.user_city?.map((e) => e.city_name),
|
|
user_state: userForm.user_state?.length <= 0 ? null : userForm.user_state?.map((e) => e.state_name),
|
|
// truck_type: userForm.truck_type?.length <= 0 ? null : userForm.truck_type?.map((e) => e.meta_value),
|
|
user_description: userForm.user_description
|
|
}
|
|
|
|
|
|
const dataUpdate = {
|
|
// categories: userForm.categories,
|
|
name: userForm.name + ' ' + userForm.last_name
|
|
}
|
|
|
|
let result = 'error';
|
|
let action = 'Creado';
|
|
loading.value = true;
|
|
if(props.user !== null) {
|
|
// Se actualiza
|
|
result = await companyStore.updateUserCompany(props.user._id, userData, dataUpdate);
|
|
action = 'actualizado';
|
|
} else {
|
|
// Se crea
|
|
result = await companyStore.createUserCompany(userData, dataUpdate);
|
|
action = 'creado';
|
|
}
|
|
loading.value = false;
|
|
if(result === 'success') {
|
|
document.getElementById('btnCloseuserModal').click();
|
|
Swal.fire({
|
|
title: `<strong>Usuario ${action} con éxito!</strong>`,
|
|
icon: 'success'
|
|
})
|
|
} else {
|
|
Swal.fire({
|
|
title: result,
|
|
icon: 'error'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
const validations = () => {
|
|
errors.value = {
|
|
name: userForm.name.length < 4 ? 'Ingrese nombre' : null,
|
|
last_name: userForm.last_name.length <= 1 ? 'Ingrese apellido' : null,
|
|
email: !validateEmail(userForm.email) ? 'Ingrese email valido' : null,
|
|
phone: userForm.phone.length < 10 ? 'Ingrese numero teléfonico valido' : null,
|
|
};
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div class="modal fade" id="userModal" tabindex="-1" role="dialog" aria-labelledby="userModal" aria-hidden="true">
|
|
<div class="modal-dialog modal-dialog-centered modal-xl" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h2 class="title mt-2 mb-3">{{ title }}</h2>
|
|
<button
|
|
id="btnCloseuserModal"
|
|
type="button"
|
|
@click="$emit('reset-user')"
|
|
class="close bg-white" data-dismiss="modal" aria-label="Close">
|
|
<span aria-hidden="true">×</span>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body form-content">
|
|
<form @submit.prevent="saveUser" autocomplete="off" method="post" ref="formRef">
|
|
<CustomInput
|
|
label="Nombre(s)*"
|
|
name="name"
|
|
v-model:field="userForm.name"
|
|
:filled="false"
|
|
:error="errors.name"
|
|
/>
|
|
<CustomInput
|
|
label="Apellido(s)*"
|
|
name="lastname"
|
|
v-model:field="userForm.last_name"
|
|
:filled="false"
|
|
:error="errors.last_name"
|
|
/>
|
|
<CustomInput
|
|
label="Teléfono*"
|
|
name="phone1"
|
|
type="number"
|
|
v-model:field="userForm.phone"
|
|
:filled="false"
|
|
:step="1"
|
|
|
|
:error="errors.phone"
|
|
/>
|
|
<CustomInput
|
|
label="Correo electronico*"
|
|
name="email"
|
|
type="email"
|
|
v-model:field="userForm.email"
|
|
:readonly="(props.user) ? true : false"
|
|
:filled="false"
|
|
:error="errors.email"
|
|
/>
|
|
<div class="d-flex flex-column">
|
|
<label class="custom-label" for="role">Rol de usuario:</label>
|
|
<select
|
|
class="custom-input-light"
|
|
name="role"
|
|
id="role"
|
|
v-model="userForm.job_role"
|
|
>
|
|
<option disabled value="">-- Seleccionar rol --</option>
|
|
<!-- <option value="owner">Dueño</option> -->
|
|
<option value="manager">Gerente</option>
|
|
<option value="staff">Personal</option>
|
|
<option v-if="authStore.user?.permissions === 'role_carrier'" value="driver">Conductor</option>
|
|
</select>
|
|
</div>
|
|
<!-- <div class="mb-4 mt-3">
|
|
<label class="custom-label">Segmento</label>
|
|
<Segments
|
|
v-model="userForm.categories"
|
|
:multiple="true"
|
|
/>
|
|
</div> -->
|
|
<!-- <div class="mb-4 mt-3">
|
|
<label class="custom-label">Tipo de transporte que utiliza</label>
|
|
<TruckTypes
|
|
v-model="userForm.truck_type"
|
|
:multiple="true"
|
|
/>
|
|
</div> -->
|
|
<div class="mb-4 mt-3">
|
|
<label class="custom-label">Locaciones de carga por estado</label>
|
|
<States
|
|
v-model="userForm.user_state"
|
|
:multiple="true"
|
|
/>
|
|
</div>
|
|
<div class="mb-4 mt-3">
|
|
<label class="custom-label">Locaciones de carga por municipio</label>
|
|
<Cities
|
|
v-model="userForm.user_city"
|
|
:multiple="true"
|
|
/>
|
|
</div>
|
|
<div class="d-flex flex-column">
|
|
<label class="custom-label" for="description">Información adicional del usuario:</label>
|
|
<textarea
|
|
class="custom-input-light"
|
|
name="description"
|
|
id="description"
|
|
placeholder="Escribe aqui..."
|
|
v-model="userForm.user_description"
|
|
></textarea>
|
|
</div>
|
|
<div class="box-info" v-if="!props.user">
|
|
<div>
|
|
<i class="fa-solid fa-circle-info info"></i>
|
|
</div>
|
|
<span>Al crear un nuevo usuario, informa al beneficiario de la cuenta, que debe utilizar su correo electrónico para establecer una contraseña en la sección <span class="font-bold">Olvidé mi contraseña</span> y así poder iniciar sesión.</span>
|
|
</div>
|
|
<div class="mt-4 text-center">
|
|
<Spiner v-if="loading"/>
|
|
<button
|
|
v-else
|
|
class="btn btn-dark" type="submit">Guardar</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button
|
|
type="button"
|
|
class="btn btn-dark"
|
|
@click="$emit('reset-user')"
|
|
data-dismiss="modal">Cerrar</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.form-content {
|
|
margin: 0 auto;
|
|
width: 80%;
|
|
}
|
|
|
|
.box-info {
|
|
margin-top: 20px;
|
|
align-items: center;
|
|
background-color: aqua;
|
|
display: flex;
|
|
padding: 16px 24px;
|
|
border-radius: 13px;
|
|
font-size: 1rem;
|
|
}
|
|
|
|
.info {
|
|
font-size: 32px;
|
|
margin-right: 1rem;
|
|
}
|
|
</style> |