@base-framework/organisms 1.0.129 → 1.0.132

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/organisms.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Atom as z}from"@base-framework/base";import{Div as W}from"@base-framework/atoms";import{Atom as _}from"@base-framework/base";var c=class{constructor(t=0,s=20){this.lastCursor=null,this.currentOffset=t,this.limit=s,this.hasMoreData=!0,this.loading=!1}canLoadMore(){return this.hasMoreData}update(t,s=null){t<this.limit&&(this.hasMoreData=!1),this.lastCursor=s,this.currentOffset+=t}reset(){this.lastCursor=null,this.currentOffset=0,this.hasMoreData=!0,this.loading=!1}};var $=100;function D(e){let t=e===globalThis?globalThis.pageYOffset:e.scrollTop,s=e===globalThis?globalThis.innerHeight:e.clientHeight,r=e===globalThis?globalThis.document.documentElement.scrollHeight:e.scrollHeight;return{scrollTop:t,clientHeight:s,scrollHeight:r}}function F(e,t=$){return e.scrollTop+e.clientHeight>=e.scrollHeight-t}var A=(e,t)=>F(e)&&t.canLoadMore(),w=(e,t,s,r=null)=>{e&&e.length>0?(s.append(e),t.update(e.length,r)):t.hasMoreData=!1},f=e=>(t,s)=>{let r=i=>{let a=[],o=null;i&&(a=i.rows||i.items||[],o=i.lastCursor||null),s(a,o)};e.xhr.all("",r,t.currentOffset,t.limit,t.lastCursor)};var m=(e,t,s)=>{t.reset(),e(t,(r,i)=>{s.reset(),w(r,t,s,i)})},H=(e,t,s)=>(r,{list:i},a)=>{let o=D(e);if(A(o,t)){if(t.loading)return;t.loading=!0,s(t,(n,l)=>{a&&a(),w(n,t,i,l),t.loading=!1})}},R=(e,t,s)=>(r,i,a)=>{let o=D(e);if(A(o,t)){if(t.loading)return;t.loading=!0,s(t,(n,l)=>{a&&a(),w(n,t,i,l),t.loading=!1})}};var q=(e,t,s)=>()=>{m(e,t,s)},J=(e,t,s)=>{s.list.refresh=q(e,t,s.list)},K=_((e,t)=>{let s=new c(e.offset,e.limit),r=e.loadMoreItems||f(e.data);return W({class:e.containerClass??"",onCreated(i,a){J(r,s,a),a.list.refresh()}},t)}),E=K;import{Div as B,On as U}from"@base-framework/atoms";import{Data as Y,Jot as j}from"@base-framework/base";import{Builder as k,Html as M}from"@base-framework/base";var h=class{static first(t){return this.get(t,0)}static last(t){let s=t.childNodes.length-1;return this.get(t,s)}static get(t,s){return t?.childNodes[s]??null}static next(t){return t?.nextSibling??null}static previous(t){return t?.previousSibling??null}static index(t){if(!t||!t.parentNode)return-1;let s=t.parentNode.children;return Array.from(s).indexOf(t)}static getPreviousIndex(t){let s=this.index(t);return s>0?s-1:0}static replace(t,s,r){if(!s)return;M.removeElementData(s);let i=k.build(t,null,r);s.replaceWith(i)}static remove(t){t&&M.removeChild(t)}static append(t,s,r){t&&k.build(t,s,r)}static prepend(t,s,r){if(!t)return;let i=k.build(t,null,r);s.insertBefore(i,s.firstChild)}};var v=(e,t,s)=>({index:e,item:t,status:s}),C=class{static diff(t,s,r){let i=this.arrayToMap(t,r),a=[],o=[];return s.forEach((n,l)=>{let p=n[r];if(!i.has(p)){a.push(v(l,n,"added"));return}let{item:N}=i.get(p);if(!this.deepEqual(N,n)){a.push(v(l,n,"updated"));return}a.push(v(l,n,"unchanged")),i.delete(p)}),i.forEach(({item:n})=>{o.push(n)}),{changes:a,deletedItems:o}}static arrayToMap(t,s){let r=new Map;return t.forEach((i,a)=>{r.set(i[s],{item:i,index:a})}),r}static deepEqual(t,s){if(t===s)return!0;if(typeof t!="object"||t===null||typeof s!="object"||s===null)return!1;let r=Object.keys(t),i=Object.keys(s);if(r.length!==i.length)return!1;for(let a of r)if(!i.includes(a)||!this.deepEqual(t[a],s[a]))return!1;return!0}};var x=class{constructor({layout:t,itemProperty:s,customCompare:r}){this.layout=t,this.itemProperty=s,this.customCompare=r,this.lastAppend=null,this.lastPrepend=null}reset(){this.lastAppend=null,this.lastPrepend=null}setFirstValues(t){let s=this.lastAppend;return s||(this.lastAppend=t),!s}append(t,s){let r=this.getValue(t);this.setFirstValues(r)&&this.addDivider(r,s),this.compare(this.lastAppend,r)&&(this.addDivider(r,s),this.lastAppend=r)}getValue(t){return t[this.itemProperty]??null}prepend(t,s){let r=this.getValue(t);this.setFirstValues(r)&&this.addDivider(r,s),this.compare(this.lastPrepend,r)&&(this.addDivider(this.lastPrepend,s),this.lastPrepend=r)}compare(t,s){return this.customCompare?this.customCompare(t,s):t!==s}addDivider(t,s){if(!this.layout||!s)return;let r=this.layout(t);s.push(r)}};var b=e=>JSON.parse(JSON.stringify(e)),d=j({onCreated(){this.divider&&(this.rowDivider=new x({...this.divider}))},setData(){let e=this.items?b(this.items):[];return new Y({items:e,hasItems:null})},before(){this.linkParentData()},linkParentData(){let e=!1,t=this.parent?.data??this.parent?.context?.data??null;t&&(e=t.get("hasItems"),this.data.link(t,"hasItems"));let s=e||null;if(e!==void 0){let r=this.items||[];s=Array.isArray(r)&&r.length>0,this.data.set("hasItems",s)}this.defaultHasItemValue=s},destroy(){this.data.hasItems=this.defaultHasItemValue},render(){let e=this.row.bind(this);return B({class:"flex flex-auto flex-col"},[U("hasItems",t=>!t&&this.emptyState?this.emptyState():null),B({cache:"listContainer",class:`list ${this.class||""}`,onSet:["hasItems",{hidden:!1}],for:["items",e]})])},row(e,t,s,r){return typeof this.rowItem!="function"?null:(this.rowDivider&&r&&this.rowDivider.append(e,r),this.rowItem(e,t))},delete(e){let t=this.findIndexByKey(e);if(t===-1)return;this.data.delete(`items[${t}]`);let s=h.get(this.listContainer,t);s&&h.remove(s),this.updateHasItems()},replace(e){if(e.status==="unchanged")return;let t=e.item;if(e.status==="added"){this.append(t);return}let s=t[this.key],r=this.findIndexByKey(s);if(r===-1)return;this.data.set(`items[${r}]`,t);let i=h.get(this.listContainer,r),a=this.row(t,r);i&&a&&h.replace(a,i,this)},remove(e){Array.isArray(e)&&(e.forEach(t=>{this.delete(t[this.key])}),this.updateHasItems())},setRows(e){let t=Array.isArray(e)?e:[];this.data.set("items",t),this.updateHasItems()},getRows(){return this.data.get("items")||[]},reset(){this.data.set("items",[]),this.data.set("hasItems",!1),this.rowDivider&&this.rowDivider.reset()},append(e){if(!e)return;Array.isArray(e)||(e=[e]),e=b(e);let t=[],s=this.data.items.length-1;e.forEach(r=>{this.rowDivider&&this.rowDivider.append(r,t);let i=this.row(r,s+1);i&&t.push(i),this.data.set(`items[${++s}]`,r)}),this.updateHasItems(),t.length>0&&h.append(t,this.listContainer,this)},mingle(e,t=!1){if(!Array.isArray(e))return;e=b(e);let s=this.data.get("items")||[],r=C.diff(s,e,this.key);t&&r.deletedItems.length>0&&this.remove(r.deletedItems),r.changes.forEach(i=>{this.replace(i)}),this.updateHasItems()},prepend(e){if(!e)return;Array.isArray(e)||(e=[e]),e=b(e);let t=[],s=e.reverse();s.forEach(a=>{this.rowDivider&&this.rowDivider.prepend(a,t);let o=this.row(a,0);o&&t.push(o)});let r=this.data.get("items")||[],i=s.concat(r);this.data.attributes.items=i,this.data.stage.items=i,this.updateHasItems(),t.length>0&&h.prepend(t,this.listContainer,this)},updateHasItems(){let e=this.data.get("items")||[],t=Array.isArray(e)&&e.length>0;this.data.set("hasItems",t)},findIndexByKey(e){return(this.data.get("items")||[]).findIndex(s=>s&&s[this.key]===e)}});var G=z(e=>E({loadMoreItems:e.loadMoreItems,offset:e.offset,limit:e.limit,containerClass:e.containerClass??"",data:e.data},[new d({cache:e.cache??"list",key:e.key,items:e.items||[],divider:e.divider,role:"list",class:e.class,rowItem:e.rowItem})]));import{Atom as st}from"@base-framework/base";import{Div as Q}from"@base-framework/atoms";import{Atom as X}from"@base-framework/base";var Z=(e,t,s)=>()=>{m(e,t,s)},tt=(e,t,s)=>{s.list.refresh=Z(e,t,s.list)},et=X((e,t)=>{let s=new c(e.offset,e.limit),r=e.scrollContainer||globalThis,i=e.loadMoreItems||f(e.data),a=H(r,s,i);return Q({class:e.containerClass??"",onCreated(o,n){tt(i,s,n),a(null,n,()=>{n.list.reset()})},addEvent:["scroll",r,a,{passive:!0}]},t)}),P=et;var rt=st(e=>P({scrollContainer:e.scrollContainer,loadMoreItems:e.loadMoreItems,offset:e.offset,limit:e.limit,containerClass:e.containerClass??"",data:e.data},[new d({cache:e.cache??"list",key:e.key,items:e.items||[],divider:e.divider,role:"list",class:e.class,rowItem:e.rowItem})]));import{A as it}from"@base-framework/atoms";import{Component as at,router as ot}from"@base-framework/base";var L=(e,t)=>({attr:e,value:t}),nt=(e,t)=>new RegExp("^"+e+"($|#|/|\\.).*").test(t),T=class extends at{beforeSetup(){this.selectedClass=this.activeClass||"active"}render(){let t=this.href,s=this.text,r=this.setupWatchers(t,s);return it({cache:"link",class:this.class||this.className||null,onState:["selected",{[this.selectedClass]:!0}],href:this.getString(t),text:this.getString(s),nest:this.nest||this.children,watch:r})}getLinkPath(){return this?.link?.pathname||null}getString(t){let s=typeof t;return s!=="object"&&s!=="undefined"?t:null}setupWatchers(t,s){let r=this.exact===!0,i=ot.data,a=[];return t&&typeof t=="object"&&a.push(L("href",t)),s&&typeof s=="object"&&a.push(L("text",s)),a.push({value:["[[path]]",i],callBack:(o,n)=>{let l=n.pathname+n.hash,p=r?o===l:nt(n.pathname,o);this.update(p)}}),a}setupStates(){return{selected:!1}}update(t){this.state.selected=t}};import{Tbody as dt}from"@base-framework/atoms";import{Data as ut}from"@base-framework/base";import{Div as lt,Td as ht,Tr as ct}from"@base-framework/atoms";var O=({columnCount:e=3,customCell:t,key:s})=>{let r=i=>{if(t&&typeof t=="function")return t(i);let a=["w-3/4","w-1/2","w-full","w-2/3","w-5/6"],o=a[i%a.length];return ht({class:"px-6 py-4"},[lt({class:`${o} h-4 bg-gray-200 rounded animate-pulse`})])};return ct({class:"border-b",key:s},Array.from({length:e},(i,a)=>r(a)))};var u=class extends d{setData(){let t=this.items&&this.items.length>0;return this.skeleton&&!t?new ut({items:this.generateSkeletonRows(),hasItems:!0,showSkeleton:!0}):super.setData()}generateSkeletonRows(){let t=this.skeleton,s=5,r=null;typeof t=="object"&&(s=t.number||5,r=t.row||null);let i=this.columnCount||3;return Array.from({length:s},(a,o)=>r&&typeof r=="function"?r(o,i):O({columnCount:i,key:`skeleton-${o}`}))}removeSkeleton(){this.data.get("showSkeleton")&&(this.data.set("showSkeleton",!1),this.data.set("items",this.items||[]))}setRows(t){this.removeSkeleton(),super.setRows(t)}append(t){this.removeSkeleton(),super.append(t)}prepend(t){this.removeSkeleton(),super.prepend(t)}render(){let t=this.row.bind(this);return dt({onCreated:s=>{this.listContainer=s},class:`tbody ${this.class||""}`,for:["items",t]})}};var ft=({key:e,rows:t,selectRow:s,rowItem:r,emptyState:i,skeleton:a,columnCount:o})=>new u({cache:"list",key:e,items:t,rowItem:n=>r(n,s),class:"divide-y divide-border",emptyState:i,skeleton:a,columnCount:o});import{Tbody as mt}from"@base-framework/atoms";var I=class extends u{declareProps(){this.tracker=null,this.scrollContainer=null,this.fetchCallback=null}setupPageTracker(){return this.tracker=new c(this.offset,this.limit)}setupScrollHandler(t){let s=this.setupPageTracker();return this.fetchCallback=this.loadMoreItems||f(this.tableData),R(t,s,this.fetchCallback)}refresh(){m(this.fetchCallback,this.tracker,this)}render(){let t=this.row.bind(this),s=this.scrollContainer||globalThis,r=this.setupScrollHandler(s);return mt({class:`tbody ${this.class||""}`,onCreated:(i,a)=>{this.listContainer=i,r(null,a,()=>{this.reset()})},addEvent:["scroll",s,r,{passive:!0}],for:["items",t]})}};import{Span as pt}from"@base-framework/atoms";import{Component as gt,SimpleData as yt}from"@base-framework/base";var g=class{constructor(t,s){this.timer=null,this.callBack=s,this.duration=t||1e3}createTimer(t){this.timer=globalThis.setTimeout(t,this.duration)}start(){this.stop();let t=this.returnCallBack.bind(this);this.createTimer(t)}stop(){globalThis.clearTimeout(this.timer)}returnCallBack(){let t=this.callBack;typeof t=="function"&&t.call()}};var y=class extends g{createTimer(t){this.timer=globalThis.setInterval(t,this.duration)}stop(){globalThis.clearInterval(this.timer)}};var V=new yt({date:0}),Ct=6e4,xt=new y(Ct,()=>{V.increment("date")});xt.start();var S=class extends gt{setData(){return V}render(){return pt({class:this.class,text:this.getTime(),onSet:["date",()=>this.getTime()]})}getTime(){let t=this.dateTime;return this.filter?this.filter(t):t}};export{G as DataList,ft as DataTableBody,S as DynamicTime,y as IntervalTimer,d as List,T as NavLink,rt as ScrollableList,I as ScrollableTableBody,u as TableBody,g as Timer};
1
+ import{Atom as z}from"@base-framework/base";import{Div as W}from"@base-framework/atoms";import{Atom as _}from"@base-framework/base";var c=class{constructor(t=0,s=20){this.lastCursor=null,this.currentOffset=t,this.limit=s,this.hasMoreData=!0,this.loading=!1}canLoadMore(){return this.hasMoreData}update(t,s=null){t<this.limit&&(this.hasMoreData=!1),this.lastCursor=s,this.currentOffset+=t}reset(){this.lastCursor=null,this.currentOffset=0,this.hasMoreData=!0,this.loading=!1}};var $=100;function D(e){let t=e===globalThis?globalThis.pageYOffset:e.scrollTop,s=e===globalThis?globalThis.innerHeight:e.clientHeight,r=e===globalThis?globalThis.document.documentElement.scrollHeight:e.scrollHeight;return{scrollTop:t,clientHeight:s,scrollHeight:r}}function F(e,t=$){return e.scrollTop+e.clientHeight>=e.scrollHeight-t}var A=(e,t)=>F(e)&&t.canLoadMore(),w=(e,t,s,r=null)=>{e&&e.length>0?(s.append(e),t.update(e.length,r)):t.hasMoreData=!1},f=e=>(t,s)=>{let r=i=>{let a=[],o=null;i&&(a=i.rows||i.items||[],o=i.lastCursor||null),s(a,o)};e.xhr.all("",r,t.currentOffset,t.limit,t.lastCursor)};var m=(e,t,s)=>{t.reset(),e(t,(r,i)=>{s.reset(),w(r,t,s,i)})},H=(e,t,s)=>(r,{list:i},a)=>{let o=D(e);if(A(o,t)){if(t.loading)return;t.loading=!0,s(t,(n,l)=>{a&&a(),w(n,t,i,l),t.loading=!1})}},R=(e,t,s)=>(r,i,a)=>{let o=D(e);if(A(o,t)){if(t.loading)return;t.loading=!0,s(t,(n,l)=>{a&&a(),w(n,t,i,l),t.loading=!1})}};var q=(e,t,s)=>()=>{m(e,t,s)},J=(e,t,s)=>{s.list.refresh=q(e,t,s.list)},K=_((e,t)=>{let s=new c(e.offset,e.limit),r=e.loadMoreItems||f(e.data);return W({class:e.containerClass??"",onCreated(i,a){J(r,s,a),a.list.refresh()}},t)}),E=K;import{Div as B,On as U}from"@base-framework/atoms";import{Data as Y,Jot as j}from"@base-framework/base";import{Builder as k,Html as M}from"@base-framework/base";var h=class{static first(t){return this.get(t,0)}static last(t){let s=t.childNodes.length-1;return this.get(t,s)}static get(t,s){return t?.childNodes[s]??null}static next(t){return t?.nextSibling??null}static previous(t){return t?.previousSibling??null}static index(t){if(!t||!t.parentNode)return-1;let s=t.parentNode.children;return Array.from(s).indexOf(t)}static getPreviousIndex(t){let s=this.index(t);return s>0?s-1:0}static replace(t,s,r){if(!s)return;M.removeElementData(s);let i=k.build(t,null,r);s.replaceWith(i)}static remove(t){t&&M.removeChild(t)}static append(t,s,r){t&&k.build(t,s,r)}static prepend(t,s,r){if(!t)return;let i=k.build(t,null,r);s.insertBefore(i,s.firstChild)}};var v=(e,t,s)=>({index:e,item:t,status:s}),C=class{static diff(t,s,r){let i=this.arrayToMap(t,r),a=[],o=[];return s.forEach((n,l)=>{let p=n[r];if(!i.has(p)){a.push(v(l,n,"added"));return}let{item:N}=i.get(p);if(!this.deepEqual(N,n)){a.push(v(l,n,"updated"));return}a.push(v(l,n,"unchanged")),i.delete(p)}),i.forEach(({item:n})=>{o.push(n)}),{changes:a,deletedItems:o}}static arrayToMap(t,s){let r=new Map;return t.forEach((i,a)=>{r.set(i[s],{item:i,index:a})}),r}static deepEqual(t,s){if(t===s)return!0;if(typeof t!="object"||t===null||typeof s!="object"||s===null)return!1;let r=Object.keys(t),i=Object.keys(s);if(r.length!==i.length)return!1;for(let a of r)if(!i.includes(a)||!this.deepEqual(t[a],s[a]))return!1;return!0}};var x=class{constructor({layout:t,itemProperty:s,customCompare:r}){this.layout=t,this.itemProperty=s,this.customCompare=r,this.lastAppend=null,this.lastPrepend=null}reset(){this.lastAppend=null,this.lastPrepend=null}setFirstValues(t){let s=this.lastAppend;return s||(this.lastAppend=t),!s}append(t,s){let r=this.getValue(t);this.setFirstValues(r)&&this.addDivider(r,s),this.compare(this.lastAppend,r)&&(this.addDivider(r,s),this.lastAppend=r)}getValue(t){return t[this.itemProperty]??null}prepend(t,s){let r=this.getValue(t);this.setFirstValues(r)&&this.addDivider(r,s),this.compare(this.lastPrepend,r)&&(this.addDivider(this.lastPrepend,s),this.lastPrepend=r)}compare(t,s){return this.customCompare?this.customCompare(t,s):t!==s}addDivider(t,s){if(!this.layout||!s)return;let r=this.layout(t);s.push(r)}};var b=e=>JSON.parse(JSON.stringify(e)),d=j({onCreated(){this.divider&&(this.rowDivider=new x({...this.divider}))},setData(){let e=this.items?b(this.items):[];return new Y({items:e,hasItems:null})},before(){this.linkParentData()},linkParentData(){let e=!1,t=this.parent?.data??this.parent?.context?.data??null;t&&(e=t.get("hasItems"),this.data.link(t,"hasItems"));let s=e||null;if(e!==void 0){let r=this.items||[];s=Array.isArray(r)&&r.length>0,this.data.set("hasItems",s)}this.defaultHasItemValue=s},destroy(){this.data.hasItems=this.defaultHasItemValue},render(){let e=this.row.bind(this);return B({class:"flex flex-auto flex-col"},[U("hasItems",t=>!t&&this.emptyState?this.emptyState():null),B({cache:"listContainer",class:`list ${this.class||""}`,onSet:["hasItems",{hidden:!1}],for:["items",e]})])},row(e,t,s,r){return typeof this.rowItem!="function"?null:(this.rowDivider&&r&&this.rowDivider.append(e,r),this.rowItem(e,t))},delete(e){let t=this.findIndexByKey(e);if(t===-1)return;this.data.delete(`items[${t}]`);let s=h.get(this.listContainer,t);s&&h.remove(s),this.updateHasItems()},replace(e){if(e.status==="unchanged")return;let t=e.item;if(e.status==="added"){this.append(t);return}let s=t[this.key],r=this.findIndexByKey(s);if(r===-1)return;this.data.set(`items[${r}]`,t);let i=h.get(this.listContainer,r),a=this.row(t,r);i&&a&&h.replace(a,i,this)},remove(e){Array.isArray(e)&&(e.forEach(t=>{this.delete(t[this.key])}),this.updateHasItems())},setRows(e){let t=Array.isArray(e)?e:[];this.data.set("items",t),this.updateHasItems()},getRows(){return this.data.get("items")||[]},reset(){this.data.set("items",[]),this.data.set("hasItems",!1),this.rowDivider&&this.rowDivider.reset()},append(e){if(!e)return;Array.isArray(e)||(e=[e]),e=b(e);let t=[],s=this.data.items.length-1;e.forEach(r=>{this.rowDivider&&this.rowDivider.append(r,t);let i=this.row(r,s+1);i&&t.push(i),this.data.set(`items[${++s}]`,r)}),this.updateHasItems(),t.length>0&&h.append(t,this.listContainer,this)},mingle(e,t=!1){if(!Array.isArray(e))return;e=b(e);let s=this.data.get("items")||[],r=C.diff(s,e,this.key);t&&r.deletedItems.length>0&&this.remove(r.deletedItems),r.changes.forEach(i=>{this.replace(i)}),this.updateHasItems()},prepend(e){if(!e)return;Array.isArray(e)||(e=[e]),e=b(e);let t=[],s=e.reverse();s.forEach(a=>{this.rowDivider&&this.rowDivider.prepend(a,t);let o=this.row(a,0);o&&t.push(o)});let r=this.data.get("items")||[],i=s.concat(r);this.data.attributes.items=i,this.data.stage.items=i,this.updateHasItems(),t.length>0&&h.prepend(t,this.listContainer,this)},updateHasItems(){let e=this.data.get("items")||[],t=Array.isArray(e)&&e.length>0;this.data.set("hasItems",t)},findIndexByKey(e){return(this.data.get("items")||[]).findIndex(s=>s&&s[this.key]===e)}});var G=z(e=>E({loadMoreItems:e.loadMoreItems,offset:e.offset,limit:e.limit,containerClass:e.containerClass??"",data:e.data},[new d({cache:e.cache??"list",key:e.key,items:e.items||[],divider:e.divider,role:"list",class:e.class,rowItem:e.rowItem})]));import{Atom as st}from"@base-framework/base";import{Div as Q}from"@base-framework/atoms";import{Atom as X}from"@base-framework/base";var Z=(e,t,s)=>()=>{m(e,t,s)},tt=(e,t,s)=>{s.list.refresh=Z(e,t,s.list)},et=X((e,t)=>{let s=new c(e.offset,e.limit),r=e.scrollContainer||globalThis,i=e.loadMoreItems||f(e.data),a=H(r,s,i);return Q({class:e.containerClass??"",onCreated(o,n){tt(i,s,n),a(null,n,()=>{n.list.reset()})},addEvent:["scroll",r,a,{passive:!0}]},t)}),P=et;var rt=st(e=>P({scrollContainer:e.scrollContainer,loadMoreItems:e.loadMoreItems,offset:e.offset,limit:e.limit,containerClass:e.containerClass??"",data:e.data},[new d({cache:e.cache??"list",key:e.key,items:e.items||[],divider:e.divider,role:"list",class:e.class,rowItem:e.rowItem})]));import{A as it}from"@base-framework/atoms";import{Component as at,router as ot}from"@base-framework/base";var L=(e,t)=>({attr:e,value:t}),nt=(e,t)=>new RegExp("^"+e+"($|#|/|\\.).*").test(t),T=class extends at{beforeSetup(){this.selectedClass=this.activeClass||"active"}render(){let t=this.href,s=this.text,r=this.setupWatchers(t,s);return it({cache:"link",class:this.class||this.className||null,onState:["selected",{[this.selectedClass]:!0}],href:this.getString(t),text:this.getString(s),nest:this.nest||this.children,watch:r})}getLinkPath(){return this?.link?.pathname||null}getString(t){let s=typeof t;return s!=="object"&&s!=="undefined"?t:null}setupWatchers(t,s){let r=this.exact===!0,i=ot.data,a=[];return t&&typeof t=="object"&&a.push(L("href",t)),s&&typeof s=="object"&&a.push(L("text",s)),a.push({value:["[[path]]",i],callBack:(o,n)=>{let l=n.pathname+n.hash,p=r?o===l:nt(n.pathname,o);this.update(p)}}),a}setupStates(){return{selected:!1}}update(t){this.state.selected=t}};import{Tbody as dt}from"@base-framework/atoms";import{Data as ut}from"@base-framework/base";import{Div as lt,Td as ht,Tr as ct}from"@base-framework/atoms";var O=({columnCount:e=3,customCell:t,key:s})=>{let r=i=>{if(t&&typeof t=="function")return t(i);let a=["w-3/4","w-1/2","w-full","w-2/3","w-5/6"],o=a[i%a.length];return ht({class:"px-6 py-4"},[lt({class:`${o} h-4 bg-muted rounded animate-pulse`})])};return ct({class:"border-b",key:s},Array.from({length:e},(i,a)=>r(a)))};var u=class extends d{setData(){let t=this.items&&this.items.length>0;return this.skeleton&&!t?new ut({items:this.generateSkeletonRows(),hasItems:!0,showSkeleton:!0}):super.setData()}generateSkeletonRows(){let t=this.skeleton,s=5,r=null;typeof t=="object"&&(s=t.number||5,r=t.row||null);let i=this.columnCount||3;return Array.from({length:s},(a,o)=>r&&typeof r=="function"?r(o,i):O({columnCount:i,key:`skeleton-${o}`}))}removeSkeleton(){this.data.get("showSkeleton")&&(this.data.set("showSkeleton",!1),this.data.set("items",this.items||[]))}setRows(t){this.removeSkeleton(),super.setRows(t)}append(t){this.removeSkeleton(),super.append(t)}prepend(t){this.removeSkeleton(),super.prepend(t)}row(t,s,r,i){return this.data&&this.data.get("showSkeleton")?t:super.row(t,s,r,i)}render(){let t=this.row.bind(this);return dt({onCreated:s=>{this.listContainer=s},class:`tbody ${this.class||""}`,for:["items",t]})}destroy(){super.destroy()}};var ft=({key:e,rows:t,selectRow:s,rowItem:r,emptyState:i,skeleton:a,columnCount:o})=>new u({cache:"list",key:e,items:t,rowItem:n=>r(n,s),class:"divide-y divide-border",emptyState:i,skeleton:a,columnCount:o});import{Tbody as mt}from"@base-framework/atoms";var I=class extends u{declareProps(){this.tracker=null,this.scrollContainer=null,this.fetchCallback=null}setupPageTracker(){return this.tracker=new c(this.offset,this.limit)}setupScrollHandler(t){let s=this.setupPageTracker();return this.fetchCallback=this.loadMoreItems||f(this.tableData),R(t,s,this.fetchCallback)}refresh(){m(this.fetchCallback,this.tracker,this)}render(){let t=this.row.bind(this),s=this.scrollContainer||globalThis,r=this.setupScrollHandler(s);return mt({class:`tbody ${this.class||""}`,onCreated:(i,a)=>{this.listContainer=i,r(null,a,()=>{this.reset()})},addEvent:["scroll",s,r,{passive:!0}],for:["items",t]})}};import{Span as pt}from"@base-framework/atoms";import{Component as gt,SimpleData as yt}from"@base-framework/base";var g=class{constructor(t,s){this.timer=null,this.callBack=s,this.duration=t||1e3}createTimer(t){this.timer=globalThis.setTimeout(t,this.duration)}start(){this.stop();let t=this.returnCallBack.bind(this);this.createTimer(t)}stop(){globalThis.clearTimeout(this.timer)}returnCallBack(){let t=this.callBack;typeof t=="function"&&t.call()}};var y=class extends g{createTimer(t){this.timer=globalThis.setInterval(t,this.duration)}stop(){globalThis.clearInterval(this.timer)}};var V=new yt({date:0}),Ct=6e4,xt=new y(Ct,()=>{V.increment("date")});xt.start();var S=class extends gt{setData(){return V}render(){return pt({class:this.class,text:this.getTime(),onSet:["date",()=>this.getTime()]})}getTime(){let t=this.dateTime;return this.filter?this.filter(t):t}};export{G as DataList,ft as DataTableBody,S as DynamicTime,y as IntervalTimer,d as List,T as NavLink,rt as ScrollableList,I as ScrollableTableBody,u as TableBody,g as Timer};
2
2
  //# sourceMappingURL=organisms.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lists/data-list.js", "../src/lists/data-container.js", "../src/lists/pagination-tracker.js", "../src/lists/scroll-utils.js", "../src/lists/list.js", "../src/utils/child-helper.js", "../src/utils/data-helper.js", "../src/lists/row-divider.js", "../src/lists/scrollable-list.js", "../src/lists/scrollable-container.js", "../src/router/nav-link.js", "../src/tables/table-body.js", "../src/tables/skeleton-table-row.js", "../src/tables/data-table-body.js", "../src/tables/scrollable-table-body.js", "../src/time/dynamic-time.js", "../src/utils/timer/timer.js", "../src/utils/timer/interval-timer.js"],
4
- "sourcesContent": ["import { Atom } from \"@base-framework/base\";\r\nimport DataContainer from \"./data-container.js\";\r\nimport { List } from \"./list.js\";\r\n\r\n/**\r\n * A ScrollableList component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.class] - The class to add to the list.\r\n * @property {string} [props.key] - The key to use to identify the items.\r\n * @property {array} [props.items] - The initial items.\r\n * @property {object} [props.divider] - The row divider.\r\n * @property {function} [props.rowItem] - The row item.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @property {string} [props.cache] - The cache name to use.\r\n * @returns {object}\r\n */\r\nexport const DataList = Atom((props) => (\r\n\tDataContainer(\r\n\t\t{\r\n\t\t\tloadMoreItems: props.loadMoreItems,\r\n\t\t\toffset: props.offset,\r\n\t\t\tlimit: props.limit,\r\n\t\t\tcontainerClass: props.containerClass ?? '',\r\n\t\t\tdata: props.data\r\n\t\t},\r\n\t\t[\r\n\t\t\tnew List({\r\n\t\t\t\tcache: props.cache ?? 'list',\r\n\t\t\t\tkey: props.key,\r\n\t\t\t\titems: props.items || [],\r\n\t\t\t\tdivider: props.divider,\r\n\t\t\t\trole: 'list',\r\n\t\t\t\tclass: props.class,\r\n\t\t\t\trowItem: props.rowItem\r\n\t\t\t})\r\n\t\t]\r\n\t)\r\n));\r\n\r\nexport default DataList;", "import { Div } from \"@base-framework/atoms\";\r\nimport { Atom } from \"@base-framework/base\";\r\nimport { PaginationTracker } from \"./pagination-tracker.js\";\r\nimport { fetchAndRefresh, setupFetchCallback } from \"./scroll-utils.js\";\r\n\r\n/**\r\n * This will reset the tracker and fetch new data.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {Function}\r\n */\r\nconst setupResetCallback = (fetchCallback, tracker, list) =>\r\n{\r\n\treturn () =>\r\n\t{\r\n\t\tfetchAndRefresh(fetchCallback, tracker, list);\r\n\t};\r\n};\r\n\r\n/**\r\n * This will add the refresh method to the list.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} parent\r\n */\r\nconst addRefreshMethod = (fetchCallback, tracker, parent) =>\r\n{\r\n\tparent.list.refresh = setupResetCallback(fetchCallback, tracker, parent.list);\r\n};\r\n\r\n/**\r\n * A DataContainer component that updates using the provided data.\r\n *\r\n * @param {object} props\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.containerClass] - The class to add to the list container.\r\n * @param {array} children - The child elements to render.\r\n * @returns {object}\r\n */\r\nexport const DataContainer = Atom((props, children) =>\r\n{\r\n\tconst tracker = new PaginationTracker(props.offset, props.limit);\r\n\tconst fetchCallback = props.loadMoreItems || setupFetchCallback(props.data);\r\n\r\n\treturn Div(\r\n\t\t{\r\n\t\t\tclass: props.containerClass ?? '',\r\n\r\n\t\t\t/**\r\n\t\t\t * This will request to update the list when the atom is created.\r\n\t\t\t *\r\n\t\t\t * @param {object} ele\r\n\t\t\t * @param {object} parent\r\n\t\t\t * @returns {void}\r\n\t\t\t */\r\n\t\t\tonCreated(ele, parent)\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will add the refresh method to the list.\r\n\t\t\t\t */\r\n\t\t\t\taddRefreshMethod(fetchCallback, tracker, parent);\r\n\r\n\t\t\t\tparent.list.refresh();\r\n\t\t\t}\r\n\t\t},\r\n\t\tchildren\r\n\t);\r\n});\r\n\r\nexport default DataContainer;", "/**\r\n * PaginationTracker stores and updates pagination state.\r\n *\r\n * @class\r\n */\r\nexport class PaginationTracker\r\n{\r\n\t/**\r\n\t * Creates an instance of PaginationTracker.\r\n\t *\r\n\t * @param {number} [offset=0] - The initial offset.\r\n\t * @param {number} [limit=20] - The number of items to load per batch.\r\n\t */\r\n\tconstructor(offset = 0, limit = 20)\r\n\t{\r\n\t\tthis.lastCursor = null;\r\n\t\tthis.currentOffset = offset;\r\n\t\tthis.limit = limit;\r\n\t\tthis.hasMoreData = true;\r\n\t\tthis.loading = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether more data can be loaded.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tcanLoadMore()\r\n\t{\r\n\t\treturn this.hasMoreData;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the tracker state based on the number of items loaded.\r\n\t *\r\n\t * @param {number} numItems - The number of items loaded.\r\n\t * @param {string|null} lastCursor - The last cursor value.\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(numItems, lastCursor = null)\r\n\t{\r\n\t\tif (numItems < this.limit)\r\n\t\t{\r\n\t\t\tthis.hasMoreData = false;\r\n\t\t}\r\n\r\n\t\tthis.lastCursor = lastCursor;\r\n\t\tthis.currentOffset += numItems;\r\n\t}\r\n\r\n\t/**\r\n\t * Resets the tracker state.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.lastCursor = null;\r\n\t\tthis.currentOffset = 0;\r\n\t\tthis.hasMoreData = true;\r\n\t\tthis.loading = false;\r\n\t}\r\n}\r\n\r\nexport default PaginationTracker;", "import { PaginationTracker } from \"./pagination-tracker.js\";\r\n\r\n// Module-level constant for scroll threshold (in pixels)\r\nconst SCROLL_THRESHOLD = 100;\r\n\r\n/**\r\n * Get scroll metrics for a container.\r\n *\r\n * @param {HTMLElement|globalThis} container\r\n * @returns {object} Contains scrollTop, clientHeight, and scrollHeight.\r\n */\r\nexport function getScrollMetrics(container)\r\n{\r\n\t// @ts-ignore\r\n\tconst scrollTop = container === globalThis ? globalThis.pageYOffset : container.scrollTop;\r\n\t// @ts-ignore\r\n\tconst clientHeight = container === globalThis ? globalThis.innerHeight : container.clientHeight;\r\n\t// @ts-ignore\r\n\tconst scrollHeight = container === globalThis ? globalThis.document.documentElement.scrollHeight : container.scrollHeight;\r\n\treturn { scrollTop, clientHeight, scrollHeight };\r\n}\r\n\r\n/**\r\n * Check if the scroll position indicates we should load more items.\r\n *\r\n * @param {object} metrics - The scroll metrics.\r\n * @param {number} [threshold=SCROLL_THRESHOLD] - The threshold in pixels.\r\n * @returns {boolean}\r\n */\r\nexport function shouldLoadMore(metrics, threshold = SCROLL_THRESHOLD)\r\n{\r\n\treturn metrics.scrollTop + metrics.clientHeight >= metrics.scrollHeight - threshold;\r\n}\r\n\r\n/**\r\n * Check if more items can be loaded based on metrics and tracker state.\r\n *\r\n * @param {object} metrics - The scroll metrics.\r\n * @param {PaginationTracker} tracker - The pagination tracker.\r\n * @returns {boolean}\r\n */\r\nexport const canLoad = (metrics, tracker) =>\r\n{\r\n\treturn shouldLoadMore(metrics) && tracker.canLoadMore();\r\n};\r\n\r\n/**\r\n * Update the rows in the list and update the tracker state.\r\n *\r\n * @param {Array} rows\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @param {string|null} lastCursor - The last cursor value.\r\n * @returns {void}\r\n */\r\nexport const updateRows = (rows, tracker, list, lastCursor = null) =>\r\n{\r\n\tif (rows && rows.length > 0)\r\n\t{\r\n\t\tlist.append(rows);\r\n\t\ttracker.update(rows.length, lastCursor);\r\n\t}\r\n\telse\r\n\t{\r\n\t\ttracker.hasMoreData = false;\r\n\t}\r\n};\r\n\r\n/**\r\n * Set up a fetch callback for loading data.\r\n *\r\n * @param {object} data\r\n * @returns {function}\r\n */\r\nexport const setupFetchCallback = (data) =>\r\n{\r\n\treturn (tracker, callback) =>\r\n\t{\r\n\t\t/**\r\n\t\t * This will handle the result of the fetch.\r\n\t\t *\r\n\t\t * @param {object|null} response\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\tconst resultCallback = (response) =>\r\n\t\t{\r\n\t\t\tlet rows = [];\r\n\t\t\tlet lastCursor = null;\r\n\t\t\tif (response)\r\n\t\t\t{\r\n\t\t\t\trows = response.rows || response.items || [];\r\n\t\t\t\tlastCursor = response.lastCursor || null;\r\n\t\t\t}\r\n\t\t\tcallback(rows, lastCursor);\r\n\t\t};\r\n\r\n\t\tdata.xhr.all('', resultCallback, tracker.currentOffset, tracker.limit, tracker.lastCursor);\r\n\t};\r\n};\r\n\r\n/**\r\n * Fetch and update rows in the list.\r\n *\r\n * @param {function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {void}\r\n */\r\nexport const fetchAndUpdate = (fetchCallback, tracker, list) =>\r\n{\r\n\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t{\r\n\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t});\r\n};\r\n\r\n/**\r\n * Fetch and refresh the list.\r\n *\r\n * @param {function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {void}\r\n */\r\nexport const fetchAndRefresh = (fetchCallback, tracker, list) =>\r\n{\r\n\ttracker.reset();\r\n\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t{\r\n\t\tlist.reset();\r\n\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t});\r\n};\r\n\r\n/**\r\n * Create a scroll event handler for the container.\r\n *\r\n * This handler ensures that loading is triggered only when the user is close\r\n * to the bottom of the container and prevents multiple concurrent loads.\r\n *\r\n * @param {object} container - The scrollable container.\r\n * @param {PaginationTracker} tracker - The pagination tracker.\r\n * @param {function} fetchCallback - Function to fetch data.\r\n * @returns {function} A scroll event handler function.\r\n */\r\nexport const createScrollHandler = (container, tracker, fetchCallback) =>\r\n{\r\n\treturn (e, { list }, callBack) =>\r\n\t{\r\n\t\tconst metrics = getScrollMetrics(container);\r\n\t\tif (canLoad(metrics, tracker))\r\n\t\t{\r\n\t\t\t// Prevent multiple concurrent loads\r\n\t\t\tif (tracker.loading)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttracker.loading = true;\r\n\t\t\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t\t\t{\r\n\t\t\t\tif (callBack)\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t\t\t\ttracker.loading = false;\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n};\r\n\r\n/**\r\n * Create a table scroll event handler for the container.\r\n *\r\n * This handler ensures that loading is triggered only when the user is close\r\n * to the bottom of the container and prevents multiple concurrent loads.\r\n *\r\n * @param {object} container - The scrollable container.\r\n * @param {PaginationTracker} tracker - The pagination tracker.\r\n * @param {function} fetchCallback - Function to fetch data.\r\n * @returns {function} A scroll event handler function.\r\n */\r\nexport const createTableScrollHandler = (container, tracker, fetchCallback) =>\r\n{\r\n\treturn (e, list, callBack) =>\r\n\t{\r\n\t\tconst metrics = getScrollMetrics(container);\r\n\t\tif (canLoad(metrics, tracker))\r\n\t\t{\r\n\t\t\t// Prevent multiple concurrent loads\r\n\t\t\tif (tracker.loading)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttracker.loading = true;\r\n\t\t\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t\t\t{\r\n\t\t\t\tif (callBack)\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t\t\t\ttracker.loading = false;\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n};\r\n", "import { Div, On } from '@base-framework/atoms';\r\nimport { Component, Data, Jot } from '@base-framework/base';\r\nimport { ChildHelper } from 'src/utils/child-helper.js';\r\nimport { DataHelper } from 'src/utils/data-helper.js';\r\nimport { RowDivider } from './row-divider.js';\r\n\r\n/**\r\n * This will clone the data.\r\n *\r\n * @param {*} data\r\n * @returns {*}\r\n */\r\nconst clone = (data) => JSON.parse(JSON.stringify(data));\r\n\r\n/**\r\n * List\r\n *\r\n * This will create a list component.\r\n *\r\n * @param {object} props\r\n * @property {string} class - The class to add to the list\r\n * @property {string} key - The key to use to identify the items\r\n * @property {array} [items] - The items\r\n * @property {object} [emptyState] - The empty state component to show when no items\r\n * @property {object} [divider] - The divider configuration\r\n * @property {function} rowItem - Function to render each row item\r\n *\r\n * @type {typeof Component}\r\n */\r\nexport const List = Jot(\r\n{\r\n\t/**\r\n\t * This will check to set up the row divider.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tonCreated()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tif (this.divider)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.rowDivider = new RowDivider({ ...this.divider });\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will set the default data.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst items = (this.items) ? clone(this.items) : [];\r\n\r\n\t\treturn new Data({\r\n\t\t\titems,\r\n\t\t\thasItems: null\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will run before the component is set up.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tbefore()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.linkParentData();\r\n\t},\r\n\r\n\t/**\r\n\t * This will link the parent data to the list.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tlinkParentData()\r\n\t{\r\n\t\tlet parentValue = false;\r\n\t\t// @ts-ignore\r\n\t\tconst parentData = this.parent?.data ?? this.parent?.context?.data ?? null;\r\n\t\tif (parentData)\r\n\t\t{\r\n\t\t\tparentValue = parentData.get('hasItems');\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.link(parentData, 'hasItems');\r\n\t\t}\r\n\r\n\t\tlet hasItems = parentValue || null;\r\n\t\tif (parentValue !== undefined)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst items = this.items || [];\r\n\t\t\t// @ts-ignore\r\n\t\t\thasItems = (Array.isArray(items) && items.length > 0);\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set('hasItems', hasItems);\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.defaultHasItemValue = hasItems;\r\n\t},\r\n\r\n\t/**\r\n\t * Called when the component is destroyed.\r\n\t *\r\n\t * @public\r\n\t * @return {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.data.hasItems = this.defaultHasItemValue;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render the list.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst rowCallBack = this.row.bind(this);\r\n\r\n\t\treturn Div({ class: 'flex flex-auto flex-col' }, [\r\n\t\t\tOn('hasItems', (hasItems) =>\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\treturn (!hasItems && this.emptyState)? this.emptyState() : null;\r\n\t\t\t}),\r\n\t\t\tDiv({\r\n\t\t\t\tcache: 'listContainer',\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tclass: `list ${this.class || ''}`,\r\n\t\t\t\tonSet: ['hasItems', { hidden: false }],\r\n\t\t\t\tfor: ['items', rowCallBack]\r\n\t\t\t})\r\n\t\t]);\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a row for each item.\r\n\t *\r\n\t * @param {*} item\r\n\t * @param {number} index\r\n\t * @param {*} scope\r\n\t * @param {*} children\r\n\t * @returns {object|null}\r\n\t */\r\n\trow(item, index, scope, children)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tif (typeof this.rowItem !== 'function')\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tif (this.rowDivider && children)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.rowDivider.append(item, children);\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn this.rowItem(item, index);\r\n\t},\r\n\r\n\t/**\r\n\t * This will delete an item from the list.\r\n\t *\r\n\t * @public\r\n\t * @param {*} keyValue\r\n\t * @returns {void}\r\n\t */\r\n\tdelete(keyValue)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst index = this.findIndexByKey(keyValue);\r\n\t\tif (index === -1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.data.delete(`items[${index}]`);\r\n\t\t// @ts-ignore\r\n\t\tconst rowElement = ChildHelper.get(this.listContainer, index);\r\n\t\tif (rowElement)\r\n\t\t{\r\n\t\t\tChildHelper.remove(rowElement);\r\n\t\t}\r\n\r\n\t\t// Update hasItems after deletion\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will replace an item in the list.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} row\r\n\t * @returns {void}\r\n\t */\r\n\treplace(row)\r\n\t{\r\n\t\tif (row.status === 'unchanged')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tconst item = row.item;\r\n\t\tif (row.status === 'added')\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.append(item);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tconst keyValue = item[this.key];\r\n\t\t// @ts-ignore\r\n\t\tconst index = this.findIndexByKey(keyValue);\r\n\t\tif (index === -1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set(`items[${index}]`, item);\r\n\t\t// @ts-ignore\r\n\t\tconst oldRow = ChildHelper.get(this.listContainer, index);\r\n\t\t// @ts-ignore\r\n\t\tconst layout = this.row(item, index);\r\n\t\tif (oldRow && layout)\r\n\t\t{\r\n\t\t\tChildHelper.replace(layout, oldRow, this);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove items from the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array} items\r\n\t * @returns {void}\r\n\t */\r\n\tremove(items)\r\n\t{\r\n\t\tif (!Array.isArray(items))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will get the deleted rows.\r\n\t\t */\r\n\t\titems.forEach((item) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.delete(item[this.key]);\r\n\t\t});\r\n\r\n\t\t// Update hasItems after removal\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will set the items in the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array} rows\r\n\t * @returns {void}\r\n\t */\r\n\tsetRows(rows)\r\n\t{\r\n\t\tconst safeRows = Array.isArray(rows) ? rows : [];\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('items', safeRows);\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the items in the list.\r\n\t *\r\n\t * @public\r\n\t * @returns {array}\r\n\t */\r\n\tgetRows()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\treturn this.data.get('items') || [];\r\n\t},\r\n\r\n\t/**\r\n\t * This will reset the list.\r\n\t *\r\n\t * @public\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('items', []);\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('hasItems', false);\r\n\r\n\t\t// @ts-ignore\r\n\t\tif (this.rowDivider)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.rowDivider.reset();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will append items to the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tappend(items)\r\n\t{\r\n\t\tif (!items)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(items))\r\n\t\t{\r\n\t\t\titems = [items];\r\n\t\t}\r\n\r\n\t\titems = clone(items);\r\n\r\n\t\t/**\r\n\t\t * This will get all the new rows to be batched later.\r\n\t\t */\r\n\t\tconst rows = [];\r\n\t\t// @ts-ignore\r\n\t\tlet lastIndex = this.data.items.length - 1;\r\n\t\titems.forEach((item) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tif (this.rowDivider)\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tthis.rowDivider.append(item, rows);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will build the new rows that will be appended.\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst rowElement = this.row(item, lastIndex + 1);\r\n\t\t\tif (rowElement)\r\n\t\t\t{\r\n\t\t\t\trows.push(rowElement);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will silently add the new rows without re-rendering the entire list.\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set(`items[${++lastIndex}]`, item);\r\n\t\t});\r\n\r\n\t\t// Update hasItems after appending\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\r\n\t\t// This will batch push all the rows.\r\n\t\tif (rows.length > 0)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tChildHelper.append(rows, this.listContainer, this);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will mingle the new items with the old items.\r\n\t *\r\n\t * @public\r\n\t * @param {Array<Object>} newItems\r\n\t * @param {boolean} withDelete\r\n\t * @returns {void}\r\n\t */\r\n\tmingle(newItems, withDelete = false)\r\n\t{\r\n\t\tif (!Array.isArray(newItems))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnewItems = clone(newItems);\r\n\r\n\t\t// @ts-ignore\r\n\t\tconst oldItems = this.data.get('items') || [];\r\n\r\n\t\t/**\r\n\t\t * This will diff the old and new items to determine what has\r\n\t\t * been added, updated, or deleted.\r\n\t\t */\r\n\t\t// @ts-ignore\r\n\t\tconst changes = DataHelper.diff(oldItems, newItems, this.key);\r\n\r\n\t\t/**\r\n\t\t * We want to delete the items before adding and updating the\r\n\t\t * new items.\r\n\t\t */\r\n\t\tif (withDelete && changes.deletedItems.length > 0)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.remove(changes.deletedItems);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will add or update the new rows.\r\n\t\t */\r\n\t\tchanges.changes.forEach((row) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.replace(row);\r\n\t\t});\r\n\r\n\t\t// Update hasItems after mingling\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will prepend items to the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tprepend(items)\r\n\t{\r\n\t\tif (!items)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(items))\r\n\t\t{\r\n\t\t\titems = [items];\r\n\t\t}\r\n\r\n\t\titems = clone(items);\r\n\r\n\t\t/**\r\n\t\t * This will get all the new rows to be batched later.\r\n\t\t */\r\n\t\tconst rows = [];\r\n\t\tconst reverseItems = items.reverse();\r\n\t\treverseItems.forEach((item) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tif (this.rowDivider)\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tthis.rowDivider.prepend(item, rows);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will build the new rows that will be prepended.\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst rowElement = this.row(item, 0);\r\n\t\t\tif (rowElement)\r\n\t\t\t{\r\n\t\t\t\trows.push(rowElement);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// This will use the get method to get the items as a raw array.\r\n\t\t// @ts-ignore\r\n\t\tconst existingItems = this.data.get('items') || [];\r\n\t\tconst newItems = reverseItems.concat(existingItems);\r\n\r\n\t\t/**\r\n\t\t * This will silently add the new rows without re-rendering the entire\r\n\t\t * list. This will bypass the data object and directly add the items\r\n\t\t * to the stage.\r\n\t\t */\r\n\t\t// @ts-ignore\r\n\t\tthis.data.attributes.items = newItems;\r\n\t\t// @ts-ignore\r\n\t\tthis.data.stage.items = newItems;\r\n\r\n\t\t// Update hasItems after prepending\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\r\n\t\tif (rows.length > 0)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tChildHelper.prepend(rows, this.listContainer, this);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Updates the hasItems flag based on current items length.\r\n\t *\r\n\t * @private\r\n\t * @returns {void}\r\n\t */\r\n\tupdateHasItems()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst items = this.data.get('items') || [];\r\n\t\tconst hasItems = Array.isArray(items) && items.length > 0;\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('hasItems', hasItems);\r\n\t},\r\n\r\n\t/**\r\n\t * Finds the index of an item in the data array by its key.\r\n\t *\r\n\t * @private\r\n\t * @param {*} keyValue\r\n\t * @returns {number} Index of the item, or -1 if not found\r\n\t */\r\n\tfindIndexByKey(keyValue)\r\n\t{\r\n\t\t//@ts-ignore\r\n\t\tconst items = this.data.get('items') || [];\r\n\t\t//@ts-ignore\r\n\t\treturn items.findIndex((item) => item && item[this.key] === keyValue);\r\n\t}\r\n});", "import { Builder, Html } from \"@base-framework/base\";\r\n\r\n/**\r\n * ChildHelper\r\n *\r\n * This class will help with getting children of a node.\r\n *\r\n * @class\r\n */\r\nexport class ChildHelper\r\n{\r\n\t/**\r\n\t * This will get the first child.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic first(parent)\r\n\t{\r\n\t\treturn this.get(parent, 0);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the last child.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic last(parent)\r\n\t{\r\n\t\tconst index = parent.childNodes.length - 1;\r\n\t\treturn this.get(parent, index);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the child at the specified index.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {number} index\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic get(parent, index)\r\n\t{\r\n\t\treturn parent?.childNodes[index] ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent of the node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic next(node)\r\n\t{\r\n\t\treturn node?.nextSibling ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the previous sibling.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic previous(node)\r\n\t{\r\n\t\treturn node?.previousSibling ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the index of the node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {number}\r\n\t */\r\n\tstatic index(node)\r\n\t{\r\n\t\tif (!node || !node.parentNode)\r\n\t\t{\r\n\t\t\treturn -1; // Return -1 if node or its parent doesn't exist\r\n\t\t}\r\n\r\n\t\tconst children = node.parentNode.children;\r\n\t\treturn Array.from(children).indexOf(node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the previous index of the node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {number}\r\n\t */\r\n\tstatic getPreviousIndex(node)\r\n\t{\r\n\t\tconst index = this.index(node);\r\n\t\treturn (index > 0)? index - 1 : 0;\r\n\t}\r\n\r\n\t/**\r\n\t * This will replace a child layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} oldChild\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic replace(layout, oldChild, parent)\r\n\t{\r\n\t\tif (!oldChild)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Remove the data from the old child before\r\n\t\t * replacing it with the new child.\r\n\t\t */\r\n\t\tHtml.removeElementData(oldChild);\r\n\r\n\t\tconst frag = Builder.build(layout, null, parent);\r\n\t\toldChild.replaceWith(frag);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a child.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tstatic remove(node)\r\n\t{\r\n\t\tif (node)\r\n\t\t{\r\n\t\t\tHtml.removeChild(node);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child layout.\r\n\t *\r\n\t * @param {object} childrenLayout\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic append(childrenLayout, container, parent)\r\n\t{\r\n\t\tif (!childrenLayout)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tBuilder.build(childrenLayout, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a child layout.\r\n\t *\r\n\t * @param {object} childrenLayout\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic prepend(childrenLayout, container, parent)\r\n\t{\r\n\t\tif (!childrenLayout)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst frag = Builder.build(childrenLayout, null, parent);\r\n\t\tcontainer.insertBefore(frag, container.firstChild);\r\n\t}\r\n}", "/**\r\n * This will create a new item.\r\n *\r\n * @param {number} index\r\n * @param {*} item\r\n * @param {string} status\r\n * @returns {object}\r\n */\r\nconst Item = (index, item, status) =>\r\n{\r\n\treturn {\r\n\t\tindex,\r\n\t\titem,\r\n\t\tstatus\r\n\t};\r\n};\r\n\r\n/**\r\n * DataHelper\r\n *\r\n * This will help with data manipulation.\r\n *\r\n * @class\r\n */\r\nexport class DataHelper\r\n{\r\n\t/**\r\n\t * Compares two arrays of objects and returns the differences based on a specified key.\r\n\t *\r\n\t * @param {Array<Object>} oldArray - The original array of objects.\r\n\t * @param {Array<Object>} newArray - The updated array of objects.\r\n\t * @param {string} key - The key used to compare objects in the arrays.\r\n\t * @returns {Object} An object containing arrays of added, updated, and deleted items.\r\n\t */\r\n\tstatic diff(oldArray, newArray, key)\r\n\t{\r\n\t\tconst oldItemsMap = this.arrayToMap(oldArray, key);\r\n\t\tconst changes = [];\r\n\t\tconst deletedItems = [];\r\n\r\n\t\t// Process new array to determine status of each item\r\n\t\tnewArray.forEach((newItem, newIndex) =>\r\n\t\t{\r\n\t\t\tconst keyValue = newItem[key];\r\n\t\t\tif (!oldItemsMap.has(keyValue))\r\n\t\t\t{\r\n\t\t\t\t// Item is added\r\n\t\t\t\tchanges.push(Item(newIndex, newItem, 'added'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst { item: oldItem } = oldItemsMap.get(keyValue);\r\n\t\t\tif (!this.deepEqual(oldItem, newItem))\r\n\t\t\t{\r\n\t\t\t\t// Item is updated\r\n\t\t\t\tchanges.push(Item(newIndex, newItem, 'updated'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Item is unchanged\r\n\t\t\tchanges.push(Item(newIndex, newItem, 'unchanged'));\r\n\r\n\t\t\t// Remove from oldItemsMap to identify deletions later\r\n\t\t\toldItemsMap.delete(keyValue);\r\n\t\t});\r\n\r\n\t\t// Remaining items in oldItemsMap are deleted\r\n\t\toldItemsMap.forEach(({ item: oldItem }) =>\r\n\t\t{\r\n\t\t\tdeletedItems.push(oldItem);\r\n\t\t});\r\n\r\n\t\treturn {\r\n\t\t\tchanges,\r\n\t\t\tdeletedItems\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Converts an array of objects into a Map keyed by the specified property.\r\n\t * Each value in the Map is an object containing the item and its index in the array.\r\n\t *\r\n\t * @param {Array<Object>} array - The array to convert.\r\n\t * @param {string} key - The key used to map the objects.\r\n\t * @returns {Map} A Map with keys as specified property and values as objects.\r\n\t * @private\r\n\t */\r\n\tstatic arrayToMap(array, key)\r\n\t{\r\n\t\tconst map = new Map();\r\n\t\tarray.forEach((item, index) =>\r\n\t\t{\r\n\t\t\tmap.set(item[key], { item, index });\r\n\t\t});\r\n\t\treturn map;\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a deep comparison between two objects.\r\n\t *\r\n\t * @param {Object} obj1 - The first object to compare.\r\n\t * @param {Object} obj2 - The second object to compare.\r\n\t * @returns {boolean} True if objects are equal, else false.\r\n\t * @private\r\n\t */\r\n\tstatic deepEqual(obj1, obj2)\r\n\t{\r\n\t\tif (obj1 === obj2) return true;\r\n\r\n\t\tif (\r\n\t\t\ttypeof obj1 !== 'object' ||\r\n\t\t\tobj1 === null ||\r\n\t\t\ttypeof obj2 !== 'object' ||\r\n\t\t\tobj2 === null\r\n\t\t)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst keys1 = Object.keys(obj1);\r\n\t\tconst keys2 = Object.keys(obj2);\r\n\r\n\t\t// Different number of properties\r\n\t\tif (keys1.length !== keys2.length)\r\n\t\t{\r\n\t\t\treturn false\r\n\t\t}\r\n\r\n\t\tfor (const key of keys1)\r\n\t\t{\r\n\t\t\tif (!keys2.includes(key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!this.deepEqual(obj1[key], obj2[key]))\r\n\t\t\t{\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}", "\r\n/**\r\n * RowDivider\r\n *\r\n * This will check to add divider rows to a list based on a divider.\r\n *\r\n * @class\r\n */\r\nexport class RowDivider\r\n{\r\n\t/**\r\n\t * This will create a row divider.\r\n\t *\r\n\t * @param {object} options\r\n\t * @param {function} options.layout\r\n\t * @param {string} options.itemProperty\r\n\t * @param {function} [options.customCompare]\r\n\t */\r\n\tconstructor({ layout, itemProperty, customCompare })\r\n\t{\r\n\t\tthis.layout = layout;\r\n\t\tthis.itemProperty = itemProperty\r\n\t\tthis.customCompare = customCompare;\r\n\r\n\t\tthis.lastAppend = null;\r\n\t\tthis.lastPrepend = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the divider.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.lastAppend = null;\r\n\t\tthis.lastPrepend = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the first values.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {boolean}\r\n\t */\r\n\tsetFirstValues(value)\r\n\t{\r\n\t\tlet last = this.lastAppend;\r\n\t\tif (!last)\r\n\t\t{\r\n\t\t\tthis.lastAppend = value;\r\n\t\t\t//this.lastPrepend = value;\r\n\t\t}\r\n\t\treturn (!last);\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a value.\r\n\t *\r\n\t * @param {object} item\r\n\t * @param {Array<object>} children\r\n\t * @returns {void}\r\n\t */\r\n\tappend(item, children)\r\n\t{\r\n\t\tconst value = this.getValue(item);\r\n\t\tconst first = this.setFirstValues(value);\r\n\t\tif (first)\r\n\t\t{\r\n\t\t\tthis.addDivider(value, children);\r\n\t\t}\r\n\r\n\t\tif (this.compare(this.lastAppend, value))\r\n\t\t{\r\n\t\t\tthis.addDivider(value, children);\r\n\t\t\tthis.lastAppend = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of the item.\r\n\t *\r\n\t * @param {object} item\r\n\t * @returns {*}\r\n\t */\r\n\tgetValue(item)\r\n\t{\r\n\t\treturn item[this.itemProperty] ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a value.\r\n\t *\r\n\t * @param {object} item\r\n\t * @param {Array<object>} children\r\n\t * @returns {void}\r\n\t */\r\n\tprepend(item, children)\r\n\t{\r\n\t\tconst value = this.getValue(item);\r\n\t\tconst first = this.setFirstValues(value);\r\n\t\tif (first)\r\n\t\t{\r\n\t\t\tthis.addDivider(value, children);\r\n\t\t}\r\n\r\n\t\tif (this.compare(this.lastPrepend, value))\r\n\t\t{\r\n\t\t\tthis.addDivider(this.lastPrepend, children);\r\n\t\t\tthis.lastPrepend = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will compare the values.\r\n\t *\r\n\t * @param {*} lastValue\r\n\t * @param {*} value\r\n\t * @returns {boolean}\r\n\t */\r\n\tcompare(lastValue, value)\r\n\t{\r\n\t\tif (this.customCompare)\r\n\t\t{\r\n\t\t\treturn this.customCompare(lastValue, value);\r\n\t\t}\r\n\r\n\t\treturn (lastValue !== value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a divider layout.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\taddDivider(value, children)\r\n\t{\r\n\t\tif (!this.layout || !children)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst layout = this.layout(value);\r\n\t\tchildren.push(layout);\r\n\t}\r\n}", "import { Atom } from \"@base-framework/base\";\r\nimport { List } from \"./list.js\";\r\nimport ScrollableContainer from \"./scrollable-container.js\";\r\n\r\n/**\r\n * A ScrollableList component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {HTMLElement} [props.scrollContainer] - The container element for scroll events. Defaults to globalThis.\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.class] - The class to add to the list.\r\n * @property {string} [props.key] - The key to use to identify the items.\r\n * @property {array} [props.items] - The initial items.\r\n * @property {object} [props.divider] - The row divider.\r\n * @property {function} [props.rowItem] - The row item.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @property {string} [props.cache] - The cache name to use.\r\n * @returns {object}\r\n */\r\nexport const ScrollableList = Atom((props) => (\r\n\tScrollableContainer(\r\n\t\t{\r\n\t\t\tscrollContainer: props.scrollContainer,\r\n\t\t\tloadMoreItems: props.loadMoreItems,\r\n\t\t\toffset: props.offset,\r\n\t\t\tlimit: props.limit,\r\n\t\t\tcontainerClass: props.containerClass ?? '',\r\n\t\t\tdata: props.data\r\n\t\t},\r\n\t\t[\r\n\t\t\tnew List({\r\n\t\t\t\tcache: props.cache ?? 'list',\r\n\t\t\t\tkey: props.key,\r\n\t\t\t\titems: props.items || [],\r\n\t\t\t\tdivider: props.divider,\r\n\t\t\t\trole: 'list',\r\n\t\t\t\tclass: props.class,\r\n\t\t\t\trowItem: props.rowItem\r\n\t\t\t})\r\n\t\t]\r\n\t)\r\n));\r\n\r\nexport default ScrollableList;", "import { Div } from \"@base-framework/atoms\";\r\nimport { Atom } from \"@base-framework/base\";\r\nimport { PaginationTracker } from \"./pagination-tracker.js\";\r\nimport { createScrollHandler, fetchAndRefresh, setupFetchCallback } from \"./scroll-utils.js\";\r\n\r\n/**\r\n * This will reset the tracker and fetch new data.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {Function}\r\n */\r\nconst setupResetCallback = (fetchCallback, tracker, list) =>\r\n{\r\n\treturn () =>\r\n\t{\r\n\t\tfetchAndRefresh(fetchCallback, tracker, list);\r\n\t};\r\n};\r\n\r\n/**\r\n * This will add the refresh method to the list.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} parent\r\n */\r\nconst addRefreshMethod = (fetchCallback, tracker, parent) =>\r\n{\r\n\tparent.list.refresh = setupResetCallback(fetchCallback, tracker, parent.list);\r\n};\r\n\r\n/**\r\n * A ScrollableList component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {HTMLElement} [props.scrollContainer] - The container element for scroll events. Defaults to globalThis.\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @param {array} children - The child elements to render.\r\n * @returns {object}\r\n */\r\nexport const ScrollableContainer = Atom((props, children) =>\r\n{\r\n\tconst tracker = new PaginationTracker(props.offset, props.limit);\r\n\tconst container = props.scrollContainer || globalThis;\r\n\tconst fetchCallback = props.loadMoreItems || setupFetchCallback(props.data);\r\n\r\n\t/**\r\n\t * This will handle the scroll event.\r\n\t *\r\n\t * @param {object|null} e\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tconst handleScroll = createScrollHandler(container, tracker, fetchCallback);\r\n\r\n\treturn Div(\r\n\t\t{\r\n\t\t\tclass: props.containerClass ?? '',\r\n\r\n\t\t\t/**\r\n\t\t\t * This will request to update the list when the atom is created.\r\n\t\t\t *\r\n\t\t\t * @param {object} ele\r\n\t\t\t * @param {object} parent\r\n\t\t\t * @returns {void}\r\n\t\t\t */\r\n\t\t\tonCreated(ele, parent)\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will add the refresh method to the list.\r\n\t\t\t\t */\r\n\t\t\t\taddRefreshMethod(fetchCallback, tracker, parent);\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * This will request the first fetch.\r\n\t\t\t\t */\r\n\t\t\t\thandleScroll(null, parent, () =>\r\n\t\t\t\t{\r\n\t\t\t\t\tparent.list.reset();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * This will add the scroll event to the container.\r\n\t\t\t */\r\n\t\t\taddEvent: ['scroll', container, handleScroll, { passive: true }],\r\n\t\t},\r\n\t\tchildren\r\n\t);\r\n});\r\n\r\nexport default ScrollableContainer;", "import { A } from '@base-framework/atoms';\r\nimport { Component, router } from '@base-framework/base';\r\n\r\n/**\r\n * Watcher\r\n *\r\n * This will create a watcher object.\r\n *\r\n * @param {string} attr\r\n * @param {string} value\r\n * @returns {object}\r\n */\r\nconst Watcher = (attr, value) => ({\r\n\tattr,\r\n\tvalue\r\n});\r\n\r\n/**\r\n * This will check if the path is active.\r\n *\r\n * @param {string} path\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nconst iSActive = (path, url) => new RegExp('^' + path + '($|#|/|\\\\.).*').test(url);\r\n\r\n/**\r\n * NavLink\r\n *\r\n * This will create a nav link that will add an active\r\n * class when the browser route path matches the link\r\n * href.\r\n *\r\n * @property {string} activeClass - The active class to add.\r\n * @property {string} class - The class\r\n * @property {string} exact - The exact match\r\n * @property {string|object} href - The href or watcher object\r\n * @property {string|object} text - The text or watcher object\r\n * @property {array|string} nest - The nested elements\r\n *\r\n * @class\r\n * @extends Component\r\n */\r\nexport class NavLink extends Component\r\n{\r\n\t/**\r\n\t * This will configure the link active class.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSetup()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.selectedClass = this.activeClass || 'active';\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst href = this.href,\r\n\t\t// @ts-ignore\r\n\t\ttext = this.text,\r\n\t\twatchers = this.setupWatchers(href, text);\r\n\r\n\t\treturn A({\r\n\t\t\tcache: 'link',\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: this.class || this.className || null,\r\n\t\t\tonState: ['selected', {\r\n\t\t\t\t[this.selectedClass]: true\r\n\t\t\t}],\r\n\t\t\thref: this.getString(href),\r\n\t\t\ttext: this.getString(text),\r\n\t\t\tnest: this.nest || this.children,\r\n\t\t\twatch: watchers\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the link path.\r\n\t *\r\n\t * @returns {string|null}\r\n\t */\r\n\tgetLinkPath()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\treturn this?.link?.pathname || null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get string.\r\n\t *\r\n\t * @param {string} string\r\n\t * @returns {(string|null)}\r\n\t */\r\n\tgetString(string)\r\n\t{\r\n\t\tconst type = typeof string;\r\n\t\treturn (type !== 'object' && type !== 'undefined')? string : null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the watchers.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} href\r\n\t * @param {string} text\r\n\t * @returns {array}\r\n\t */\r\n\tsetupWatchers(href, text)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst exact = (this.exact === true),\r\n\t\tdata = router.data;\r\n\r\n\t\tconst watchers = [];\r\n\r\n\t\tif (href && typeof href === 'object')\r\n\t\t{\r\n\t\t\twatchers.push(Watcher('href', href));\r\n\t\t}\r\n\r\n\t\tif (text && typeof text === 'object')\r\n\t\t{\r\n\t\t\twatchers.push(Watcher('text', text));\r\n\t\t}\r\n\r\n\t\twatchers.push({\r\n\t\t\tvalue: ['[[path]]', data],\r\n\t\t\tcallBack: (value, ele) =>\r\n\t\t\t{\r\n\t\t\t\tconst path = ele.pathname + ele.hash;\r\n\t\t\t\tconst selected = exact? (value === path) : (iSActive(ele.pathname, value));\r\n\t\t\t\tthis.update(selected);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn watchers;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tsetupStates()\r\n\t{\r\n\t\treturn {\r\n\t\t\tselected: false\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the class on the element.\r\n\t *\r\n\t * @param {boolean} selected\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(selected)\r\n\t{\r\n\t\tthis.state.selected = selected;\r\n\t}\r\n}", "import { Tbody } from '@base-framework/atoms';\r\nimport { Data } from '@base-framework/base';\r\nimport { List } from '../lists/list.js';\r\nimport { SkeletonTableRow } from './skeleton-table-row.js';\r\n\r\n/**\r\n * TableBody\r\n *\r\n * This will create a table body component with skeleton support.\r\n *\r\n * @param {object} props\r\n * @property {string} class - The class to add to the list\r\n * @property {string} key - The key to use to identify the items\r\n * @property {array} [items] - The items\r\n * @property {boolean|object} [skeleton] - Skeleton configuration. Can be true for default or object with { number: 5, row: customRowFunction }\r\n * @property {number} [columnCount] - Number of columns for skeleton rows (auto-detected from headers if not provided)\r\n *\r\n * @class TableBody\r\n * @extends List\r\n */\r\n// @ts-ignore\r\nexport class TableBody extends List\r\n{\r\n\t/**\r\n\t * This will set the default data.\r\n\t *\r\n\t * @returns {Data}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst hasItems = this.items && this.items.length > 0;\r\n\t\t// @ts-ignore\r\n\t\tconst isSkeletonEnabled = this.skeleton && !hasItems;\r\n\t\tif (isSkeletonEnabled)\r\n\t\t{\r\n\t\t\t// Create new data with skeleton properties\r\n\t\t\treturn new Data({\r\n\t\t\t\titems: this.generateSkeletonRows(),\r\n\t\t\t\thasItems: true, // Show skeleton as if we have items\r\n\t\t\t\tshowSkeleton: true\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn super.setData();\r\n\t}\r\n\r\n\t/**\r\n\t * Generates skeleton rows for the table.\r\n\t *\r\n\t * @returns {Array}\r\n\t */\r\n\tgenerateSkeletonRows()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst skeletonConfig = this.skeleton;\r\n\r\n\t\t// Default skeleton configuration\r\n\t\tlet skeletonCount = 5;\r\n\t\tlet customRowFunction = null;\r\n\r\n\t\t// Handle skeleton configuration\r\n\t\tif (typeof skeletonConfig === 'object')\r\n\t\t{\r\n\t\t\tskeletonCount = skeletonConfig.number || 5;\r\n\t\t\tcustomRowFunction = skeletonConfig.row || null;\r\n\t\t}\r\n\r\n\t\t// Calculate column count from columnCount prop or default to 3\r\n\t\t// @ts-ignore\r\n\t\tconst columnCount = this.columnCount || 3;\r\n\r\n\t\t// Generate skeleton rows\r\n\t\treturn Array.from({ length: skeletonCount }, (_, index) =>\r\n\t\t{\r\n\t\t\tif (customRowFunction && typeof customRowFunction === 'function')\r\n\t\t\t{\r\n\t\t\t\treturn customRowFunction(index, columnCount);\r\n\t\t\t}\r\n\r\n\t\t\treturn SkeletonTableRow({\r\n\t\t\t\tcolumnCount,\r\n\t\t\t\tkey: `skeleton-${index}`\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Removes skeleton rows and shows real content.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremoveSkeleton()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tif (this.data.get('showSkeleton'))\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set('showSkeleton', false);\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set('items', this.items || []);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Override setRows to remove skeleton when real data arrives\r\n\t *\r\n\t * @param {array} rows\r\n\t * @returns {void}\r\n\t */\r\n\tsetRows(rows)\r\n\t{\r\n\t\t// Remove skeleton when setting real rows\r\n\t\tthis.removeSkeleton();\r\n\t\t// @ts-ignore\r\n\t\tsuper.setRows(rows);\r\n\t}\r\n\r\n\t/**\r\n\t * Override append to remove skeleton when real data arrives\r\n\t *\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tappend(items)\r\n\t{\r\n\t\t// Remove skeleton when appending real items\r\n\t\tthis.removeSkeleton();\r\n\t\t// @ts-ignore\r\n\t\tsuper.append(items);\r\n\t}\r\n\r\n\t/**\r\n\t * Override prepend to remove skeleton when real data arrives\r\n\t *\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tprepend(items)\r\n\t{\r\n\t\t// Remove skeleton when prepending real items\r\n\t\tthis.removeSkeleton();\r\n\t\t// @ts-ignore\r\n\t\tsuper.prepend(items);\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the list.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst rowCallBack = this.row.bind(this);\r\n\r\n\t\treturn Tbody({\r\n\t\t\tonCreated: (ele) =>\r\n\t\t\t{\r\n\t\t\t\tthis.listContainer = ele;\r\n\t\t\t},\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: `tbody ${this.class || ''}`,\r\n\t\t\tfor: ['items', rowCallBack]\r\n\t\t});\r\n\t}\r\n};", "import { Div, Td, Tr } from '@base-framework/atoms';\r\n\r\n/**\r\n * Creates a skeleton table row with animated placeholders.\r\n *\r\n * @param {object} props\r\n * @param {number} [props.columnCount=3] - Number of columns to create skeleton cells for\r\n * @param {function} [props.customCell] - Custom function to render skeleton cells\r\n * @param {string} [props.key] - Unique key for the row\r\n * @returns {object}\r\n */\r\nexport const SkeletonTableRow = ({ columnCount = 3, customCell, key }) =>\r\n{\r\n\tconst createSkeletonCell = (index) =>\r\n\t{\r\n\t\tif (customCell && typeof customCell === 'function')\r\n\t\t{\r\n\t\t\treturn customCell(index);\r\n\t\t}\r\n\r\n\t\t// Default skeleton cell with varying widths for more realistic appearance\r\n\t\tconst widths = ['w-3/4', 'w-1/2', 'w-full', 'w-2/3', 'w-5/6'];\r\n\t\tconst width = widths[index % widths.length];\r\n\r\n\t\treturn Td({ class: 'px-6 py-4' }, [\r\n\t\t\tDiv({\r\n\t\t\t\tclass: `${width} h-4 bg-gray-200 rounded animate-pulse`\r\n\t\t\t})\r\n\t\t]);\r\n\t};\r\n\r\n\treturn Tr({\r\n\t\tclass: 'border-b',\r\n\t\tkey\r\n\t}, Array.from({ length: columnCount }, (_, index) => createSkeletonCell(index)));\r\n};\r\n\r\nexport default SkeletonTableRow;\r\n", "import { TableBody } from './table-body.js';\r\n\r\n/**\r\n * This will create the table body.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nexport const DataTableBody = ({ key, rows, selectRow, rowItem, emptyState, skeleton, columnCount }) => (\r\n\tnew TableBody({\r\n\t\tcache: 'list',\r\n\t\tkey,\r\n\t\titems: rows,\r\n\t\trowItem: (row) => rowItem(row, selectRow),\r\n\t\tclass: 'divide-y divide-border',\r\n\t\temptyState,\r\n\t\tskeleton,\r\n\t\tcolumnCount\r\n\t})\r\n);", "import { Tbody } from '@base-framework/atoms';\r\nimport { PaginationTracker } from '../lists/pagination-tracker.js';\r\nimport { createTableScrollHandler, fetchAndRefresh, setupFetchCallback } from '../lists/scroll-utils.js';\r\nimport { TableBody } from './table-body.js';\r\n\r\n/**\r\n * A ScrollableTableBody component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {HTMLElement} [props.scrollContainer] - The container element for scroll events. Defaults to globalThis.\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.class] - The class to add to the list.\r\n * @property {string} [props.key] - The key to use to identify the items.\r\n * @property {array} [props.items] - The initial items.\r\n * @property {function} [props.rowItem] - The row item.\r\n * @property {object} [props.tableData] - The data object containing the xhr method.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @property {boolean|object} [props.skeleton] - Skeleton configuration. Can be true for default or object with { number: 5, row: customRowFunction }\r\n * @property {number} [props.columnCount] - Number of columns for skeleton rows\r\n *\r\n * @class ScrollableTableBody\r\n * @extends TableBody\r\n */\r\nexport class ScrollableTableBody extends TableBody\r\n{\r\n\t/**\r\n\t * This will declare the component props.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeclareProps()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {PaginationTracker}\r\n\t\t */\r\n\t\tthis.tracker = null;\r\n\r\n\t\t/**\r\n\t\t * @member {HTMLElement}\r\n\t\t * @default globalThis\r\n\t\t */\r\n\t\tthis.scrollContainer = null;\r\n\r\n\t\t/**\r\n\t\t * @member {function}\r\n\t\t */\r\n\t\tthis.fetchCallback = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the page tracker.\r\n\t *\r\n\t * @returns {PaginationTracker}\r\n\t */\r\n\tsetupPageTracker()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\treturn this.tracker = new PaginationTracker(this.offset, this.limit);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the scroll handler.\r\n\t *\r\n\t * @param {HTMLElement} container\r\n\t * @returns {Function}\r\n\t */\r\n\tsetupScrollHandler(container)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst tracker = this.setupPageTracker();\r\n\t\t// @ts-ignore\r\n\t\tthis.fetchCallback = this.loadMoreItems || setupFetchCallback(this.tableData);\r\n\r\n\t\t/**\r\n\t\t * This will handle the scroll event.\r\n\t\t *\r\n\t\t * @param {object|null} e\r\n\t\t * @param {object} parent\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\treturn createTableScrollHandler(container, tracker, this.fetchCallback);\r\n\t}\r\n\r\n\t/**\r\n\t * This will refresh the list.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\trefresh()\r\n\t{\r\n\t\tfetchAndRefresh(this.fetchCallback, this.tracker, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the list.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst rowCallBack = this.row.bind(this);\r\n\t\t// @ts-ignore\r\n\t\tconst container = this.scrollContainer || globalThis;\r\n\r\n\t\t/**\r\n\t\t * This will handle the scroll event.\r\n\t\t *\r\n\t\t * @param {object|null} e\r\n\t\t * @param {object} parent\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\tconst handleScroll = this.setupScrollHandler(container);\r\n\r\n\t\treturn Tbody({\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: `tbody ${this.class || ''}`,\r\n\r\n\t\t\t/**\r\n\t\t\t * This will request to update the list when the atom is created.\r\n\t\t\t *\r\n\t\t\t * @param {object} ele\r\n\t\t\t * @param {object} parent\r\n\t\t\t * @returns {void}\r\n\t\t\t */\r\n\t\t\tonCreated: (ele, parent) =>\r\n\t\t\t{\r\n\t\t\t\tthis.listContainer = ele;\r\n\r\n\t\t\t\thandleScroll(null, parent, () =>\r\n\t\t\t\t{\r\n\t\t\t\t\t// @ts-ignore\r\n\t\t\t\t\tthis.reset();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * This will add the scroll event to the container.\r\n\t\t\t */\r\n\t\t\taddEvent: ['scroll', container, handleScroll, { passive: true }],\r\n\r\n\t\t\tfor: ['items', rowCallBack]\r\n\t\t});\r\n\t}\r\n};\r\n\r\nexport default ScrollableTableBody;", "import { Span } from \"@base-framework/atoms\";\r\nimport { Component, SimpleData } from \"@base-framework/base\";\r\nimport { IntervalTimer } from \"src/utils/timer/interval-timer.js\";\r\n\r\n/**\r\n * This will create a simple flat data object to use to bind\r\n * timer update. This will be used to update the time every\r\n * minute.\r\n *\r\n * This data will be bound to all the dynamic time elements.\r\n *\r\n * @constant\r\n * @type {SimpleData} data\r\n */\r\nconst data = new SimpleData({\r\n\tdate: 0\r\n});\r\n\r\n/**\r\n * @constant\r\n * @type {number} MINUTE_INTERVAL\r\n */\r\nconst MINUTE_INTERVAL = 60000;\r\n\r\n/**\r\n * This will update the the data value every minute.\r\n *\r\n * @constant\r\n * @type {IntervalTimer} timer\r\n */\r\nconst timer = new IntervalTimer(MINUTE_INTERVAL, () =>\r\n{\r\n\tdata.increment('date');\r\n});\r\n\r\n/**\r\n * This will start the timer to update any dynamic time\r\n * elements.\r\n */\r\ntimer.start();\r\n\r\n/**\r\n * DynamicTime\r\n *\r\n * This will create a dynamic time element that will update\r\n * the time every minute.\r\n *\r\n * @property {string} dateTime - The date time to display.\r\n * @property {function} [filter] - The filter to apply to the date time.\r\n *\r\n * @class\r\n * @augments Component\r\n */\r\nexport class DynamicTime extends Component\r\n{\r\n\t/**\r\n\t * This will set up the component data with the\r\n\t * data created above.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\treturn Span({\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: this.class,\r\n\t\t\ttext: this.getTime(),\r\n\t\t\tonSet: ['date', () => this.getTime()]\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the date and check to filter the value.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetTime()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst dateTime = this.dateTime;\r\n\t\t// @ts-ignore\r\n\t\treturn (this.filter) ? this.filter(dateTime) : dateTime;\r\n\t}\r\n}", "/**\r\n * Timer\r\n *\r\n * This will create a timer that will call a callback function.\r\n *\r\n * @property {number} duration - The duration of the timer.\r\n * @property {function} callBack - The callback function.\r\n *\r\n * @class\r\n */\r\nexport class Timer\r\n{\r\n\t/**\r\n\t * This will create a new timer.\r\n\t *\r\n\t * @param {number} duration\r\n\t * @param {function} callBack\r\n\t */\r\n\tconstructor(duration, callBack)\r\n\t{\r\n\t\t/**\r\n\t\t * @property {number|null} timer\r\n\t\t */\r\n\t\tthis.timer = null;\r\n\r\n\t\t/**\r\n\t\t * @property {function} callBack\r\n\t\t */\r\n\t\tthis.callBack = callBack;\r\n\r\n\t\t/**\r\n\t\t * @property {number} duration\r\n\t\t */\r\n\t\tthis.duration = duration || 1000;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a timer.\r\n\t *\r\n\t * @protected\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tcreateTimer(callBack)\r\n\t{\r\n\t\tthis.timer = globalThis.setTimeout(callBack, this.duration);\r\n\t}\r\n\r\n\t/**\r\n\t * This will start the timer.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tstart()\r\n\t{\r\n\t\t/**\r\n\t\t * This will stop the timer before starting a new one.\r\n\t\t */\r\n\t\tthis.stop();\r\n\r\n\t\tconst callBack = this.returnCallBack.bind(this);\r\n\t\tthis.createTimer(callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will stop the timer.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tstop()\r\n\t{\r\n\t\tglobalThis.clearTimeout(this.timer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the callback function.\r\n\t *\r\n\t * @private\r\n\t * @returns {void}\r\n\t */\r\n\treturnCallBack()\r\n\t{\r\n\t\tconst callBack = this.callBack;\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack.call();\r\n\t\t}\r\n\t}\r\n}", "import { Timer } from './timer.js';\r\n\r\n/**\r\n * IntervalTimer\r\n *\r\n * This will create a timer that will call a callback function.\r\n *\r\n * @class\r\n */\r\nexport class IntervalTimer extends Timer\r\n{\r\n\t/**\r\n\t * This will create a timer.\r\n\t *\r\n\t * @protected\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tcreateTimer(callBack)\r\n\t{\r\n\t\tthis.timer = globalThis.setInterval(callBack, this.duration);\r\n\t}\r\n\r\n\t/**\r\n\t * This will stop the timer.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tstop()\r\n\t{\r\n\t\tglobalThis.clearInterval(this.timer);\r\n\t}\r\n}"],
5
- "mappings": "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",
6
- "names": ["Atom", "Div", "Atom", "PaginationTracker", "offset", "limit", "numItems", "lastCursor", "SCROLL_THRESHOLD", "getScrollMetrics", "container", "scrollTop", "clientHeight", "scrollHeight", "shouldLoadMore", "metrics", "threshold", "canLoad", "tracker", "updateRows", "rows", "list", "lastCursor", "setupFetchCallback", "data", "callback", "resultCallback", "response", "fetchAndRefresh", "fetchCallback", "tracker", "list", "rows", "lastCursor", "updateRows", "createScrollHandler", "container", "e", "callBack", "metrics", "getScrollMetrics", "canLoad", "createTableScrollHandler", "setupResetCallback", "fetchCallback", "tracker", "list", "fetchAndRefresh", "addRefreshMethod", "parent", "DataContainer", "Atom", "props", "children", "PaginationTracker", "setupFetchCallback", "Div", "ele", "data_container_default", "Div", "On", "Data", "Jot", "Builder", "Html", "ChildHelper", "parent", "index", "node", "children", "layout", "oldChild", "frag", "childrenLayout", "container", "Item", "index", "item", "status", "DataHelper", "oldArray", "newArray", "key", "oldItemsMap", "changes", "deletedItems", "newItem", "newIndex", "keyValue", "oldItem", "array", "map", "obj1", "obj2", "keys1", "keys2", "RowDivider", "layout", "itemProperty", "customCompare", "value", "last", "item", "children", "lastValue", "clone", "data", "List", "Jot", "RowDivider", "items", "Data", "parentValue", "parentData", "hasItems", "rowCallBack", "Div", "On", "item", "index", "scope", "children", "keyValue", "rowElement", "ChildHelper", "row", "oldRow", "layout", "rows", "safeRows", "lastIndex", "newItems", "withDelete", "oldItems", "changes", "DataHelper", "reverseItems", "existingItems", "DataList", "Atom", "props", "data_container_default", "List", "Atom", "Div", "Atom", "setupResetCallback", "fetchCallback", "tracker", "list", "fetchAndRefresh", "addRefreshMethod", "parent", "ScrollableContainer", "Atom", "props", "children", "PaginationTracker", "container", "setupFetchCallback", "handleScroll", "createScrollHandler", "Div", "ele", "scrollable_container_default", "ScrollableList", "Atom", "props", "scrollable_container_default", "List", "A", "Component", "router", "Watcher", "attr", "value", "iSActive", "path", "url", "NavLink", "href", "text", "watchers", "string", "type", "exact", "data", "ele", "selected", "Tbody", "Data", "Div", "Td", "Tr", "SkeletonTableRow", "columnCount", "customCell", "key", "createSkeletonCell", "index", "widths", "width", "_", "TableBody", "List", "hasItems", "Data", "skeletonConfig", "skeletonCount", "customRowFunction", "columnCount", "_", "index", "SkeletonTableRow", "rows", "items", "rowCallBack", "Tbody", "ele", "DataTableBody", "key", "rows", "selectRow", "rowItem", "emptyState", "skeleton", "columnCount", "TableBody", "row", "Tbody", "ScrollableTableBody", "TableBody", "PaginationTracker", "container", "tracker", "setupFetchCallback", "createTableScrollHandler", "fetchAndRefresh", "rowCallBack", "handleScroll", "Tbody", "ele", "parent", "Span", "Component", "SimpleData", "Timer", "duration", "callBack", "IntervalTimer", "Timer", "callBack", "data", "SimpleData", "MINUTE_INTERVAL", "timer", "IntervalTimer", "DynamicTime", "Component", "Span", "dateTime"]
4
+ "sourcesContent": ["import { Atom } from \"@base-framework/base\";\r\nimport DataContainer from \"./data-container.js\";\r\nimport { List } from \"./list.js\";\r\n\r\n/**\r\n * A ScrollableList component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.class] - The class to add to the list.\r\n * @property {string} [props.key] - The key to use to identify the items.\r\n * @property {array} [props.items] - The initial items.\r\n * @property {object} [props.divider] - The row divider.\r\n * @property {function} [props.rowItem] - The row item.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @property {string} [props.cache] - The cache name to use.\r\n * @returns {object}\r\n */\r\nexport const DataList = Atom((props) => (\r\n\tDataContainer(\r\n\t\t{\r\n\t\t\tloadMoreItems: props.loadMoreItems,\r\n\t\t\toffset: props.offset,\r\n\t\t\tlimit: props.limit,\r\n\t\t\tcontainerClass: props.containerClass ?? '',\r\n\t\t\tdata: props.data\r\n\t\t},\r\n\t\t[\r\n\t\t\tnew List({\r\n\t\t\t\tcache: props.cache ?? 'list',\r\n\t\t\t\tkey: props.key,\r\n\t\t\t\titems: props.items || [],\r\n\t\t\t\tdivider: props.divider,\r\n\t\t\t\trole: 'list',\r\n\t\t\t\tclass: props.class,\r\n\t\t\t\trowItem: props.rowItem\r\n\t\t\t})\r\n\t\t]\r\n\t)\r\n));\r\n\r\nexport default DataList;", "import { Div } from \"@base-framework/atoms\";\r\nimport { Atom } from \"@base-framework/base\";\r\nimport { PaginationTracker } from \"./pagination-tracker.js\";\r\nimport { fetchAndRefresh, setupFetchCallback } from \"./scroll-utils.js\";\r\n\r\n/**\r\n * This will reset the tracker and fetch new data.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {Function}\r\n */\r\nconst setupResetCallback = (fetchCallback, tracker, list) =>\r\n{\r\n\treturn () =>\r\n\t{\r\n\t\tfetchAndRefresh(fetchCallback, tracker, list);\r\n\t};\r\n};\r\n\r\n/**\r\n * This will add the refresh method to the list.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} parent\r\n */\r\nconst addRefreshMethod = (fetchCallback, tracker, parent) =>\r\n{\r\n\tparent.list.refresh = setupResetCallback(fetchCallback, tracker, parent.list);\r\n};\r\n\r\n/**\r\n * A DataContainer component that updates using the provided data.\r\n *\r\n * @param {object} props\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.containerClass] - The class to add to the list container.\r\n * @param {array} children - The child elements to render.\r\n * @returns {object}\r\n */\r\nexport const DataContainer = Atom((props, children) =>\r\n{\r\n\tconst tracker = new PaginationTracker(props.offset, props.limit);\r\n\tconst fetchCallback = props.loadMoreItems || setupFetchCallback(props.data);\r\n\r\n\treturn Div(\r\n\t\t{\r\n\t\t\tclass: props.containerClass ?? '',\r\n\r\n\t\t\t/**\r\n\t\t\t * This will request to update the list when the atom is created.\r\n\t\t\t *\r\n\t\t\t * @param {object} ele\r\n\t\t\t * @param {object} parent\r\n\t\t\t * @returns {void}\r\n\t\t\t */\r\n\t\t\tonCreated(ele, parent)\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will add the refresh method to the list.\r\n\t\t\t\t */\r\n\t\t\t\taddRefreshMethod(fetchCallback, tracker, parent);\r\n\r\n\t\t\t\tparent.list.refresh();\r\n\t\t\t}\r\n\t\t},\r\n\t\tchildren\r\n\t);\r\n});\r\n\r\nexport default DataContainer;", "/**\r\n * PaginationTracker stores and updates pagination state.\r\n *\r\n * @class\r\n */\r\nexport class PaginationTracker\r\n{\r\n\t/**\r\n\t * Creates an instance of PaginationTracker.\r\n\t *\r\n\t * @param {number} [offset=0] - The initial offset.\r\n\t * @param {number} [limit=20] - The number of items to load per batch.\r\n\t */\r\n\tconstructor(offset = 0, limit = 20)\r\n\t{\r\n\t\tthis.lastCursor = null;\r\n\t\tthis.currentOffset = offset;\r\n\t\tthis.limit = limit;\r\n\t\tthis.hasMoreData = true;\r\n\t\tthis.loading = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns whether more data can be loaded.\r\n\t *\r\n\t * @returns {boolean}\r\n\t */\r\n\tcanLoadMore()\r\n\t{\r\n\t\treturn this.hasMoreData;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the tracker state based on the number of items loaded.\r\n\t *\r\n\t * @param {number} numItems - The number of items loaded.\r\n\t * @param {string|null} lastCursor - The last cursor value.\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(numItems, lastCursor = null)\r\n\t{\r\n\t\tif (numItems < this.limit)\r\n\t\t{\r\n\t\t\tthis.hasMoreData = false;\r\n\t\t}\r\n\r\n\t\tthis.lastCursor = lastCursor;\r\n\t\tthis.currentOffset += numItems;\r\n\t}\r\n\r\n\t/**\r\n\t * Resets the tracker state.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.lastCursor = null;\r\n\t\tthis.currentOffset = 0;\r\n\t\tthis.hasMoreData = true;\r\n\t\tthis.loading = false;\r\n\t}\r\n}\r\n\r\nexport default PaginationTracker;", "import { PaginationTracker } from \"./pagination-tracker.js\";\r\n\r\n// Module-level constant for scroll threshold (in pixels)\r\nconst SCROLL_THRESHOLD = 100;\r\n\r\n/**\r\n * Get scroll metrics for a container.\r\n *\r\n * @param {HTMLElement|globalThis} container\r\n * @returns {object} Contains scrollTop, clientHeight, and scrollHeight.\r\n */\r\nexport function getScrollMetrics(container)\r\n{\r\n\t// @ts-ignore\r\n\tconst scrollTop = container === globalThis ? globalThis.pageYOffset : container.scrollTop;\r\n\t// @ts-ignore\r\n\tconst clientHeight = container === globalThis ? globalThis.innerHeight : container.clientHeight;\r\n\t// @ts-ignore\r\n\tconst scrollHeight = container === globalThis ? globalThis.document.documentElement.scrollHeight : container.scrollHeight;\r\n\treturn { scrollTop, clientHeight, scrollHeight };\r\n}\r\n\r\n/**\r\n * Check if the scroll position indicates we should load more items.\r\n *\r\n * @param {object} metrics - The scroll metrics.\r\n * @param {number} [threshold=SCROLL_THRESHOLD] - The threshold in pixels.\r\n * @returns {boolean}\r\n */\r\nexport function shouldLoadMore(metrics, threshold = SCROLL_THRESHOLD)\r\n{\r\n\treturn metrics.scrollTop + metrics.clientHeight >= metrics.scrollHeight - threshold;\r\n}\r\n\r\n/**\r\n * Check if more items can be loaded based on metrics and tracker state.\r\n *\r\n * @param {object} metrics - The scroll metrics.\r\n * @param {PaginationTracker} tracker - The pagination tracker.\r\n * @returns {boolean}\r\n */\r\nexport const canLoad = (metrics, tracker) =>\r\n{\r\n\treturn shouldLoadMore(metrics) && tracker.canLoadMore();\r\n};\r\n\r\n/**\r\n * Update the rows in the list and update the tracker state.\r\n *\r\n * @param {Array} rows\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @param {string|null} lastCursor - The last cursor value.\r\n * @returns {void}\r\n */\r\nexport const updateRows = (rows, tracker, list, lastCursor = null) =>\r\n{\r\n\tif (rows && rows.length > 0)\r\n\t{\r\n\t\tlist.append(rows);\r\n\t\ttracker.update(rows.length, lastCursor);\r\n\t}\r\n\telse\r\n\t{\r\n\t\ttracker.hasMoreData = false;\r\n\t}\r\n};\r\n\r\n/**\r\n * Set up a fetch callback for loading data.\r\n *\r\n * @param {object} data\r\n * @returns {function}\r\n */\r\nexport const setupFetchCallback = (data) =>\r\n{\r\n\treturn (tracker, callback) =>\r\n\t{\r\n\t\t/**\r\n\t\t * This will handle the result of the fetch.\r\n\t\t *\r\n\t\t * @param {object|null} response\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\tconst resultCallback = (response) =>\r\n\t\t{\r\n\t\t\tlet rows = [];\r\n\t\t\tlet lastCursor = null;\r\n\t\t\tif (response)\r\n\t\t\t{\r\n\t\t\t\trows = response.rows || response.items || [];\r\n\t\t\t\tlastCursor = response.lastCursor || null;\r\n\t\t\t}\r\n\t\t\tcallback(rows, lastCursor);\r\n\t\t};\r\n\r\n\t\tdata.xhr.all('', resultCallback, tracker.currentOffset, tracker.limit, tracker.lastCursor);\r\n\t};\r\n};\r\n\r\n/**\r\n * Fetch and update rows in the list.\r\n *\r\n * @param {function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {void}\r\n */\r\nexport const fetchAndUpdate = (fetchCallback, tracker, list) =>\r\n{\r\n\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t{\r\n\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t});\r\n};\r\n\r\n/**\r\n * Fetch and refresh the list.\r\n *\r\n * @param {function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {void}\r\n */\r\nexport const fetchAndRefresh = (fetchCallback, tracker, list) =>\r\n{\r\n\ttracker.reset();\r\n\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t{\r\n\t\tlist.reset();\r\n\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t});\r\n};\r\n\r\n/**\r\n * Create a scroll event handler for the container.\r\n *\r\n * This handler ensures that loading is triggered only when the user is close\r\n * to the bottom of the container and prevents multiple concurrent loads.\r\n *\r\n * @param {object} container - The scrollable container.\r\n * @param {PaginationTracker} tracker - The pagination tracker.\r\n * @param {function} fetchCallback - Function to fetch data.\r\n * @returns {function} A scroll event handler function.\r\n */\r\nexport const createScrollHandler = (container, tracker, fetchCallback) =>\r\n{\r\n\treturn (e, { list }, callBack) =>\r\n\t{\r\n\t\tconst metrics = getScrollMetrics(container);\r\n\t\tif (canLoad(metrics, tracker))\r\n\t\t{\r\n\t\t\t// Prevent multiple concurrent loads\r\n\t\t\tif (tracker.loading)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttracker.loading = true;\r\n\t\t\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t\t\t{\r\n\t\t\t\tif (callBack)\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t\t\t\ttracker.loading = false;\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n};\r\n\r\n/**\r\n * Create a table scroll event handler for the container.\r\n *\r\n * This handler ensures that loading is triggered only when the user is close\r\n * to the bottom of the container and prevents multiple concurrent loads.\r\n *\r\n * @param {object} container - The scrollable container.\r\n * @param {PaginationTracker} tracker - The pagination tracker.\r\n * @param {function} fetchCallback - Function to fetch data.\r\n * @returns {function} A scroll event handler function.\r\n */\r\nexport const createTableScrollHandler = (container, tracker, fetchCallback) =>\r\n{\r\n\treturn (e, list, callBack) =>\r\n\t{\r\n\t\tconst metrics = getScrollMetrics(container);\r\n\t\tif (canLoad(metrics, tracker))\r\n\t\t{\r\n\t\t\t// Prevent multiple concurrent loads\r\n\t\t\tif (tracker.loading)\r\n\t\t\t{\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttracker.loading = true;\r\n\t\t\tfetchCallback(tracker, (rows, lastCursor) =>\r\n\t\t\t{\r\n\t\t\t\tif (callBack)\r\n\t\t\t\t{\r\n\t\t\t\t\tcallBack();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tupdateRows(rows, tracker, list, lastCursor);\r\n\t\t\t\ttracker.loading = false;\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n};\r\n", "import { Div, On } from '@base-framework/atoms';\r\nimport { Component, Data, Jot } from '@base-framework/base';\r\nimport { ChildHelper } from 'src/utils/child-helper.js';\r\nimport { DataHelper } from 'src/utils/data-helper.js';\r\nimport { RowDivider } from './row-divider.js';\r\n\r\n/**\r\n * This will clone the data.\r\n *\r\n * @param {*} data\r\n * @returns {*}\r\n */\r\nconst clone = (data) => JSON.parse(JSON.stringify(data));\r\n\r\n/**\r\n * List\r\n *\r\n * This will create a list component.\r\n *\r\n * @param {object} props\r\n * @property {string} class - The class to add to the list\r\n * @property {string} key - The key to use to identify the items\r\n * @property {array} [items] - The items\r\n * @property {object} [emptyState] - The empty state component to show when no items\r\n * @property {object} [divider] - The divider configuration\r\n * @property {function} rowItem - Function to render each row item\r\n *\r\n * @type {typeof Component}\r\n */\r\nexport const List = Jot(\r\n{\r\n\t/**\r\n\t * This will check to set up the row divider.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tonCreated()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tif (this.divider)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.rowDivider = new RowDivider({ ...this.divider });\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will set the default data.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst items = (this.items) ? clone(this.items) : [];\r\n\r\n\t\treturn new Data({\r\n\t\t\titems,\r\n\t\t\thasItems: null\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * This will run before the component is set up.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tbefore()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.linkParentData();\r\n\t},\r\n\r\n\t/**\r\n\t * This will link the parent data to the list.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tlinkParentData()\r\n\t{\r\n\t\tlet parentValue = false;\r\n\t\t// @ts-ignore\r\n\t\tconst parentData = this.parent?.data ?? this.parent?.context?.data ?? null;\r\n\t\tif (parentData)\r\n\t\t{\r\n\t\t\tparentValue = parentData.get('hasItems');\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.link(parentData, 'hasItems');\r\n\t\t}\r\n\r\n\t\tlet hasItems = parentValue || null;\r\n\t\tif (parentValue !== undefined)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst items = this.items || [];\r\n\t\t\t// @ts-ignore\r\n\t\t\thasItems = (Array.isArray(items) && items.length > 0);\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set('hasItems', hasItems);\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.defaultHasItemValue = hasItems;\r\n\t},\r\n\r\n\t/**\r\n\t * Called when the component is destroyed.\r\n\t *\r\n\t * @public\r\n\t * @return {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.data.hasItems = this.defaultHasItemValue;\r\n\t},\r\n\r\n\t/**\r\n\t * This will render the list.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst rowCallBack = this.row.bind(this);\r\n\r\n\t\treturn Div({ class: 'flex flex-auto flex-col' }, [\r\n\t\t\tOn('hasItems', (hasItems) =>\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\treturn (!hasItems && this.emptyState)? this.emptyState() : null;\r\n\t\t\t}),\r\n\t\t\tDiv({\r\n\t\t\t\tcache: 'listContainer',\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tclass: `list ${this.class || ''}`,\r\n\t\t\t\tonSet: ['hasItems', { hidden: false }],\r\n\t\t\t\tfor: ['items', rowCallBack]\r\n\t\t\t})\r\n\t\t]);\r\n\t},\r\n\r\n\t/**\r\n\t * This will create a row for each item.\r\n\t *\r\n\t * @param {*} item\r\n\t * @param {number} index\r\n\t * @param {*} scope\r\n\t * @param {*} children\r\n\t * @returns {object|null}\r\n\t */\r\n\trow(item, index, scope, children)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tif (typeof this.rowItem !== 'function')\r\n\t\t{\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tif (this.rowDivider && children)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.rowDivider.append(item, children);\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn this.rowItem(item, index);\r\n\t},\r\n\r\n\t/**\r\n\t * This will delete an item from the list.\r\n\t *\r\n\t * @public\r\n\t * @param {*} keyValue\r\n\t * @returns {void}\r\n\t */\r\n\tdelete(keyValue)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst index = this.findIndexByKey(keyValue);\r\n\t\tif (index === -1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.data.delete(`items[${index}]`);\r\n\t\t// @ts-ignore\r\n\t\tconst rowElement = ChildHelper.get(this.listContainer, index);\r\n\t\tif (rowElement)\r\n\t\t{\r\n\t\t\tChildHelper.remove(rowElement);\r\n\t\t}\r\n\r\n\t\t// Update hasItems after deletion\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will replace an item in the list.\r\n\t *\r\n\t * @protected\r\n\t * @param {object} row\r\n\t * @returns {void}\r\n\t */\r\n\treplace(row)\r\n\t{\r\n\t\tif (row.status === 'unchanged')\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tconst item = row.item;\r\n\t\tif (row.status === 'added')\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.append(item);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tconst keyValue = item[this.key];\r\n\t\t// @ts-ignore\r\n\t\tconst index = this.findIndexByKey(keyValue);\r\n\t\tif (index === -1)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set(`items[${index}]`, item);\r\n\t\t// @ts-ignore\r\n\t\tconst oldRow = ChildHelper.get(this.listContainer, index);\r\n\t\t// @ts-ignore\r\n\t\tconst layout = this.row(item, index);\r\n\t\tif (oldRow && layout)\r\n\t\t{\r\n\t\t\tChildHelper.replace(layout, oldRow, this);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will remove items from the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array} items\r\n\t * @returns {void}\r\n\t */\r\n\tremove(items)\r\n\t{\r\n\t\tif (!Array.isArray(items))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will get the deleted rows.\r\n\t\t */\r\n\t\titems.forEach((item) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.delete(item[this.key]);\r\n\t\t});\r\n\r\n\t\t// Update hasItems after removal\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will set the items in the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array} rows\r\n\t * @returns {void}\r\n\t */\r\n\tsetRows(rows)\r\n\t{\r\n\t\tconst safeRows = Array.isArray(rows) ? rows : [];\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('items', safeRows);\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will get the items in the list.\r\n\t *\r\n\t * @public\r\n\t * @returns {array}\r\n\t */\r\n\tgetRows()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\treturn this.data.get('items') || [];\r\n\t},\r\n\r\n\t/**\r\n\t * This will reset the list.\r\n\t *\r\n\t * @public\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('items', []);\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('hasItems', false);\r\n\r\n\t\t// @ts-ignore\r\n\t\tif (this.rowDivider)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.rowDivider.reset();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will append items to the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tappend(items)\r\n\t{\r\n\t\tif (!items)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(items))\r\n\t\t{\r\n\t\t\titems = [items];\r\n\t\t}\r\n\r\n\t\titems = clone(items);\r\n\r\n\t\t/**\r\n\t\t * This will get all the new rows to be batched later.\r\n\t\t */\r\n\t\tconst rows = [];\r\n\t\t// @ts-ignore\r\n\t\tlet lastIndex = this.data.items.length - 1;\r\n\t\titems.forEach((item) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tif (this.rowDivider)\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tthis.rowDivider.append(item, rows);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will build the new rows that will be appended.\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst rowElement = this.row(item, lastIndex + 1);\r\n\t\t\tif (rowElement)\r\n\t\t\t{\r\n\t\t\t\trows.push(rowElement);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will silently add the new rows without re-rendering the entire list.\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set(`items[${++lastIndex}]`, item);\r\n\t\t});\r\n\r\n\t\t// Update hasItems after appending\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\r\n\t\t// This will batch push all the rows.\r\n\t\tif (rows.length > 0)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tChildHelper.append(rows, this.listContainer, this);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * This will mingle the new items with the old items.\r\n\t *\r\n\t * @public\r\n\t * @param {Array<Object>} newItems\r\n\t * @param {boolean} withDelete\r\n\t * @returns {void}\r\n\t */\r\n\tmingle(newItems, withDelete = false)\r\n\t{\r\n\t\tif (!Array.isArray(newItems))\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnewItems = clone(newItems);\r\n\r\n\t\t// @ts-ignore\r\n\t\tconst oldItems = this.data.get('items') || [];\r\n\r\n\t\t/**\r\n\t\t * This will diff the old and new items to determine what has\r\n\t\t * been added, updated, or deleted.\r\n\t\t */\r\n\t\t// @ts-ignore\r\n\t\tconst changes = DataHelper.diff(oldItems, newItems, this.key);\r\n\r\n\t\t/**\r\n\t\t * We want to delete the items before adding and updating the\r\n\t\t * new items.\r\n\t\t */\r\n\t\tif (withDelete && changes.deletedItems.length > 0)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.remove(changes.deletedItems);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This will add or update the new rows.\r\n\t\t */\r\n\t\tchanges.changes.forEach((row) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.replace(row);\r\n\t\t});\r\n\r\n\t\t// Update hasItems after mingling\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\t},\r\n\r\n\t/**\r\n\t * This will prepend items to the list.\r\n\t *\r\n\t * @public\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tprepend(items)\r\n\t{\r\n\t\tif (!items)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(items))\r\n\t\t{\r\n\t\t\titems = [items];\r\n\t\t}\r\n\r\n\t\titems = clone(items);\r\n\r\n\t\t/**\r\n\t\t * This will get all the new rows to be batched later.\r\n\t\t */\r\n\t\tconst rows = [];\r\n\t\tconst reverseItems = items.reverse();\r\n\t\treverseItems.forEach((item) =>\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tif (this.rowDivider)\r\n\t\t\t{\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tthis.rowDivider.prepend(item, rows);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * This will build the new rows that will be prepended.\r\n\t\t\t */\r\n\t\t\t// @ts-ignore\r\n\t\t\tconst rowElement = this.row(item, 0);\r\n\t\t\tif (rowElement)\r\n\t\t\t{\r\n\t\t\t\trows.push(rowElement);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// This will use the get method to get the items as a raw array.\r\n\t\t// @ts-ignore\r\n\t\tconst existingItems = this.data.get('items') || [];\r\n\t\tconst newItems = reverseItems.concat(existingItems);\r\n\r\n\t\t/**\r\n\t\t * This will silently add the new rows without re-rendering the entire\r\n\t\t * list. This will bypass the data object and directly add the items\r\n\t\t * to the stage.\r\n\t\t */\r\n\t\t// @ts-ignore\r\n\t\tthis.data.attributes.items = newItems;\r\n\t\t// @ts-ignore\r\n\t\tthis.data.stage.items = newItems;\r\n\r\n\t\t// Update hasItems after prepending\r\n\t\t// @ts-ignore\r\n\t\tthis.updateHasItems();\r\n\r\n\t\tif (rows.length > 0)\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tChildHelper.prepend(rows, this.listContainer, this);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Updates the hasItems flag based on current items length.\r\n\t *\r\n\t * @private\r\n\t * @returns {void}\r\n\t */\r\n\tupdateHasItems()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst items = this.data.get('items') || [];\r\n\t\tconst hasItems = Array.isArray(items) && items.length > 0;\r\n\t\t// @ts-ignore\r\n\t\tthis.data.set('hasItems', hasItems);\r\n\t},\r\n\r\n\t/**\r\n\t * Finds the index of an item in the data array by its key.\r\n\t *\r\n\t * @private\r\n\t * @param {*} keyValue\r\n\t * @returns {number} Index of the item, or -1 if not found\r\n\t */\r\n\tfindIndexByKey(keyValue)\r\n\t{\r\n\t\t//@ts-ignore\r\n\t\tconst items = this.data.get('items') || [];\r\n\t\t//@ts-ignore\r\n\t\treturn items.findIndex((item) => item && item[this.key] === keyValue);\r\n\t}\r\n});", "import { Builder, Html } from \"@base-framework/base\";\r\n\r\n/**\r\n * ChildHelper\r\n *\r\n * This class will help with getting children of a node.\r\n *\r\n * @class\r\n */\r\nexport class ChildHelper\r\n{\r\n\t/**\r\n\t * This will get the first child.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic first(parent)\r\n\t{\r\n\t\treturn this.get(parent, 0);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the last child.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic last(parent)\r\n\t{\r\n\t\tconst index = parent.childNodes.length - 1;\r\n\t\treturn this.get(parent, index);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the child at the specified index.\r\n\t *\r\n\t * @param {object} parent\r\n\t * @param {number} index\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic get(parent, index)\r\n\t{\r\n\t\treturn parent?.childNodes[index] ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the parent of the node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic next(node)\r\n\t{\r\n\t\treturn node?.nextSibling ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the previous sibling.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {object|null}\r\n\t */\r\n\tstatic previous(node)\r\n\t{\r\n\t\treturn node?.previousSibling ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the index of the node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {number}\r\n\t */\r\n\tstatic index(node)\r\n\t{\r\n\t\tif (!node || !node.parentNode)\r\n\t\t{\r\n\t\t\treturn -1; // Return -1 if node or its parent doesn't exist\r\n\t\t}\r\n\r\n\t\tconst children = node.parentNode.children;\r\n\t\treturn Array.from(children).indexOf(node);\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the previous index of the node.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {number}\r\n\t */\r\n\tstatic getPreviousIndex(node)\r\n\t{\r\n\t\tconst index = this.index(node);\r\n\t\treturn (index > 0)? index - 1 : 0;\r\n\t}\r\n\r\n\t/**\r\n\t * This will replace a child layout.\r\n\t *\r\n\t * @param {object} layout\r\n\t * @param {object} oldChild\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic replace(layout, oldChild, parent)\r\n\t{\r\n\t\tif (!oldChild)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Remove the data from the old child before\r\n\t\t * replacing it with the new child.\r\n\t\t */\r\n\t\tHtml.removeElementData(oldChild);\r\n\r\n\t\tconst frag = Builder.build(layout, null, parent);\r\n\t\toldChild.replaceWith(frag);\r\n\t}\r\n\r\n\t/**\r\n\t * This will remove a child.\r\n\t *\r\n\t * @param {object} node\r\n\t * @returns {void}\r\n\t */\r\n\tstatic remove(node)\r\n\t{\r\n\t\tif (node)\r\n\t\t{\r\n\t\t\tHtml.removeChild(node);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a child layout.\r\n\t *\r\n\t * @param {object} childrenLayout\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic append(childrenLayout, container, parent)\r\n\t{\r\n\t\tif (!childrenLayout)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tBuilder.build(childrenLayout, container, parent);\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a child layout.\r\n\t *\r\n\t * @param {object} childrenLayout\r\n\t * @param {object} container\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tstatic prepend(childrenLayout, container, parent)\r\n\t{\r\n\t\tif (!childrenLayout)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst frag = Builder.build(childrenLayout, null, parent);\r\n\t\tcontainer.insertBefore(frag, container.firstChild);\r\n\t}\r\n}", "/**\r\n * This will create a new item.\r\n *\r\n * @param {number} index\r\n * @param {*} item\r\n * @param {string} status\r\n * @returns {object}\r\n */\r\nconst Item = (index, item, status) =>\r\n{\r\n\treturn {\r\n\t\tindex,\r\n\t\titem,\r\n\t\tstatus\r\n\t};\r\n};\r\n\r\n/**\r\n * DataHelper\r\n *\r\n * This will help with data manipulation.\r\n *\r\n * @class\r\n */\r\nexport class DataHelper\r\n{\r\n\t/**\r\n\t * Compares two arrays of objects and returns the differences based on a specified key.\r\n\t *\r\n\t * @param {Array<Object>} oldArray - The original array of objects.\r\n\t * @param {Array<Object>} newArray - The updated array of objects.\r\n\t * @param {string} key - The key used to compare objects in the arrays.\r\n\t * @returns {Object} An object containing arrays of added, updated, and deleted items.\r\n\t */\r\n\tstatic diff(oldArray, newArray, key)\r\n\t{\r\n\t\tconst oldItemsMap = this.arrayToMap(oldArray, key);\r\n\t\tconst changes = [];\r\n\t\tconst deletedItems = [];\r\n\r\n\t\t// Process new array to determine status of each item\r\n\t\tnewArray.forEach((newItem, newIndex) =>\r\n\t\t{\r\n\t\t\tconst keyValue = newItem[key];\r\n\t\t\tif (!oldItemsMap.has(keyValue))\r\n\t\t\t{\r\n\t\t\t\t// Item is added\r\n\t\t\t\tchanges.push(Item(newIndex, newItem, 'added'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst { item: oldItem } = oldItemsMap.get(keyValue);\r\n\t\t\tif (!this.deepEqual(oldItem, newItem))\r\n\t\t\t{\r\n\t\t\t\t// Item is updated\r\n\t\t\t\tchanges.push(Item(newIndex, newItem, 'updated'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Item is unchanged\r\n\t\t\tchanges.push(Item(newIndex, newItem, 'unchanged'));\r\n\r\n\t\t\t// Remove from oldItemsMap to identify deletions later\r\n\t\t\toldItemsMap.delete(keyValue);\r\n\t\t});\r\n\r\n\t\t// Remaining items in oldItemsMap are deleted\r\n\t\toldItemsMap.forEach(({ item: oldItem }) =>\r\n\t\t{\r\n\t\t\tdeletedItems.push(oldItem);\r\n\t\t});\r\n\r\n\t\treturn {\r\n\t\t\tchanges,\r\n\t\t\tdeletedItems\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Converts an array of objects into a Map keyed by the specified property.\r\n\t * Each value in the Map is an object containing the item and its index in the array.\r\n\t *\r\n\t * @param {Array<Object>} array - The array to convert.\r\n\t * @param {string} key - The key used to map the objects.\r\n\t * @returns {Map} A Map with keys as specified property and values as objects.\r\n\t * @private\r\n\t */\r\n\tstatic arrayToMap(array, key)\r\n\t{\r\n\t\tconst map = new Map();\r\n\t\tarray.forEach((item, index) =>\r\n\t\t{\r\n\t\t\tmap.set(item[key], { item, index });\r\n\t\t});\r\n\t\treturn map;\r\n\t}\r\n\r\n\t/**\r\n\t * Performs a deep comparison between two objects.\r\n\t *\r\n\t * @param {Object} obj1 - The first object to compare.\r\n\t * @param {Object} obj2 - The second object to compare.\r\n\t * @returns {boolean} True if objects are equal, else false.\r\n\t * @private\r\n\t */\r\n\tstatic deepEqual(obj1, obj2)\r\n\t{\r\n\t\tif (obj1 === obj2) return true;\r\n\r\n\t\tif (\r\n\t\t\ttypeof obj1 !== 'object' ||\r\n\t\t\tobj1 === null ||\r\n\t\t\ttypeof obj2 !== 'object' ||\r\n\t\t\tobj2 === null\r\n\t\t)\r\n\t\t{\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst keys1 = Object.keys(obj1);\r\n\t\tconst keys2 = Object.keys(obj2);\r\n\r\n\t\t// Different number of properties\r\n\t\tif (keys1.length !== keys2.length)\r\n\t\t{\r\n\t\t\treturn false\r\n\t\t}\r\n\r\n\t\tfor (const key of keys1)\r\n\t\t{\r\n\t\t\tif (!keys2.includes(key))\r\n\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!this.deepEqual(obj1[key], obj2[key]))\r\n\t\t\t{\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n}", "\r\n/**\r\n * RowDivider\r\n *\r\n * This will check to add divider rows to a list based on a divider.\r\n *\r\n * @class\r\n */\r\nexport class RowDivider\r\n{\r\n\t/**\r\n\t * This will create a row divider.\r\n\t *\r\n\t * @param {object} options\r\n\t * @param {function} options.layout\r\n\t * @param {string} options.itemProperty\r\n\t * @param {function} [options.customCompare]\r\n\t */\r\n\tconstructor({ layout, itemProperty, customCompare })\r\n\t{\r\n\t\tthis.layout = layout;\r\n\t\tthis.itemProperty = itemProperty\r\n\t\tthis.customCompare = customCompare;\r\n\r\n\t\tthis.lastAppend = null;\r\n\t\tthis.lastPrepend = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will reset the divider.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\treset()\r\n\t{\r\n\t\tthis.lastAppend = null;\r\n\t\tthis.lastPrepend = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set the first values.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {boolean}\r\n\t */\r\n\tsetFirstValues(value)\r\n\t{\r\n\t\tlet last = this.lastAppend;\r\n\t\tif (!last)\r\n\t\t{\r\n\t\t\tthis.lastAppend = value;\r\n\t\t\t//this.lastPrepend = value;\r\n\t\t}\r\n\t\treturn (!last);\r\n\t}\r\n\r\n\t/**\r\n\t * This will append a value.\r\n\t *\r\n\t * @param {object} item\r\n\t * @param {Array<object>} children\r\n\t * @returns {void}\r\n\t */\r\n\tappend(item, children)\r\n\t{\r\n\t\tconst value = this.getValue(item);\r\n\t\tconst first = this.setFirstValues(value);\r\n\t\tif (first)\r\n\t\t{\r\n\t\t\tthis.addDivider(value, children);\r\n\t\t}\r\n\r\n\t\tif (this.compare(this.lastAppend, value))\r\n\t\t{\r\n\t\t\tthis.addDivider(value, children);\r\n\t\t\tthis.lastAppend = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the value of the item.\r\n\t *\r\n\t * @param {object} item\r\n\t * @returns {*}\r\n\t */\r\n\tgetValue(item)\r\n\t{\r\n\t\treturn item[this.itemProperty] ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will prepend a value.\r\n\t *\r\n\t * @param {object} item\r\n\t * @param {Array<object>} children\r\n\t * @returns {void}\r\n\t */\r\n\tprepend(item, children)\r\n\t{\r\n\t\tconst value = this.getValue(item);\r\n\t\tconst first = this.setFirstValues(value);\r\n\t\tif (first)\r\n\t\t{\r\n\t\t\tthis.addDivider(value, children);\r\n\t\t}\r\n\r\n\t\tif (this.compare(this.lastPrepend, value))\r\n\t\t{\r\n\t\t\tthis.addDivider(this.lastPrepend, children);\r\n\t\t\tthis.lastPrepend = value;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * This will compare the values.\r\n\t *\r\n\t * @param {*} lastValue\r\n\t * @param {*} value\r\n\t * @returns {boolean}\r\n\t */\r\n\tcompare(lastValue, value)\r\n\t{\r\n\t\tif (this.customCompare)\r\n\t\t{\r\n\t\t\treturn this.customCompare(lastValue, value);\r\n\t\t}\r\n\r\n\t\treturn (lastValue !== value);\r\n\t}\r\n\r\n\t/**\r\n\t * This will add a divider layout.\r\n\t *\r\n\t * @param {*} value\r\n\t * @returns {void}\r\n\t */\r\n\taddDivider(value, children)\r\n\t{\r\n\t\tif (!this.layout || !children)\r\n\t\t{\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst layout = this.layout(value);\r\n\t\tchildren.push(layout);\r\n\t}\r\n}", "import { Atom } from \"@base-framework/base\";\r\nimport { List } from \"./list.js\";\r\nimport ScrollableContainer from \"./scrollable-container.js\";\r\n\r\n/**\r\n * A ScrollableList component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {HTMLElement} [props.scrollContainer] - The container element for scroll events. Defaults to globalThis.\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.class] - The class to add to the list.\r\n * @property {string} [props.key] - The key to use to identify the items.\r\n * @property {array} [props.items] - The initial items.\r\n * @property {object} [props.divider] - The row divider.\r\n * @property {function} [props.rowItem] - The row item.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @property {string} [props.cache] - The cache name to use.\r\n * @returns {object}\r\n */\r\nexport const ScrollableList = Atom((props) => (\r\n\tScrollableContainer(\r\n\t\t{\r\n\t\t\tscrollContainer: props.scrollContainer,\r\n\t\t\tloadMoreItems: props.loadMoreItems,\r\n\t\t\toffset: props.offset,\r\n\t\t\tlimit: props.limit,\r\n\t\t\tcontainerClass: props.containerClass ?? '',\r\n\t\t\tdata: props.data\r\n\t\t},\r\n\t\t[\r\n\t\t\tnew List({\r\n\t\t\t\tcache: props.cache ?? 'list',\r\n\t\t\t\tkey: props.key,\r\n\t\t\t\titems: props.items || [],\r\n\t\t\t\tdivider: props.divider,\r\n\t\t\t\trole: 'list',\r\n\t\t\t\tclass: props.class,\r\n\t\t\t\trowItem: props.rowItem\r\n\t\t\t})\r\n\t\t]\r\n\t)\r\n));\r\n\r\nexport default ScrollableList;", "import { Div } from \"@base-framework/atoms\";\r\nimport { Atom } from \"@base-framework/base\";\r\nimport { PaginationTracker } from \"./pagination-tracker.js\";\r\nimport { createScrollHandler, fetchAndRefresh, setupFetchCallback } from \"./scroll-utils.js\";\r\n\r\n/**\r\n * This will reset the tracker and fetch new data.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} list\r\n * @returns {Function}\r\n */\r\nconst setupResetCallback = (fetchCallback, tracker, list) =>\r\n{\r\n\treturn () =>\r\n\t{\r\n\t\tfetchAndRefresh(fetchCallback, tracker, list);\r\n\t};\r\n};\r\n\r\n/**\r\n * This will add the refresh method to the list.\r\n *\r\n * @param {Function} fetchCallback\r\n * @param {PaginationTracker} tracker\r\n * @param {object} parent\r\n */\r\nconst addRefreshMethod = (fetchCallback, tracker, parent) =>\r\n{\r\n\tparent.list.refresh = setupResetCallback(fetchCallback, tracker, parent.list);\r\n};\r\n\r\n/**\r\n * A ScrollableList component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {HTMLElement} [props.scrollContainer] - The container element for scroll events. Defaults to globalThis.\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {object} [props.data] - The data object containing the xhr method.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @param {array} children - The child elements to render.\r\n * @returns {object}\r\n */\r\nexport const ScrollableContainer = Atom((props, children) =>\r\n{\r\n\tconst tracker = new PaginationTracker(props.offset, props.limit);\r\n\tconst container = props.scrollContainer || globalThis;\r\n\tconst fetchCallback = props.loadMoreItems || setupFetchCallback(props.data);\r\n\r\n\t/**\r\n\t * This will handle the scroll event.\r\n\t *\r\n\t * @param {object|null} e\r\n\t * @param {object} parent\r\n\t * @returns {void}\r\n\t */\r\n\tconst handleScroll = createScrollHandler(container, tracker, fetchCallback);\r\n\r\n\treturn Div(\r\n\t\t{\r\n\t\t\tclass: props.containerClass ?? '',\r\n\r\n\t\t\t/**\r\n\t\t\t * This will request to update the list when the atom is created.\r\n\t\t\t *\r\n\t\t\t * @param {object} ele\r\n\t\t\t * @param {object} parent\r\n\t\t\t * @returns {void}\r\n\t\t\t */\r\n\t\t\tonCreated(ele, parent)\r\n\t\t\t{\r\n\t\t\t\t/**\r\n\t\t\t\t * This will add the refresh method to the list.\r\n\t\t\t\t */\r\n\t\t\t\taddRefreshMethod(fetchCallback, tracker, parent);\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * This will request the first fetch.\r\n\t\t\t\t */\r\n\t\t\t\thandleScroll(null, parent, () =>\r\n\t\t\t\t{\r\n\t\t\t\t\tparent.list.reset();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * This will add the scroll event to the container.\r\n\t\t\t */\r\n\t\t\taddEvent: ['scroll', container, handleScroll, { passive: true }],\r\n\t\t},\r\n\t\tchildren\r\n\t);\r\n});\r\n\r\nexport default ScrollableContainer;", "import { A } from '@base-framework/atoms';\r\nimport { Component, router } from '@base-framework/base';\r\n\r\n/**\r\n * Watcher\r\n *\r\n * This will create a watcher object.\r\n *\r\n * @param {string} attr\r\n * @param {string} value\r\n * @returns {object}\r\n */\r\nconst Watcher = (attr, value) => ({\r\n\tattr,\r\n\tvalue\r\n});\r\n\r\n/**\r\n * This will check if the path is active.\r\n *\r\n * @param {string} path\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nconst iSActive = (path, url) => new RegExp('^' + path + '($|#|/|\\\\.).*').test(url);\r\n\r\n/**\r\n * NavLink\r\n *\r\n * This will create a nav link that will add an active\r\n * class when the browser route path matches the link\r\n * href.\r\n *\r\n * @property {string} activeClass - The active class to add.\r\n * @property {string} class - The class\r\n * @property {string} exact - The exact match\r\n * @property {string|object} href - The href or watcher object\r\n * @property {string|object} text - The text or watcher object\r\n * @property {array|string} nest - The nested elements\r\n *\r\n * @class\r\n * @extends Component\r\n */\r\nexport class NavLink extends Component\r\n{\r\n\t/**\r\n\t * This will configure the link active class.\r\n\t *\r\n\t * @protected\r\n\t * @returns {void}\r\n\t */\r\n\tbeforeSetup()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tthis.selectedClass = this.activeClass || 'active';\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst href = this.href,\r\n\t\t// @ts-ignore\r\n\t\ttext = this.text,\r\n\t\twatchers = this.setupWatchers(href, text);\r\n\r\n\t\treturn A({\r\n\t\t\tcache: 'link',\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: this.class || this.className || null,\r\n\t\t\tonState: ['selected', {\r\n\t\t\t\t[this.selectedClass]: true\r\n\t\t\t}],\r\n\t\t\thref: this.getString(href),\r\n\t\t\ttext: this.getString(text),\r\n\t\t\tnest: this.nest || this.children,\r\n\t\t\twatch: watchers\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the link path.\r\n\t *\r\n\t * @returns {string|null}\r\n\t */\r\n\tgetLinkPath()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\treturn this?.link?.pathname || null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will get string.\r\n\t *\r\n\t * @param {string} string\r\n\t * @returns {(string|null)}\r\n\t */\r\n\tgetString(string)\r\n\t{\r\n\t\tconst type = typeof string;\r\n\t\treturn (type !== 'object' && type !== 'undefined')? string : null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the watchers.\r\n\t *\r\n\t * @protected\r\n\t * @param {string} href\r\n\t * @param {string} text\r\n\t * @returns {array}\r\n\t */\r\n\tsetupWatchers(href, text)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst exact = (this.exact === true),\r\n\t\tdata = router.data;\r\n\r\n\t\tconst watchers = [];\r\n\r\n\t\tif (href && typeof href === 'object')\r\n\t\t{\r\n\t\t\twatchers.push(Watcher('href', href));\r\n\t\t}\r\n\r\n\t\tif (text && typeof text === 'object')\r\n\t\t{\r\n\t\t\twatchers.push(Watcher('text', text));\r\n\t\t}\r\n\r\n\t\twatchers.push({\r\n\t\t\tvalue: ['[[path]]', data],\r\n\t\t\tcallBack: (value, ele) =>\r\n\t\t\t{\r\n\t\t\t\tconst path = ele.pathname + ele.hash;\r\n\t\t\t\tconst selected = exact? (value === path) : (iSActive(ele.pathname, value));\r\n\t\t\t\tthis.update(selected);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn watchers;\r\n\t}\r\n\r\n\t/**\r\n\t * This will setup the states.\r\n\t *\r\n\t * @protected\r\n\t * @returns {object}\r\n\t */\r\n\tsetupStates()\r\n\t{\r\n\t\treturn {\r\n\t\t\tselected: false\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * This will update the class on the element.\r\n\t *\r\n\t * @param {boolean} selected\r\n\t * @returns {void}\r\n\t */\r\n\tupdate(selected)\r\n\t{\r\n\t\tthis.state.selected = selected;\r\n\t}\r\n}", "import { Tbody } from '@base-framework/atoms';\r\nimport { Data } from '@base-framework/base';\r\nimport { List } from '../lists/list.js';\r\nimport { SkeletonTableRow } from './skeleton-table-row.js';\r\n\r\n/**\r\n * TableBody\r\n *\r\n * This will create a table body component with skeleton support.\r\n *\r\n * @param {object} props\r\n * @property {string} class - The class to add to the list\r\n * @property {string} key - The key to use to identify the items\r\n * @property {array} [items] - The items\r\n * @property {boolean|object} [skeleton] - Skeleton configuration. Can be true for default or object with { number: 5, row: customRowFunction }\r\n * @property {number} [columnCount] - Number of columns for skeleton rows (auto-detected from headers if not provided)\r\n *\r\n * @class TableBody\r\n * @extends List\r\n */\r\n// @ts-ignore\r\nexport class TableBody extends List\r\n{\r\n\t/**\r\n\t * This will set the default data.\r\n\t *\r\n\t * @returns {Data}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst hasItems = this.items && this.items.length > 0;\r\n\t\t// @ts-ignore\r\n\t\tconst isSkeletonEnabled = this.skeleton && !hasItems;\r\n\t\tif (isSkeletonEnabled)\r\n\t\t{\r\n\t\t\t// Create new data with skeleton properties\r\n\t\t\treturn new Data({\r\n\t\t\t\titems: this.generateSkeletonRows(),\r\n\t\t\t\thasItems: true, // Show skeleton as if we have items\r\n\t\t\t\tshowSkeleton: true\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// @ts-ignore\r\n\t\treturn super.setData();\r\n\t}\r\n\r\n\t/**\r\n\t * Generates skeleton rows for the table.\r\n\t *\r\n\t * @returns {Array}\r\n\t */\r\n\tgenerateSkeletonRows()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst skeletonConfig = this.skeleton;\r\n\r\n\t\t// Default skeleton configuration\r\n\t\tlet skeletonCount = 5;\r\n\t\tlet customRowFunction = null;\r\n\r\n\t\t// Handle skeleton configuration\r\n\t\tif (typeof skeletonConfig === 'object')\r\n\t\t{\r\n\t\t\tskeletonCount = skeletonConfig.number || 5;\r\n\t\t\tcustomRowFunction = skeletonConfig.row || null;\r\n\t\t}\r\n\r\n\t\t// Calculate column count from columnCount prop or default to 3\r\n\t\t// @ts-ignore\r\n\t\tconst columnCount = this.columnCount || 3;\r\n\r\n\t\t// Generate skeleton rows\r\n\t\treturn Array.from({ length: skeletonCount }, (_, index) =>\r\n\t\t{\r\n\t\t\tif (customRowFunction && typeof customRowFunction === 'function')\r\n\t\t\t{\r\n\t\t\t\treturn customRowFunction(index, columnCount);\r\n\t\t\t}\r\n\r\n\t\t\treturn SkeletonTableRow({\r\n\t\t\t\tcolumnCount,\r\n\t\t\t\tkey: `skeleton-${index}`\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Removes skeleton rows and shows real content.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tremoveSkeleton()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tif (this.data.get('showSkeleton'))\r\n\t\t{\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set('showSkeleton', false);\r\n\t\t\t// @ts-ignore\r\n\t\t\tthis.data.set('items', this.items || []);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Override setRows to remove skeleton when real data arrives\r\n\t *\r\n\t * @param {array} rows\r\n\t * @returns {void}\r\n\t */\r\n\tsetRows(rows)\r\n\t{\r\n\t\t// Remove skeleton when setting real rows\r\n\t\tthis.removeSkeleton();\r\n\t\t// @ts-ignore\r\n\t\tsuper.setRows(rows);\r\n\t}\r\n\r\n\t/**\r\n\t * Override append to remove skeleton when real data arrives\r\n\t *\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tappend(items)\r\n\t{\r\n\t\t// Remove skeleton when appending real items\r\n\t\tthis.removeSkeleton();\r\n\t\t// @ts-ignore\r\n\t\tsuper.append(items);\r\n\t}\r\n\r\n\t/**\r\n\t * Override prepend to remove skeleton when real data arrives\r\n\t *\r\n\t * @param {array|object} items\r\n\t * @returns {void}\r\n\t */\r\n\tprepend(items)\r\n\t{\r\n\t\t// Remove skeleton when prepending real items\r\n\t\tthis.removeSkeleton();\r\n\t\t// @ts-ignore\r\n\t\tsuper.prepend(items);\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a row for each item.\r\n\t * Override to handle skeleton items differently from real data items.\r\n\t *\r\n\t * @param {*} item\r\n\t * @param {*} index\r\n\t * @param {*} scope\r\n\t * @param {*} children\r\n\t * @returns {object|null}\r\n\t */\r\n\trow(item, index, scope, children)\r\n\t{\r\n\t\t// If this is a skeleton item (already a component), return it directly\r\n\t\t// @ts-ignore\r\n\t\tif (this.data && this.data.get('showSkeleton'))\r\n\t\t{\r\n\t\t\treturn item;\r\n\t\t}\r\n\r\n\t\t// For real data items, use the normal row processing\r\n\t\t// @ts-ignore\r\n\t\treturn super.row(item, index, scope, children);\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the list.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst rowCallBack = this.row.bind(this);\r\n\r\n\t\treturn Tbody({\r\n\t\t\tonCreated: (ele) =>\r\n\t\t\t{\r\n\t\t\t\tthis.listContainer = ele;\r\n\t\t\t},\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: `tbody ${this.class || ''}`,\r\n\t\t\tfor: ['items', rowCallBack]\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Called when the component is destroyed.\r\n\t *\r\n\t * @public\r\n\t * @return {void}\r\n\t */\r\n\tdestroy()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tsuper.destroy();\r\n\t}\r\n};", "import { Div, Td, Tr } from '@base-framework/atoms';\r\n\r\n/**\r\n * Creates a skeleton table row with animated placeholders.\r\n *\r\n * @param {object} props\r\n * @param {number} [props.columnCount=3] - Number of columns to create skeleton cells for\r\n * @param {function} [props.customCell] - Custom function to render skeleton cells\r\n * @param {string} [props.key] - Unique key for the row\r\n * @returns {object}\r\n */\r\nexport const SkeletonTableRow = ({ columnCount = 3, customCell, key }) =>\r\n{\r\n\tconst createSkeletonCell = (index) =>\r\n\t{\r\n\t\tif (customCell && typeof customCell === 'function')\r\n\t\t{\r\n\t\t\treturn customCell(index);\r\n\t\t}\r\n\r\n\t\t// Default skeleton cell with varying widths for more realistic appearance\r\n\t\tconst widths = ['w-3/4', 'w-1/2', 'w-full', 'w-2/3', 'w-5/6'];\r\n\t\tconst width = widths[index % widths.length];\r\n\r\n\t\treturn Td({ class: 'px-6 py-4' }, [\r\n\t\t\tDiv({\r\n\t\t\t\tclass: `${width} h-4 bg-muted rounded animate-pulse`\r\n\t\t\t})\r\n\t\t]);\r\n\t};\r\n\r\n\treturn Tr({\r\n\t\tclass: 'border-b',\r\n\t\tkey\r\n\t}, Array.from({ length: columnCount }, (_, index) => createSkeletonCell(index)));\r\n};\r\n\r\nexport default SkeletonTableRow;\r\n", "import { TableBody } from './table-body.js';\r\n\r\n/**\r\n * This will create the table body.\r\n *\r\n * @param {object} props\r\n * @returns {object}\r\n */\r\nexport const DataTableBody = ({ key, rows, selectRow, rowItem, emptyState, skeleton, columnCount }) => (\r\n\tnew TableBody({\r\n\t\tcache: 'list',\r\n\t\tkey,\r\n\t\titems: rows,\r\n\t\trowItem: (row) => rowItem(row, selectRow),\r\n\t\tclass: 'divide-y divide-border',\r\n\t\temptyState,\r\n\t\tskeleton,\r\n\t\tcolumnCount\r\n\t})\r\n);", "import { Tbody } from '@base-framework/atoms';\r\nimport { PaginationTracker } from '../lists/pagination-tracker.js';\r\nimport { createTableScrollHandler, fetchAndRefresh, setupFetchCallback } from '../lists/scroll-utils.js';\r\nimport { TableBody } from './table-body.js';\r\n\r\n/**\r\n * A ScrollableTableBody component that updates when its container is scrolled.\r\n *\r\n * @param {object} props\r\n * @property {HTMLElement} [props.scrollContainer] - The container element for scroll events. Defaults to globalThis.\r\n * @property {function} [props.loadMoreItems] - A function to fetch/generate additional items.\r\n * @property {number} [props.offset] - The initial offset. Defaults to 0.\r\n * @property {number} [props.limit] - Number of items to load per batch. Defaults to 20.\r\n * @property {string} [props.class] - The class to add to the list.\r\n * @property {string} [props.key] - The key to use to identify the items.\r\n * @property {array} [props.items] - The initial items.\r\n * @property {function} [props.rowItem] - The row item.\r\n * @property {object} [props.tableData] - The data object containing the xhr method.\r\n * @property {string} [props.containerClass] - The class to add to the scroll container.\r\n * @property {boolean|object} [props.skeleton] - Skeleton configuration. Can be true for default or object with { number: 5, row: customRowFunction }\r\n * @property {number} [props.columnCount] - Number of columns for skeleton rows\r\n *\r\n * @class ScrollableTableBody\r\n * @extends TableBody\r\n */\r\nexport class ScrollableTableBody extends TableBody\r\n{\r\n\t/**\r\n\t * This will declare the component props.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tdeclareProps()\r\n\t{\r\n\t\t/**\r\n\t\t * @member {PaginationTracker}\r\n\t\t */\r\n\t\tthis.tracker = null;\r\n\r\n\t\t/**\r\n\t\t * @member {HTMLElement}\r\n\t\t * @default globalThis\r\n\t\t */\r\n\t\tthis.scrollContainer = null;\r\n\r\n\t\t/**\r\n\t\t * @member {function}\r\n\t\t */\r\n\t\tthis.fetchCallback = null;\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the page tracker.\r\n\t *\r\n\t * @returns {PaginationTracker}\r\n\t */\r\n\tsetupPageTracker()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\treturn this.tracker = new PaginationTracker(this.offset, this.limit);\r\n\t}\r\n\r\n\t/**\r\n\t * This will set up the scroll handler.\r\n\t *\r\n\t * @param {HTMLElement} container\r\n\t * @returns {Function}\r\n\t */\r\n\tsetupScrollHandler(container)\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst tracker = this.setupPageTracker();\r\n\t\t// @ts-ignore\r\n\t\tthis.fetchCallback = this.loadMoreItems || setupFetchCallback(this.tableData);\r\n\r\n\t\t/**\r\n\t\t * This will handle the scroll event.\r\n\t\t *\r\n\t\t * @param {object|null} e\r\n\t\t * @param {object} parent\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\treturn createTableScrollHandler(container, tracker, this.fetchCallback);\r\n\t}\r\n\r\n\t/**\r\n\t * This will refresh the list.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\trefresh()\r\n\t{\r\n\t\tfetchAndRefresh(this.fetchCallback, this.tracker, this);\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the list.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst rowCallBack = this.row.bind(this);\r\n\t\t// @ts-ignore\r\n\t\tconst container = this.scrollContainer || globalThis;\r\n\r\n\t\t/**\r\n\t\t * This will handle the scroll event.\r\n\t\t *\r\n\t\t * @param {object|null} e\r\n\t\t * @param {object} parent\r\n\t\t * @returns {void}\r\n\t\t */\r\n\t\tconst handleScroll = this.setupScrollHandler(container);\r\n\r\n\t\treturn Tbody({\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: `tbody ${this.class || ''}`,\r\n\r\n\t\t\t/**\r\n\t\t\t * This will request to update the list when the atom is created.\r\n\t\t\t *\r\n\t\t\t * @param {object} ele\r\n\t\t\t * @param {object} parent\r\n\t\t\t * @returns {void}\r\n\t\t\t */\r\n\t\t\tonCreated: (ele, parent) =>\r\n\t\t\t{\r\n\t\t\t\tthis.listContainer = ele;\r\n\r\n\t\t\t\thandleScroll(null, parent, () =>\r\n\t\t\t\t{\r\n\t\t\t\t\t// @ts-ignore\r\n\t\t\t\t\tthis.reset();\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * This will add the scroll event to the container.\r\n\t\t\t */\r\n\t\t\taddEvent: ['scroll', container, handleScroll, { passive: true }],\r\n\r\n\t\t\tfor: ['items', rowCallBack]\r\n\t\t});\r\n\t}\r\n};\r\n\r\nexport default ScrollableTableBody;", "import { Span } from \"@base-framework/atoms\";\r\nimport { Component, SimpleData } from \"@base-framework/base\";\r\nimport { IntervalTimer } from \"src/utils/timer/interval-timer.js\";\r\n\r\n/**\r\n * This will create a simple flat data object to use to bind\r\n * timer update. This will be used to update the time every\r\n * minute.\r\n *\r\n * This data will be bound to all the dynamic time elements.\r\n *\r\n * @constant\r\n * @type {SimpleData} data\r\n */\r\nconst data = new SimpleData({\r\n\tdate: 0\r\n});\r\n\r\n/**\r\n * @constant\r\n * @type {number} MINUTE_INTERVAL\r\n */\r\nconst MINUTE_INTERVAL = 60000;\r\n\r\n/**\r\n * This will update the the data value every minute.\r\n *\r\n * @constant\r\n * @type {IntervalTimer} timer\r\n */\r\nconst timer = new IntervalTimer(MINUTE_INTERVAL, () =>\r\n{\r\n\tdata.increment('date');\r\n});\r\n\r\n/**\r\n * This will start the timer to update any dynamic time\r\n * elements.\r\n */\r\ntimer.start();\r\n\r\n/**\r\n * DynamicTime\r\n *\r\n * This will create a dynamic time element that will update\r\n * the time every minute.\r\n *\r\n * @property {string} dateTime - The date time to display.\r\n * @property {function} [filter] - The filter to apply to the date time.\r\n *\r\n * @class\r\n * @augments Component\r\n */\r\nexport class DynamicTime extends Component\r\n{\r\n\t/**\r\n\t * This will set up the component data with the\r\n\t * data created above.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\tsetData()\r\n\t{\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * This will render the component.\r\n\t *\r\n\t * @returns {object}\r\n\t */\r\n\trender()\r\n\t{\r\n\t\treturn Span({\r\n\t\t\t// @ts-ignore\r\n\t\t\tclass: this.class,\r\n\t\t\ttext: this.getTime(),\r\n\t\t\tonSet: ['date', () => this.getTime()]\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * This will get the date and check to filter the value.\r\n\t *\r\n\t * @returns {string}\r\n\t */\r\n\tgetTime()\r\n\t{\r\n\t\t// @ts-ignore\r\n\t\tconst dateTime = this.dateTime;\r\n\t\t// @ts-ignore\r\n\t\treturn (this.filter) ? this.filter(dateTime) : dateTime;\r\n\t}\r\n}", "/**\r\n * Timer\r\n *\r\n * This will create a timer that will call a callback function.\r\n *\r\n * @property {number} duration - The duration of the timer.\r\n * @property {function} callBack - The callback function.\r\n *\r\n * @class\r\n */\r\nexport class Timer\r\n{\r\n\t/**\r\n\t * This will create a new timer.\r\n\t *\r\n\t * @param {number} duration\r\n\t * @param {function} callBack\r\n\t */\r\n\tconstructor(duration, callBack)\r\n\t{\r\n\t\t/**\r\n\t\t * @property {number|null} timer\r\n\t\t */\r\n\t\tthis.timer = null;\r\n\r\n\t\t/**\r\n\t\t * @property {function} callBack\r\n\t\t */\r\n\t\tthis.callBack = callBack;\r\n\r\n\t\t/**\r\n\t\t * @property {number} duration\r\n\t\t */\r\n\t\tthis.duration = duration || 1000;\r\n\t}\r\n\r\n\t/**\r\n\t * This will create a timer.\r\n\t *\r\n\t * @protected\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tcreateTimer(callBack)\r\n\t{\r\n\t\tthis.timer = globalThis.setTimeout(callBack, this.duration);\r\n\t}\r\n\r\n\t/**\r\n\t * This will start the timer.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tstart()\r\n\t{\r\n\t\t/**\r\n\t\t * This will stop the timer before starting a new one.\r\n\t\t */\r\n\t\tthis.stop();\r\n\r\n\t\tconst callBack = this.returnCallBack.bind(this);\r\n\t\tthis.createTimer(callBack);\r\n\t}\r\n\r\n\t/**\r\n\t * This will stop the timer.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tstop()\r\n\t{\r\n\t\tglobalThis.clearTimeout(this.timer);\r\n\t}\r\n\r\n\t/**\r\n\t * This will call the callback function.\r\n\t *\r\n\t * @private\r\n\t * @returns {void}\r\n\t */\r\n\treturnCallBack()\r\n\t{\r\n\t\tconst callBack = this.callBack;\r\n\t\tif (typeof callBack === 'function')\r\n\t\t{\r\n\t\t\tcallBack.call();\r\n\t\t}\r\n\t}\r\n}", "import { Timer } from './timer.js';\r\n\r\n/**\r\n * IntervalTimer\r\n *\r\n * This will create a timer that will call a callback function.\r\n *\r\n * @class\r\n */\r\nexport class IntervalTimer extends Timer\r\n{\r\n\t/**\r\n\t * This will create a timer.\r\n\t *\r\n\t * @protected\r\n\t * @param {function} callBack\r\n\t * @returns {void}\r\n\t */\r\n\tcreateTimer(callBack)\r\n\t{\r\n\t\tthis.timer = globalThis.setInterval(callBack, this.duration);\r\n\t}\r\n\r\n\t/**\r\n\t * This will stop the timer.\r\n\t *\r\n\t * @returns {void}\r\n\t */\r\n\tstop()\r\n\t{\r\n\t\tglobalThis.clearInterval(this.timer);\r\n\t}\r\n}"],
5
+ "mappings": "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",
6
+ "names": ["Atom", "Div", "Atom", "PaginationTracker", "offset", "limit", "numItems", "lastCursor", "SCROLL_THRESHOLD", "getScrollMetrics", "container", "scrollTop", "clientHeight", "scrollHeight", "shouldLoadMore", "metrics", "threshold", "canLoad", "tracker", "updateRows", "rows", "list", "lastCursor", "setupFetchCallback", "data", "callback", "resultCallback", "response", "fetchAndRefresh", "fetchCallback", "tracker", "list", "rows", "lastCursor", "updateRows", "createScrollHandler", "container", "e", "callBack", "metrics", "getScrollMetrics", "canLoad", "createTableScrollHandler", "setupResetCallback", "fetchCallback", "tracker", "list", "fetchAndRefresh", "addRefreshMethod", "parent", "DataContainer", "Atom", "props", "children", "PaginationTracker", "setupFetchCallback", "Div", "ele", "data_container_default", "Div", "On", "Data", "Jot", "Builder", "Html", "ChildHelper", "parent", "index", "node", "children", "layout", "oldChild", "frag", "childrenLayout", "container", "Item", "index", "item", "status", "DataHelper", "oldArray", "newArray", "key", "oldItemsMap", "changes", "deletedItems", "newItem", "newIndex", "keyValue", "oldItem", "array", "map", "obj1", "obj2", "keys1", "keys2", "RowDivider", "layout", "itemProperty", "customCompare", "value", "last", "item", "children", "lastValue", "clone", "data", "List", "Jot", "RowDivider", "items", "Data", "parentValue", "parentData", "hasItems", "rowCallBack", "Div", "On", "item", "index", "scope", "children", "keyValue", "rowElement", "ChildHelper", "row", "oldRow", "layout", "rows", "safeRows", "lastIndex", "newItems", "withDelete", "oldItems", "changes", "DataHelper", "reverseItems", "existingItems", "DataList", "Atom", "props", "data_container_default", "List", "Atom", "Div", "Atom", "setupResetCallback", "fetchCallback", "tracker", "list", "fetchAndRefresh", "addRefreshMethod", "parent", "ScrollableContainer", "Atom", "props", "children", "PaginationTracker", "container", "setupFetchCallback", "handleScroll", "createScrollHandler", "Div", "ele", "scrollable_container_default", "ScrollableList", "Atom", "props", "scrollable_container_default", "List", "A", "Component", "router", "Watcher", "attr", "value", "iSActive", "path", "url", "NavLink", "href", "text", "watchers", "string", "type", "exact", "data", "ele", "selected", "Tbody", "Data", "Div", "Td", "Tr", "SkeletonTableRow", "columnCount", "customCell", "key", "createSkeletonCell", "index", "widths", "width", "_", "TableBody", "List", "hasItems", "Data", "skeletonConfig", "skeletonCount", "customRowFunction", "columnCount", "_", "index", "SkeletonTableRow", "rows", "items", "item", "scope", "children", "rowCallBack", "Tbody", "ele", "DataTableBody", "key", "rows", "selectRow", "rowItem", "emptyState", "skeleton", "columnCount", "TableBody", "row", "Tbody", "ScrollableTableBody", "TableBody", "PaginationTracker", "container", "tracker", "setupFetchCallback", "createTableScrollHandler", "fetchAndRefresh", "rowCallBack", "handleScroll", "Tbody", "ele", "parent", "Span", "Component", "SimpleData", "Timer", "duration", "callBack", "IntervalTimer", "Timer", "callBack", "data", "SimpleData", "MINUTE_INTERVAL", "timer", "IntervalTimer", "DynamicTime", "Component", "Span", "dateTime"]
7
7
  }
@@ -54,6 +54,17 @@ export class TableBody extends TableBody_base {
54
54
  * @returns {void}
55
55
  */
56
56
  prepend(items: any[] | object): void;
57
+ /**
58
+ * This will create a row for each item.
59
+ * Override to handle skeleton items differently from real data items.
60
+ *
61
+ * @param {*} item
62
+ * @param {*} index
63
+ * @param {*} scope
64
+ * @param {*} children
65
+ * @returns {object|null}
66
+ */
67
+ row(item: any, index: any, scope: any, children: any): object | null;
57
68
  /**
58
69
  * This will render the list.
59
70
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base-framework/organisms",
3
- "version": "1.0.129",
3
+ "version": "1.0.132",
4
4
  "description": "This will add default organisms to the base framework.",
5
5
  "main": "./dist/organisms.js",
6
6
  "scripts": {