This repository has been archived on 2023-10-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
pocketbase-quasar-lista/src/pages/IndexPage.vue
2023-03-13 12:03:39 +01:00

188 lines
4.6 KiB
Vue

<template>
<div class="row q-mt-md q-mx-md">
<div class="col">
<q-btn
round
color="deep-orange"
icon="keyboard_return"
@click="
cargarDatos();
$router.push('/');
"
/>
</div>
<div class="col-12 flex flex-center">
<q-avatar size="96px">
<q-img :src="fuenteImagen" />
</q-avatar>
</div>
</div>
<div class="row">
<div class="col-2"></div>
<div class="col">
<q-form class="q-gutter-md" @click.once="recibeDatos()">
<q-file outlined v-model="imagen" label="Avatar" class="q-py-md" />
<q-input
outlined
v-model="name"
label="Name"
:rules="[
(val) => (val != null && val.length >= 3) || 'Mínimo 3 caracteres',
]"
/>
<q-input
outlined
v-model="username"
label="Username"
:rules="[
(val) => (val != null && val.length >= 3) || 'Mínimo 3 caracteres',
(val) => comprobarUsername || 'Ya existe en la BD',
(val) => /^[A-Z0-9]+$/i.test(val) || 'Sólo letras o números',
]"
/>
<q-input
outlined
v-model="listaStore.pb.authStore.model.email"
label="email"
disable
/>
</q-form>
<div class="row q-mt-md q-mx-auto">
<q-btn
class="col-6"
flat
color="primary"
label="Cancelar"
@click="cargarDatos()"
/>
<q-btn
class="col-6"
flat
:disable="btnSaveDisable()"
color="secondary"
label="Guardar"
@click="alertSave = true"
/>
</div>
</div>
<div class="col-2"></div>
</div>
<q-dialog v-model="alertSave" persistent>
<q-card>
<q-card-section class="row items-center">
<q-avatar icon="warning" color="warning" text-color="white" />
<span class="q-ml-sm">Está seguro de guardar los datos?</span>
</q-card-section>
<q-card-actions align="right">
<q-btn
flat
label="No"
color="negative"
v-close-popup
@click="cargarDatos()"
/>
<q-btn
flat
label="Guardar"
color="accent"
v-close-popup
@click="updateUser()"
/>
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script setup>
import { ref, computed, onMounted } from "vue";
import { useListaStore } from "../stores/lista.js";
const listaStore = useListaStore();
const imagen = ref(null);
const fuenteImagen = ref(null);
const username = ref(listaStore.pb.authStore.model.username);
const name = ref(listaStore.pb.authStore.model.name);
const alertSave = ref(false);
const usuarios = ref([]);
const updateUser = async () => {
const formData = new FormData();
if (username.value.trim().length > 0) {
formData.append("username", username.value.trim());
}
if (name.value.trim().length > 0) {
formData.append("name", name.value.trim());
}
if (imagen.value != null) {
formData.append("avatar", imagen.value);
}
await listaStore.pb
.collection("users")
.update(listaStore.pb.authStore.model.id, formData)
.then((r) => {
cargarDatos();
});
recibeDatos();
};
const cargarDatos = () => {
refrescarImagen();
imagen.value = null;
username.value = listaStore.pb.authStore.model.username.trim();
name.value = listaStore.pb.authStore.model.name.trim();
};
const recibeDatos = () => {
listaStore.getUsers().then(function (item) {
usuarios.value = item;
});
};
const comprobarUsername = computed(() => {
let filtro = usuarios.value?.filter(
(user) => user.username.toLowerCase() == username.value.trim().toLowerCase()
);
if (filtro.length == 0) {
return true;
} else if (
filtro.length == 1 &&
filtro[0].username == listaStore.pb.authStore.model.username
) {
return true;
}
return false;
});
const btnSaveDisable = () => {
if (
username.value == null ||
username.value.length < 3 ||
!comprobarUsername.value ||
!/^[A-Z0-9]+$/i.test(username.value) ||
name.value == null ||
name.value.length < 3
) {
return true;
}
return false;
};
const refrescarImagen = () => {
if (listaStore.pb.authStore.model.avatar.length > 0) {
fuenteImagen.value = listaStore.pb.getFileUrl(
listaStore.pb.authStore.model,
listaStore.pb.authStore.model.avatar
);
} else {
fuenteImagen.value = `https://cdn.quasar.dev/img/avatar.png`;
}
};
onMounted(() => {
refrescarImagen();
});
</script>