forked from verdnatura/salix-front
refactor(customer_webAccess): FormModel
This commit is contained in:
parent
810e579ea9
commit
7612260359
|
@ -100,7 +100,6 @@ const isResetting = ref(false);
|
||||||
const hasChanges = ref(!$props.observeFormChanges);
|
const hasChanges = ref(!$props.observeFormChanges);
|
||||||
const originalData = ref({});
|
const originalData = ref({});
|
||||||
const formData = computed(() => state.get(modelValue));
|
const formData = computed(() => state.get(modelValue));
|
||||||
const formUrl = computed(() => $props.url);
|
|
||||||
const defaultButtons = computed(() => ({
|
const defaultButtons = computed(() => ({
|
||||||
save: {
|
save: {
|
||||||
color: 'primary',
|
color: 'primary',
|
||||||
|
@ -148,11 +147,14 @@ if (!$props.url)
|
||||||
(val) => updateAndEmit('onFetch', val)
|
(val) => updateAndEmit('onFetch', val)
|
||||||
);
|
);
|
||||||
|
|
||||||
watch(formUrl, async () => {
|
watch(
|
||||||
originalData.value = null;
|
() => [$props.url, $props.filter],
|
||||||
reset();
|
async () => {
|
||||||
await fetch();
|
originalData.value = null;
|
||||||
});
|
reset();
|
||||||
|
await fetch();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
onBeforeRouteLeave((to, from, next) => {
|
onBeforeRouteLeave((to, from, next) => {
|
||||||
if (hasChanges.value && $props.observeFormChanges)
|
if (hasChanges.value && $props.observeFormChanges)
|
||||||
|
|
|
@ -2,164 +2,81 @@
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { useQuasar } from 'quasar';
|
import { useQuasar } from 'quasar';
|
||||||
|
|
||||||
import { useValidator } from 'src/composables/useValidator';
|
|
||||||
import useNotify from 'src/composables/useNotify';
|
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
|
||||||
|
|
||||||
import FetchData from 'components/FetchData.vue';
|
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import CustomerChangePassword from 'src/pages/Customer/components/CustomerChangePassword.vue';
|
import CustomerChangePassword from 'src/pages/Customer/components/CustomerChangePassword.vue';
|
||||||
|
import FormModel from 'components/FormModel.vue';
|
||||||
|
|
||||||
const { notify } = useNotify();
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const { validate } = useValidator();
|
|
||||||
const quasar = useQuasar();
|
const quasar = useQuasar();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const stateStore = useStateStore();
|
|
||||||
|
|
||||||
const active = ref(false);
|
|
||||||
const canChangePassword = ref(0);
|
const canChangePassword = ref(0);
|
||||||
const email = ref(null);
|
|
||||||
const isLoading = ref(false);
|
|
||||||
const name = ref(null);
|
|
||||||
const usersPreviewRef = ref(null);
|
|
||||||
const user = ref([]);
|
|
||||||
|
|
||||||
const dataChanges = computed(() => {
|
const filter = computed(() => {
|
||||||
return (
|
return {
|
||||||
user.value.active !== active.value ||
|
fields: ['active', 'email', 'name'],
|
||||||
user.value.email !== email.value ||
|
where: { id: route.params.id },
|
||||||
user.value.name !== name.value
|
};
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const filter = { where: { id: `${route.params.id}` } };
|
|
||||||
|
|
||||||
const showChangePasswordDialog = () => {
|
const showChangePasswordDialog = () => {
|
||||||
quasar.dialog({
|
quasar.dialog({
|
||||||
component: CustomerChangePassword,
|
component: CustomerChangePassword,
|
||||||
componentProps: {
|
componentProps: {
|
||||||
id: route.params.id,
|
id: route.params.id,
|
||||||
promise: usersPreviewRef.value.fetch(),
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const setInitialData = () => {
|
async function hasCustomerRole() {
|
||||||
if (user.value.length) {
|
const { data } = await axios(`Clients/${route.params.id}/hasCustomerRole`);
|
||||||
active.value = user.value[0].active;
|
canChangePassword.value = data;
|
||||||
email.value = user.value[0].email;
|
}
|
||||||
name.value = user.value[0].name;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onSubmit = async () => {
|
|
||||||
isLoading.value = true;
|
|
||||||
|
|
||||||
const payload = {
|
|
||||||
active: active.value,
|
|
||||||
email: email.value,
|
|
||||||
name: name.value,
|
|
||||||
};
|
|
||||||
try {
|
|
||||||
await axios.patch(`Clients/${route.params.id}/updateUser`, payload);
|
|
||||||
notify('globals.dataSaved', 'positive');
|
|
||||||
if (usersPreviewRef.value) usersPreviewRef.value.fetch();
|
|
||||||
} catch (error) {
|
|
||||||
notify('errors.create', 'negative');
|
|
||||||
} finally {
|
|
||||||
isLoading.value = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<FetchData
|
<FormModel
|
||||||
|
url="VnUsers/preview"
|
||||||
|
:url-update="`Clients/${route.params.id}/updateUser`"
|
||||||
:filter="filter"
|
:filter="filter"
|
||||||
@on-fetch="
|
model="webAccess"
|
||||||
(data) => {
|
:mapper="
|
||||||
user = data;
|
({ active, name, email }) => {
|
||||||
setInitialData();
|
return {
|
||||||
|
active,
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
|
@on-fetch="hasCustomerRole()"
|
||||||
auto-load
|
auto-load
|
||||||
ref="usersPreviewRef"
|
>
|
||||||
url="VnUsers/preview"
|
<template #form="{ data, validate }">
|
||||||
/>
|
<QCheckbox :label="t('Enable web access')" v-model="data.active" />
|
||||||
<FetchData
|
<VnInput :label="t('User')" clearable v-model="data.name" />
|
||||||
:url="`Clients/${route.params.id}/hasCustomerRole`"
|
<VnInput
|
||||||
@on-fetch="(data) => (canChangePassword = data)"
|
:label="t('Recovery email')"
|
||||||
auto-load
|
:rules="validate('client.email')"
|
||||||
/>
|
clearable
|
||||||
|
type="email"
|
||||||
<Teleport to="#st-actions" v-if="stateStore?.isSubToolbarShown()">
|
v-model="data.email"
|
||||||
<QBtnGroup push class="q-gutter-x-sm">
|
class="q-mt-sm"
|
||||||
<QBtn
|
:info="t('This email is used for user to regain access their account')"
|
||||||
:disabled="isLoading"
|
|
||||||
:label="t('globals.reset')"
|
|
||||||
:loading="isLoading"
|
|
||||||
@click="setInitialData"
|
|
||||||
color="primary"
|
|
||||||
flat
|
|
||||||
icon="restart_alt"
|
|
||||||
type="reset"
|
|
||||||
/>
|
/>
|
||||||
|
</template>
|
||||||
|
<template #moreActions>
|
||||||
<QBtn
|
<QBtn
|
||||||
:disabled="isLoading"
|
|
||||||
:label="t('Change password')"
|
:label="t('Change password')"
|
||||||
:loading="isLoading"
|
|
||||||
@click.stop="showChangePasswordDialog()"
|
|
||||||
color="primary"
|
color="primary"
|
||||||
flat
|
|
||||||
icon="edit"
|
icon="edit"
|
||||||
v-if="canChangePassword"
|
:disable="!canChangePassword"
|
||||||
|
@click="showChangePasswordDialog()"
|
||||||
/>
|
/>
|
||||||
<QBtn
|
</template>
|
||||||
:disabled="isLoading || !dataChanges"
|
</FormModel>
|
||||||
:label="t('globals.save')"
|
|
||||||
:loading="isLoading"
|
|
||||||
@click="onSubmit"
|
|
||||||
color="primary"
|
|
||||||
icon="save"
|
|
||||||
/>
|
|
||||||
</QBtnGroup>
|
|
||||||
</Teleport>
|
|
||||||
|
|
||||||
<div class="full-width flex justify-center">
|
|
||||||
<QCard class="card-width q-pa-lg">
|
|
||||||
<QCardSection>
|
|
||||||
<QForm>
|
|
||||||
<QCheckbox :label="t('Enable web access')" v-model="active" />
|
|
||||||
|
|
||||||
<div class="q-px-sm">
|
|
||||||
<VnInput :label="t('User')" clearable v-model="name" />
|
|
||||||
<VnInput
|
|
||||||
:label="t('Recovery email')"
|
|
||||||
:rules="validate('client.email')"
|
|
||||||
clearable
|
|
||||||
type="email"
|
|
||||||
v-model="email"
|
|
||||||
class="q-mt-sm"
|
|
||||||
>
|
|
||||||
<template #append>
|
|
||||||
<QIcon name="info" class="cursor-pointer">
|
|
||||||
<QTooltip>{{
|
|
||||||
t(
|
|
||||||
'This email is used for user to regain access their account'
|
|
||||||
)
|
|
||||||
}}</QTooltip>
|
|
||||||
</QIcon>
|
|
||||||
</template>
|
|
||||||
</VnInput>
|
|
||||||
</div>
|
|
||||||
</QForm>
|
|
||||||
</QCardSection>
|
|
||||||
</QCard>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<i18n>
|
<i18n>
|
||||||
|
|
Loading…
Reference in New Issue