6943-customer_migration_subsection-v2 #591
|
@ -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
Aixina detecta els canvis del filter també
Pot ser en algun cas done fallo, en VnPaginate me ha pasat que detectava si en el onMounted fea un fetch, despres detectava el canvi de url/filter i tambe fea el fetch. De moment ho dixaria aixina. Prove a tirar els e2e
PD: els he tirat i no he vist ningun fallo