|
2 | 2 | <div class="flex flex-col h-full gap-4">
|
3 | 3 | <!-- title and desc -->
|
4 | 4 | <div role="heading" aria-level="1" class="flex flex-col gap-1">
|
5 |
| - <h5 class="text-xl font-semibold">Setup Email</h5> |
| 5 | + <h2 class="text-xl font-semibold text-ink-gray-9">Setup Email</h2> |
6 | 6 | <p class="text-sm text-gray-600">
|
7 | 7 | Choose the email service provider you want to configure.
|
8 | 8 | </p>
|
9 | 9 | </div>
|
10 | 10 | <!-- email service provider selection -->
|
11 | 11 | <div class="flex flex-wrap items-center">
|
12 |
| - <div v-for="s in services" :key="s.name" class="flex flex-col items-center gap-1 mt-4 w-[70px]" |
13 |
| - @click="handleSelect(s)"> |
14 |
| - <EmailProviderIcon :service-name="s.name" :logo="s.icon" :selected="selectedService?.name === s?.name" /> |
| 12 | + <div |
| 13 | + v-for="s in services" |
| 14 | + :key="s.name" |
| 15 | + class="flex flex-col items-center gap-1 mt-4 w-[70px]" |
| 16 | + @click="handleSelect(s)" |
| 17 | + > |
| 18 | + <EmailProviderIcon |
| 19 | + :service-name="s.name" |
| 20 | + :logo="s.icon" |
| 21 | + :selected="selectedService?.name === s?.name" |
| 22 | + /> |
15 | 23 | </div>
|
16 | 24 | </div>
|
17 | 25 | <div v-if="selectedService" class="flex flex-col gap-4">
|
18 | 26 | <!-- email service provider info -->
|
19 |
| - <div class="flex items-center gap-2 p-2 rounded-md ring-1 ring-gray-200"> |
20 |
| - <CircleAlert class="w-5 h-6 text-blue-500 w-min-5 w-max-5 min-h-5 max-w-5" /> |
21 |
| - <div class="text-xs text-gray-700 text-wrap"> |
| 27 | + <div |
| 28 | + class="flex items-center gap-2 p-2 rounded-md ring-1 ring-gray-400 dark:ring-gray-700 text-gray-700 dark:text-gray-500" |
| 29 | + > |
| 30 | + <CircleAlert class="w-5 h-6 w-min-5 w-max-5 min-h-5 max-w-5" /> |
| 31 | + <div class="text-xs text-wrap"> |
22 | 32 | {{ selectedService.info }}
|
23 |
| - <a :href="selectedService.link" target="_blank" class="text-blue-500 underline">here</a>. |
| 33 | + <a :href="selectedService.link" target="_blank" class="underline" |
| 34 | + >here</a |
| 35 | + >. |
24 | 36 | </div>
|
25 | 37 | </div>
|
26 | 38 | <!-- service provider fields -->
|
27 | 39 | <div class="flex flex-col gap-4">
|
28 | 40 | <div class="grid grid-cols-1 gap-4">
|
29 |
| - <div v-for="field in fields" :key="field.name" class="flex flex-col gap-1"> |
30 |
| - <FormControl v-model="state[field.name]" :label="field.label" :name="field.name" :type="field.type" |
31 |
| - :placeholder="field.placeholder" /> |
| 41 | + <div |
| 42 | + v-for="field in fields" |
| 43 | + :key="field.name" |
| 44 | + class="flex flex-col gap-1" |
| 45 | + > |
| 46 | + <FormControl |
| 47 | + v-model="state[field.name]" |
| 48 | + :label="field.label" |
| 49 | + :name="field.name" |
| 50 | + :type="field.type" |
| 51 | + :placeholder="field.placeholder" |
| 52 | + /> |
32 | 53 | </div>
|
33 | 54 | </div>
|
34 | 55 | <div class="grid grid-cols-2 gap-4">
|
35 |
| - <div v-for="field in incomingOutgoingFields" :key="field.name" class="flex flex-col gap-1"> |
36 |
| - <FormControl v-model="state[field.name]" :label="field.label" :name="field.name" :type="field.type" /> |
| 56 | + <div |
| 57 | + v-for="field in incomingOutgoingFields" |
| 58 | + :key="field.name" |
| 59 | + class="flex flex-col gap-1" |
| 60 | + > |
| 61 | + <FormControl |
| 62 | + v-model="state[field.name]" |
| 63 | + :label="field.label" |
| 64 | + :name="field.name" |
| 65 | + :type="field.type" |
| 66 | + /> |
37 | 67 | <p class="text-gray-500 text-p-sm">{{ field.description }}</p>
|
38 | 68 | </div>
|
39 | 69 | </div>
|
|
42 | 72 | </div>
|
43 | 73 | <!-- action button -->
|
44 | 74 | <div v-if="selectedService" class="flex justify-between mt-auto">
|
45 |
| - <Button label="Back" theme="gray" variant="outline" :disabled="addEmailRes.loading" |
46 |
| - @click="emit('update:step', 'email-list')" /> |
47 |
| - <Button label="Create" variant="solid" :loading="addEmailRes.loading" @click="createEmailAccount" /> |
| 75 | + <Button |
| 76 | + label="Back" |
| 77 | + theme="gray" |
| 78 | + variant="outline" |
| 79 | + :disabled="addEmailRes.loading" |
| 80 | + @click="emit('update:step', 'email-list')" |
| 81 | + /> |
| 82 | + <Button |
| 83 | + label="Create" |
| 84 | + variant="solid" |
| 85 | + :loading="addEmailRes.loading" |
| 86 | + @click="createEmailAccount" |
| 87 | + /> |
48 | 88 | </div>
|
49 | 89 | </div>
|
50 | 90 | </template>
|
51 | 91 |
|
52 | 92 | <script setup>
|
53 |
| -import { computed, reactive, ref } from "vue"; |
54 |
| -import { createResource } from "frappe-ui"; |
55 |
| -import CircleAlert from "~icons/lucide/circle-alert"; |
56 |
| -import { createToast } from "@/utils"; |
| 93 | +import { computed, reactive, ref } from 'vue' |
| 94 | +import { createResource } from 'frappe-ui' |
| 95 | +import CircleAlert from '~icons/lucide/circle-alert' |
| 96 | +import { createToast } from '@/utils' |
57 | 97 | import {
|
58 | 98 | customProviderFields,
|
59 | 99 | popularProviderFields,
|
60 | 100 | services,
|
61 | 101 | validateInputs,
|
62 | 102 | incomingOutgoingFields,
|
63 |
| -} from "./emailConfig"; |
64 |
| -import EmailProviderIcon from "./EmailProviderIcon.vue"; |
| 103 | +} from './emailConfig' |
| 104 | +import EmailProviderIcon from './EmailProviderIcon.vue' |
65 | 105 |
|
66 |
| -const emit = defineEmits(); |
| 106 | +const emit = defineEmits() |
67 | 107 |
|
68 | 108 | const state = reactive({
|
69 |
| - service: "", |
70 |
| - email_account_name: "", |
71 |
| - email_id: "", |
72 |
| - password: "", |
73 |
| - api_key: "", |
74 |
| - api_secret: "", |
75 |
| - frappe_mail_site: "", |
| 109 | + service: '', |
| 110 | + email_account_name: '', |
| 111 | + email_id: '', |
| 112 | + password: '', |
| 113 | + api_key: '', |
| 114 | + api_secret: '', |
| 115 | + frappe_mail_site: '', |
76 | 116 | enable_incoming: false,
|
77 | 117 | enable_outgoing: false,
|
78 | 118 | default_incoming: false,
|
79 | 119 | default_outgoing: false,
|
80 |
| -}); |
| 120 | +}) |
81 | 121 |
|
82 |
| -const selectedService = ref(null); |
| 122 | +const selectedService = ref(null) |
83 | 123 | const fields = computed(() =>
|
84 |
| - selectedService.value.custom ? customProviderFields : popularProviderFields |
85 |
| -); |
| 124 | + selectedService.value.custom ? customProviderFields : popularProviderFields, |
| 125 | +) |
86 | 126 |
|
87 | 127 | function handleSelect(service) {
|
88 |
| - selectedService.value = service; |
89 |
| - state.service = service.name; |
| 128 | + selectedService.value = service |
| 129 | + state.service = service.name |
90 | 130 | }
|
91 | 131 |
|
92 | 132 | const addEmailRes = createResource({
|
93 |
| - url: "crm.api.settings.create_email_account", |
| 133 | + url: 'crm.api.settings.create_email_account', |
94 | 134 | makeParams: (val) => {
|
95 | 135 | return {
|
96 | 136 | ...val,
|
97 |
| - }; |
| 137 | + } |
98 | 138 | },
|
99 | 139 | onSuccess: () => {
|
100 | 140 | createToast({
|
101 |
| - title: "Email account created successfully", |
102 |
| - icon: "check", |
103 |
| - iconClasses: "text-green-600", |
104 |
| - }); |
105 |
| - emit("update:step", "email-list"); |
| 141 | + title: 'Email account created successfully', |
| 142 | + icon: 'check', |
| 143 | + iconClasses: 'text-green-600', |
| 144 | + }) |
| 145 | + emit('update:step', 'email-list') |
106 | 146 | },
|
107 | 147 | onError: () => {
|
108 |
| - error.value = "Failed to create email account, Invalid credentials"; |
| 148 | + error.value = 'Failed to create email account, Invalid credentials' |
109 | 149 | },
|
110 |
| -}); |
| 150 | +}) |
111 | 151 |
|
112 |
| -const error = ref(); |
| 152 | +const error = ref() |
113 | 153 | function createEmailAccount() {
|
114 |
| - error.value = validateInputs(state, selectedService.value.custom); |
115 |
| - if (error.value) return; |
| 154 | + error.value = validateInputs(state, selectedService.value.custom) |
| 155 | + if (error.value) return |
116 | 156 |
|
117 |
| - addEmailRes.submit({ data: state }); |
| 157 | + addEmailRes.submit({ data: state }) |
118 | 158 | }
|
119 | 159 | </script>
|
120 | 160 |
|
|
0 commit comments