优化预订事项房型与房表展示
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user