mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-30 21:21:09 -04:00 
			
		
		
		
	connect mail sender with api
This commit is contained in:
		| @ -3,75 +3,259 @@ | ||||
|     :title="$t('wizard.mail.mail_config')" | ||||
|     :description="$t('wizard.mail.mail_config_desc')" | ||||
|   > | ||||
|     <form action="" @submit.prevent="next"> | ||||
|       <component | ||||
|         :is="mailDriverStore.mail_driver" | ||||
|         :config-data="mailDriverStore.mailConfigData" | ||||
|         :is-saving="isSaving" | ||||
|         :is-fetching-initial-data="isFetchingInitialData" | ||||
|         @on-change-driver="(val) => changeDriver(val)" | ||||
|         @submit-data="next" | ||||
|       /> | ||||
|     <form action="" @submit.prevent="submitMailSenderData"> | ||||
|       <div class="p-4 sm:p-6 my-2"> | ||||
|         <!-- Name --> | ||||
|         <BaseInputGrid> | ||||
|           <BaseInputGroup | ||||
|             :label="$t(`${pre_t}.name`)" | ||||
|             :error="v$.name.$error && v$.name.$errors[0].$message" | ||||
|             :help-text="$t(`${pre_t}.name_help`)" | ||||
|             required | ||||
|           > | ||||
|             <BaseInput | ||||
|               v-model.trim="mailSenderStore.currentMailSender.name" | ||||
|               :invalid="v$.name.$error" | ||||
|               type="text" | ||||
|               @input="v$.name.$touch()" | ||||
|             /> | ||||
|           </BaseInputGroup> | ||||
|  | ||||
|           <!-- From Name --> | ||||
|           <BaseInputGroup | ||||
|             :label="$t(`${pre_t}.from_name`)" | ||||
|             :error="v$.from_name.$error && v$.from_name.$errors[0].$message" | ||||
|             required | ||||
|           > | ||||
|             <BaseInput | ||||
|               v-model="mailSenderStore.currentMailSender.from_name" | ||||
|               :invalid="v$.from_name.$error" | ||||
|               type="text" | ||||
|               @input="v$.from_name.$touch()" | ||||
|             /> | ||||
|           </BaseInputGroup> | ||||
|  | ||||
|           <!-- From Address --> | ||||
|           <BaseInputGroup | ||||
|             :label="$t(`${pre_t}.from_address`)" | ||||
|             :error=" | ||||
|               v$.from_address.$error && v$.from_address.$errors[0].$message | ||||
|             " | ||||
|             required | ||||
|           > | ||||
|             <BaseInput | ||||
|               v-model="mailSenderStore.currentMailSender.from_address" | ||||
|               :invalid="v$.from_address.$error" | ||||
|               type="text" | ||||
|               @input="v$.from_address.$touch()" | ||||
|             /> | ||||
|           </BaseInputGroup> | ||||
|  | ||||
|           <!-- CC --> | ||||
|           <BaseInputGroup | ||||
|             :label="$t(`${pre_t}.cc`)" | ||||
|             :error="v$.cc.$error && v$.cc.$errors[0].$message" | ||||
|             :help-text="$t(`${pre_t}.email_list`)" | ||||
|           > | ||||
|             <BaseInput | ||||
|               v-model="mailSenderStore.currentMailSender.cc" | ||||
|               :invalid="v$.cc.$error" | ||||
|               type="text" | ||||
|               @input="v$.cc.$touch()" | ||||
|             /> | ||||
|           </BaseInputGroup> | ||||
|  | ||||
|           <!-- BCC --> | ||||
|           <BaseInputGroup | ||||
|             :label="$t(`${pre_t}.bcc`)" | ||||
|             :error="v$.bcc.$error && v$.bcc.$errors[0].$message" | ||||
|             :help-text="$t(`${pre_t}.email_list`)" | ||||
|           > | ||||
|             <BaseInput | ||||
|               v-model="mailSenderStore.currentMailSender.bcc" | ||||
|               :invalid="v$.bcc.$error" | ||||
|               type="text" | ||||
|               @input="v$.bcc.$touch()" | ||||
|             /> | ||||
|           </BaseInputGroup> | ||||
|  | ||||
|           <!-- Mail Driver --> | ||||
|           <BaseInputGroup | ||||
|             :label="$t(`${pre_t}.driver`)" | ||||
|             :error="v$.driver.$error && v$.driver.$errors[0].$message" | ||||
|             required | ||||
|           > | ||||
|             <BaseMultiselect | ||||
|               v-model="mailSenderStore.currentMailSender.driver" | ||||
|               :options="mailSenderStore.mail_drivers" | ||||
|               :can-deselect="false" | ||||
|               :invalid="v$.driver.$error" | ||||
|             /> | ||||
|           </BaseInputGroup> | ||||
|  | ||||
|           <component | ||||
|             :is="loadMailDriver" | ||||
|             :mail-sender-store="mailSenderStore" | ||||
|           /> | ||||
|         </BaseInputGrid> | ||||
|  | ||||
|         <!-- Is Default? --> | ||||
|         <BaseSwitchSection | ||||
|           v-model="mailSenderStore.currentMailSender.is_default" | ||||
|           :title="$t(`${pre_t}.is_default`)" | ||||
|           :description="$t(`${pre_t}.is_default_description`)" | ||||
|         /> | ||||
|         <BaseDivider class="my-4" /> | ||||
|  | ||||
|         <BaseButton | ||||
|           :loading="isSaving" | ||||
|           :disabled="isSaving" | ||||
|           variant="primary" | ||||
|           type="submit" | ||||
|         > | ||||
|           <template #left="slotProps"> | ||||
|             <BaseIcon | ||||
|               v-if="!isSaving" | ||||
|               name="SaveIcon" | ||||
|               :class="slotProps.class" | ||||
|             /> | ||||
|           </template> | ||||
|           {{ $t('wizard.save_cont') }} | ||||
|         </BaseButton> | ||||
|       </div> | ||||
|     </form> | ||||
|   </BaseWizardStep> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Smtp from './mail-driver/SmtpMailDriver.vue' | ||||
| import Mailgun from './mail-driver/MailgunMailDriver.vue' | ||||
| import Ses from './mail-driver/SesMailDriver.vue' | ||||
| import Basic from './mail-driver/BasicMailDriver.vue' | ||||
| import { useMailDriverStore } from '@/scripts/admin/stores/mail-driver' | ||||
| import { ref } from 'vue' | ||||
| <script setup> | ||||
| import { computed, ref, inject, onMounted } from 'vue' | ||||
| import { useI18n } from 'vue-i18n' | ||||
| import { useMailSenderStore } from '@/scripts/admin/stores/mail-sender' | ||||
| import { useVuelidate } from '@vuelidate/core' | ||||
| import { required, email, minLength, helpers } from '@vuelidate/validators' | ||||
| import MailSenderDropdown from '@/scripts/admin/components/dropdowns/MailSenderIndexDropdown.vue' | ||||
| import MailSenderTestModal from '@/scripts/admin/components/modal-components/MailSenderTestModal.vue' | ||||
| import SmtpDriver from '@/scripts/admin/views/settings/mail-sender/SmtpDriver.vue' | ||||
| import MailgunDriver from '@/scripts/admin/views/settings/mail-sender/MailgunDriver.vue' | ||||
| import SesDriver from '@/scripts/admin/views/settings/mail-sender/SesDriver.vue' | ||||
|  | ||||
| export default { | ||||
|   components: { | ||||
|     Smtp, | ||||
|     Mailgun, | ||||
|     Ses, | ||||
|     sendmail: Basic, | ||||
|     Mail: Basic, | ||||
|   }, | ||||
| const pre_t = 'settings.mail_sender' | ||||
| const mailSenderStore = useMailSenderStore() | ||||
| const { t } = useI18n() | ||||
| const table = ref(null) | ||||
| const utils = inject('utils') | ||||
| let isSaving = ref(false) | ||||
| const emit = defineEmits(['next']) | ||||
|  | ||||
|   emits: ['next'], | ||||
| const loadMailDriver = computed(() => { | ||||
|   switch (mailSenderStore.currentMailSender.driver) { | ||||
|     case 'smtp': | ||||
|       return SmtpDriver | ||||
|       break | ||||
|     case 'mail': | ||||
|       return false | ||||
|       break | ||||
|     case 'sendmail': | ||||
|       return false | ||||
|       break | ||||
|     case 'mailgun': | ||||
|       return MailgunDriver | ||||
|       break | ||||
|     case 'ses': | ||||
|       return SesDriver | ||||
|       break | ||||
|     default: | ||||
|       return false | ||||
|   } | ||||
| }) | ||||
|  | ||||
|   setup(props, { emit }) { | ||||
|     const isSaving = ref(false) | ||||
|     const isFetchingInitialData = ref(false) | ||||
| // This is multiple email custom validation | ||||
| const multiEmail = (value) => { | ||||
|   if (value == '' || value === null) return true | ||||
|   const emailRegex = | ||||
|     /^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i | ||||
|  | ||||
|     const mailDriverStore = useMailDriverStore() | ||||
|  | ||||
|     mailDriverStore.mail_driver = 'mail' | ||||
|  | ||||
|     loadData() | ||||
|  | ||||
|     function changeDriver(value) { | ||||
|       mailDriverStore.mail_driver = value | ||||
|     } | ||||
|  | ||||
|     async function loadData() { | ||||
|       isFetchingInitialData.value = true | ||||
|       await mailDriverStore.fetchMailDrivers() | ||||
|       isFetchingInitialData.value = false | ||||
|     } | ||||
|  | ||||
|     async function next(mailConfigData) { | ||||
|       isSaving.value = true | ||||
|       let res = await mailDriverStore.updateMailConfig(mailConfigData) | ||||
|       isSaving.value = false | ||||
|  | ||||
|       if (res.data.success) { | ||||
|         await emit('next', 5) | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return { | ||||
|       mailDriverStore, | ||||
|       isSaving, | ||||
|       isFetchingInitialData, | ||||
|       changeDriver, | ||||
|       next, | ||||
|     } | ||||
|   }, | ||||
|   const emailArr = value.split(',') | ||||
|   let isValid = emailArr.every((v) => { | ||||
|     return emailRegex.test(v) | ||||
|   }) | ||||
|   return isValid | ||||
| } | ||||
|  | ||||
| const rules = computed(() => { | ||||
|   return { | ||||
|     name: { | ||||
|       required: helpers.withMessage(t('validation.required'), required), | ||||
|       minLength: helpers.withMessage( | ||||
|         t('validation.name_min_length', { count: 3 }), | ||||
|         minLength(3) | ||||
|       ), | ||||
|     }, | ||||
|     from_name: { | ||||
|       required: helpers.withMessage(t('validation.required'), required), | ||||
|     }, | ||||
|     from_address: { | ||||
|       required: helpers.withMessage(t('validation.required'), required), | ||||
|       email: helpers.withMessage(t('validation.email_incorrect'), email), | ||||
|     }, | ||||
|     cc: { | ||||
|       multiEmail: helpers.withMessage( | ||||
|         t('validation.email_incorrect'), | ||||
|         multiEmail | ||||
|       ), | ||||
|     }, | ||||
|     bcc: { | ||||
|       multiEmail: helpers.withMessage( | ||||
|         t('validation.email_incorrect'), | ||||
|         multiEmail | ||||
|       ), | ||||
|     }, | ||||
|     driver: { | ||||
|       required: helpers.withMessage(t('validation.required'), required), | ||||
|     }, | ||||
|   } | ||||
| }) | ||||
|  | ||||
| const v$ = useVuelidate( | ||||
|   rules, | ||||
|   computed(() => mailSenderStore.currentMailSender) | ||||
| ) | ||||
|  | ||||
| async function submitMailSenderData() { | ||||
|   v$.value.$touch() | ||||
|   if (v$.value.$invalid) { | ||||
|     return true | ||||
|   } | ||||
|   try { | ||||
|     const action = mailSenderStore.isEdit | ||||
|       ? mailSenderStore.updateMailSender | ||||
|       : mailSenderStore.addMailSender | ||||
|     isSaving.value = true | ||||
|  | ||||
|     var mailDriverConfig = null | ||||
|     switch (mailSenderStore.currentMailSender.driver) { | ||||
|       case 'smtp': | ||||
|         mailDriverConfig = mailSenderStore.smtpConfig | ||||
|         break | ||||
|       case 'mailgun': | ||||
|         mailDriverConfig = mailSenderStore.mailgunConfig | ||||
|         break | ||||
|       case 'ses': | ||||
|         mailDriverConfig = mailSenderStore.sesConfig | ||||
|         break | ||||
|     } | ||||
|     mailSenderStore.currentMailSender.settings = mailDriverConfig | ||||
|  | ||||
|     let res = await action(mailSenderStore.currentMailSender) | ||||
|     emit('next') | ||||
|     isSaving.value = false | ||||
|   } catch (err) { | ||||
|     isSaving.value = false | ||||
|     return true | ||||
|   } | ||||
| } | ||||
|  | ||||
| onMounted(async () => { | ||||
|   await mailSenderStore.fetchMailDrivers() | ||||
| }) | ||||
| </script> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user