This commit is contained in:
seb
2026-10-11 03:27:02 +02:00
parent deb22d8b4f
commit 45cc69730b
4 changed files with 370 additions and 294 deletions

View File

@@ -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,
});