refactor: show table request

This commit is contained in:
Thanaphon Frappet 2024-12-18 17:55:45 +07:00
parent 40d9e339e0
commit bbe4150581
2 changed files with 175 additions and 1 deletions

View file

@ -43,6 +43,7 @@ import {
} from 'src/stores/product-service/types';
// NOTE: Import Components
import TableRequest from './TableRequest.vue';
import SelectInput from 'components/shared/SelectInput.vue';
import SwitchItem from 'components/shared/SwitchItem.vue';
import FormEmployeePassport from 'components/03_customer-management/FormEmployeePassport.vue';
@ -1845,7 +1846,11 @@ watch(
<template v-else>
<PaymentForm
v-if="view !== View.InvoicePre && view !== View.Receipt"
v-if="
view !== View.InvoicePre &&
view !== View.Receipt &&
view !== View.Complete
"
:data="quotationFormState.source"
@fetch-status="
() => {

View file

@ -0,0 +1,169 @@
<script setup lang="ts">
import { useI18n } from 'vue-i18n';
import { QTableColumn, QTableSlots } from 'quasar';
import { computed, reactive, ref, watch } from 'vue';
import { RequestData, RequestDataStatus } from 'src/stores/request-list/types';
import BadgeComponent from 'components/BadgeComponent.vue';
withDefaults(
defineProps<{
rows: RequestData[];
}>(),
{ rows: () => [] },
);
const columns = [
{
name: 'order',
align: 'center',
label: 'general.order',
field: (e: RequestData & { _index: number }) => e._index + 1,
},
{
name: 'code',
align: 'center',
label: 'quotation.tableColumnsRequest.code',
field: (v: RequestData) => v.code,
},
{
name: 'employeeName',
align: 'left',
label: 'customer.employee',
field: (v: RequestData) => {
return `${v.employee.firstName} ${v.employee.lastName}`;
},
},
{
name: 'requestDataStatus',
align: 'left',
label: 'general.status',
field: (v: RequestData) => v.requestDataStatus,
},
] satisfies QTableColumn[];
const emits = defineEmits<{
(e: 'success'): void;
}>();
const open = defineModel<boolean>('open', { default: false });
</script>
<template>
<q-table
:rows-per-page-options="[0]"
:rows="
rows.map((data, i) => ({
...data,
_index: i,
}))
"
:columns
hide-bottom
bordered
flat
hide-pagination
selection="multiple"
card-container-class="q-col-gutter-sm"
class="full-width"
>
<template v-slot:header="props">
<q-tr
style="background-color: hsla(var(--info-bg) / 0.07)"
:props="props"
>
<q-th v-for="col in columns" :key="col.name" :props="props">
<template v-if="!col.name.startsWith('#')">
{{ $t(col.label) }}
</template>
</q-th>
</q-tr>
</template>
<template
v-slot:body="props: {
row: RequestData & { _index: number };
} & Omit<Parameters<QTableSlots['body']>[0], 'row'>"
>
<q-tr :class="{ dark: $q.dark.isActive }" class="text-center">
<q-td v-for="col in columns" :align="col.align">
<!-- NOTE: custom column will starts with # -->
<template v-if="col.name !== 'requestDataStatus'">
<span>
{{
typeof col.field === 'string'
? props.row[col.field as keyof RequestData]
: col.field(props.row)
}}
</span>
</template>
<template v-else>
<span>
<BadgeComponent
:hsla-color="
props.row.requestDataStatus === RequestDataStatus.Pending
? '--orange-5-hsl'
: props.row.requestDataStatus ===
RequestDataStatus.InProgress
? '--blue-6-hsl'
: props.row.requestDataStatus ===
RequestDataStatus.Completed
? '--green-8-hsl'
: '--orange-5-hsl'
"
:title="
$t(`requestList.status.${props.row.requestDataStatus}`) || '-'
"
/>
</span>
</template>
</q-td>
</q-tr>
</template>
</q-table>
</template>
<style scoped>
.selectable-item {
padding: 0;
appearance: none;
border: none;
background: transparent;
position: relative;
color: inherit;
& > .selectable-item__pos {
display: none;
}
}
.selectable-item__selected {
& > :deep(*) {
border: 1px solid var(--_color, var(--brand-1)) !important;
}
& > .selectable-item__pos {
display: block;
position: absolute;
margin: var(--size-2);
right: 0;
top: 0;
border-radius: 50%;
width: 20px;
height: 20px;
color: var(--surface-1);
background: var(--brand-1);
color: currentColor;
}
}
.selectable-item__disabled {
filter: grayscale(1);
opacity: 0.5;
& :deep(*) {
cursor: not-allowed;
}
}
</style>