Files
bssapp/ui/src/stores/orderBulkCloseStore.js

128 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineStore } from 'pinia'
import api from 'src/services/api'
export const useOrderBulkCloseStore = defineStore('orderBulkClose', {
state: () => ({
orders: [],
selectedOrderNumbers: [],
search: '',
loading: false,
closing: false,
error: null
}),
getters: {
selectedCount (state) {
return state.selectedOrderNumbers.length
},
totalCount (state) {
return state.orders.length
}
},
actions: {
isSelected (orderNumber) {
return this.selectedOrderNumbers.includes(orderNumber)
},
setSelected (orderNumber, selected) {
if (!orderNumber) return
if (selected) {
if (!this.selectedOrderNumbers.includes(orderNumber)) {
this.selectedOrderNumbers.push(orderNumber)
}
return
}
this.selectedOrderNumbers = this.selectedOrderNumbers.filter(
(n) => n !== orderNumber
)
},
toggleSelectMany (orderNumbers, selected) {
const clean = Array.from(
new Set((orderNumbers || []).filter(Boolean))
)
if (selected) {
const current = new Set(this.selectedOrderNumbers)
clean.forEach((n) => current.add(n))
this.selectedOrderNumbers = Array.from(current)
return
}
const block = new Set(clean)
this.selectedOrderNumbers = this.selectedOrderNumbers.filter(
(n) => !block.has(n)
)
},
clearSelection () {
this.selectedOrderNumbers = []
},
async fetchOrders () {
this.loading = true
this.error = null
try {
const search = String(this.search || '').trim()
const params = {}
if (search) params.search = search
const res = await api.get('/orders/close-ready', { params })
this.orders = Array.isArray(res?.data) ? res.data : []
// new list disinda kalan secimleri temizle
const available = new Set(this.orders.map((o) => o.OrderNumber))
this.selectedOrderNumbers = this.selectedOrderNumbers.filter(
(n) => available.has(n)
)
} catch (err) {
this.orders = []
this.error =
err?.response?.data ||
err?.message ||
'Siparişler alınamadı'
} finally {
this.loading = false
}
},
async closeSelectedOrders () {
if (!this.selectedOrderNumbers.length) {
return { affected: 0 }
}
this.closing = true
this.error = null
try {
const payload = {
order_numbers: this.selectedOrderNumbers
}
const res = await api.post('/orders/bulk-close', payload)
const affected = Number(res?.data?.affected || 0)
// local optimizasyon: secilenleri listeden dus
const selected = new Set(this.selectedOrderNumbers)
this.orders = this.orders.filter((o) => !selected.has(o.OrderNumber))
this.selectedOrderNumbers = []
return { affected }
} catch (err) {
this.error =
err?.response?.data ||
err?.message ||
'Toplu kapatma başarısız'
throw err
} finally {
this.closing = false
}
}
}
})