diff --git a/client/src/components/reservation/ReservationV4TaskCardSection.vue b/client/src/components/reservation/ReservationV4TaskCardSection.vue new file mode 100644 index 0000000..e150b70 --- /dev/null +++ b/client/src/components/reservation/ReservationV4TaskCardSection.vue @@ -0,0 +1,494 @@ + + + + + + {{ title }} + + + #{{ card.card_id }} + + + + + + + + {{ t('task.reviewStatus') }} + {{ card.review_status ?? '-' }} + + + {{ t('taskV4.readonlyReason') }} + {{ availabilityReason || '-' }} + + + {{ t('taskV4.blockedReason') }} + {{ card.availability.blocked_reason ?? '-' }} + + + {{ t('taskV4.orderTaskId') }} + {{ orderTaskId ?? '-' }} + + + + + + + + {{ t('taskV4.displayPayload') }} + + + + {{ row.key }} + {{ row.value }} + + + + + + + {{ message }} + + + + + {{ successMessage }} + + + + + {{ t('taskV4.confirmedOrderId') }} + + + + {{ t('taskV4.reviewReason') }} + + + + + {{ submitting ? t('taskV4.resolvingReview') : t('taskV4.resolveReview') }} + + + {{ t('task.viewOrder') }} + + + + + + + {{ submitting ? t('taskV4.confirmingCard') : t('taskV4.confirmCard') }} + + + {{ t('task.viewOrder') }} + + + + + + + + diff --git a/client/src/tests/reservationV4Views.spec.ts b/client/src/tests/reservationV4Views.spec.ts index 04b91fe..34dfa6c 100644 --- a/client/src/tests/reservationV4Views.spec.ts +++ b/client/src/tests/reservationV4Views.spec.ts @@ -96,6 +96,28 @@ describe('reservation V4 pages', () => { }) }) + it('keeps V4 task card layout classes for styled card metadata and payload summary', async () => { + const detail = createOrderTaskDetail() + detail.business_cards[0]!.display_payload = { + booking_scenario: 'STANDARD', + relevant_message_excerpt: 'Please keep this visible.', + } + vi.mocked(service.fetchReservationV4OrderTaskDetail).mockResolvedValue(detail) + + const wrapper = await mountWithPlugins( + ReservationV4OrderTaskDetailView, + '/reservation/order-tasks/9001', + ) + await flushPromises() + + expect(wrapper.findAll('.task-card-section')).toHaveLength(2) + expect(wrapper.find('.task-card-section__header').exists()).toBe(true) + expect(wrapper.find('.card-meta-grid').exists()).toBe(true) + expect(wrapper.find('.card-meta-item').text()).toContain(zhCN.task.reviewStatus) + expect(wrapper.find('details.safe-payload > summary').text()).toContain(zhCN.taskV4.displayPayload) + expect(wrapper.find('.card-actions .primary-button').text()).toContain(zhCN.taskV4.confirmCard) + }) + it('does not render direct attachment URLs from V4 source message payload', async () => { const detail = createOrderTaskDetail({ sourceDisplayPayload: { diff --git a/client/src/views/reservation/ReservationV4OrderTaskDetailView.vue b/client/src/views/reservation/ReservationV4OrderTaskDetailView.vue index c0045ba..34e9433 100644 --- a/client/src/views/reservation/ReservationV4OrderTaskDetailView.vue +++ b/client/src/views/reservation/ReservationV4OrderTaskDetailView.vue @@ -88,6 +88,23 @@ v-if="detail.basic_information_card" :card="detail.basic_information_card" :title="t('taskV4.basicInformationCard')" + :model-value="cardValues[detail.basic_information_card.card_id] ?? {}" + :read-only="isCardReadOnly(detail.basic_information_card)" + :editable-keys="editableFieldKeys(detail.basic_information_card)" + :validation-errors="cardFieldErrors[detail.basic_information_card.card_id] ?? {}" + :hotel-id="detail.order_task.hotel_id" + :order-task-id="detail.order_task.order_task_id" + :action-errors="cardActionErrors[detail.basic_information_card.card_id] ?? []" + :success-message="cardSuccessMessages[detail.basic_information_card.card_id] ?? ''" + :review-form="reviewForms[detail.basic_information_card.card_id]" + :submitting="submittingCardId === detail.basic_information_card.card_id" + :can-confirm="canConfirmCard(detail.basic_information_card)" + :can-review="canReviewCard(detail.basic_information_card)" + :bound-order-id="detail.bound_order?.order_id" + @update:model-value="setCardValues(detail.basic_information_card, $event)" + @update:review-form="setReviewForm(detail.basic_information_card.card_id, $event)" + @confirm="submitConfirm(detail.basic_information_card)" + @resolve-review="submitReview(detail.basic_information_card)" /> @@ -113,6 +130,23 @@ :key="businessCard.card_id" :card="businessCard" :title="cardTitle(businessCard)" + :model-value="cardValues[businessCard.card_id] ?? {}" + :read-only="isCardReadOnly(businessCard)" + :editable-keys="editableFieldKeys(businessCard)" + :validation-errors="cardFieldErrors[businessCard.card_id] ?? {}" + :hotel-id="detail.order_task.hotel_id" + :order-task-id="detail.order_task.order_task_id" + :action-errors="cardActionErrors[businessCard.card_id] ?? []" + :success-message="cardSuccessMessages[businessCard.card_id] ?? ''" + :review-form="reviewForms[businessCard.card_id]" + :submitting="submittingCardId === businessCard.card_id" + :can-confirm="canConfirmCard(businessCard)" + :can-review="canReviewCard(businessCard)" + :bound-order-id="detail.bound_order?.order_id" + @update:model-value="setCardValues(businessCard, $event)" + @update:review-form="setReviewForm(businessCard.card_id, $event)" + @confirm="submitConfirm(businessCard)" + @resolve-review="submitReview(businessCard)" /> @@ -148,13 +182,13 @@
+ #{{ card.card_id }} +
+ {{ message }} +
+ {{ successMessage }} +