ADD: Vista gestión de membresías con creación y formulario
This commit is contained in:
parent
69937297dc
commit
98b55de050
@ -99,6 +99,15 @@ export default {
|
|||||||
title: 'Permisos de dirección'
|
title: 'Permisos de dirección'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
membership: {
|
||||||
|
title: 'Membresías',
|
||||||
|
create: {
|
||||||
|
title: 'Crear membresía',
|
||||||
|
description: 'Permite crear nuevas membresías.',
|
||||||
|
onSuccess: 'Membresía creada exitosamente',
|
||||||
|
onError: 'Error al crear la membresía'
|
||||||
|
}
|
||||||
|
},
|
||||||
app: {
|
app: {
|
||||||
theme: {
|
theme: {
|
||||||
dark: 'Tema oscuro',
|
dark: 'Tema oscuro',
|
||||||
|
|||||||
64
src/pages/App/Membership/Create.vue
Normal file
64
src/pages/App/Membership/Create.vue
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<script setup>
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
import { useRouter } from 'vue-router';
|
||||||
|
import { api, useForm } from '@Services/Api';
|
||||||
|
import { apiTo, transl, viewTo } from './Module';
|
||||||
|
|
||||||
|
import IconButton from '@Holos/Button/Icon.vue'
|
||||||
|
import Input from '@Holos/Form/Input.vue';
|
||||||
|
import Selectable from '@Holos/Form/Selectable.vue';
|
||||||
|
import PageHeader from '@Holos/PageHeader.vue';
|
||||||
|
import Form from './Form.vue'
|
||||||
|
|
||||||
|
/** Definidores */
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
/** Propiedades */
|
||||||
|
const form = useForm({
|
||||||
|
name: '',
|
||||||
|
paternal: '',
|
||||||
|
maternal: '',
|
||||||
|
curp: '',
|
||||||
|
membership_number: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
/** Métodos */
|
||||||
|
function submit() {
|
||||||
|
form.transform(data => ({
|
||||||
|
...data,
|
||||||
|
})).post(apiTo('store'), {
|
||||||
|
onSuccess: () => {
|
||||||
|
Notify.success(Lang('register.create.onSuccess'))
|
||||||
|
router.push(viewTo({ name: 'index' }));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Ciclos */
|
||||||
|
onMounted(() => {
|
||||||
|
api.get(route('system.roles'), {
|
||||||
|
onSuccess: (r) => {
|
||||||
|
roles.value = r.roles;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<PageHeader :title="transl('create.title')">
|
||||||
|
<RouterLink :to="viewTo({ name: 'index' })">
|
||||||
|
<IconButton
|
||||||
|
class="text-white"
|
||||||
|
icon="arrow_back"
|
||||||
|
:title="$t('return')"
|
||||||
|
filled
|
||||||
|
/>
|
||||||
|
</RouterLink>
|
||||||
|
</PageHeader>
|
||||||
|
<Form
|
||||||
|
action="create"
|
||||||
|
:form="form"
|
||||||
|
@submit="submit"
|
||||||
|
>
|
||||||
|
</Form>
|
||||||
|
</template>
|
||||||
67
src/pages/App/Membership/Form.vue
Normal file
67
src/pages/App/Membership/Form.vue
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<script setup>
|
||||||
|
import { transl } from './Module';
|
||||||
|
|
||||||
|
import PrimaryButton from '@Holos/Button/Primary.vue';
|
||||||
|
import Input from '@Holos/Form/Input.vue';
|
||||||
|
|
||||||
|
/** Eventos */
|
||||||
|
const emit = defineEmits([
|
||||||
|
'submit'
|
||||||
|
])
|
||||||
|
|
||||||
|
/** Propiedades */
|
||||||
|
defineProps({
|
||||||
|
action: {
|
||||||
|
default: 'create',
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
form: Object
|
||||||
|
})
|
||||||
|
|
||||||
|
/** Métodos */
|
||||||
|
function submit() {
|
||||||
|
emit('submit')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="w-full pb-2">
|
||||||
|
<p class="text-justify text-sm" v-text="transl(`${action}.description`)" />
|
||||||
|
</div>
|
||||||
|
<div class="w-full">
|
||||||
|
<form @submit.prevent="submit" class="grid gap-4 grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
|
||||||
|
<Input
|
||||||
|
v-model="form.name"
|
||||||
|
id="name"
|
||||||
|
:onError="form.errors.name"
|
||||||
|
autofocus
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
<Input
|
||||||
|
v-model="form.paternal"
|
||||||
|
id="paternal"
|
||||||
|
:onError="form.errors.paternal"
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
<Input
|
||||||
|
v-model="form.maternal"
|
||||||
|
id="maternal"
|
||||||
|
:onError="form.errors.maternal"
|
||||||
|
/>
|
||||||
|
<Input
|
||||||
|
v-model="form.curp"
|
||||||
|
id="Curp"
|
||||||
|
:onError="form.errors.curp"
|
||||||
|
type="text"
|
||||||
|
/>
|
||||||
|
<slot />
|
||||||
|
<div class="col-span-1 md:col-span-2 lg:col-span-3 xl:col-span-4 flex flex-col items-center justify-end space-y-4 mt-4">
|
||||||
|
<PrimaryButton
|
||||||
|
v-text="$t(action)"
|
||||||
|
:class="{ 'opacity-25': form.processing }"
|
||||||
|
:disabled="form.processing"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@ -1,9 +1,21 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import PageHeader from '@Holos/PageHeader.vue';
|
import { can, viewTo, } from "./Module";
|
||||||
import MembershipSection from '@App/MembershipSection.vue';
|
|
||||||
|
import SearcherHead from "@Holos/Searcher.vue";
|
||||||
|
import IconButton from '@Holos/Button/Icon.vue'
|
||||||
|
import MembershipSection from "@App/MembershipSection.vue";
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<PageHeader title="Cobro de Membresía" />
|
<SearcherHead title="Cobro de Membresía" @search="(x) => searcher.search(x)">
|
||||||
<MembershipSection />
|
<RouterLink v-if="can('create')" :to="viewTo({ name: 'create' })">
|
||||||
</template>
|
<IconButton
|
||||||
|
class="text-white"
|
||||||
|
icon="add"
|
||||||
|
:title="$t('crud.create')"
|
||||||
|
filled
|
||||||
|
/>
|
||||||
|
</RouterLink>
|
||||||
|
</SearcherHead>
|
||||||
|
<MembershipSection />
|
||||||
|
</template>
|
||||||
|
|||||||
21
src/pages/App/Membership/Module.js
Normal file
21
src/pages/App/Membership/Module.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import { lang } from '@Lang/i18n';
|
||||||
|
import { hasPermission } from '@Plugins/RolePermission.js';
|
||||||
|
|
||||||
|
// Ruta API
|
||||||
|
const apiTo = (name, params = {}) => route(`membership.${name}`, params)
|
||||||
|
|
||||||
|
// Ruta visual
|
||||||
|
const viewTo = ({ name = '', params = {}, query = {} }) => view({ name: `membership.${name}`, params, query })
|
||||||
|
|
||||||
|
// Obtener traducción del componente
|
||||||
|
const transl = (str) => lang(`membership.${str}`)
|
||||||
|
|
||||||
|
// Determina si un usuario puede hacer algo no en base a los permisos
|
||||||
|
const can = (permission) => true//hasPermission(`membership.${permission}`)
|
||||||
|
|
||||||
|
export {
|
||||||
|
can,
|
||||||
|
viewTo,
|
||||||
|
apiTo,
|
||||||
|
transl
|
||||||
|
}
|
||||||
@ -95,6 +95,11 @@ const router = createRouter({
|
|||||||
path: '',
|
path: '',
|
||||||
name: 'membership.index',
|
name: 'membership.index',
|
||||||
component: () => import('@Pages/App/Membership/Index.vue')
|
component: () => import('@Pages/App/Membership/Index.vue')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'create',
|
||||||
|
name: 'membership.create',
|
||||||
|
component: () => import('@Pages/App/Membership/Create.vue')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user