Extract AdminOrderWorkflowService and status rules API; split AdminPage into composables and components; share order status constants; update tests. Co-authored-by: Cursor <cursoragent@cursor.com>
89 lines
2.3 KiB
TypeScript
89 lines
2.3 KiB
TypeScript
import { ref, computed } from 'vue'
|
|
import { fetchAllOrders, type AdminOrder } from '@/api/admin'
|
|
import { PAID_GROUP_STATUSES } from '@/constants/orderStatus'
|
|
|
|
export type AdminOrderFilter =
|
|
| 'all'
|
|
| 'processing'
|
|
| 'paid_group'
|
|
| 'pending_payment'
|
|
|
|
export function useAdminOrders() {
|
|
const orders = ref<AdminOrder[]>([])
|
|
const loading = ref(true)
|
|
const error = ref('')
|
|
const activeFilter = ref<AdminOrderFilter>('all')
|
|
const searchQuery = ref('')
|
|
|
|
const stats = computed(() => {
|
|
const total = orders.value.length
|
|
const todo = orders.value.filter((o) => o.status === 'processing').length
|
|
const paid = orders.value.filter((o) =>
|
|
PAID_GROUP_STATUSES.includes(
|
|
o.status as (typeof PAID_GROUP_STATUSES)[number],
|
|
),
|
|
).length
|
|
const pending = orders.value.filter(
|
|
(o) => o.status === 'pending_payment',
|
|
).length
|
|
return { total, todo, paid, pending }
|
|
})
|
|
|
|
const filteredOrders = computed(() => {
|
|
let result = orders.value
|
|
|
|
if (activeFilter.value === 'processing') {
|
|
result = result.filter((o) => o.status === 'processing')
|
|
} else if (activeFilter.value === 'paid_group') {
|
|
result = result.filter((o) =>
|
|
PAID_GROUP_STATUSES.includes(
|
|
o.status as (typeof PAID_GROUP_STATUSES)[number],
|
|
),
|
|
)
|
|
} else if (activeFilter.value === 'pending_payment') {
|
|
result = result.filter((o) => o.status === 'pending_payment')
|
|
}
|
|
|
|
const query = searchQuery.value.trim().toLowerCase()
|
|
if (query) {
|
|
result = result.filter(
|
|
(o) =>
|
|
o.id.toLowerCase().includes(query) ||
|
|
o.plate.toLowerCase().includes(query),
|
|
)
|
|
}
|
|
|
|
return result
|
|
})
|
|
|
|
async function loadOrders() {
|
|
loading.value = true
|
|
error.value = ''
|
|
try {
|
|
orders.value = await fetchAllOrders()
|
|
} catch {
|
|
error.value = 'Kunde inte hämta beställningar. Försök igen senare.'
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
function replaceOrder(updated: AdminOrder) {
|
|
const index = orders.value.findIndex((o) => o.id === updated.id)
|
|
if (index !== -1) {
|
|
orders.value[index] = updated
|
|
}
|
|
}
|
|
|
|
return {
|
|
orders,
|
|
loading,
|
|
error,
|
|
activeFilter,
|
|
searchQuery,
|
|
stats,
|
|
filteredOrders,
|
|
loadOrders,
|
|
replaceOrder,
|
|
}
|
|
}
|