RSS Git Download  Clone
Raw Blame History 3kB 85 lines
<script setup lang="ts">
import { ref, watch, computed } from 'vue'
import P3xrDialog from '../components/P3xrDialog.vue'
import { useCommonStore } from '../stores/common.store'
import { useI18nStore } from '../stores/i18n'

const common = useCommonStore()
const strings = computed(() => useI18nStore().strings)

const username = ref('')
const password = ref('')
const pwVisible = ref(false)

watch(() => common.askAuthOpen, (open) => {
    if (open) {
        username.value = ''
        password.value = ''
        pwVisible.value = false
    }
})

function handleOk() {
    common.resolveAskAuth?.({ username: username.value, password: password.value })
}

function handleCancel() {
    common.resolveAskAuth?.(null)
}

function str(val: any, opts?: any): string {
    if (typeof val === 'function') return val(opts)
    return val ?? ''
}
</script>

<template>
    <P3xrDialog
        :open="common.askAuthOpen"
        :title="str(strings?.label?.askAuth)"
        icon="mdi-shield"
        width="400px"
        :full-screen-on-mobile="false"
        @close="handleCancel"
    >
        <div style="font-size: 12px; opacity: 0.7; margin-bottom: 8px;">{{ strings?.label?.aclAuthHint }}</div>
        <v-text-field
            v-model="username" autofocus
            :label="str(strings?.form?.connection?.label?.username)"
            autocomplete="off" density="comfortable" variant="outlined" hide-details class="mb-3"
            @keydown.enter="handleOk"
        >
            <template #prepend-inner>
                <v-icon size="20">mdi-account</v-icon>
            </template>
        </v-text-field>
        <v-text-field
            v-model="password"
            :label="str(strings?.form?.connection?.label?.password)"
            :type="pwVisible ? 'text' : 'password'"
            autocomplete="off" density="comfortable" variant="outlined" hide-details
            @keydown.enter="handleOk"
        >
            <template #prepend-inner>
                <v-icon size="20">mdi-lock</v-icon>
            </template>
            <template #append-inner>
                <v-icon size="20" style="cursor:pointer;" @click="pwVisible = !pwVisible">
                    {{ pwVisible ? 'mdi-eye-off' : 'mdi-eye' }}
                </v-icon>
            </template>
        </v-text-field>

        <template #actions>
            <v-btn color="error" variant="flat" @click="handleCancel">
                <v-icon size="20" class="mr-1">mdi-close-circle</v-icon>
                {{ str(strings?.intention?.cancel) }}
            </v-btn>
            <v-btn color="primary" variant="flat" @click="handleOk">
                <v-icon size="20" class="mr-1">mdi-check</v-icon>
                {{ str(strings?.intention?.ok) }}
            </v-btn>
        </template>
    </P3xrDialog>
</template>