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:
		| @ -1,158 +0,0 @@ | ||||
| <template> | ||||
|   <form @submit.prevent="saveEmailConfig"> | ||||
|     <BaseInputGrid> | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.driver')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.basicMailConfig.mail_driver.$error && | ||||
|           v$.basicMailConfig.mail_driver.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseMultiselect | ||||
|           v-model="mailDriverStore.basicMailConfig.mail_driver" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :options="mailDrivers" | ||||
|           :can-deselect="false" | ||||
|           :invalid="v$.basicMailConfig.mail_driver.$error" | ||||
|           @update:modelValue="onChangeDriver" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_mail')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.basicMailConfig.from_mail.$error && | ||||
|           v$.basicMailConfig.from_mail.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.basicMailConfig.from_mail" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="from_mail" | ||||
|           :invalid="v$.basicMailConfig.from_mail.$error" | ||||
|           @input="v$.basicMailConfig.from_mail.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_name')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.basicMailConfig.from_name.$error && | ||||
|           v$.basicMailConfig.from_name.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.basicMailConfig.from_name" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="name" | ||||
|           :invalid="v$.basicMailConfig.from_name.$error" | ||||
|           @input="v$.basicMailConfig.from_name.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|     </BaseInputGrid> | ||||
|     <div class="flex mt-8"> | ||||
|       <BaseButton | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :disabled="isSaving" | ||||
|         :loading="isSaving" | ||||
|         variant="primary" | ||||
|         type="submit" | ||||
|       > | ||||
|         <template #left="slotProps"> | ||||
|           <BaseIcon v-if="!isSaving" :class="slotProps.class" name="SaveIcon" /> | ||||
|         </template> | ||||
|         {{ $t('general.save') }} | ||||
|       </BaseButton> | ||||
|       <slot /> | ||||
|     </div> | ||||
|   </form> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import { onMounted, computed } from 'vue' | ||||
| import { required, email, helpers } from '@vuelidate/validators' | ||||
| import useVuelidate from '@vuelidate/core' | ||||
| import { useI18n } from 'vue-i18n' | ||||
| import { useMailDriverStore } from '@/scripts/admin/stores/mail-driver' | ||||
|  | ||||
| const props = defineProps({ | ||||
|   configData: { | ||||
|     type: Object, | ||||
|     require: true, | ||||
|     default: Object, | ||||
|   }, | ||||
|   isSaving: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   isFetchingInitialData: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   mailDrivers: { | ||||
|     type: Array, | ||||
|     require: true, | ||||
|     default: Array, | ||||
|   }, | ||||
| }) | ||||
|  | ||||
| const emit = defineEmits(['submit-data', 'on-change-driver']) | ||||
|  | ||||
| const mailDriverStore = useMailDriverStore() | ||||
| const { t } = useI18n() | ||||
|  | ||||
| const rules = computed(() => { | ||||
|   return { | ||||
|     basicMailConfig: { | ||||
|       mail_driver: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       from_mail: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|         email: helpers.withMessage(t('validation.email_incorrect'), email), | ||||
|       }, | ||||
|       from_name: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|     }, | ||||
|   } | ||||
| }) | ||||
|  | ||||
| const v$ = useVuelidate( | ||||
|   rules, | ||||
|   computed(() => mailDriverStore) | ||||
| ) | ||||
|  | ||||
| onMounted(() => { | ||||
|   for (const key in mailDriverStore.basicMailConfig) { | ||||
|     if (props.configData.hasOwnProperty(key)) { | ||||
|       mailDriverStore.$patch((state) => { | ||||
|         state.basicMailConfig[key] = props.configData[key] | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
| async function saveEmailConfig() { | ||||
|   v$.value.basicMailConfig.$touch() | ||||
|   if (!v$.value.basicMailConfig.$invalid) { | ||||
|     emit('submit-data', mailDriverStore.basicMailConfig) | ||||
|   } | ||||
|   return false | ||||
| } | ||||
|  | ||||
| function onChangeDriver() { | ||||
|   v$.value.basicMailConfig.mail_driver.$touch() | ||||
|   emit('on-change-driver', mailDriverStore.basicMailConfig.mail_driver) | ||||
| } | ||||
| </script> | ||||
| @ -1,247 +0,0 @@ | ||||
| <template> | ||||
|   <form @submit.prevent="saveEmailConfig"> | ||||
|     <BaseInputGrid> | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.driver')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.mailgunConfig.mail_driver.$error && | ||||
|           v$.mailgunConfig.mail_driver.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseMultiselect | ||||
|           v-model="mailDriverStore.mailgunConfig.mail_driver" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :options="mailDrivers" | ||||
|           :can-deselect="false" | ||||
|           :invalid="v$.mailgunConfig.mail_driver.$error" | ||||
|           @update:modelValue="onChangeDriver" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.mailgun_domain')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.mailgunConfig.mail_mailgun_domain.$error && | ||||
|           v$.mailgunConfig.mail_mailgun_domain.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_domain" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mailgun_domain" | ||||
|           :invalid="v$.mailgunConfig.mail_mailgun_domain.$error" | ||||
|           @input="v$.mailgunConfig.mail_mailgun_domain.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.mailgun_secret')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.mailgunConfig.mail_mailgun_secret.$error && | ||||
|           v$.mailgunConfig.mail_mailgun_secret.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_secret" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :type="getInputType" | ||||
|           name="mailgun_secret" | ||||
|           autocomplete="off" | ||||
|           :invalid="v$.mailgunConfig.mail_mailgun_secret.$error" | ||||
|           @input="v$.mailgunConfig.mail_mailgun_secret.$touch()" | ||||
|         > | ||||
|           <template #right> | ||||
|             <BaseIcon | ||||
|               v-if="isShowPassword" | ||||
|               class="mr-1 text-gray-500 cursor-pointer" | ||||
|               name="EyeOffIcon" | ||||
|               @click="isShowPassword = !isShowPassword" | ||||
|             /> | ||||
|             <BaseIcon | ||||
|               v-else | ||||
|               class="mr-1 text-gray-500 cursor-pointer" | ||||
|               name="EyeIcon" | ||||
|               @click="isShowPassword = !isShowPassword" | ||||
|             /> | ||||
|           </template> | ||||
|         </BaseInput> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.mailgun_endpoint')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.mailgunConfig.mail_mailgun_endpoint.$error && | ||||
|           v$.mailgunConfig.mail_mailgun_endpoint.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_endpoint" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mailgun_endpoint" | ||||
|           :invalid="v$.mailgunConfig.mail_mailgun_endpoint.$error" | ||||
|           @input="v$.mailgunConfig.mail_mailgun_endpoint.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_mail')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.mailgunConfig.from_mail.$error && | ||||
|           v$.mailgunConfig.from_mail.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.mailgunConfig.from_mail" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="from_mail" | ||||
|           :invalid="v$.mailgunConfig.from_mail.$error" | ||||
|           @input="v$.mailgunConfig.from_mail.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_name')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.mailgunConfig.from_name.$error && | ||||
|           v$.mailgunConfig.from_name.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.mailgunConfig.from_name" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="from_name" | ||||
|           :invalid="v$.mailgunConfig.from_name.$error" | ||||
|           @input="v$.mailgunConfig.from_name.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|     </BaseInputGrid> | ||||
|     <div class="flex my-10"> | ||||
|       <BaseButton | ||||
|         :disabled="isSaving" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :loading="isSaving" | ||||
|         variant="primary" | ||||
|         type="submit" | ||||
|       > | ||||
|         <template #left="slotProps"> | ||||
|           <BaseIcon v-if="!isSaving" name="SaveIcon" :class="slotProps.class" /> | ||||
|         </template> | ||||
|         {{ $t('general.save') }} | ||||
|       </BaseButton> | ||||
|       <slot /> | ||||
|     </div> | ||||
|   </form> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import { onMounted, ref, computed } from 'vue' | ||||
| import { required, email, helpers } from '@vuelidate/validators' | ||||
| import useVuelidate from '@vuelidate/core' | ||||
| import { useI18n } from 'vue-i18n' | ||||
| import { useMailDriverStore } from '@/scripts/admin/stores/mail-driver' | ||||
|  | ||||
| const props = defineProps({ | ||||
|   configData: { | ||||
|     type: Object, | ||||
|     require: true, | ||||
|     default: Object, | ||||
|   }, | ||||
|   isSaving: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   isFetchingInitialData: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   mailDrivers: { | ||||
|     type: Array, | ||||
|     require: true, | ||||
|     default: Array, | ||||
|   }, | ||||
| }) | ||||
|  | ||||
| const emit = defineEmits(['submit-data', 'on-change-driver']) | ||||
|  | ||||
| const mailDriverStore = useMailDriverStore() | ||||
| const { t } = useI18n() | ||||
|  | ||||
| let isShowPassword = ref(false) | ||||
|  | ||||
| const getInputType = computed(() => { | ||||
|   if (isShowPassword.value) { | ||||
|     return 'text' | ||||
|   } | ||||
|   return 'password' | ||||
| }) | ||||
|  | ||||
| const rules = computed(() => { | ||||
|   return { | ||||
|     mailgunConfig: { | ||||
|       mail_driver: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_mailgun_domain: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_mailgun_endpoint: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_mailgun_secret: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       from_mail: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|         email, | ||||
|       }, | ||||
|       from_name: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|     }, | ||||
|   } | ||||
| }) | ||||
|  | ||||
| const v$ = useVuelidate( | ||||
|   rules, | ||||
|   computed(() => mailDriverStore) | ||||
| ) | ||||
|  | ||||
| onMounted(() => { | ||||
|   for (const key in mailDriverStore.mailgunConfig) { | ||||
|     if (props.configData.hasOwnProperty(key)) { | ||||
|       mailDriverStore.mailgunConfig[key] = props.configData[key] | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
| async function saveEmailConfig() { | ||||
|   v$.value.mailgunConfig.$touch() | ||||
|   if (!v$.value.mailgunConfig.$invalid) { | ||||
|     emit('submit-data', mailDriverStore.mailgunConfig) | ||||
|   } | ||||
|   return false | ||||
| } | ||||
|  | ||||
| function onChangeDriver() { | ||||
|   v$.value.mailgunConfig.mail_driver.$touch() | ||||
|   emit('on-change-driver', mailDriverStore.mailgunConfig.mail_driver) | ||||
| } | ||||
| </script> | ||||
| @ -1,294 +0,0 @@ | ||||
| <template> | ||||
|   <form @submit.prevent="saveEmailConfig"> | ||||
|     <BaseInputGrid> | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.driver')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.mail_driver.$error && | ||||
|           v$.sesConfig.mail_driver.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseMultiselect | ||||
|           v-model="mailDriverStore.sesConfig.mail_driver" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :options="mailDrivers" | ||||
|           :can-deselect="false" | ||||
|           :invalid="v$.sesConfig.mail_driver.$error" | ||||
|           @update:modelValue="onChangeDriver" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.host')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.mail_host.$error && | ||||
|           v$.sesConfig.mail_host.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.sesConfig.mail_host" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mail_host" | ||||
|           :invalid="v$.sesConfig.mail_host.$error" | ||||
|           @input="v$.sesConfig.mail_host.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.port')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.mail_port.$error && | ||||
|           v$.sesConfig.mail_port.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.sesConfig.mail_port" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mail_port" | ||||
|           :invalid="v$.sesConfig.mail_port.$error" | ||||
|           @input="v$.sesConfig.mail_port.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.encryption')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.mail_encryption.$error && | ||||
|           v$.sesConfig.mail_encryption.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseMultiselect | ||||
|           v-model.trim="mailDriverStore.sesConfig.mail_encryption" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :options="encryptions" | ||||
|           :invalid="v$.sesConfig.mail_encryption.$error" | ||||
|           placeholder="Select option" | ||||
|           @input="v$.sesConfig.mail_encryption.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_mail')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.from_mail.$error && | ||||
|           v$.sesConfig.from_mail.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.sesConfig.from_mail" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="from_mail" | ||||
|           :invalid="v$.sesConfig.from_mail.$error" | ||||
|           @input="v$.sesConfig.from_mail.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_name')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.from_name.$error && | ||||
|           v$.sesConfig.from_name.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.sesConfig.from_name" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="name" | ||||
|           :invalid="v$.sesConfig.from_name.$error" | ||||
|           @input="v$.sesConfig.from_name.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.ses_key')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.mail_ses_key.$error && | ||||
|           v$.sesConfig.mail_ses_key.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.sesConfig.mail_ses_key" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mail_ses_key" | ||||
|           :invalid="v$.sesConfig.mail_ses_key.$error" | ||||
|           @input="v$.sesConfig.mail_ses_key.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.ses_secret')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.sesConfig.mail_ses_secret.$error && | ||||
|           v$.mail_ses_secret.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.sesConfig.mail_ses_secret" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :type="getInputType" | ||||
|           name="mail_ses_secret" | ||||
|           autocomplete="off" | ||||
|           :invalid="v$.sesConfig.mail_ses_secret.$error" | ||||
|           @input="v$.sesConfig.mail_ses_secret.$touch()" | ||||
|         > | ||||
|           <template #right> | ||||
|             <BaseIcon | ||||
|               v-if="isShowPassword" | ||||
|               class="mr-1 text-gray-500 cursor-pointer" | ||||
|               name="EyeOffIcon" | ||||
|               @click="isShowPassword = !isShowPassword" | ||||
|             /> | ||||
|             <BaseIcon | ||||
|               v-else | ||||
|               class="mr-1 text-gray-500 cursor-pointer" | ||||
|               name="EyeIcon" | ||||
|               @click="isShowPassword = !isShowPassword" | ||||
|             /> | ||||
|           </template> | ||||
|         </BaseInput> | ||||
|       </BaseInputGroup> | ||||
|     </BaseInputGrid> | ||||
|  | ||||
|     <div class="flex my-10"> | ||||
|       <BaseButton | ||||
|         :disabled="isSaving" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :loading="isSaving" | ||||
|         variant="primary" | ||||
|         type="submit" | ||||
|       > | ||||
|         <template #left="slotProps"> | ||||
|           <BaseIcon v-if="!isSaving" name="SaveIcon" :class="slotProps.class" /> | ||||
|         </template> | ||||
|         {{ $t('general.save') }} | ||||
|       </BaseButton> | ||||
|       <slot /> | ||||
|     </div> | ||||
|   </form> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import { computed, onMounted, reactive, ref } from 'vue' | ||||
| import { required, email, numeric, helpers } from '@vuelidate/validators' | ||||
| import useVuelidate from '@vuelidate/core' | ||||
| import { useI18n } from 'vue-i18n' | ||||
| import { useMailDriverStore } from '@/scripts/admin/stores/mail-driver' | ||||
|  | ||||
| const props = defineProps({ | ||||
|   configData: { | ||||
|     type: Object, | ||||
|     require: true, | ||||
|     default: Object, | ||||
|   }, | ||||
|   isSaving: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   isFetchingInitialData: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   mailDrivers: { | ||||
|     type: Array, | ||||
|     require: true, | ||||
|     default: Array, | ||||
|   }, | ||||
| }) | ||||
|  | ||||
| const emit = defineEmits(['submit-data', 'on-change-driver']) | ||||
|  | ||||
| const mailDriverStore = useMailDriverStore() | ||||
| const { t } = useI18n() | ||||
|  | ||||
| let isShowPassword = ref(false) | ||||
| const encryptions = reactive(['tls', 'ssl', 'starttls']) | ||||
|  | ||||
| const rules = computed(() => { | ||||
|   return { | ||||
|     sesConfig: { | ||||
|       mail_driver: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_host: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_port: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|         numeric, | ||||
|       }, | ||||
|       mail_ses_key: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_ses_secret: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_encryption: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       from_mail: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|         email: helpers.withMessage(t('validation.email_incorrect'), email), | ||||
|       }, | ||||
|       from_name: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|     }, | ||||
|   } | ||||
| }) | ||||
|  | ||||
| const v$ = useVuelidate( | ||||
|   rules, | ||||
|   computed(() => mailDriverStore) | ||||
| ) | ||||
|  | ||||
| const getInputType = computed(() => { | ||||
|   if (isShowPassword.value) { | ||||
|     return 'text' | ||||
|   } | ||||
|   return 'password' | ||||
| }) | ||||
|  | ||||
| onMounted(() => { | ||||
|   for (const key in mailDriverStore.sesConfig) { | ||||
|     if (props.configData.hasOwnProperty(key)) { | ||||
|       mailDriverStore.sesConfig[key] = props.configData[key] | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
| async function saveEmailConfig() { | ||||
|   v$.value.sesConfig.$touch() | ||||
|   if (!v$.value.sesConfig.$invalid) { | ||||
|     emit('submit-data', mailDriverStore.sesConfig) | ||||
|   } | ||||
|   return false | ||||
| } | ||||
|  | ||||
| function onChangeDriver() { | ||||
|   v$.value.sesConfig.mail_driver.$touch() | ||||
|   emit('on-change-driver', mailDriverStore.sesConfig.mail_driver) | ||||
| } | ||||
| </script> | ||||
| @ -1,275 +0,0 @@ | ||||
| <template> | ||||
|   <form @submit.prevent="saveEmailConfig"> | ||||
|     <BaseInputGrid> | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.driver')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.smtpConfig.mail_driver.$error && | ||||
|           v$.smtpConfig.mail_driver.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseMultiselect | ||||
|           v-model="mailDriverStore.smtpConfig.mail_driver" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :options="mailDrivers" | ||||
|           :can-deselect="false" | ||||
|           :invalid="v$.smtpConfig.mail_driver.$error" | ||||
|           @update:modelValue="onChangeDriver" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.host')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.smtpConfig.mail_host.$error && | ||||
|           v$.smtpConfig.mail_host.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.smtpConfig.mail_host" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mail_host" | ||||
|           :invalid="v$.smtpConfig.mail_host.$error" | ||||
|           @input="v$.smtpConfig.mail_host.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :label="$t('settings.mail.username')" | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.smtpConfig.mail_username" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="db_name" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :label="$t('settings.mail.password')" | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.smtpConfig.mail_password" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :type="getInputType" | ||||
|           name="password" | ||||
|         > | ||||
|           <template #right> | ||||
|             <BaseIcon | ||||
|               v-if="isShowPassword" | ||||
|               class="mr-1 text-gray-500 cursor-pointer" | ||||
|               name="EyeOffIcon" | ||||
|               @click="isShowPassword = !isShowPassword" | ||||
|             /> | ||||
|             <BaseIcon | ||||
|               v-else | ||||
|               class="mr-1 text-gray-500 cursor-pointer" | ||||
|               name="EyeIcon" | ||||
|               @click="isShowPassword = !isShowPassword" | ||||
|             /> | ||||
|           </template> | ||||
|         </BaseInput> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.port')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.smtpConfig.mail_port.$error && | ||||
|           v$.smtpConfig.mail_port.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.smtpConfig.mail_port" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="mail_port" | ||||
|           :invalid="v$.smtpConfig.mail_port.$error" | ||||
|           @input="v$.smtpConfig.mail_port.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.encryption')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.smtpConfig.mail_encryption.$error && | ||||
|           v$.smtpConfig.mail_encryption.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseMultiselect | ||||
|           v-model.trim="mailDriverStore.smtpConfig.mail_encryption" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           :options="encryptions" | ||||
|           :searchable="true" | ||||
|           :show-labels="false" | ||||
|           placeholder="Select option" | ||||
|           :invalid="v$.smtpConfig.mail_encryption.$error" | ||||
|           @input="v$.smtpConfig.mail_encryption.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_mail')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.smtpConfig.from_mail.$error && | ||||
|           v$.smtpConfig.from_mail.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.smtpConfig.from_mail" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="from_mail" | ||||
|           :invalid="v$.smtpConfig.from_mail.$error" | ||||
|           @input="v$.smtpConfig.from_mail.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|  | ||||
|       <BaseInputGroup | ||||
|         :label="$t('settings.mail.from_name')" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :error=" | ||||
|           v$.smtpConfig.from_name.$error && | ||||
|           v$.smtpConfig.from_name.$errors[0].$message | ||||
|         " | ||||
|         required | ||||
|       > | ||||
|         <BaseInput | ||||
|           v-model.trim="mailDriverStore.smtpConfig.from_name" | ||||
|           :content-loading="isFetchingInitialData" | ||||
|           type="text" | ||||
|           name="from_name" | ||||
|           :invalid="v$.smtpConfig.from_name.$error" | ||||
|           @input="v$.smtpConfig.from_name.$touch()" | ||||
|         /> | ||||
|       </BaseInputGroup> | ||||
|     </BaseInputGrid> | ||||
|  | ||||
|     <div class="flex my-10"> | ||||
|       <BaseButton | ||||
|         :disabled="isSaving" | ||||
|         :content-loading="isFetchingInitialData" | ||||
|         :loading="isSaving" | ||||
|         type="submit" | ||||
|         variant="primary" | ||||
|       > | ||||
|         <template #left="slotProps"> | ||||
|           <BaseIcon v-if="!isSaving" name="SaveIcon" :class="slotProps.class" /> | ||||
|         </template> | ||||
|         {{ $t('general.save') }} | ||||
|       </BaseButton> | ||||
|       <slot /> | ||||
|     </div> | ||||
|   </form> | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| import { reactive, onMounted, ref, computed } from 'vue' | ||||
| import { required, email, numeric, helpers } from '@vuelidate/validators' | ||||
| import useVuelidate from '@vuelidate/core' | ||||
| import { useI18n } from 'vue-i18n' | ||||
| import { useMailDriverStore } from '@/scripts/admin/stores/mail-driver' | ||||
|  | ||||
| const props = defineProps({ | ||||
|   configData: { | ||||
|     type: Object, | ||||
|     require: true, | ||||
|     default: Object, | ||||
|   }, | ||||
|   isSaving: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   isFetchingInitialData: { | ||||
|     type: Boolean, | ||||
|     require: true, | ||||
|     default: false, | ||||
|   }, | ||||
|   mailDrivers: { | ||||
|     type: Array, | ||||
|     require: true, | ||||
|     default: Array, | ||||
|   }, | ||||
| }) | ||||
|  | ||||
| const emit = defineEmits(['submit-data', 'on-change-driver']) | ||||
|  | ||||
| const mailDriverStore = useMailDriverStore() | ||||
| const { t } = useI18n() | ||||
|  | ||||
| let isShowPassword = ref(false) | ||||
| const encryptions = reactive(['tls', 'ssl', 'starttls']) | ||||
|  | ||||
| const getInputType = computed(() => { | ||||
|   if (isShowPassword.value) { | ||||
|     return 'text' | ||||
|   } | ||||
|   return 'password' | ||||
| }) | ||||
|  | ||||
| const rules = computed(() => { | ||||
|   return { | ||||
|     smtpConfig: { | ||||
|       mail_driver: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_host: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       mail_port: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|         numeric: helpers.withMessage(t('validation.numbers_only'), numeric), | ||||
|       }, | ||||
|       mail_encryption: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|       from_mail: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|         email: helpers.withMessage(t('validation.email_incorrect'), email), | ||||
|       }, | ||||
|       from_name: { | ||||
|         required: helpers.withMessage(t('validation.required'), required), | ||||
|       }, | ||||
|     }, | ||||
|   } | ||||
| }) | ||||
|  | ||||
| const v$ = useVuelidate( | ||||
|   rules, | ||||
|   computed(() => mailDriverStore) | ||||
| ) | ||||
|  | ||||
| onMounted(() => { | ||||
|   for (const key in mailDriverStore.smtpConfig) { | ||||
|     if (props.configData.hasOwnProperty(key)) { | ||||
|       mailDriverStore.smtpConfig[key] = props.configData[key] | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | ||||
| async function saveEmailConfig() { | ||||
|   v$.value.smtpConfig.$touch() | ||||
|   if (!v$.value.smtpConfig.$invalid) { | ||||
|     emit('submit-data', mailDriverStore.smtpConfig) | ||||
|   } | ||||
|   return false | ||||
| } | ||||
|  | ||||
| function onChangeDriver() { | ||||
|   v$.value.smtpConfig.mail_driver.$touch() | ||||
|   emit('on-change-driver', mailDriverStore.smtpConfig.mail_driver) | ||||
| } | ||||
| </script> | ||||
		Reference in New Issue
	
	Block a user