jws-frontend/src/components/01_branch-management/TableCardComponent.vue

183 lines
4.8 KiB
Vue
Raw Normal View History

2024-04-05 18:21:12 +07:00
<script setup lang="ts">
2024-04-10 09:45:44 +07:00
import { Icon } from '@iconify/vue';
2024-04-05 18:21:12 +07:00
import { QTableProps } from 'quasar';
import { ref } from 'vue';
const color: string[] = ['pink', 'violet'];
2024-04-11 09:57:24 +07:00
defineProps<{
2024-04-05 18:21:12 +07:00
subBranch?: boolean;
rows: {
2024-04-10 17:22:33 +07:00
id: string;
2024-04-05 18:21:12 +07:00
name: string;
branchName: string;
address: string;
2024-04-10 09:45:44 +07:00
telephoneNo: string;
code: string;
type: boolean;
2024-04-05 18:21:12 +07:00
status: string;
}[];
}>();
const columns = [
{
name: 'name',
required: true,
2024-04-11 09:57:24 +07:00
label: 'branchLabel',
2024-04-05 18:21:12 +07:00
align: 'left',
field: (row) => row.name,
format: (val) => `${val}`,
sortable: true,
},
{
name: 'branchName',
align: 'center',
2024-04-11 09:52:51 +07:00
label: 'branchName',
2024-04-05 18:21:12 +07:00
field: 'branchName',
sortable: true,
},
2024-04-10 18:08:01 +07:00
{ name: 'address', label: 'address', field: 'address', sortable: true },
{ name: 'telephoneNo', label: 'telephone', field: 'telephoneNo' },
2024-04-11 09:52:51 +07:00
{ name: 'code', label: 'code', field: 'code' },
{ name: 'type', label: 'type', field: 'type' },
{ name: 'status', label: 'status', field: 'status' },
2024-04-05 18:21:12 +07:00
] satisfies QTableProps['columns'];
const filter = ref('');
</script>
<template>
2024-04-11 09:42:26 +07:00
<div v-if="rows.length > 0">
2024-04-05 18:21:12 +07:00
<q-table
:rows-per-page-options="[4]"
flat
bordered
grid
:rows="rows"
:columns="columns"
row-key="name"
:filter="filter"
hide-header
2024-04-11 11:43:42 +07:00
card-container-class="q-col-gutter-lg"
2024-04-05 18:21:12 +07:00
>
2024-04-11 11:43:42 +07:00
<template #item="prop">
2024-04-10 18:08:01 +07:00
<div
2024-04-11 11:43:42 +07:00
class="col-6"
2024-04-10 18:08:01 +07:00
@click.stop="!subBranch && $emit('navigate', prop.row)"
>
2024-04-11 11:43:42 +07:00
<div class="bordered rounded" style="overflow: hidden">
<div
class="bordered-b row q-px-md q-py-sm"
:class="{
[`table-card__${color[+(subBranch || false)]}`]: true,
'table-header': i === 0,
'table-row': i !== 0 && i % 2 === 0,
dark: $q.dark.isActive,
}"
2024-04-05 18:21:12 +07:00
:key="i"
2024-04-10 17:22:33 +07:00
v-for="([k, v], i) in Object.entries(prop.row).slice(1)"
2024-04-05 18:21:12 +07:00
>
2024-04-11 11:43:42 +07:00
<div
2024-04-05 18:21:12 +07:00
avatar
2024-04-11 11:43:42 +07:00
class="row items-center"
2024-04-05 18:21:12 +07:00
style="width: 120px"
2024-04-11 11:43:42 +07:00
:style="{ color: (i !== 0 && 'grey') || 'currentColor' }"
2024-04-05 18:21:12 +07:00
>
2024-04-11 09:57:24 +07:00
{{
$t(
k === 'name'
? subBranch
? 'branchLabel'
: 'branchHQLabel'
: prop.colsMap[k]?.label,
)
}}
2024-04-11 11:43:42 +07:00
</div>
2024-04-05 18:21:12 +07:00
2024-04-11 11:43:42 +07:00
<div class="row items-center" style="flex-grow: 1">
<div style="flex-grow: 1">
2024-04-11 14:17:39 +07:00
<template v-if="k === 'status'">
<span
class="q-px-sm"
style="
color: var(--teal-6);
background: hsla(var(--teal-6-hsl) / 0.08);
border-radius: 25px;
"
>
{{ v }}
</span>
</template>
<template v-else>
{{
k !== 'type'
? v
: (v && $t('branchHQLabel')) || $t('branchLabel')
}}
</template>
2024-04-05 18:21:12 +07:00
</div>
2024-04-11 11:43:42 +07:00
<q-btn
2024-04-11 14:17:39 +07:00
size=".75rem"
2024-04-11 11:43:42 +07:00
v-if="i === 0"
outline
no-caps
class="q-px-md"
dense
:label="$t('viewDetail')"
@click.stop="$emit('showInfo', prop.row)"
2024-04-25 10:06:00 +07:00
:id="`view-detail-btn-${prop.row.id}`"
2024-04-11 11:43:42 +07:00
>
<Icon
icon="mdi:navigate-next"
class="cursor-pointer"
v-if="i === 0"
width="20px"
/>
</q-btn>
</div>
</div>
</div>
2024-04-05 18:21:12 +07:00
</div>
</template>
</q-table>
</div>
2024-04-11 09:42:26 +07:00
<div
v-else
class="column items-center justify-center q-pb-xl"
style="opacity: 0.3; height: 40vh"
>
<q-img
src="/no-data.png"
style="object-fit: cover; width: 128px; height: 128px"
/>
<span class="text-body1">{{ $t('noData') }}</span>
</div>
2024-04-05 18:21:12 +07:00
</template>
<style scoped>
2024-04-11 11:43:42 +07:00
.table-card__pink {
2024-04-05 18:21:12 +07:00
--bg-table-card-header: var(--pink-6-hsl);
2024-04-11 11:43:42 +07:00
--fg-table-card-header: var(--pink-0-hsl);
&.dark {
2024-04-05 18:21:12 +07:00
--bg-table-card-row: hsla(var(--gray-9-hsl) / 1);
}
}
2024-04-11 11:43:42 +07:00
.table-card__violet {
2024-04-10 17:22:33 +07:00
--bg-table-card-header: var(--purple-11-hsl);
2024-04-11 11:43:42 +07:00
--fg-table-card-header: var(--violet-0-hsl);
&.dark {
2024-04-05 18:21:12 +07:00
--bg-table-card-row: hsla(var(--gray-9-hsl) / 1);
}
}
2024-04-11 11:43:42 +07:00
.table-header {
2024-04-05 18:21:12 +07:00
background: hsl(var(--bg-table-card-header));
2024-04-11 11:43:42 +07:00
color: hsl(var(--fg-table-card-header));
2024-04-05 18:21:12 +07:00
}
2024-04-11 11:43:42 +07:00
.table-row {
background: hsla(var(--bg-table-card-header) / 0.08);
2024-04-05 18:21:12 +07:00
}
</style>