|
@@ -0,0 +1,132 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <q-dialog ref="dialogRef" @hide="onDialogHide">
|
|
|
|
|
+ <q-card class="q-dialog-plugin overflow-hidden" style="width: 560px; max-width: 95vw">
|
|
|
|
|
+ <DefaultDialogHeader :title="() => $t('associado.pending_approval_dialog_title')" @close="onDialogCancel" />
|
|
|
|
|
+ <q-card-section class="q-gutter-y-sm q-pt-none">
|
|
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
|
|
+ <div class="col-8">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("common.terms.name") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.name ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-4">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("common.terms.status") }}</div>
|
|
|
|
|
+ <q-badge
|
|
|
|
|
+ :color="getStatusColor(associado.status)"
|
|
|
|
|
+ :label="$t(getStatusI18nKey(associado.status))"
|
|
|
|
|
+ class="text-capitalize q-mt-xs"
|
|
|
|
|
+ outline
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
|
|
+ <div class="col-8">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("common.terms.email") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.email ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-4">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("common.terms.cpf") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.cpf ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <q-separator class="q-my-sm" />
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
|
|
+ <div class="col-6">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("associado.registration") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.registration ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-6">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("associado.position") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.position?.name ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
|
|
+ <div class="col-6">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("associado.sector") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.sector?.name ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="col-6">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("associado.admission_date") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.admission_date ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row q-col-gutter-sm">
|
|
|
|
|
+ <div class="col-6">
|
|
|
|
|
+ <div class="text-caption text-grey-7">{{ $t("associado.validity") }}</div>
|
|
|
|
|
+ <div class="text-body1">{{ associado.expiry_date ?? "—" }}</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </q-card-section>
|
|
|
|
|
+
|
|
|
|
|
+ <q-card-actions>
|
|
|
|
|
+ <q-space />
|
|
|
|
|
+ <q-btn
|
|
|
|
|
+ outline
|
|
|
|
|
+ color="negative"
|
|
|
|
|
+ :label="$t('associado.pending_refuse')"
|
|
|
|
|
+ :loading="loading === 'refuse'"
|
|
|
|
|
+ :disable="!!loading"
|
|
|
|
|
+ @click="onRefuse"
|
|
|
|
|
+ />
|
|
|
|
|
+ <q-btn
|
|
|
|
|
+ unelevated
|
|
|
|
|
+ color="violet-normal"
|
|
|
|
|
+ :label="$t('associado.pending_approve')"
|
|
|
|
|
+ :loading="loading === 'approve'"
|
|
|
|
|
+ :disable="!!loading"
|
|
|
|
|
+ @click="onApprove"
|
|
|
|
|
+ />
|
|
|
|
|
+ </q-card-actions>
|
|
|
|
|
+ </q-card>
|
|
|
|
|
+ </q-dialog>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script setup>
|
|
|
|
|
+import { ref } from "vue";
|
|
|
|
|
+import { useDialogPluginComponent, useQuasar } from "quasar";
|
|
|
|
|
+import { useI18n } from "vue-i18n";
|
|
|
|
|
+import { approveUser, refuseUser } from "src/api/user";
|
|
|
|
|
+import { getStatusColor, getStatusI18nKey } from "src/helpers/utils";
|
|
|
|
|
+
|
|
|
|
|
+import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
|
|
|
|
|
+
|
|
|
|
|
+defineEmits([...useDialogPluginComponent.emits]);
|
|
|
|
|
+
|
|
|
|
|
+const { associado } = defineProps({
|
|
|
|
|
+ associado: { type: Object, required: true },
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+const { t } = useI18n();
|
|
|
|
|
+const $q = useQuasar();
|
|
|
|
|
+const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent();
|
|
|
|
|
+
|
|
|
|
|
+const loading = ref(null);
|
|
|
|
|
+
|
|
|
|
|
+const onApprove = async () => {
|
|
|
|
|
+ loading.value = "approve";
|
|
|
|
|
+ try {
|
|
|
|
|
+ await approveUser(associado.id);
|
|
|
|
|
+ onDialogOK();
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ $q.notify({ type: "negative", message: t("http.errors.failed") });
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ loading.value = null;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const onRefuse = async () => {
|
|
|
|
|
+ loading.value = "refuse";
|
|
|
|
|
+ try {
|
|
|
|
|
+ await refuseUser(associado.id);
|
|
|
|
|
+ onDialogOK();
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ $q.notify({ type: "negative", message: t("http.errors.failed") });
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ loading.value = null;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+</script>
|