2024-09-23 15:03:54 +07:00
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { Icon } from '@iconify/vue/dist/iconify.js';
|
|
|
|
|
import { formatNumberDecimal } from 'src/stores/utils';
|
2024-10-28 10:17:12 +07:00
|
|
|
import BadgeComponent from 'components/BadgeComponent.vue';
|
2024-09-23 15:03:54 +07:00
|
|
|
import KebabAction from '../shared/KebabAction.vue';
|
2024-10-18 11:52:04 +07:00
|
|
|
import MainButton from '../button/MainButton.vue';
|
2024-11-07 16:12:28 +07:00
|
|
|
import { onMounted } from 'vue';
|
2024-09-23 15:03:54 +07:00
|
|
|
|
|
|
|
|
defineProps<{
|
|
|
|
|
title?: string;
|
|
|
|
|
code?: string;
|
|
|
|
|
amount?: number;
|
2024-10-25 18:10:36 +07:00
|
|
|
status?: string;
|
|
|
|
|
workerCount?: number;
|
|
|
|
|
workerMax?: number;
|
|
|
|
|
createdAt?: string;
|
|
|
|
|
validUntil?: string;
|
2024-09-23 15:03:54 +07:00
|
|
|
customerName?: string;
|
|
|
|
|
reporter?: string;
|
|
|
|
|
totalPrice?: number;
|
2024-10-11 12:07:15 +07:00
|
|
|
urgent?: boolean;
|
2024-09-23 15:03:54 +07:00
|
|
|
}>();
|
|
|
|
|
|
|
|
|
|
defineEmits<{
|
|
|
|
|
(e: 'view'): void;
|
|
|
|
|
(e: 'edit'): void;
|
|
|
|
|
(e: 'link'): void;
|
|
|
|
|
(e: 'upload'): void;
|
|
|
|
|
(e: 'delete'): void;
|
|
|
|
|
(e: 'example'): void;
|
2024-10-18 10:56:10 +07:00
|
|
|
(e: 'preview'): void;
|
2024-09-23 15:03:54 +07:00
|
|
|
}>();
|
2024-11-07 16:12:28 +07:00
|
|
|
|
|
|
|
|
const rand = Math.random() * 2;
|
2024-09-23 15:03:54 +07:00
|
|
|
</script>
|
|
|
|
|
<template>
|
2024-11-07 10:55:55 +07:00
|
|
|
<div
|
2024-11-07 11:45:24 +07:00
|
|
|
class="surface-1 rounded q-pa-sm quo-card bordered"
|
2024-11-07 10:55:55 +07:00
|
|
|
:class="{ 'urgent-card': urgent }"
|
2024-11-07 16:12:28 +07:00
|
|
|
:style="{ '--animation-delay': rand + 's' }"
|
2024-11-07 10:55:55 +07:00
|
|
|
>
|
2024-09-23 15:03:54 +07:00
|
|
|
<!-- SEC: header -->
|
|
|
|
|
<header class="row items-center no-wrap">
|
2024-11-07 11:45:24 +07:00
|
|
|
<div v-if="urgent" class="q-mr-sm" style="font-size: 90%">
|
|
|
|
|
<BadgeComponent
|
|
|
|
|
icon="mdi-fire"
|
|
|
|
|
:title="$t('general.urgent2')"
|
|
|
|
|
hsla-color="--gray-1-hsl"
|
|
|
|
|
hsla-background="--red-8-hsl"
|
|
|
|
|
solid
|
|
|
|
|
/>
|
2024-09-23 15:03:54 +07:00
|
|
|
</div>
|
2024-11-07 11:45:24 +07:00
|
|
|
<div class="q-mr-sm" style="font-size: 90%">
|
|
|
|
|
<BadgeComponent
|
|
|
|
|
:title="status"
|
|
|
|
|
hsla-color="--blue-6-hsl"
|
|
|
|
|
hsla-background="--blue-0-hsl"
|
|
|
|
|
hsla-border="--blue-1-hsl"
|
|
|
|
|
:border="urgent"
|
|
|
|
|
solid
|
|
|
|
|
/>
|
2024-11-07 10:55:55 +07:00
|
|
|
</div>
|
2024-09-23 15:03:54 +07:00
|
|
|
|
|
|
|
|
<nav class="col text-right">
|
2024-10-25 18:10:36 +07:00
|
|
|
<q-btn
|
|
|
|
|
flat
|
|
|
|
|
dense
|
|
|
|
|
rounded
|
|
|
|
|
icon="mdi-play-box-outline"
|
|
|
|
|
size="12px"
|
2024-10-29 09:02:00 +07:00
|
|
|
:title="$t('preview.doc')"
|
2024-10-25 18:10:36 +07:00
|
|
|
@click.stop="$emit('preview')"
|
|
|
|
|
/>
|
2024-09-23 15:03:54 +07:00
|
|
|
<q-btn
|
|
|
|
|
flat
|
|
|
|
|
dense
|
|
|
|
|
rounded
|
|
|
|
|
icon="mdi-eye-outline"
|
|
|
|
|
size="12px"
|
2024-10-29 09:02:00 +07:00
|
|
|
:title="$t('general.viewDetail')"
|
2024-09-23 15:03:54 +07:00
|
|
|
@click.stop="$emit('view')"
|
|
|
|
|
/>
|
|
|
|
|
<KebabAction
|
|
|
|
|
:idName="code"
|
|
|
|
|
status="ACTIVE"
|
2024-10-18 14:00:14 +07:00
|
|
|
hide-toggle
|
2024-09-23 15:03:54 +07:00
|
|
|
use-upload
|
|
|
|
|
@view="$emit('view')"
|
|
|
|
|
@edit="$emit('edit')"
|
|
|
|
|
@link="$emit('link')"
|
|
|
|
|
@upload="$emit('upload')"
|
|
|
|
|
@delete="$emit('delete')"
|
|
|
|
|
/>
|
|
|
|
|
</nav>
|
|
|
|
|
</header>
|
|
|
|
|
|
2024-11-07 11:45:24 +07:00
|
|
|
<div class="ellipsis q-px-xs">
|
|
|
|
|
<b>{{ title || '-' }}</b>
|
|
|
|
|
<q-tooltip anchor="bottom start" self="top left">
|
|
|
|
|
{{ title || '-' }}
|
|
|
|
|
</q-tooltip>
|
|
|
|
|
</div>
|
|
|
|
|
<div
|
|
|
|
|
class="ellipsis q-px-xs q-mb-sm"
|
|
|
|
|
style="color: hsla(var(--gray-8-hsl) / 0.7); font-size: 80%"
|
|
|
|
|
>
|
|
|
|
|
{{ code || '-' }}
|
2024-11-04 14:08:48 +07:00
|
|
|
<q-tooltip anchor="bottom start" self="top left">
|
|
|
|
|
{{ title || '-' }}
|
|
|
|
|
</q-tooltip>
|
|
|
|
|
</div>
|
|
|
|
|
|
2024-09-23 15:03:54 +07:00
|
|
|
<!-- SEC: body -->
|
2024-11-07 11:45:24 +07:00
|
|
|
<section
|
|
|
|
|
class="rounded q-px-sm"
|
|
|
|
|
:class="{
|
|
|
|
|
'surface-1': urgent,
|
|
|
|
|
'surface-2': !urgent,
|
|
|
|
|
}"
|
|
|
|
|
>
|
2024-11-07 10:55:55 +07:00
|
|
|
<article class="row q-py-sm">
|
|
|
|
|
<div class="col-4 app-text-muted q-pr-sm">
|
|
|
|
|
{{ $t('quotation.customerName') }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-8">{{ customerName || '-' }}</div>
|
|
|
|
|
<div class="col-4 app-text-muted q-pr-sm">
|
|
|
|
|
{{ $t('quotation.actor') }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-8">{{ reporter || '-' }}</div>
|
|
|
|
|
<div class="col-4 app-text-muted q-pr-sm">
|
|
|
|
|
{{ $t('quotation.employee') }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-8">
|
|
|
|
|
<BadgeComponent
|
|
|
|
|
icon="mdi-account-multiple-outline"
|
|
|
|
|
:title="[workerCount, workerMax].join(' / ')"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-4 app-text-muted q-pr-sm">
|
|
|
|
|
{{ $t('general.createdAt') }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-8">
|
|
|
|
|
{{ createdAt }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-4 app-text-muted q-pr-sm">
|
|
|
|
|
{{ $t('general.validUntil') }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-8">
|
|
|
|
|
{{ validUntil }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-4 app-text-muted q-pr-sm">
|
|
|
|
|
{{ $t('quotation.totalPrice') }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="col-8">
|
|
|
|
|
{{ formatNumberDecimal(totalPrice || 0, 2) }}
|
|
|
|
|
</div>
|
|
|
|
|
</article>
|
2024-10-25 18:10:36 +07:00
|
|
|
</section>
|
2024-09-23 15:03:54 +07:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.badge-card {
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
color: hsla(var(--gray-0-hsl) / 1);
|
|
|
|
|
background: hsla(var(--_color) / 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.badge-card__fullAmountCash {
|
|
|
|
|
--_color: var(--red-6-hsl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.badge-card__installmentsCash {
|
|
|
|
|
--_color: var(--blue-6-hsl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.badge-card__fullAmountBill {
|
|
|
|
|
--_color: var(--jungle-8-hsl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.badge-card__installmentsBill {
|
|
|
|
|
--_color: var(--purple-7-hsl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dark .badge-card__installmentsCash {
|
|
|
|
|
--_color: var(--blue-10-hsl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
span {
|
|
|
|
|
display: inline-block;
|
|
|
|
|
/*new:*/
|
|
|
|
|
line-height: 12px;
|
|
|
|
|
height: 12px;
|
|
|
|
|
}
|
2024-10-11 12:07:15 +07:00
|
|
|
|
2024-11-07 10:55:55 +07:00
|
|
|
.urgent-card {
|
2024-11-07 16:01:09 +07:00
|
|
|
--_color: var(--red-7-hsl);
|
2024-11-07 11:45:24 +07:00
|
|
|
background-color: hsla(var(--red-7-hsl) / 0.07) !important;
|
|
|
|
|
border: 0.5px solid var(--red-6) !important;
|
2024-11-07 16:01:09 +07:00
|
|
|
animation: status 1s infinite;
|
2024-11-07 16:12:28 +07:00
|
|
|
animation-delay: var(--animation-delay);
|
2024-11-07 10:55:55 +07:00
|
|
|
|
|
|
|
|
.code {
|
|
|
|
|
color: var(--red-6);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tag {
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
border-radius: var(--radius-2);
|
|
|
|
|
background: hsl(var(--red-7-hsl));
|
|
|
|
|
color: white;
|
|
|
|
|
-webkit-box-shadow: 0px 0px 6px 0px rgba(240, 62, 62, 1);
|
|
|
|
|
-moz-box-shadow: 0px 0px 6px 0px rgba(240, 62, 62, 1);
|
|
|
|
|
box-shadow: 0px 0px 6px 0px rgba(240, 62, 62, 1);
|
|
|
|
|
}
|
2024-10-11 12:07:15 +07:00
|
|
|
}
|
2024-11-07 16:01:09 +07:00
|
|
|
|
|
|
|
|
@keyframes status {
|
|
|
|
|
0% {
|
|
|
|
|
box-shadow: 0x 0px 0px hsla(var(--_color) / 1);
|
|
|
|
|
}
|
|
|
|
|
50% {
|
|
|
|
|
box-shadow: 0px 0px 1px 4px hsla(var(--_color) / 0.3);
|
|
|
|
|
}
|
|
|
|
|
100% {
|
|
|
|
|
box-shadow: 0px 0px 4px 12px hsla(var(--_color) / 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-23 15:03:54 +07:00
|
|
|
</style>
|