Files
SGF/public/supplier-picker-model.mjs
2026-11-04 09:37:20 +02:00

17 lines
1.1 KiB
JavaScript

/** Latest-request wins. Browsing never chooses a supplier or preserves a stale selection. */
export function createSupplierPicker(fetchPage,notify=()=>{},active=()=>true) {
let serial=0,state={items:[],selected:null,page:1,last:1,total:0,loading:false,error:null};
const publish=()=>{if(active())notify({...state});};
return {
get selected(){return state.selected;},
async search(search='',page=1){
const turn=++serial;state={items:[],selected:null,page,last:1,total:0,loading:true,error:null};publish();
try{const result=await fetchPage(search,page);if(turn!==serial||!active())return;
state={items:result.data,selected:null,page:result.current_page,last:result.last_page,total:result.total,loading:false,error:null};publish();
}catch(error){if(turn!==serial||!active())return;state={...state,loading:false,error:error.message};publish();}
},
choose(id){state={...state,selected:state.items.find(s=>String(s.id)===String(id))??null};publish();},
invalidate(){serial++;state={...state,items:[],selected:null,loading:false};publish();},
};
}