From 2f828cd164ed4f4dc3a68fac99559e437318ebde Mon Sep 17 00:00:00 2001 From: Ruslan Bakiev Date: Sat, 4 Apr 2026 13:52:01 +0700 Subject: [PATCH] Add unified order summary card --- app/components/orders/OrderSummaryCard.vue | 177 +++++++++++++++++++++ app/pages/client-orders/index.vue | 100 ++++++------ app/pages/clients/[id].vue | 24 +-- app/pages/orders/index.vue | 33 +--- 4 files changed, 244 insertions(+), 90 deletions(-) create mode 100644 app/components/orders/OrderSummaryCard.vue diff --git a/app/components/orders/OrderSummaryCard.vue b/app/components/orders/OrderSummaryCard.vue new file mode 100644 index 0000000..728ef77 --- /dev/null +++ b/app/components/orders/OrderSummaryCard.vue @@ -0,0 +1,177 @@ + + + diff --git a/app/pages/client-orders/index.vue b/app/pages/client-orders/index.vue index 06b7a16..9497c1c 100644 --- a/app/pages/client-orders/index.vue +++ b/app/pages/client-orders/index.vue @@ -3,23 +3,27 @@ import { useQuery } from '@vue/apollo-composable'; import FullCalendar from '@fullcalendar/vue3'; import dayGridPlugin from '@fullcalendar/daygrid'; import ruLocale from '@fullcalendar/core/locales/ru'; -import OrderStatusBadge from '~/components/orders/OrderStatusBadge.vue'; import { ManagerOrdersDocument, + ManagerUsersDocument, type ManagerOrdersQuery, + type ManagerUsersQuery, } from '~/composables/graphql/generated'; +import { messengerConnectionAvatarSrc } from '~/composables/useMessengerConnectionPresentation'; definePageMeta({ middleware: ['manager-only'], }); type ManagerOrderItem = ManagerOrdersQuery['managerOrders'][number]; +type ManagerUserItem = ManagerUsersQuery['managerUsers'][number]; type StatusFilter = 'ALL' | 'NEW' | 'PRICED' | 'IN_PROGRESS' | 'CLOSED'; const route = useRoute(); const router = useRouter(); const ordersQuery = useQuery(ManagerOrdersDocument, { status: null }); +const usersQuery = useQuery(ManagerUsersDocument); const search = ref(''); const statusFilter = ref('ALL'); @@ -40,6 +44,32 @@ function setViewMode(view: 'cards' | 'calendar' | 'kanban') { }); } +const usersById = computed>(() => Object.fromEntries( + (usersQuery.result.value?.managerUsers ?? []).map((user) => [user.id, user]), +)); + +function customerCardMeta(customerId: string) { + const customer = usersById.value[customerId]; + if (!customer) { + return { + name: customerId, + avatarSrc: '', + initials: customerId.slice(0, 2).toUpperCase(), + }; + } + + return { + name: customer.fullName, + avatarSrc: messengerConnectionAvatarSrc(customer.telegramConnection), + initials: customer.fullName + .split(/\s+/) + .filter(Boolean) + .slice(0, 2) + .map((part) => part.charAt(0).toUpperCase()) + .join(''), + }; +} + function getOrderGroup(order: ManagerOrderItem) { if (order.status === 'NEW' || order.status === 'MANAGER_PROCESSING') { return 'NEW'; @@ -68,6 +98,7 @@ const searchedOrders = computed(() => { const text = [ order.code, order.customerId, + customerCardMeta(order.customerId).name, order.deliveryAddress || '', ...order.items.map((item) => item.productName), ] @@ -248,68 +279,33 @@ const calendarOptions = computed(() => ({
- -
-
-

{{ order.code }}

-

Клиент: {{ order.customerId }}

-
- -
- -

Создан: {{ new Date(order.createdAt).toLocaleString() }}

-

{{ order.deliveryAddress }}

- -
    -
  • - {{ item.productName }} × {{ item.quantity }} -
  • -
- -

- ещё {{ order.items.length - 3 }} поз. -

-
+ :code="order.code" + :status="order.status" + :created-at="order.createdAt" + :total-price="order.totalPrice" + :items="order.items" + :customer="customerCardMeta(order.customerId)" + />
- -
-
-

{{ order.code }}

-

Клиент: {{ order.customerId }}

-

Создан: {{ new Date(order.createdAt).toLocaleString() }}

-

Адрес: {{ order.deliveryAddress }}

-
- -
- -
    -
  • - {{ item.productName }} × {{ item.quantity }} -
  • -
-
+ :code="order.code" + :status="order.status" + :created-at="order.createdAt" + :total-price="order.totalPrice" + :items="order.items" + :customer="customerCardMeta(order.customerId)" + />
diff --git a/app/pages/clients/[id].vue b/app/pages/clients/[id].vue index 1ee0d84..4ef7e10 100644 --- a/app/pages/clients/[id].vue +++ b/app/pages/clients/[id].vue @@ -178,21 +178,21 @@ async function rejectRequest() { У пользователя пока нет заказов.
- -
-
-

{{ order.code }}

-

{{ new Date(order.createdAt).toLocaleString() }}

-

{{ order.deliveryAddress }}

-
-

{{ order.status }}

-
-
+ :code="order.code" + :status="order.status" + :created-at="order.createdAt" + :total-price="order.totalPrice" + :items="order.items" + :customer="{ + name: currentUser.fullName, + avatarSrc: messengerConnectionAvatarSrc(currentUser.telegramConnection), + initials: userInitials(currentUser.fullName), + }" + />
diff --git a/app/pages/orders/index.vue b/app/pages/orders/index.vue index 2a9c385..f3af7ee 100644 --- a/app/pages/orders/index.vue +++ b/app/pages/orders/index.vue @@ -1,6 +1,5 @@