+29
-8
@@ -289,6 +289,9 @@ const OEE_SCHEMA={
|
||||
{k:'qualityRate',l:'Quality Rate',u:'Nos.',type:'calc'},
|
||||
{k:'qualityRate2',l:'Quality Rate',u:'%',type:'calc',hl:true},
|
||||
]},
|
||||
{title:'Remarks',color:'#8aa0c0',fields:[
|
||||
{k:'remarks',l:'Remarks',type:'text',ph:'Optional note...'},
|
||||
]},
|
||||
],
|
||||
thead:`<thead>
|
||||
<tr>
|
||||
@@ -414,6 +417,9 @@ const OEE_SCHEMA={
|
||||
{k:'qualityRate',l:'Quality Rate',u:'Nos.',type:'calc'},
|
||||
{k:'qualityRate2',l:'Quality Rate',u:'%',type:'calc',hl:true},
|
||||
]},
|
||||
{title:'Remarks',color:'#8aa0c0',fields:[
|
||||
{k:'remarks',l:'Remarks',type:'text',ph:'Optional note...'},
|
||||
]},
|
||||
],
|
||||
compute:function(r){
|
||||
const n=k=>{const v=parseFloat(r[k]);return isNaN(v)?0:v;};
|
||||
@@ -480,6 +486,9 @@ const OEE_SCHEMA={
|
||||
{k:'qualityRate',l:'Quality Rate',u:'Nos. or Kg',type:'calc'},
|
||||
{k:'qualityRate2',l:'Quality Rate',u:'%',type:'calc',hl:true},
|
||||
]},
|
||||
{title:'Remarks',color:'#8aa0c0',fields:[
|
||||
{k:'remarks',l:'Remarks',type:'text',ph:'Optional note...'},
|
||||
]},
|
||||
],
|
||||
compute:function(r){
|
||||
const n=k=>{const v=parseFloat(r[k]);return isNaN(v)?0:v;};
|
||||
@@ -546,6 +555,9 @@ const OEE_SCHEMA={
|
||||
{k:'qualityRate',l:'Quality Rate',u:'Nos. or Kg',type:'calc'},
|
||||
{k:'qualityRate2',l:'Quality Rate',u:'%',type:'calc',hl:true},
|
||||
]},
|
||||
{title:'Remarks',color:'#8aa0c0',fields:[
|
||||
{k:'remarks',l:'Remarks',type:'text',ph:'Optional note...'},
|
||||
]},
|
||||
],
|
||||
compute:function(r){
|
||||
const n=k=>{const v=parseFloat(r[k]);return isNaN(v)?0:v;};
|
||||
@@ -595,7 +607,7 @@ const OEE_SCHEMA={
|
||||
{k:'oee',l:'OEE (Target 85%)',u:'%',type:'calc',hl:true},
|
||||
]},
|
||||
{title:'Remarks',color:'#8aa0c0',fields:[
|
||||
{k:'remarks',l:'Remarks',type:'text'},
|
||||
{k:'remarks',l:'Remarks',type:'text',ph:'Optional note...'},
|
||||
]},
|
||||
],
|
||||
compute:function(r){
|
||||
@@ -641,7 +653,8 @@ let _companies=[{value:_co,label:_co}];
|
||||
function coOptions(sel){return _companies.map(c=>`<option value="${esc(c.value)}" ${sel===c.value?'selected':''}>${esc(c.label)}</option>`).join('');}
|
||||
|
||||
let _mode='list'; // 'list' | 'form'
|
||||
let _docs=[];let _listLoading=false;let _filterTab='';let _page=0,_pageSize=30,_rawCount=0;
|
||||
let _docs=[];let _listLoading=false;let _filterTab='';let _page=0,_pageSize=30,_rawCount=0;let _docsTotal=null;
|
||||
let _filterMonthFrom='',_filterMonthTo='';
|
||||
let _editId=null; // doc id when editing, null for new
|
||||
let _tab='ebb';let _month='';let _remark='';let _rows=[];
|
||||
let _canceled=false;let _saving=false;let _formLoading=false;
|
||||
@@ -672,8 +685,9 @@ async function loadList(resetPage){
|
||||
if(resetPage)_page=0;
|
||||
_listLoading=true;render();
|
||||
const tq=_filterTab?`&tab=${encodeURIComponent(_filterTab)}`:'';
|
||||
try{const r=await api('GET',`/oee?top=${_pageSize}&skip=${_page*_pageSize}&company=${encodeURIComponent(_co)}${tq}`);_docs=r.data||[];_rawCount=_docs.length;}
|
||||
catch(e){toast(e.message,'err');_docs=[];_rawCount=0;}
|
||||
const mq=(_filterMonthFrom?`&monthFrom=${_filterMonthFrom}`:'')+(_filterMonthTo?`&monthTo=${_filterMonthTo}`:'');
|
||||
try{const r=await api('GET',`/oee?top=${_pageSize}&skip=${_page*_pageSize}&company=${encodeURIComponent(_co)}${tq}${mq}`);_docs=r.data||[];_rawCount=_docs.length;_docsTotal=typeof r.total==='number'?r.total:null;}
|
||||
catch(e){toast(e.message,'err');_docs=[];_rawCount=0;_docsTotal=null;}
|
||||
_listLoading=false;render();
|
||||
}
|
||||
|
||||
@@ -757,6 +771,11 @@ function renderList(app){
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end;margin-bottom:14px">
|
||||
<div class="fg" style="margin:0;min-width:150px"><label class="fl">Company</label><select class="fi" id="sel-co">${coOptions(_co)}</select></div>
|
||||
<div class="fg" style="margin:0;min-width:170px"><label class="fl">Filter by Form</label><select class="fi" id="f-tab">${tabOpts}</select></div>
|
||||
<div class="fg" style="margin:0"><label class="fl">Month</label><div style="display:flex;gap:6px;align-items:center">
|
||||
<input class="fi" id="f-monthfrom" type="month" value="${esc(_filterMonthFrom)}" style="width:130px"/>
|
||||
<span style="font-size:11px;color:var(--text3)">to</span>
|
||||
<input class="fi" id="f-monthto" type="month" value="${esc(_filterMonthTo)}" style="width:130px"/>
|
||||
</div></div>
|
||||
${CAN_ADD?`<button class="btn b-primary" id="btn-new" style="height:36px;margin-left:auto">+ New Entry</button>`:''}
|
||||
</div>
|
||||
${_listLoading?`<div class="empty-msg"><span class="sp" style="border-color:rgba(26,111,255,.25);border-top-color:var(--blue)"></span> Loading…</div>`:
|
||||
@@ -764,14 +783,16 @@ function renderList(app){
|
||||
`<div class="mp-list">${docsHtml}</div>
|
||||
<div class="mp-pager">
|
||||
<button class="btn b-cancel" id="l-prev" ${_page===0?'disabled':''} style="padding:6px 14px;font-size:11px">‹ Prev</button>
|
||||
<span class="mp-count">Page ${_page+1}</span>
|
||||
<button class="btn b-cancel" id="l-next" ${_rawCount>=_pageSize?'':'disabled'} style="padding:6px 14px;font-size:11px">Next ›</button>
|
||||
<span class="mp-count">${_docsTotal!=null?`Page ${_page+1} of ${Math.max(1,Math.ceil(_docsTotal/_pageSize))} · ${_docsTotal} record${_docsTotal===1?'':'s'}`:`Page ${_page+1}`}</span>
|
||||
<button class="btn b-cancel" id="l-next" ${(_docsTotal!=null?(_page+1)*_pageSize<_docsTotal:_rawCount>=_pageSize)?'':'disabled'} style="padding:6px 14px;font-size:11px">Next ›</button>
|
||||
</div>`}
|
||||
</div>`;
|
||||
app.appendChild(c);
|
||||
setTimeout(()=>{
|
||||
q('#sel-co')&&(q('#sel-co').onchange=function(){_co=this.value;loadList(true);});
|
||||
q('#f-tab')&&(q('#f-tab').onchange=function(){_filterTab=this.value;loadList(true);});
|
||||
q('#f-monthfrom')&&(q('#f-monthfrom').onchange=function(){_filterMonthFrom=this.value;loadList(true);});
|
||||
q('#f-monthto')&&(q('#f-monthto').onchange=function(){_filterMonthTo=this.value;loadList(true);});
|
||||
q('#btn-new')&&(q('#btn-new').onclick=newEntry);
|
||||
q('#l-prev')&&(q('#l-prev').onclick=()=>{if(_page>0){_page--;loadList();}});
|
||||
q('#l-next')&&(q('#l-next').onclick=()=>{if(_rawCount>=_pageSize){_page++;loadList();}});
|
||||
@@ -821,7 +842,7 @@ function openRowModal(index,readOnly){
|
||||
const opts=machineNamesForTab(_tab).map(m=>`<option value="${esc(m)}" ${cur===m?'selected':''}>${esc(m)}</option>`).join('');
|
||||
inp=`<select data-f="${f.k}" ${readOnly?'disabled':''}><option value="">— Select —</option>${opts}</select>`;
|
||||
}
|
||||
else if(f.type==='text'||f.type==='machine')inp=`<input data-f="${f.k}" type="text" placeholder="${f.type==='machine'?'Machine name':'e.g. A / B / C'}" value="${esc(String(work[f.k]||''))}" ${readOnly?'disabled':''}/>`;
|
||||
else if(f.type==='text'||f.type==='machine')inp=`<input data-f="${f.k}" type="text" placeholder="${esc(f.ph||(f.type==='machine'?'Machine name':'e.g. A / B / C'))}" value="${esc(String(work[f.k]||''))}" ${readOnly?'disabled':''}/>`;
|
||||
else inp=`<input data-f="${f.k}" type="number" step="any" value="${esc(String(work[f.k]!=null?work[f.k]:0))}" ${readOnly?'disabled':''}/>`;
|
||||
return `<div class="oee-fld">${label}${inp}</div>`;
|
||||
};
|
||||
@@ -999,6 +1020,6 @@ async function init(){
|
||||
}
|
||||
init();
|
||||
</script>
|
||||
<script src="/sidebar.js?v=25"></script>
|
||||
<script src="/sidebar.js?v=31"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user