mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-10-30 13:11:08 -04:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			dark-switc
			...
			dark-sideb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b2d181975c | |||
| a03d4138fd | 
| @ -113,7 +113,7 @@ | |||||||
|             </span> |             </span> | ||||||
|           </template> |           </template> | ||||||
|           <BaseDropdownItem @click="removeMultipleCustomers"> |           <BaseDropdownItem @click="removeMultipleCustomers"> | ||||||
|             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -164,7 +164,7 @@ | |||||||
|           </template> |           </template> | ||||||
|  |  | ||||||
|           <BaseDropdownItem @click="removeMultipleEstimates"> |           <BaseDropdownItem @click="removeMultipleEstimates"> | ||||||
|             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -135,7 +135,7 @@ | |||||||
|             v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)" |             v-if="userStore.hasAbilities(abilities.DELETE_EXPENSE)" | ||||||
|             @click="removeMultipleExpenses" |             @click="removeMultipleExpenses" | ||||||
|           > |           > | ||||||
|             <BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -68,15 +68,13 @@ | |||||||
|             @input="v$.userForm.password.$touch()" |             @input="v$.userForm.password.$touch()" | ||||||
|           > |           > | ||||||
|             <template #right> |             <template #right> | ||||||
|               <BaseIcon |               <EyeOffIcon | ||||||
|                 v-if="isShowPassword" |                 v-if="isShowPassword" | ||||||
|                 name="EyeOffIcon" |  | ||||||
|                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" |                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|                 @click="isShowPassword = !isShowPassword" |                 @click="isShowPassword = !isShowPassword" | ||||||
|               /> |               /> | ||||||
|               <BaseIcon |               <EyeIcon | ||||||
|                 v-else |                 v-else | ||||||
|                 name="EyeIcon" |  | ||||||
|                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" |                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|                 @click="isShowPassword = !isShowPassword" |                 @click="isShowPassword = !isShowPassword" | ||||||
|               /> |               /> | ||||||
|  | |||||||
| @ -178,7 +178,7 @@ | |||||||
|           </template> |           </template> | ||||||
|  |  | ||||||
|           <BaseDropdownItem @click="removeMultipleInvoices"> |           <BaseDropdownItem @click="removeMultipleInvoices"> | ||||||
|             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -117,7 +117,7 @@ | |||||||
|             </span> |             </span> | ||||||
|           </template> |           </template> | ||||||
|           <BaseDropdownItem @click="removeMultipleItems"> |           <BaseDropdownItem @click="removeMultipleItems"> | ||||||
|             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -116,7 +116,7 @@ | |||||||
|             </span> |             </span> | ||||||
|           </template> |           </template> | ||||||
|           <BaseDropdownItem @click="removeMultiplePayments"> |           <BaseDropdownItem @click="removeMultiplePayments"> | ||||||
|             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -151,12 +151,12 @@ | |||||||
|               " |               " | ||||||
|             > |             > | ||||||
|               {{ $t('general.actions') }} |               {{ $t('general.actions') }} | ||||||
|               <BaseIcon name="ChevronDownIcon"/> |               <BaseIcon name="ChevronDownIcon" class="h-5" /> | ||||||
|             </span> |             </span> | ||||||
|           </template> |           </template> | ||||||
|  |  | ||||||
|           <BaseDropdownItem @click="removeMultipleRecurringInvoices()"> |           <BaseDropdownItem @click="removeMultipleRecurringInvoices()"> | ||||||
|             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -51,12 +51,27 @@ | |||||||
|         <BaseInput |         <BaseInput | ||||||
|           v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_secret" |           v-model.trim="mailDriverStore.mailgunConfig.mail_mailgun_secret" | ||||||
|           :content-loading="isFetchingInitialData" |           :content-loading="isFetchingInitialData" | ||||||
|           type="password" |           :type="getInputType" | ||||||
|           name="mailgun_secret" |           name="mailgun_secret" | ||||||
|           autocomplete="off" |           autocomplete="off" | ||||||
|           :invalid="v$.mailgunConfig.mail_mailgun_secret.$error" |           :invalid="v$.mailgunConfig.mail_mailgun_secret.$error" | ||||||
|           @input="v$.mailgunConfig.mail_mailgun_secret.$touch()" |           @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> | ||||||
|  |  | ||||||
|       <BaseInputGroup |       <BaseInputGroup | ||||||
| @ -169,6 +184,15 @@ const emit = defineEmits(['submit-data', 'on-change-driver']) | |||||||
| const mailDriverStore = useMailDriverStore() | const mailDriverStore = useMailDriverStore() | ||||||
| const { t } = useI18n() | const { t } = useI18n() | ||||||
|  |  | ||||||
|  | let isShowPassword = ref(false) | ||||||
|  |  | ||||||
|  | const getInputType = computed(() => { | ||||||
|  |   if (isShowPassword.value) { | ||||||
|  |     return 'text' | ||||||
|  |   } | ||||||
|  |   return 'password' | ||||||
|  | }) | ||||||
|  |  | ||||||
| const rules = computed(() => { | const rules = computed(() => { | ||||||
|   return { |   return { | ||||||
|     mailgunConfig: { |     mailgunConfig: { | ||||||
|  | |||||||
| @ -146,12 +146,27 @@ | |||||||
|         <BaseInput |         <BaseInput | ||||||
|           v-model.trim="mailDriverStore.sesConfig.mail_ses_secret" |           v-model.trim="mailDriverStore.sesConfig.mail_ses_secret" | ||||||
|           :content-loading="isFetchingInitialData" |           :content-loading="isFetchingInitialData" | ||||||
|           type="password" |           :type="getInputType" | ||||||
|           name="mail_ses_secret" |           name="mail_ses_secret" | ||||||
|           autocomplete="off" |           autocomplete="off" | ||||||
|           :invalid="v$.sesConfig.mail_ses_secret.$error" |           :invalid="v$.sesConfig.mail_ses_secret.$error" | ||||||
|           @input="v$.sesConfig.mail_ses_secret.$touch()" |           @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> |       </BaseInputGroup> | ||||||
|     </BaseInputGrid> |     </BaseInputGrid> | ||||||
|  |  | ||||||
| @ -208,6 +223,7 @@ const emit = defineEmits(['submit-data', 'on-change-driver']) | |||||||
| const mailDriverStore = useMailDriverStore() | const mailDriverStore = useMailDriverStore() | ||||||
| const { t } = useI18n() | const { t } = useI18n() | ||||||
|  |  | ||||||
|  | let isShowPassword = ref(false) | ||||||
| const encryptions = reactive(['tls', 'ssl', 'starttls']) | const encryptions = reactive(['tls', 'ssl', 'starttls']) | ||||||
|  |  | ||||||
| const rules = computed(() => { | const rules = computed(() => { | ||||||
| @ -248,6 +264,13 @@ const v$ = useVuelidate( | |||||||
|   computed(() => mailDriverStore) |   computed(() => mailDriverStore) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | const getInputType = computed(() => { | ||||||
|  |   if (isShowPassword.value) { | ||||||
|  |     return 'text' | ||||||
|  |   } | ||||||
|  |   return 'password' | ||||||
|  | }) | ||||||
|  |  | ||||||
| onMounted(() => { | onMounted(() => { | ||||||
|   for (const key in mailDriverStore.sesConfig) { |   for (const key in mailDriverStore.sesConfig) { | ||||||
|     if (props.configData.hasOwnProperty(key)) { |     if (props.configData.hasOwnProperty(key)) { | ||||||
|  | |||||||
| @ -58,9 +58,24 @@ | |||||||
|         <BaseInput |         <BaseInput | ||||||
|           v-model.trim="mailDriverStore.smtpConfig.mail_password" |           v-model.trim="mailDriverStore.smtpConfig.mail_password" | ||||||
|           :content-loading="isFetchingInitialData" |           :content-loading="isFetchingInitialData" | ||||||
|           type="password" |           :type="getInputType" | ||||||
|           name="password" |           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> | ||||||
|  |  | ||||||
|       <BaseInputGroup |       <BaseInputGroup | ||||||
| @ -194,8 +209,17 @@ const emit = defineEmits(['submit-data', 'on-change-driver']) | |||||||
|  |  | ||||||
| const mailDriverStore = useMailDriverStore() | const mailDriverStore = useMailDriverStore() | ||||||
| const { t } = useI18n() | const { t } = useI18n() | ||||||
|  |  | ||||||
|  | let isShowPassword = ref(false) | ||||||
| const encryptions = reactive(['tls', 'ssl', 'starttls']) | const encryptions = reactive(['tls', 'ssl', 'starttls']) | ||||||
|  |  | ||||||
|  | const getInputType = computed(() => { | ||||||
|  |   if (isShowPassword.value) { | ||||||
|  |     return 'text' | ||||||
|  |   } | ||||||
|  |   return 'password' | ||||||
|  | }) | ||||||
|  |  | ||||||
| const rules = computed(() => { | const rules = computed(() => { | ||||||
|   return { |   return { | ||||||
|     smtpConfig: { |     smtpConfig: { | ||||||
|  | |||||||
| @ -118,11 +118,11 @@ | |||||||
|               " |               " | ||||||
|             > |             > | ||||||
|               {{ $t('general.actions') }} |               {{ $t('general.actions') }} | ||||||
|               <BaseIcon name="ChevronDownIcon"/> |               <BaseIcon name="ChevronDownIcon" class="h-5" /> | ||||||
|             </span> |             </span> | ||||||
|           </template> |           </template> | ||||||
|           <BaseDropdownItem @click="removeMultipleUsers"> |           <BaseDropdownItem @click="removeMultipleUsers"> | ||||||
|             <BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600 dark:text-gray-400 dark:group-hover:text-white" /> |             <BaseIcon name="TrashIcon" class="h-5 mr-3 text-gray-600" /> | ||||||
|             {{ $t('general.delete') }} |             {{ $t('general.delete') }} | ||||||
|           </BaseDropdownItem> |           </BaseDropdownItem> | ||||||
|         </BaseDropdown> |         </BaseDropdown> | ||||||
|  | |||||||
| @ -93,7 +93,6 @@ | |||||||
|                     rounded-full |                     rounded-full | ||||||
|                     text-primary-500 |                     text-primary-500 | ||||||
|                     dark:bg-gray-600 |                     dark:bg-gray-600 | ||||||
|                     dark:text-primary-400 |  | ||||||
|                   " |                   " | ||||||
|                 > |                 > | ||||||
|                   {{ initGenerator(customer.name) }} |                   {{ initGenerator(customer.name) }} | ||||||
| @ -142,7 +141,6 @@ | |||||||
|                     bg-gray-200 |                     bg-gray-200 | ||||||
|                     rounded-full |                     rounded-full | ||||||
|                     text-primary-500 |                     text-primary-500 | ||||||
|                     dark:text-primary-400 |  | ||||||
|                     dark:bg-gray-600 |                     dark:bg-gray-600 | ||||||
|                   " |                   " | ||||||
|                 > |                 > | ||||||
|  | |||||||
| @ -16,13 +16,6 @@ defineProps({ | |||||||
|  |  | ||||||
| const globalStore = useGlobalStore() | const globalStore = useGlobalStore() | ||||||
|  |  | ||||||
| const isDark = ref( |  | ||||||
|   localStorage.getItem('theme') === 'dark' |  | ||||||
|     || document.documentElement.classList.contains('dark'), |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| globalStore.isDarkModeOn = isDark |  | ||||||
|  |  | ||||||
| const enabled = computed({ | const enabled = computed({ | ||||||
|   get: () => globalStore.isDarkModeOn, |   get: () => globalStore.isDarkModeOn, | ||||||
|   set: (value) => { |   set: (value) => { | ||||||
|  | |||||||
| @ -90,7 +90,7 @@ | |||||||
|  |  | ||||||
|     <input |     <input | ||||||
|       v-bind="$attrs" |       v-bind="$attrs" | ||||||
|       :type="getType" |       :type="type" | ||||||
|       :value="modelValue" |       :value="modelValue" | ||||||
|       :disabled="disabled" |       :disabled="disabled" | ||||||
|       :class="[ |       :class="[ | ||||||
| @ -144,44 +144,6 @@ | |||||||
|     > |     > | ||||||
|       <slot name="right" :class="iconRightClass" /> |       <slot name="right" :class="iconRightClass" /> | ||||||
|     </div> |     </div> | ||||||
|     <div |  | ||||||
|       v-if="loading && loadingPosition === 'right'" class=" |  | ||||||
|         absolute |  | ||||||
|         inset-y-0 |  | ||||||
|         right-0 |  | ||||||
|         flex |  | ||||||
|         items-center |  | ||||||
|         pr-3 |  | ||||||
|         pointer-events-none |  | ||||||
|       " |  | ||||||
|     > |  | ||||||
|       <svg |  | ||||||
|         class="animate-spin !text-primary-500" :class="[iconRightClass]" xmlns="http://www.w3.org/2000/svg" |  | ||||||
|         fill="none" viewBox="0 0 24 24" |  | ||||||
|       > |  | ||||||
|         <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4" /> |  | ||||||
|         <path |  | ||||||
|           class="opacity-75" fill="currentColor" |  | ||||||
|           d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" |  | ||||||
|         /> |  | ||||||
|       </svg> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|     <div v-if="hasRightIconSlot" class="absolute inset-y-0 right-0 flex items-center pr-3"> |  | ||||||
|       <slot name="right" :class="iconRightClass" /> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|     <div v-if="type == 'password'" class="absolute inset-y-0 right-0 flex items-center pr-3"> |  | ||||||
|       <a |  | ||||||
|         v-if="isShowPassword" href="#" class="block" data-cy="eye" tabindex="-1" |  | ||||||
|         @click.prevent="isShowPassword = !isShowPassword" |  | ||||||
|       > |  | ||||||
|         <BaseIcon name="EyeOffIcon" class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" /> |  | ||||||
|       </a> |  | ||||||
|       <a v-else href="#" class="block" data-cy="eye" tabindex="-1" @click.prevent="isShowPassword = !isShowPassword"> |  | ||||||
|         <BaseIcon name="EyeIcon" class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" /> |  | ||||||
|       </a> |  | ||||||
|     </div> |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @ -257,15 +219,6 @@ const slots = useSlots() | |||||||
|  |  | ||||||
| const emit = defineEmits(['update:modelValue']) | const emit = defineEmits(['update:modelValue']) | ||||||
|  |  | ||||||
| const isShowPassword = ref(false) |  | ||||||
|  |  | ||||||
| const getType = computed(() => { |  | ||||||
|   if (props.type === 'password') |  | ||||||
|     return isShowPassword.value ? 'text' : 'password' |  | ||||||
|  |  | ||||||
|   return props.type |  | ||||||
| }) |  | ||||||
|  |  | ||||||
| const hasLeftIconSlot = computed(() => { | const hasLeftIconSlot = computed(() => { | ||||||
|   return !!slots.left || (props.loading && props.loadingPosition === 'left') |   return !!slots.left || (props.loading && props.loadingPosition === 'left') | ||||||
| }) | }) | ||||||
|  | |||||||
| @ -32,10 +32,25 @@ | |||||||
|     > |     > | ||||||
|       <BaseInput |       <BaseInput | ||||||
|         v-model="authStore.loginData.password" |         v-model="authStore.loginData.password" | ||||||
|  |         :type="getInputType" | ||||||
|         :invalid="v$.loginData.password.$error" |         :invalid="v$.loginData.password.$error" | ||||||
|         type="password" |  | ||||||
|         @input="v$.loginData.password.$touch()" |         @input="v$.loginData.password.$touch()" | ||||||
|  |       > | ||||||
|  |         <template #right> | ||||||
|  |           <BaseIcon | ||||||
|  |             v-if="isShowPassword" | ||||||
|  |             name="EyeOffIcon" | ||||||
|  |             class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |             @click="isShowPassword = !isShowPassword" | ||||||
|           /> |           /> | ||||||
|  |           <BaseIcon | ||||||
|  |             v-else | ||||||
|  |             name="EyeIcon" | ||||||
|  |             class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |             @click="isShowPassword = !isShowPassword" | ||||||
|  |           /> | ||||||
|  |         </template> | ||||||
|  |       </BaseInput> | ||||||
|     </BaseInputGroup> |     </BaseInputGroup> | ||||||
|     <div class="flex items-center justify-between"> |     <div class="flex items-center justify-between"> | ||||||
|       <router-link |       <router-link | ||||||
| @ -76,6 +91,14 @@ const authStore = useAuthStore() | |||||||
| const { t } = useI18n() | const { t } = useI18n() | ||||||
|  |  | ||||||
| let isLoading = ref(false) | let isLoading = ref(false) | ||||||
|  | const isShowPassword = ref(false) | ||||||
|  |  | ||||||
|  | const getInputType = computed(() => { | ||||||
|  |   if (isShowPassword.value) { | ||||||
|  |     return 'text' | ||||||
|  |   } | ||||||
|  |   return 'password' | ||||||
|  | }) | ||||||
|  |  | ||||||
| const rules = computed(() => { | const rules = computed(() => { | ||||||
|   return { |   return { | ||||||
|  | |||||||
| @ -23,11 +23,23 @@ | |||||||
|     > |     > | ||||||
|       <BaseInput |       <BaseInput | ||||||
|         v-model="loginData.password" |         v-model="loginData.password" | ||||||
|         type="password" |         :type="isShowPassword ? 'text' : 'password'" | ||||||
|         name="password" |         name="password" | ||||||
|         :invalid="v$.password.$error" |         :invalid="v$.password.$error" | ||||||
|         @input="v$.password.$touch()" |         @input="v$.password.$touch()" | ||||||
|  |       > | ||||||
|  |         <template #right> | ||||||
|  |           <EyeOffIcon | ||||||
|  |             v-if="isShowPassword" | ||||||
|  |             class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |             @click="isShowPassword = !isShowPassword" | ||||||
|           /> |           /> | ||||||
|  |           <EyeIcon | ||||||
|  |             v-else | ||||||
|  |             class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |             @click="isShowPassword = !isShowPassword" | ||||||
|  |           /> </template | ||||||
|  |       ></BaseInput> | ||||||
|     </BaseInputGroup> |     </BaseInputGroup> | ||||||
|  |  | ||||||
|     <BaseInputGroup |     <BaseInputGroup | ||||||
| @ -81,6 +93,7 @@ const loginData = reactive({ | |||||||
|  |  | ||||||
| const globalStore = useGlobalStore() | const globalStore = useGlobalStore() | ||||||
|  |  | ||||||
|  | let isShowPassword = ref(false) | ||||||
| let isLoading = ref(false) | let isLoading = ref(false) | ||||||
|  |  | ||||||
| const rules = computed(() => { | const rules = computed(() => { | ||||||
|  | |||||||
| @ -66,10 +66,24 @@ | |||||||
|         > |         > | ||||||
|           <BaseInput |           <BaseInput | ||||||
|             v-model="userStore.userForm.password" |             v-model="userStore.userForm.password" | ||||||
|             type="password" |             :type="isShowPassword ? 'text' : 'password'" | ||||||
|             :invalid="v$.userForm.password.$error" |             :invalid="v$.userForm.password.$error" | ||||||
|             @input="v$.userForm.password.$touch()" |             @input="v$.userForm.password.$touch()" | ||||||
|  |           > | ||||||
|  |             <template #right> | ||||||
|  |               <BaseIcon | ||||||
|  |                 v-if="isShowPassword" | ||||||
|  |                 name="EyeOffIcon" | ||||||
|  |                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |                 @click="isShowPassword = !isShowPassword" | ||||||
|               /> |               /> | ||||||
|  |               <BaseIcon | ||||||
|  |                 v-else | ||||||
|  |                 name="EyeIcon" | ||||||
|  |                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |                 @click="isShowPassword = !isShowPassword" | ||||||
|  |               /> </template | ||||||
|  |           ></BaseInput> | ||||||
|         </BaseInputGroup> |         </BaseInputGroup> | ||||||
|  |  | ||||||
|         <BaseInputGroup |         <BaseInputGroup | ||||||
| @ -81,10 +95,24 @@ | |||||||
|         > |         > | ||||||
|           <BaseInput |           <BaseInput | ||||||
|             v-model="userStore.userForm.confirm_password" |             v-model="userStore.userForm.confirm_password" | ||||||
|             type="password" |             :type="isShowConfirmPassword ? 'text' : 'password'" | ||||||
|             :invalid="v$.userForm.confirm_password.$error" |             :invalid="v$.userForm.confirm_password.$error" | ||||||
|             @input="v$.userForm.confirm_password.$touch()" |             @input="v$.userForm.confirm_password.$touch()" | ||||||
|  |           > | ||||||
|  |             <template #right> | ||||||
|  |               <BaseIcon | ||||||
|  |                 v-if="isShowConfirmPassword" | ||||||
|  |                 name="EyeOffIcon" | ||||||
|  |                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |                 @click="isShowConfirmPassword = !isShowConfirmPassword" | ||||||
|               /> |               /> | ||||||
|  |               <BaseIcon | ||||||
|  |                 v-else | ||||||
|  |                 name="EyeIcon" | ||||||
|  |                 class="w-5 h-5 mr-1 text-gray-500 cursor-pointer" | ||||||
|  |                 @click="isShowConfirmPassword = !isShowConfirmPassword" | ||||||
|  |               /> </template | ||||||
|  |           ></BaseInput> | ||||||
|         </BaseInputGroup> |         </BaseInputGroup> | ||||||
|       </div> |       </div> | ||||||
|  |  | ||||||
| @ -123,6 +151,8 @@ const { t, tm } = useI18n() | |||||||
| let imgFiles = ref([]) | let imgFiles = ref([]) | ||||||
| let isSaving = ref(false) | let isSaving = ref(false) | ||||||
| let avatarFileBlob = ref(null) | let avatarFileBlob = ref(null) | ||||||
|  | let isShowPassword = ref(false) | ||||||
|  | let isShowConfirmPassword = ref(false) | ||||||
| const isCustomerAvatarRemoved = ref(false) | const isCustomerAvatarRemoved = ref(false) | ||||||
|  |  | ||||||
| if (userStore.userForm.avatar) { | if (userStore.userForm.avatar) { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	