diff --git a/src/components/CreateNewCityForm.vue b/src/components/CreateNewCityForm.vue new file mode 100644 index 000000000..b028509e8 --- /dev/null +++ b/src/components/CreateNewCityForm.vue @@ -0,0 +1,117 @@ +<script setup> +import { reactive, ref } from 'vue'; +import { useI18n } from 'vue-i18n'; + +import FetchData from 'components/FetchData.vue'; +import VnRow from 'components/ui/VnRow.vue'; +import VnSelectFilter from 'src/components/common/VnSelectFilter.vue'; +import VnInput from 'src/components/common/VnInput.vue'; +import FormModel from 'components/FormModel.vue'; + +const emit = defineEmits(['onDataSaved']); + +const { t } = useI18n(); + +const cityFormData = reactive({ + name: null, + provinceFk: null, +}); + +const closeButton = ref(null); +const isLoading = ref(false); +const provincesOptions = ref([]); + +const onDataSaved = () => { + emit('onDataSaved'); + closeForm(); +}; + +const closeForm = () => { + if (closeButton.value) closeButton.value.click(); +}; +</script> + +<template> + <FetchData + @on-fetch="(data) => (provincesOptions = data)" + auto-load + url="Provinces" + /> + <FormModel + :form-initial-data="cityFormData" + :observe-form-changes="false" + :default-actions="false" + url-create="towns" + model="city" + @on-data-saved="onDataSaved()" + > + <template #form="{ data, validate }"> + <span ref="closeButton" class="close-icon" v-close-popup> + <QIcon name="close" size="22px" /> + </span> + <h1 class="title">{{ t('New city') }}</h1> + <p>{{ t('Please, ensure you put the correct data!') }}</p> + <VnRow class="row q-gutter-md q-mb-md"> + <div class="col"> + <VnInput + :label="t('Name')" + v-model="data.name" + :rules="validate('city.name')" + /> + </div> + <div class="col"> + <VnSelectFilter + :label="t('Province')" + :options="provincesOptions" + hide-selected + option-label="name" + option-value="id" + v-model="data.provinceFk" + :rules="validate('city.provinceFk')" + /> + </div> + </VnRow> + <div class="q-mt-lg row justify-end"> + <QBtn + :label="t('globals.save')" + type="submit" + color="primary" + :disabled="isLoading" + :loading="isLoading" + /> + <QBtn + :label="t('globals.cancel')" + type="reset" + color="primary" + flat + class="q-ml-sm" + :disabled="isLoading" + :loading="isLoading" + v-close-popup + /> + </div> + </template> + </FormModel> +</template> + +<style lang="scss" scoped> +.close-icon { + position: absolute; + top: 20px; + right: 20px; + cursor: pointer; +} +.title { + font-size: 17px; + font-weight: bold; + line-height: 20px; +} +</style> + +<i18n> +es: + New city: Nueva ciudad + Please, ensure you put the correct data!: ¡Por favor, asegúrese de poner los datos correctos! + Name: Nombre + Province: Provincia +</i18n> diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue index d4bd74e6d..0905f6bc3 100644 --- a/src/components/CreateNewPostcodeForm.vue +++ b/src/components/CreateNewPostcodeForm.vue @@ -7,6 +7,9 @@ import VnRow from 'components/ui/VnRow.vue'; import VnSelectFilter from 'src/components/common/VnSelectFilter.vue'; import VnInput from 'src/components/common/VnInput.vue'; import FormModel from 'components/FormModel.vue'; +import CreateNewCityForm from './CreateNewCityForm.vue'; +import CreateNewProvinceForm from './CreateNewProvinceForm.vue'; +import VnSelectCreate from 'components/common/VnSelectCreate.vue'; const emit = defineEmits(['onDataSaved']); @@ -19,6 +22,8 @@ const postcodeFormData = reactive({ townFk: null, }); +const townsFetchDataRef = ref(null); +const provincesFetchDataRef = ref(null); const closeButton = ref(null); const countriesOptions = ref([]); const isLoading = ref(false); @@ -30,6 +35,14 @@ const onDataSaved = () => { closeForm(); }; +const onCityCreated = async () => { + await townsFetchDataRef.value.fetch(); +}; + +const onProvinceCreated = async () => { + await provincesFetchDataRef.value.fetch(); +}; + const closeForm = () => { if (closeButton.value) closeButton.value.click(); }; @@ -37,11 +50,13 @@ const closeForm = () => { <template> <FetchData + ref="townsFetchDataRef" @on-fetch="(data) => (townsLocationOptions = data)" auto-load url="Towns/location" /> <FetchData + ref="provincesFetchDataRef" @on-fetch="(data) => (provincesOptions = data)" auto-load url="Provinces" @@ -74,20 +89,25 @@ const closeForm = () => { /> </div> <div class="col"> - <VnSelectFilter + <VnSelectCreate :label="t('City')" :options="townsLocationOptions" + v-model="data.townFk" hide-selected option-label="name" option-value="id" - v-model="data.townFk" :rules="validate('postcode.city')" - /> + :roles-allowed-to-create="['deliveryAssistant']" + > + <template #form> + <CreateNewCityForm @on-data-saved="onCityCreated($event)" /> + </template> + </VnSelectCreate> </div> </VnRow> <VnRow class="row q-gutter-md q-mb-xl"> <div class="col"> - <VnSelectFilter + <VnSelectCreate :label="t('Province')" :options="provincesOptions" hide-selected @@ -95,7 +115,14 @@ const closeForm = () => { option-value="id" v-model="data.provinceFk" :rules="validate('postcode.provinceFk')" - /> + :roles-allowed-to-create="['deliveryAssistant']" + > + <template #form> + <CreateNewProvinceForm + @on-data-saved="onProvinceCreated($event)" + /> + </template> + </VnSelectCreate> </div> <div class="col"> <VnSelectFilter diff --git a/src/components/CreateNewProvinceForm.vue b/src/components/CreateNewProvinceForm.vue new file mode 100644 index 000000000..1896aec3f --- /dev/null +++ b/src/components/CreateNewProvinceForm.vue @@ -0,0 +1,118 @@ +<script setup> +import { reactive, ref } from 'vue'; +import { useI18n } from 'vue-i18n'; + +import FetchData from 'components/FetchData.vue'; +import VnRow from 'components/ui/VnRow.vue'; +import VnSelectFilter from 'src/components/common/VnSelectFilter.vue'; +import VnInput from 'src/components/common/VnInput.vue'; +import FormModel from 'components/FormModel.vue'; + +const emit = defineEmits(['onDataSaved']); + +const { t } = useI18n(); + +const provinceFormData = reactive({ + name: null, + autonomyFk: null, +}); + +const closeButton = ref(null); +const isLoading = ref(false); +const autonomiesOptions = ref([]); + +const onDataSaved = () => { + emit('onDataSaved'); + closeForm(); +}; + +const closeForm = () => { + if (closeButton.value) closeButton.value.click(); +}; +</script> + +<template> + <FetchData + @on-fetch="(data) => (autonomiesOptions = data)" + auto-load + url="Autonomies" + /> + <FormModel + :form-initial-data="provinceFormData" + :observe-form-changes="false" + :default-actions="false" + url-create="provinces" + model="province" + @on-data-saved="onDataSaved()" + > + <template #form="{ data, validate }"> + <span ref="closeButton" class="close-icon" v-close-popup> + <QIcon name="close" size="22px" /> + </span> + <h1 class="title">{{ t('New province') }}</h1> + <p>{{ t('Please, ensure you put the correct data!') }}</p> + <VnRow class="row q-gutter-md q-mb-md"> + <div class="col"> + <VnInput + :label="t('Name')" + v-model="data.name" + :rules="validate('province.name')" + /> + </div> + <div class="col"> + <VnSelectFilter + :label="t('Autonomy')" + :options="autonomiesOptions" + hide-selected + option-label="name" + option-value="id" + v-model="data.autonomyFk" + :rules="validate('province.autonomyFk')" + /> + </div> + </VnRow> + + <div class="q-mt-lg row justify-end"> + <QBtn + :label="t('globals.save')" + type="submit" + color="primary" + :disabled="isLoading" + :loading="isLoading" + /> + <QBtn + :label="t('globals.cancel')" + type="reset" + color="primary" + flat + class="q-ml-sm" + :disabled="isLoading" + :loading="isLoading" + v-close-popup + /> + </div> + </template> + </FormModel> +</template> + +<style lang="scss" scoped> +.close-icon { + position: absolute; + top: 20px; + right: 20px; + cursor: pointer; +} +.title { + font-size: 17px; + font-weight: bold; + line-height: 20px; +} +</style> + +<i18n> +es: + New postcode: Nuevo código postal + Please, ensure you put the correct data!: ¡Por favor, asegúrese de poner los datos correctos! + Name: Nombre + Autonomy: Autonomía +</i18n>