u
This commit is contained in:
@@ -23,6 +23,8 @@ import authAutomat from './authAutomat';
|
||||
/**
|
||||
* @typedef {Object} WarehouseState
|
||||
* @property {Array<Warehouse>} warehouses Company-scoped warehouses.
|
||||
* @property {Array<Warehouse>} filteredWarehouses Filtered warehouses according to active filter query.
|
||||
* @property {string} filter Active search/filter string.
|
||||
* @property {'idle'|'loading'|'ready'|'failed'} status Load lifecycle state.
|
||||
* @property {Error|null} error Last load error.
|
||||
*/
|
||||
@@ -30,12 +32,26 @@ import authAutomat from './authAutomat';
|
||||
/** @type {WarehouseState} */
|
||||
const initialState = {
|
||||
warehouses: [],
|
||||
filteredWarehouses: [],
|
||||
filter: '',
|
||||
status: 'idle',
|
||||
error: null,
|
||||
};
|
||||
|
||||
let warehouseAutomat;
|
||||
|
||||
const applyFilter = (warehouses, filter) => {
|
||||
const query = String(filter ?? '').trim().toLowerCase();
|
||||
return query ? warehouses.filter((w) => String(w.name ?? '').toLowerCase().includes(query)) : warehouses;
|
||||
};
|
||||
|
||||
const updateStateWithWarehouses = (warehouses, extra = {}) => {
|
||||
const list = Array.isArray(warehouses) ? warehouses : [];
|
||||
const filteredWarehouses = applyFilter(list, warehouseAutomat.state.filter);
|
||||
warehouseAutomat.setState({ warehouses: list, filteredWarehouses, ...extra });
|
||||
return list;
|
||||
};
|
||||
|
||||
/**
|
||||
* Fetches the company-scoped warehouse list.
|
||||
*
|
||||
@@ -61,7 +77,7 @@ function loadWarehouses() {
|
||||
warehouseAutomat.setState({ status: 'loading', error: null });
|
||||
try {
|
||||
const warehouses = await fetchWarehouses();
|
||||
warehouseAutomat.setState({ warehouses, status: 'ready', error: null });
|
||||
updateStateWithWarehouses(warehouses, { status: 'ready', error: null });
|
||||
return warehouses;
|
||||
} catch (error) {
|
||||
warehouseAutomat.setState({ status: 'failed', error });
|
||||
@@ -74,6 +90,15 @@ function loadWarehouses() {
|
||||
}
|
||||
|
||||
const actions = {
|
||||
/** Sets the active warehouse search filter and updates filteredWarehouses. */
|
||||
filter(query) {
|
||||
const filter = String(query ?? '');
|
||||
warehouseAutomat.setState({
|
||||
filter,
|
||||
filteredWarehouses: applyFilter(warehouseAutomat.state.warehouses, filter),
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Loads the warehouse list, exposing a loading/failed lifecycle.
|
||||
*
|
||||
@@ -91,7 +116,7 @@ const actions = {
|
||||
async reload() {
|
||||
try {
|
||||
const warehouses = await fetchWarehouses();
|
||||
warehouseAutomat.setState({ warehouses, status: 'ready', error: null });
|
||||
updateStateWithWarehouses(warehouses, { status: 'ready', error: null });
|
||||
return warehouses;
|
||||
} catch (error) {
|
||||
warehouseAutomat.setState({ error });
|
||||
@@ -130,6 +155,10 @@ const actions = {
|
||||
return data.warehouse;
|
||||
},
|
||||
|
||||
rename(id, body) {
|
||||
return actions.update(id, body);
|
||||
},
|
||||
|
||||
/**
|
||||
* Deletes a warehouse and refreshes the cached list.
|
||||
*
|
||||
@@ -148,6 +177,11 @@ const actions = {
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async reorder(warehouseIds) {
|
||||
const byId = new Map(warehouseAutomat.state.warehouses.map((w) => [w.id, w]));
|
||||
const reordered = warehouseIds.map((id) => byId.get(id)).filter(Boolean);
|
||||
if (reordered.length === warehouseAutomat.state.warehouses.length) {
|
||||
updateStateWithWarehouses(reordered);
|
||||
}
|
||||
await warehouseApi.order({ warehouseIds });
|
||||
await warehouseAutomat.actions.reload();
|
||||
},
|
||||
@@ -159,8 +193,7 @@ const actions = {
|
||||
* @returns {void}
|
||||
*/
|
||||
setWarehouses(warehouses) {
|
||||
warehouseAutomat.setState({
|
||||
warehouses: Array.isArray(warehouses) ? warehouses : [],
|
||||
updateStateWithWarehouses(warehouses, {
|
||||
status: 'ready',
|
||||
error: null,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user