优化预订事项房型与房表展示

This commit is contained in:
andy
2026-07-22 11:29:49 +07:00
parent 0b420685f9
commit 2fb518be09
3 changed files with 56 additions and 30 deletions

View File

@@ -7,7 +7,7 @@
{{ t('taskV4.roomInformation.noDisplayModel') }} {{ t('taskV4.roomInformation.noDisplayModel') }}
</div> </div>
<template v-else> <template v-else>
<div class="room-information__header"> <div class="room-information__summary">
<div class="room-information__chips"> <div class="room-information__chips">
<span>{{ eventTypeLabel }}</span> <span>{{ eventTypeLabel }}</span>
<span>{{ bookingTypeLabel }}</span> <span>{{ bookingTypeLabel }}</span>
@@ -664,11 +664,15 @@ const roomInformationLabelKeys: Record<string, string> = {
gap: 16px; gap: 16px;
} }
.room-information__header { .room-information__summary {
display: flex; display: flex;
align-items: flex-start; align-items: center;
justify-content: space-between; justify-content: space-between;
gap: 12px; gap: 14px;
border: 1px solid var(--th-color-slate-200);
border-radius: var(--th-radius-sm);
background: linear-gradient(180deg, var(--th-color-white), var(--th-color-slate-50));
padding: 10px 12px;
} }
.room-information__chips { .room-information__chips {
@@ -688,19 +692,32 @@ const roomInformationLabelKeys: Record<string, string> = {
.room-information__status-slot { .room-information__status-slot {
display: flex; display: flex;
flex: 0 1 360px;
justify-content: flex-end; justify-content: flex-end;
min-width: min(260px, 100%); min-width: 0;
} }
.room-information__status-badge, .room-information__status-badge,
.room-information__status-field { .room-information__status-field {
display: grid; width: min(320px, 100%);
gap: 6px; min-width: 0;
min-width: 180px;
border: 1px solid var(--th-color-slate-200); border: 1px solid var(--th-color-slate-200);
border-radius: var(--th-radius-sm); border-radius: var(--th-radius-sm);
background: var(--th-color-slate-50); background: var(--th-color-white);
padding: 10px 12px; padding: 8px 10px;
}
.room-information__status-badge {
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: space-between;
gap: 12px;
}
.room-information__status-field {
display: grid;
gap: 6px;
} }
.room-information__status-badge span, .room-information__status-badge span,
@@ -718,12 +735,18 @@ const roomInformationLabelKeys: Record<string, string> = {
.room-information__status-badge strong { .room-information__status-badge strong {
color: var(--th-color-slate-900); color: var(--th-color-slate-900);
font-size: 14px; font-size: 13px;
font-weight: 900; font-weight: 900;
overflow-wrap: anywhere;
text-align: right;
}
.room-information__status-badge .room-information__status-error {
flex-basis: 100%;
} }
.room-information__status-field select { .room-information__status-field select {
min-height: 36px; min-height: 34px;
border: 1px solid var(--th-color-slate-200); border: 1px solid var(--th-color-slate-200);
border-radius: var(--th-radius-sm); border-radius: var(--th-radius-sm);
background: var(--th-color-white); background: var(--th-color-white);
@@ -866,13 +889,20 @@ const roomInformationLabelKeys: Record<string, string> = {
} }
@media (max-width: 760px) { @media (max-width: 760px) {
.room-information__header { .room-information__summary {
align-items: stretch; align-items: stretch;
flex-direction: column; flex-direction: column;
} }
.room-information__status-slot { .room-information__status-slot {
flex: 0 1 auto;
justify-content: flex-start; justify-content: flex-start;
width: 100%;
}
.room-information__status-badge,
.room-information__status-field {
width: 100%;
} }
.room-information__grid, .room-information__grid,

View File

@@ -16,9 +16,6 @@
{{ t('task.viewOrder') }} {{ t('task.viewOrder') }}
</RouterLink> </RouterLink>
</div> </div>
<p>{{ t('taskV4.roomingList.description') }}</p>
<small>{{ t('taskV4.roomingList.confirmHint') }}</small>
</section> </section>
</template> </template>
@@ -89,19 +86,6 @@ function readableValue(value?: string | null): string {
overflow-wrap: anywhere; overflow-wrap: anywhere;
} }
.rooming-list-card p,
.rooming-list-card small {
margin: 0;
color: var(--th-color-slate-600);
font-size: 13px;
line-height: 1.55;
}
.rooming-list-card small {
color: var(--th-color-slate-500);
font-weight: 700;
}
.rooming-list-card__link { .rooming-list-card__link {
color: var(--th-color-blue-600); color: var(--th-color-blue-600);
flex: 0 0 auto; flex: 0 0 auto;

View File

@@ -8,6 +8,7 @@ import { createMemoryHistory, createRouter } from 'vue-router'
import taskCardSectionSource from '@/components/reservation/ReservationV4TaskCardSection.vue?raw' import taskCardSectionSource from '@/components/reservation/ReservationV4TaskCardSection.vue?raw'
import paymentAttachmentPreviewSource from '@/components/reservation/ReservationV4PaymentAttachmentPreview.vue?raw' import paymentAttachmentPreviewSource from '@/components/reservation/ReservationV4PaymentAttachmentPreview.vue?raw'
import roomInformationCardSource from '@/components/reservation/ReservationV4RoomInformationCard.vue?raw'
import roomingListCardSource from '@/components/reservation/ReservationV4RoomingListCard.vue?raw' import roomingListCardSource from '@/components/reservation/ReservationV4RoomingListCard.vue?raw'
import traceCardSource from '@/components/reservation/ReservationV4TraceCard.vue?raw' import traceCardSource from '@/components/reservation/ReservationV4TraceCard.vue?raw'
import zhCN from '@/i18n/locales/zh-CN' import zhCN from '@/i18n/locales/zh-CN'
@@ -528,7 +529,8 @@ describe('reservation V4 pages', () => {
const roomingListCard = roomingListSection!.find('[data-testid="rooming-list-card"]') const roomingListCard = roomingListSection!.find('[data-testid="rooming-list-card"]')
expect(roomingListCard.exists()).toBe(true) expect(roomingListCard.exists()).toBe(true)
expect(roomingListSection!.text()).toContain(zhCN.taskV4.roomingList.title) expect(roomingListSection!.text()).toContain(zhCN.taskV4.roomingList.title)
expect(roomingListCard.text()).toContain(zhCN.taskV4.roomingList.description) expect(roomingListCard.text()).not.toContain(zhCN.taskV4.roomingList.description)
expect(roomingListCard.text()).not.toContain(zhCN.taskV4.roomingList.confirmHint)
expect(roomingListCard.text()).toContain('GRP-001') expect(roomingListCard.text()).toContain('GRP-001')
expect(roomingListSection!.findAll('a').filter((link) => link.text() === zhCN.task.viewOrder)).toHaveLength(1) expect(roomingListSection!.findAll('a').filter((link) => link.text() === zhCN.task.viewOrder)).toHaveLength(1)
expect(wrapper.text()).toContain(zhCN.taskV4.sourceMessageCard) expect(wrapper.text()).toContain(zhCN.taskV4.sourceMessageCard)
@@ -885,6 +887,10 @@ describe('reservation V4 pages', () => {
const blockIdField = findFieldByLabel(roomCard, zhCN.taskV4.roomInformation.blockId) const blockIdField = findFieldByLabel(roomCard, zhCN.taskV4.roomInformation.blockId)
expect(confirmationField?.find('.v4-field__static').text()).toBe('-') expect(confirmationField?.find('.v4-field__static').text()).toBe('-')
expect(blockIdField?.find('.v4-field__static').text()).toBe('-') expect(blockIdField?.find('.v4-field__static').text()).toBe('-')
const summary = roomCard.find('.room-information__summary')
expect(summary.exists()).toBe(true)
expect(summary.find('.room-information__chips').exists()).toBe(true)
expect(summary.find('.room-information__status-slot').exists()).toBe(true)
const statusSlot = roomCard.find('.room-information__status-slot') const statusSlot = roomCard.find('.room-information__status-slot')
const statusSelect = statusSlot.find('select[name="/room_information/final_values/group_booking_status"]') const statusSelect = statusSlot.find('select[name="/room_information/final_values/group_booking_status"]')
expect(statusSlot.text()).toContain(zhCN.taskV4.roomInformation.groupBookingStatus) expect(statusSlot.text()).toContain(zhCN.taskV4.roomInformation.groupBookingStatus)
@@ -1440,6 +1446,12 @@ describe('reservation V4 pages', () => {
expect(traceCardSource).not.toContain('margin: 0 20px 18px') expect(traceCardSource).not.toContain('margin: 0 20px 18px')
}) })
it('keeps Room Information summary compact on narrow screens and readable with readonly errors', () => {
expect(roomInformationCardSource).toMatch(/\.room-information__status-badge\s*\{[\s\S]*?flex-wrap: wrap;/)
expect(roomInformationCardSource).toMatch(/\.room-information__status-badge \.room-information__status-error\s*\{[\s\S]*?flex-basis: 100%;/)
expect(roomInformationCardSource).toMatch(/\.room-information__status-slot\s*\{[\s\S]*?flex: 0 1 auto;[\s\S]*?width: 100%;/)
})
it('requires confirmed order id before resolving an unresolved V4 review card', async () => { it('requires confirmed order id before resolving an unresolved V4 review card', async () => {
const detail = createOrderTaskDetail({ const detail = createOrderTaskDetail({
businessCardStatus: 'REVIEW_REQUIRED', businessCardStatus: 'REVIEW_REQUIRED',