refactor: branch card (customize with props instead)
This commit is contained in:
parent
9717e7770a
commit
b043ce6c17
2 changed files with 94 additions and 82 deletions
|
|
@ -1,18 +1,12 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
defineProps<{
|
defineProps<{
|
||||||
data: {
|
|
||||||
id: string;
|
|
||||||
hq: boolean;
|
|
||||||
status: string;
|
|
||||||
branchLabelCode: string;
|
|
||||||
branchLabelName: string;
|
|
||||||
branchLabelTel: string;
|
|
||||||
branchLabelAddress: string;
|
|
||||||
branchLabelType: string;
|
|
||||||
branchLabelStatus: string;
|
|
||||||
};
|
|
||||||
fieldSelected?: string[];
|
|
||||||
inactive?: boolean;
|
inactive?: boolean;
|
||||||
|
color?: 'none' | 'hq' | 'br';
|
||||||
|
data: Record<string, unknown>;
|
||||||
|
metadata?: unknown;
|
||||||
|
badgeField?: string[];
|
||||||
|
fieldSelected?: string[];
|
||||||
|
footer?: boolean;
|
||||||
}>();
|
}>();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
@ -20,20 +14,24 @@ defineProps<{
|
||||||
<div
|
<div
|
||||||
class="branch-card rounded bordered"
|
class="branch-card rounded bordered"
|
||||||
:class="{
|
:class="{
|
||||||
|
'branch-card__dark': $q.dark.isActive,
|
||||||
'branch-card__inactive': inactive,
|
'branch-card__inactive': inactive,
|
||||||
'branch-card__hq': data.hq,
|
'branch-card__none':
|
||||||
'branch-card__br': !data.hq,
|
color !== 'hq' && color !== 'br' && (!color || color === 'none'),
|
||||||
|
'branch-card__hq': color === 'hq',
|
||||||
|
'branch-card__br': color === 'br',
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="branch-card__row"
|
class="branch-card__row"
|
||||||
:class="{ 'branch-card__header': i === 0 }"
|
:class="{
|
||||||
v-for="([k, v], i) in Object.entries(data)
|
'branch-card__header': i === 0,
|
||||||
.slice(3)
|
'branch-card__footer': footer && i === Object.keys(data).length - 1,
|
||||||
.filter(
|
}"
|
||||||
([key], idx) =>
|
v-for="([k, v], i) in Object.entries(data).filter(
|
||||||
idx === 0 || (fieldSelected ? fieldSelected.includes(key) : true),
|
([key], idx) =>
|
||||||
)"
|
idx === 0 || (fieldSelected ? fieldSelected.includes(key) : true),
|
||||||
|
)"
|
||||||
:key="k"
|
:key="k"
|
||||||
>
|
>
|
||||||
<div class="branch-card__label">
|
<div class="branch-card__label">
|
||||||
|
|
@ -41,18 +39,18 @@ defineProps<{
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="branch-card__value"
|
class="branch-card__value"
|
||||||
:class="{ 'branch-card__badge': k === 'branchLabelStatus' }"
|
:class="{ 'branch-card__badge': badgeField?.includes(k) }"
|
||||||
style="justify-content: space-between"
|
style="justify-content: space-between"
|
||||||
>
|
>
|
||||||
<span>{{ v }}</span>
|
<span>{{ v }}</span>
|
||||||
<q-btn
|
<q-btn
|
||||||
@click.stop="$emit('view-detail', data)"
|
@click.stop="$emit('view-detail', metadata ?? data)"
|
||||||
:label="$t('viewDetail')"
|
:label="$t('viewDetail')"
|
||||||
rounded
|
rounded
|
||||||
outline
|
outline
|
||||||
dense
|
dense
|
||||||
no-caps
|
no-caps
|
||||||
class="q-px-md text-caption"
|
class="branch-card__view-detail q-px-md text-caption"
|
||||||
v-if="i === 0"
|
v-if="i === 0"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -66,22 +64,6 @@ defineProps<{
|
||||||
--_branch-card-row-bg: var(--blue-5-hsl);
|
--_branch-card-row-bg: var(--blue-5-hsl);
|
||||||
--_branch-badge-fg: var(--green-8-hsl);
|
--_branch-badge-fg: var(--green-8-hsl);
|
||||||
--_branch-badge-bg: var(--green-6-hsl);
|
--_branch-badge-bg: var(--green-6-hsl);
|
||||||
|
|
||||||
&.branch-card__hq {
|
|
||||||
--_branch-card-row-bg: var(--pink-6-hsl);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.branch-card__br {
|
|
||||||
--_branch-card-row-bg: var(--violet-11-hsl);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.branch-card__inactive {
|
|
||||||
--_branch-badge-fg: var(--red-4-hsl);
|
|
||||||
--_branch-badge-bg: var(--red-4-hsl);
|
|
||||||
filter: grayscale(40%);
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
@ -97,14 +79,18 @@ defineProps<{
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(:first-child):nth-child(2n + 1) {
|
&:nth-child(2n + 1) {
|
||||||
background-color: hsla(var(--_branch-card-row-bg) / 0.1);
|
background-color: hsla(var(--_branch-card-row-bg) / 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.branch-card__header {
|
&.branch-card__header,
|
||||||
|
&.branch-card__footer {
|
||||||
color: hsl(var(--_branch-card-row-fg));
|
color: hsl(var(--_branch-card-row-fg));
|
||||||
background-color: hsl(var(--_branch-card-row-bg));
|
background-color: hsl(var(--_branch-card-row-bg));
|
||||||
font-weight: 600;
|
|
||||||
|
&:deep(*) {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.branch-card__header > * {
|
&.branch-card__header > * {
|
||||||
|
|
@ -133,5 +119,36 @@ defineProps<{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.branch-card__none {
|
||||||
|
--_branch-card-row-bg: var(--gray-3-hsl);
|
||||||
|
|
||||||
|
&.branch-card__dark {
|
||||||
|
--_branch-card-row-bg: var(--gray-9-hsl);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.branch-card__dark) .branch-card__header {
|
||||||
|
color: currentColor;
|
||||||
|
|
||||||
|
& .branch-card__view-detail {
|
||||||
|
color: hsla(var(--gray-10-hsl) / 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.branch-card__hq {
|
||||||
|
--_branch-card-row-bg: var(--pink-6-hsl);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.branch-card__br {
|
||||||
|
--_branch-card-row-bg: var(--violet-11-hsl);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.branch-card__inactive {
|
||||||
|
--_branch-badge-fg: var(--red-4-hsl);
|
||||||
|
--_branch-badge-bg: var(--red-4-hsl);
|
||||||
|
filter: grayscale(40%);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,9 @@ const fieldSelectedBranch = ref<{
|
||||||
value: 'branchHQLabel',
|
value: 'branchHQLabel',
|
||||||
});
|
});
|
||||||
|
|
||||||
const stats = ref<{ count: number; label: string }[]>([]);
|
const stats = ref<
|
||||||
|
{ count: number; label: string; color?: 'pink' | 'purple' }[]
|
||||||
|
>([]);
|
||||||
|
|
||||||
const defaultFormData = {
|
const defaultFormData = {
|
||||||
headOfficeId: null,
|
headOfficeId: null,
|
||||||
|
|
@ -337,11 +339,13 @@ async function onSubmit() {
|
||||||
stats.value[0] = {
|
stats.value[0] = {
|
||||||
count: _stats.hq,
|
count: _stats.hq,
|
||||||
label: 'branchHQLabel',
|
label: 'branchHQLabel',
|
||||||
|
color: 'pink',
|
||||||
};
|
};
|
||||||
|
|
||||||
stats.value[1] = {
|
stats.value[1] = {
|
||||||
count: _stats.br,
|
count: _stats.br,
|
||||||
label: 'branchLabel',
|
label: 'branchLabel',
|
||||||
|
color: 'purple',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -726,7 +730,8 @@ watch(locale, () => {
|
||||||
</div>
|
</div>
|
||||||
<div class="branch-container">
|
<div class="branch-container">
|
||||||
<BranchCard
|
<BranchCard
|
||||||
v-for="item in branchData.result
|
v-for="item in treeData
|
||||||
|
.flatMap((v) => [v, ...v.branch])
|
||||||
.filter((v) => {
|
.filter((v) => {
|
||||||
if (
|
if (
|
||||||
statusFilter === 'statusACTIVE' &&
|
statusFilter === 'statusACTIVE' &&
|
||||||
|
|
@ -755,40 +760,13 @@ watch(locale, () => {
|
||||||
return !v.isHeadOffice;
|
return !v.isHeadOffice;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
})
|
|
||||||
.map((v) => ({
|
|
||||||
id: v.id,
|
|
||||||
hq: v.isHeadOffice,
|
|
||||||
status: v.status,
|
|
||||||
branchLabelCode: v.code,
|
|
||||||
branchLabelName:
|
|
||||||
$i18n.locale === 'en-US' ? v.nameEN : v.name,
|
|
||||||
branchLabelTel: v.contact
|
|
||||||
.map((c) => c.telephoneNo)
|
|
||||||
.join(','),
|
|
||||||
branchLabelAddress:
|
|
||||||
$i18n.locale === 'en-US'
|
|
||||||
? `${v.addressEN || ''} ${v.subDistrict?.nameEN || ''} ${v.district?.nameEN || ''} ${v.province?.nameEN || ''}`
|
|
||||||
: `${v.address || ''} ${v.subDistrict?.name || ''} ${v.district?.name || ''} ${v.province?.name || ''}`,
|
|
||||||
branchLabelType: $t(
|
|
||||||
v.isHeadOffice ? 'branchHQLabel' : 'branchLabel',
|
|
||||||
),
|
|
||||||
branchLabelStatus: $t(`status${v.status}`),
|
|
||||||
}))
|
|
||||||
.sort((a, b) => {
|
|
||||||
console.log(a);
|
|
||||||
|
|
||||||
if (a.hq) return 1;
|
|
||||||
// if (!a.hq) return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
})"
|
})"
|
||||||
@click="
|
@click="
|
||||||
() => {
|
() => {
|
||||||
if (item.hq) {
|
if (item.isHeadOffice) {
|
||||||
fieldSelectedBranch.value = '';
|
fieldSelectedBranch.value = '';
|
||||||
inputSearch = '';
|
inputSearch = '';
|
||||||
currentHq = { id: item.id, code: item.branchLabelCode };
|
currentHq = { id: item.id, code: item.code };
|
||||||
beforeBranch = {
|
beforeBranch = {
|
||||||
id: '',
|
id: '',
|
||||||
code: '',
|
code: '',
|
||||||
|
|
@ -796,18 +774,35 @@ watch(locale, () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
|
:metadata="item"
|
||||||
|
:color="item.isHeadOffice ? 'hq' : 'br'"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
:data="item"
|
:data="{
|
||||||
|
branchLabelCode: item.code,
|
||||||
|
branchLabelName:
|
||||||
|
$i18n.locale === 'en-US' ? item.nameEN : item.name,
|
||||||
|
branchLabelTel: item.contact
|
||||||
|
.map((c) => c.telephoneNo)
|
||||||
|
.join(','),
|
||||||
|
branchLabelAddress:
|
||||||
|
$i18n.locale === 'en-US'
|
||||||
|
? `${item.addressEN || ''} ${item.subDistrict?.nameEN || ''} ${item.district?.nameEN || ''} ${item.province?.nameEN || ''}`
|
||||||
|
: `${item.address || ''} ${item.subDistrict?.name || ''} ${item.district?.name || ''} ${item.province?.name || ''}`,
|
||||||
|
branchLabelType: $t(
|
||||||
|
item.isHeadOffice ? 'branchHQLabel' : 'branchLabel',
|
||||||
|
),
|
||||||
|
branchLabelStatus: $t(`status${item.status}`),
|
||||||
|
}"
|
||||||
:field-selected="fieldSelected"
|
:field-selected="fieldSelected"
|
||||||
|
:badge-field="['branchLabelStatus']"
|
||||||
:inactive="item.status === 'INACTIVE'"
|
:inactive="item.status === 'INACTIVE'"
|
||||||
@view-detail="
|
@view-detail="
|
||||||
(b) => {
|
(v) =>
|
||||||
if (b.hq) {
|
triggerEdit(
|
||||||
triggerEdit('drawer', b.id, 'headOffice');
|
'drawer',
|
||||||
} else {
|
v.id,
|
||||||
triggerEdit('drawer', b.id, 'subBranch');
|
v.hq ? 'headOffice' : 'subBranch',
|
||||||
}
|
)
|
||||||
}
|
|
||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue