fix some bug
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
<t-cell
|
<t-cell
|
||||||
v-for="(item, index) in customerList"
|
v-for="(item, index) in customerList"
|
||||||
:key="item.id || item.code || index"
|
:key="item.id || item.code || index"
|
||||||
:note="item.code"
|
:note="item.code || ''"
|
||||||
hover
|
hover
|
||||||
@click="handleSelect(item)"
|
@click="handleSelect(item)"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="customer-profile-card">
|
<div class="customer-profile-card">
|
||||||
<t-button v-if="photoURL" variant="text" class="avatar-trigger" @click="openPhotoViewer">
|
<button v-if="photoURL" type="button" class="avatar-trigger" @click.stop="openPhotoViewer">
|
||||||
<t-image :src="photoURL" :alt="customerName" fit="cover" class="avatar" />
|
<t-image :src="photoURL" :alt="customerName" fit="cover" class="avatar" />
|
||||||
</t-button>
|
</button>
|
||||||
<div v-else class="avatar fallback" v-text="avatarText" />
|
<div v-else class="avatar fallback" v-text="avatarText" />
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
@@ -66,6 +66,7 @@ function openPhotoViewer(): void {
|
|||||||
width: 4rem;
|
width: 4rem;
|
||||||
height: 4rem;
|
height: 4rem;
|
||||||
display: block;
|
display: block;
|
||||||
|
cursor: pointer;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
border-radius: .875rem;
|
border-radius: .875rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,26 +36,12 @@
|
|||||||
<body-area-selector v-model="selectedAreas" />
|
<body-area-selector v-model="selectedAreas" />
|
||||||
</div>
|
</div>
|
||||||
</t-cell-group>
|
</t-cell-group>
|
||||||
<t-cell-group v-if="inviter" :title="`被 ${inviter.name} 邀请`" class="invite" theme="card">
|
<t-cell-group v-if="inviter" :title="`由 ${inviter.name} 邀请`" class="invite" theme="card">
|
||||||
<t-cell
|
<customer-profile-card
|
||||||
:title="inviter.name"
|
class="profile-card"
|
||||||
arrow
|
:customer="inviter"
|
||||||
@click="goCustomerDetail(inviter)"
|
@click="goCustomerDetail(inviter)"
|
||||||
>
|
/>
|
||||||
<template #description>
|
|
||||||
<telephone-link :value="inviter.telephone" placeholder="未填写电话" />
|
|
||||||
</template>
|
|
||||||
<template #leftIcon>
|
|
||||||
<t-image
|
|
||||||
v-if="getCustomerPhotoURL(inviter)"
|
|
||||||
class="avatar"
|
|
||||||
:src="getCustomerPhotoURL(inviter)"
|
|
||||||
:alt="inviter.name"
|
|
||||||
fit="cover"
|
|
||||||
/>
|
|
||||||
<div v-else class="avatar fallback" v-text="(inviter.name || '客').slice(0, 1)" />
|
|
||||||
</template>
|
|
||||||
</t-cell>
|
|
||||||
</t-cell-group>
|
</t-cell-group>
|
||||||
<div class="invite">
|
<div class="invite">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
@@ -77,8 +63,8 @@
|
|||||||
<t-cell-group theme="card">
|
<t-cell-group theme="card">
|
||||||
<t-swipe-cell
|
<t-swipe-cell
|
||||||
class="item"
|
class="item"
|
||||||
v-for="item in invitees"
|
v-for="(item, index) in invitees"
|
||||||
:key="item.id || item.code"
|
:key="item.id || item.code || index"
|
||||||
>
|
>
|
||||||
<t-cell
|
<t-cell
|
||||||
arrow
|
arrow
|
||||||
@@ -465,6 +451,21 @@ watch(() => route.params.id, async () => {
|
|||||||
margin: 0 1rem;
|
margin: 0 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.t-cell__title) {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.t-cell__title-text) {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.t-cell__note) {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-width: 0;
|
||||||
|
white-space: normal;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
}
|
||||||
|
|
||||||
.conditioning-part {
|
.conditioning-part {
|
||||||
gap: .5rem;
|
gap: .5rem;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
@@ -474,6 +475,19 @@ watch(() => route.params.id, async () => {
|
|||||||
|
|
||||||
.invite {
|
.invite {
|
||||||
|
|
||||||
|
.inviter-profile {
|
||||||
|
gap: .5rem;
|
||||||
|
display: flex;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: .75rem;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.profile-card {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ async function saveCustomer(): Promise<void> {
|
|||||||
const customerCode = formModel.code.trim();
|
const customerCode = formModel.code.trim();
|
||||||
const payload: Customer = {
|
const payload: Customer = {
|
||||||
...(currentCustomer.value || {}),
|
...(currentCustomer.value || {}),
|
||||||
code: customerCode || undefined,
|
code: customerCode || null,
|
||||||
name: formModel.name,
|
name: formModel.name,
|
||||||
gender: formModel.gender || undefined,
|
gender: formModel.gender || undefined,
|
||||||
age: Number(formModel.age) || undefined,
|
age: Number(formModel.age) || undefined,
|
||||||
@@ -426,7 +426,7 @@ async function saveCustomer(): Promise<void> {
|
|||||||
remark: formModel.note,
|
remark: formModel.note,
|
||||||
disease: formModel.disease,
|
disease: formModel.disease,
|
||||||
conditioningPart: selectedAreas.value,
|
conditioningPart: selectedAreas.value,
|
||||||
introducerCustomerId: formModel.inviterCustomerId || undefined,
|
introducerCustomerId: formModel.inviterCustomerId || null,
|
||||||
attachmentIdList: photoTempFileId.value ? [photoTempFileId.value] : undefined
|
attachmentIdList: photoTempFileId.value ? [photoTempFileId.value] : undefined
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
<section class="items">
|
<section class="items">
|
||||||
<div
|
<div
|
||||||
class="item"
|
class="item"
|
||||||
v-for="item in customerList"
|
v-for="(item, index) in customerList"
|
||||||
:key="item.id || item.code"
|
:key="item.id || item.code || index"
|
||||||
@click="goDetail(item)"
|
@click="goDetail(item)"
|
||||||
>
|
>
|
||||||
<t-image v-if="getCustomerPhotoURL(item)" :src="getCustomerPhotoURL(item)" :alt="item.name" fit="cover" class="avatar" />
|
<t-image v-if="getCustomerPhotoURL(item)" :src="getCustomerPhotoURL(item)" :alt="item.name" fit="cover" class="avatar" />
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<h4 class="value" v-text="item.name" />
|
<h4 class="value" v-text="item.name" />
|
||||||
<gender-icon :value="item.gender" size="1.125rem" />
|
<gender-icon :value="item.gender" size="1.125rem" />
|
||||||
</div>
|
</div>
|
||||||
<span class="meta gray" v-text="item.code" />
|
<span class="meta gray" v-text="item.code || ''" />
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
<div class="gray">
|
<div class="gray">
|
||||||
|
|||||||
@@ -45,13 +45,23 @@
|
|||||||
required-mark
|
required-mark
|
||||||
/>
|
/>
|
||||||
<t-form-item label="登记时间" content-align="right">
|
<t-form-item label="登记时间" content-align="right">
|
||||||
<t-button
|
<div class="time-actions">
|
||||||
theme="primary"
|
<t-button
|
||||||
variant="outline"
|
theme="primary"
|
||||||
size="extra-small"
|
variant="outline"
|
||||||
:content="registeredAtText || '此刻'"
|
size="extra-small"
|
||||||
@click="openRegisteredAtPicker"
|
:content="registeredAtText || '此刻'"
|
||||||
/>
|
@click="openRegisteredAtPicker"
|
||||||
|
/>
|
||||||
|
<t-button
|
||||||
|
v-if="registeredAtText"
|
||||||
|
theme="primary"
|
||||||
|
variant="text"
|
||||||
|
size="extra-small"
|
||||||
|
content="此刻"
|
||||||
|
@click="resetRegisteredAt"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</t-form-item>
|
</t-form-item>
|
||||||
<t-form-item label="登记备注">
|
<t-form-item label="登记备注">
|
||||||
<t-textarea
|
<t-textarea
|
||||||
@@ -123,8 +133,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<t-popup v-model="registeredAtPickerVisible" placement="bottom">
|
<t-popup v-model="registeredAtPickerVisible" placement="bottom">
|
||||||
<t-date-time-picker
|
<t-date-time-picker
|
||||||
|
v-if="registeredAtPickerVisible"
|
||||||
v-model="registeredAtDraftText"
|
v-model="registeredAtDraftText"
|
||||||
:default-value="registeredAtDraftText"
|
:start="minimumDateTimeText"
|
||||||
:mode="['date', 'minute']"
|
:mode="['date', 'minute']"
|
||||||
format="YYYY-MM-DD HH:mm"
|
format="YYYY-MM-DD HH:mm"
|
||||||
title="登记时间"
|
title="登记时间"
|
||||||
@@ -169,6 +180,7 @@ const selectedCustomerList = ref<Customer[]>([]);
|
|||||||
const registrationEventList = ref<RegistrationEvent[]>([]);
|
const registrationEventList = ref<RegistrationEvent[]>([]);
|
||||||
const selectedRegistrationEventIdList = ref<string[]>([]);
|
const selectedRegistrationEventIdList = ref<string[]>([]);
|
||||||
const recentRecordList = ref<RegistrationEventRecord[]>([]);
|
const recentRecordList = ref<RegistrationEventRecord[]>([]);
|
||||||
|
const minimumDateTimeText = "1970-01-01 00:00";
|
||||||
const registeredAtText = ref("");
|
const registeredAtText = ref("");
|
||||||
const registeredAtDraftText = ref("");
|
const registeredAtDraftText = ref("");
|
||||||
const registeredAtPickerVisible = ref(false);
|
const registeredAtPickerVisible = ref(false);
|
||||||
@@ -436,6 +448,11 @@ function confirmRegisteredAt(): void {
|
|||||||
registeredAtPickerVisible.value = false;
|
registeredAtPickerVisible.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resetRegisteredAt(): void {
|
||||||
|
registeredAtText.value = "";
|
||||||
|
registeredAtDraftText.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
async function submitRecord(): Promise<void> {
|
async function submitRecord(): Promise<void> {
|
||||||
if (!validateForm()) {
|
if (!validateForm()) {
|
||||||
return;
|
return;
|
||||||
@@ -611,6 +628,13 @@ watch(customerCode, async (value) => {
|
|||||||
padding: 0 1rem;
|
padding: 0 1rem;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.time-actions {
|
||||||
|
gap: .5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.record-photo {
|
.record-photo {
|
||||||
|
|||||||
@@ -560,6 +560,22 @@ onUnmounted(() => {
|
|||||||
.cell {
|
.cell {
|
||||||
padding: .5rem;
|
padding: .5rem;
|
||||||
|
|
||||||
|
:deep(.t-cell__title) {
|
||||||
|
flex: 1 1 0;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.t-cell__title-text) {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.t-cell__note) {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.photo {
|
.photo {
|
||||||
width: 3.5rem;
|
width: 3.5rem;
|
||||||
height: 3.5rem;
|
height: 3.5rem;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export type BodyAreaValue = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type Customer = {
|
export type Customer = {
|
||||||
code?: string;
|
code?: string | null;
|
||||||
name?: string;
|
name?: string;
|
||||||
gender?: CustomerGender;
|
gender?: CustomerGender;
|
||||||
age?: number;
|
age?: number;
|
||||||
@@ -19,7 +19,7 @@ export type Customer = {
|
|||||||
remark?: string;
|
remark?: string;
|
||||||
disease?: string;
|
disease?: string;
|
||||||
conditioningPart?: BodyAreaValue;
|
conditioningPart?: BodyAreaValue;
|
||||||
introducerCustomerId?: string;
|
introducerCustomerId?: string | null;
|
||||||
creatorUserId?: string;
|
creatorUserId?: string;
|
||||||
lastSignInAt?: number;
|
lastSignInAt?: number;
|
||||||
introducerCustomer?: Customer;
|
introducerCustomer?: Customer;
|
||||||
|
|||||||
Reference in New Issue
Block a user