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(
|
||||||
|
() => [$props.url, $props.filter],
|
||||||
|
|||||||
|
async () => {
|
||||||
originalData.value = null;
|
originalData.value = null;
|
||||||
reset();
|
reset();
|
||||||
await fetch();
|
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`"
|
|
||||||
@on-fetch="(data) => (canChangePassword = data)"
|
|
||||||
auto-load
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Teleport to="#st-actions" v-if="stateStore?.isSubToolbarShown()">
|
|
||||||
<QBtnGroup push class="q-gutter-x-sm">
|
|
||||||
<QBtn
|
|
||||||
:disabled="isLoading"
|
|
||||||
:label="t('globals.reset')"
|
|
||||||
:loading="isLoading"
|
|
||||||
@click="setInitialData"
|
|
||||||
color="primary"
|
|
||||||
flat
|
|
||||||
icon="restart_alt"
|
|
||||||
type="reset"
|
|
||||||
/>
|
|
||||||
<QBtn
|
|
||||||
:disabled="isLoading"
|
|
||||||
:label="t('Change password')"
|
|
||||||
:loading="isLoading"
|
|
||||||
@click.stop="showChangePasswordDialog()"
|
|
||||||
color="primary"
|
|
||||||
flat
|
|
||||||
icon="edit"
|
|
||||||
v-if="canChangePassword"
|
|
||||||
/>
|
|
||||||
<QBtn
|
|
||||||
:disabled="isLoading || !dataChanges"
|
|
||||||
: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
|
<VnInput
|
||||||
:label="t('Recovery email')"
|
:label="t('Recovery email')"
|
||||||
:rules="validate('client.email')"
|
:rules="validate('client.email')"
|
||||||
clearable
|
clearable
|
||||||
type="email"
|
type="email"
|
||||||
v-model="email"
|
v-model="data.email"
|
||||||
class="q-mt-sm"
|
class="q-mt-sm"
|
||||||
>
|
:info="t('This email is used for user to regain access their account')"
|
||||||
<template #append>
|
/>
|
||||||
<QIcon name="info" class="cursor-pointer">
|
|
||||||
<QTooltip>{{
|
|
||||||
t(
|
|
||||||
'This email is used for user to regain access their account'
|
|
||||||
)
|
|
||||||
}}</QTooltip>
|
|
||||||
</QIcon>
|
|
||||||
</template>
|
</template>
|
||||||
</VnInput>
|
<template #moreActions>
|
||||||
</div>
|
<QBtn
|
||||||
</QForm>
|
:label="t('Change password')"
|
||||||
</QCardSection>
|
color="primary"
|
||||||
</QCard>
|
icon="edit"
|
||||||
</div>
|
:disable="!canChangePassword"
|
||||||
|
@click="showChangePasswordDialog()"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</FormModel>
|
||||||
</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