tablevu 0.2.10 → 0.2.12

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/README.md CHANGED
@@ -23,7 +23,11 @@ npm install tablevu
23
23
  ## Usage
24
24
  * **data** : Array or Server side parameters
25
25
 
26
- * **search** : Reactive filter value
26
+ * **grouping** : Grouping data specific column or function
27
+
28
+ * **filter** : Reactive filter value
29
+
30
+ * **search** : Reactive search value
27
31
 
28
32
  * **rowid** : Key value for row.
29
33
 
@@ -47,7 +51,9 @@ npm install tablevu
47
51
  * **width** : Column width
48
52
 
49
53
  * **align** : Column align
50
-
54
+
55
+ * **style** : Column style
56
+
51
57
  * **type** : Data type (datetime, date, time, numeric). Show local value
52
58
 
53
59
  * **render** : Render value
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tablevu",
3
- "version": "0.2.10",
3
+ "version": "0.2.12",
4
4
  "description": "vue 3 data table",
5
5
  "main": "index.js",
6
6
  "directories": {
package/src/get.js CHANGED
@@ -1,23 +1,22 @@
1
- export default function get(url, options) {
1
+ export default function get(req) {
2
2
  return new Promise((resolve, reject) => {
3
- fetch(url, options).then(res => res.json()).then(res => {
3
+ fetch(req).then(res => res.json()).then(res => {
4
4
  let r;
5
5
  let c = 0;
6
6
 
7
7
  if (res) {
8
- if (res.hasOwnProperty('value')) {
8
+ if (res.hasOwnProperty('value'))
9
9
  r = res.value;
10
-
11
- if (res.hasOwnProperty('@count'))
12
- c = parseInt(res['@count']);
13
- else if (res.hasOwnProperty('count'))
14
- c = parseInt(res['count']);
15
- else
16
- c = 0;
17
- } else {
10
+ else
18
11
  r = res;
12
+
13
+ if (res.hasOwnProperty('@odata.count')) {
14
+ c = parseInt(res['@odata.count']);
15
+ } else if (res.hasOwnProperty('count'))
16
+ c = parseInt(res['count']);
17
+ else
19
18
  c = 0;
20
- }
19
+
21
20
  resolve({ rows: r, count: c })
22
21
  } else
23
22
  resolve({ rows: null, count: null })
package/src/table.js CHANGED
@@ -289,6 +289,10 @@ const tablevu = {
289
289
  o.colspan = col.colspan;
290
290
  }
291
291
 
292
+ if (col.style) {
293
+ o.style = col.style;
294
+ }
295
+
292
296
  if (col.align) {
293
297
  o.style['text-align'] = col.align;
294
298
  }
@@ -297,14 +301,6 @@ const tablevu = {
297
301
  o.style['max-width'] = col.width;
298
302
  }
299
303
 
300
- if (col.color) {
301
- o.style['color'] = col.color;
302
- }
303
-
304
- if (col.backgroundColor) {
305
- o.style['background-color'] = col.backgroundColor;
306
- }
307
-
308
304
  const v = renderValue(col, val);
309
305
 
310
306
  return h('td', o, v);
@@ -317,6 +313,10 @@ const tablevu = {
317
313
  o.colspan = col.colspan;
318
314
  }
319
315
 
316
+ if (col.style) {
317
+ o.style = col.style;
318
+ }
319
+
320
320
  if (col.align) {
321
321
  o.style['text-align'] = col.align;
322
322
  }
@@ -421,20 +421,17 @@ const tablevu = {
421
421
  ch.maxWidth = spec.columns[i].width;
422
422
  }
423
423
 
424
- let cy = { display: 'block', 'font-weight': 500, textDecoration: 'none', color: 'black', textAlign: 'center' };
424
+ let cy = { display: 'block', 'font-weight': 500, textDecoration: 'none', textAlign: 'center' };
425
425
 
426
426
  if (spec.columns[i].header) {
427
427
  if (spec.columns[i].header.colspan)
428
428
  sp = parseInt(spec.columns[i].header.colspan) || 1;
429
429
 
430
- if (spec.columns[i].header.align)
431
- cy.textAlign = spec.columns[i].header.align;
430
+ if (spec.columns[i].header.style)
431
+ ch.style = spec.columns[i].header.style;
432
432
 
433
- if (spec.columns[i].header.backgroundColor)
434
- ch.backgroundColor = spec.columns[i].header.backgroundColor;
435
-
436
- if (spec.columns[i].header.color)
437
- cy.color = spec.columns[i].header.color;
433
+ if (spec.columns[i].header.align)
434
+ ch.textAlign = spec.columns[i].header.align;
438
435
  }
439
436
 
440
437
  let a;
@@ -497,11 +494,11 @@ const tablevu = {
497
494
  }
498
495
 
499
496
  function renderFooter() {
500
- const fr = h('button', { class: spec.footer.button.class, style: 'margin-right: .5rem', onClick: first, disabled: spec.page.current == 1 }, '◀◀');
501
- const ls = h('button', { class: spec.footer.button.class, style: 'margin-right: .5rem', onClick: last, disabled: spec.page.count == 0 }, '▶▶');
502
- const pg = h('button', { class: spec.footer.button.class, style: 'margin-right: .5rem' }, spec.page.current);
503
- const pr = h('button', { class: spec.footer.button.class, style: 'margin-right: .5rem', onClick: prior, disabled: spec.page.current == 1 }, '◀');
504
- const nx = h('button', { class: spec.footer.button.class, style: 'margin-right: .5rem', onClick: next, disabled: spec.page.count > 0 && spec.page.current == spec.page.count }, '▶');
497
+ const fr = h('button', { class: spec.footer.button.class, style: 'font: initial; margin-right: .5rem', onClick: first, disabled: spec.page.current == 1 }, '◀◀');
498
+ const ls = h('button', { class: spec.footer.button.class, style: 'font: initial; margin-right: .5rem', onClick: last, disabled: spec.page.count == 0 }, '▶▶');
499
+ const pg = h('button', { class: spec.footer.button.class, style: 'font: initial; margin-right: .5rem' }, spec.page.current);
500
+ const pr = h('button', { class: spec.footer.button.class, style: 'font: initial; margin-right: .5rem', onClick: prior, disabled: spec.page.current == 1 }, '◀');
501
+ const nx = h('button', { class: spec.footer.button.class, style: 'font: initial; margin-right: .5rem', onClick: next, disabled: spec.page.count > 0 && spec.page.current == spec.page.count }, '▶');
505
502
  const td = h('td', { colspan: spec.columns.length, align: 'center' }, [fr, pr, pg, nx, ls]);
506
503
  const tr = h('tr', {}, [td]);
507
504
 
package/dist/array.js DELETED
@@ -1 +0,0 @@
1
- export default function(props,data){let d=[];if(Array.isArray(data))d=data;return new Promise((resolve,reject)=>{if(props.pageSize){d=d.slice((props.currPage-1)*props.pageSize,props.currPage*props.pageSize)}if(props.sort&&props.sort.length>0){for(let i=props.sort.length-1;i>=0;i--){let f=null;if(props.sort[i].index>-1)f=props.cols[props.sort[i].index].name;else f=props.sort[i].name;if(props.sort[i].dir=="desc")d.sort((a,b)=>a[f]<b[f]?1:b[f]<a[f]?-1:0);else d.sort((a,b)=>a[f]>b[f]?1:b[f]>a[f]?-1:0)}}resolve({rows:d,count:d.length})})}
package/dist/get.js DELETED
@@ -1 +0,0 @@
1
- export default function get(url,options){return new Promise((resolve,reject)=>{fetch(url,options).then(res=>res.json()).then(res=>{let r;let c=0;if(res){if(res.hasOwnProperty("value")){r=res.value;if(res.hasOwnProperty("@count"))c=parseInt(res["@count"]);else if(res.hasOwnProperty("count"))c=parseInt(res["count"]);else c=0}else{r=res;c=0}resolve({rows:r,count:c})}else resolve({rows:null,count:null})}).catch(err=>{console.error(err);reject(err)})})}
package/dist/odata.js DELETED
@@ -1 +0,0 @@
1
- import get from"./get.js";function filter(q){function fuval(q){if(q===null){return"null"}else if(typeof q==="string"){if(q.length==10&&q[4]=="-"&&q[7]=="-"&&Date.parse(q)){return q}else return"'"+q+"'"}else{if(typeof q==="number")return q;else{if(q.getMonth&&typeof q.getMonth==="function")return q.toISOString();else return q.func+"("+q.params.join(",")+")"}}}let s="";if(q&&q.filters)for(let i=0;i<q.filters.length;i++){if(i>0)s=s+` ${q.type||"and"} `;if(q.filters[i].column){if(q.filters[i].operator=="in")s=s+fuval(q.filters[i].value)+" "+q.filters[i].operator+" "+q.filters[i].column;else s=s+q.filters[i].column+" "+q.filters[i].operator+" "+fuval(q.filters[i].value)}else{if(q.filters[i].func)s=s+q.filters[i].func+"("+q.filters[i].params.map(m=>fuval(m)).join(",")+")";else if(q.filters[i])s=s+"("+filter(q.filters[i])+")"}}return s}function sefs(url,query,seperator){let r="";if(query.select&&query.select.length>0){if(seperator)r+="$select="+query.select.join(",");else url.searchParams.append("$select",query.select.join(","))}if(query.expand&&query.expand.length>0){let a=[];query.expand.forEach(e=>{let q=sefs(null,e,";");if(q)a.push(e.name+"("+q+")");else a.push(e.name)});if(seperator)r+=(r.length>0?seperator:"")+"$expand="+a.join(",");else url.searchParams.append("$expand",a.join(","))}if(query.count)url.searchParams.append("$count",true);return r}export default class odata{constructor(req,data,events){this.adapter=props=>{const u=new URL(req.url);if(props.pageSize){u.searchParams.append("$skip",props.pageSize*(props.currPage-1));u.searchParams.append("$top",props.pageSize)}sefs(u,data);let f=[];if(props.filter&&Object.prototype.hasOwnProperty.call(props.filter,"filters")){let l=filter(props.filter);if(l)f.push(l)}if(props.filter){let l=filter(props.filter);if(l)f.push(l)}if(props.search){let l=props.cols.filter(q=>q.searchable==undefined||q.searchable==true).map(q=>"contains("+q.name.replaceAll(".","/")+",'"+props.search+"')").join(" or ");if(l)f.push("("+l+")")}if(f&&f.length>0)u.searchParams.append("$filter",f.join(" and "));if(props.sort&&props.sort.length>0)u.searchParams.append("$orderby",props.sort.map(m=>{let n={index:-1,name:"",dir:null};if(Object.prototype.hasOwnProperty.call(m,"index")){n.index=m.index}else{n.name=m.name}n.dir=m.dir;return n}).map(m=>{return(m.index>-1?props.cols[m.index].name:m.name).replaceAll(".","/")+(m.dir?" "+m.dir:"")}).join(","));let r=null;if(events&&events.onfetch&&typeof events.onfetch=="function")r=events.onfetch(new Request(u,req));else r=new Request(u,req);return get(r)}}}
package/dist/table.js DELETED
@@ -1 +0,0 @@
1
- import{h,onMounted,reactive,ref,watch,isReactive,isRef}from"vue";import adaptarr from"./array.js";const tablevuStatuses={Error:-1,Ready:0,Loading:1};const tablevu={props:{settings:{type:Object,default:null},data:{type:[Array,Function]},group:{type:[String,Object]},search:{type:String},filter:{type:[Array,Object]},command:{type:Array,default:[]},rowid:{type:String},onRowClick:{type:Function},onRowDblClick:{type:Function},class:{type:String,default:"table"},style:{type:String,default:null}},emits:["onRowClick","onRowDblClick"],setup(props,{attrs,slots,emit,expose}){let rows=[];let rowg=[];let grps=[];let adapter=null;let timer=null;const spec=reactive({caption:null,group:{value:props.settings&&props.settings.group?props.settings.group.value:props.group?props.group:null,content:props.settings&&props.settings.group?props.settings.group.content:null,expandAll:true,class:"table-light"},page:{count:0,size:props.settings&&props.settings.page?props.settings.page.size:0,current:0,type:null},sort:props.settings&&props.settings.sort?props.settings.sort:[],columns:props.settings&&props.settings.columns?props.settings.columns:[],footer:{button:{class:"btn"}}});if(props.data){if(Array.isArray(props.data)){adapter=adaptarr}else{adapter=props.data}}if(props.filter)spec.filter=props.filter;watch(()=>props.search,(n,o)=>{const x=parseInt(props.settings.searchMinChar)||3;if(timer)clearTimeout(timer);if(o&&o.length>x&&(n==undefined||n==null||n.length<=x)||n&&n.length>x){timer=setTimeout(()=>{if(n&&n.length>x)spec.search=props.search;else spec.search=null;refresh()},444)}});if(props.filter)spec.filter=props.filter;watch(()=>props.filter,()=>{if(props.filter)spec.filter=props.filter;else spec.filter=null;refresh()},{deep:true});watch(()=>props.command,(n,o)=>{if(n&&n.length>0){const c=props.command[n.length-1];if(c&&c.name){if(c.name.toLowerCase()=="refresh")refresh();else if(c.name.toLowerCase()=="first")first();else if(c.name.toLowerCase()=="prior")prior();else if(c.name.toLowerCase()=="next")next();else if(c.name.toLowerCase()=="last")last();else console.log("Unknown command")}props.command.length=0}},{deep:true});function prepareGroup(g,r){grps=[];rowg=[];for(let i=0;i<r.length;i++){let v=null;let c=null;const o=r[i];if(g.value){if(typeof g.value=="function")v=g.value(o);else v=o[g.value]}else if(typeof g=="function")v=g(o);else{if(typeof g=="bigint"||typeof g=="number"){const l=parseInt(g);if(l)v=o[l]}else if(typeof g=="string")v=o[g]}if(g.content){if(typeof g.content=="function")c=g.content(o);else c=o[g.content]}let n=grps.findIndex(f=>f.group==v);if(n==-1){n=grps.push({group:v,content:c,expand:spec.group.expandAll})-1}rowg.push(n)}}function first(){page(1)}function prior(){if(spec.page.current>1){page(spec.page.current-1)}else{page(spec.page.current)}}function next(){page(spec.page.current+1)}function last(){page(spec.page.count)}function refresh(){page(spec.page.current)}function orderby(ind,dir){if(spec.sort&&spec.sort.length>0){let l=spec.sort.findIndex(f=>f.index==ind);if(l<0){let n=spec.columns[ind].name;l=spec.sort.findIndex(f=>f.name==n)}if(l==0){spec.sort[l].dir=dir?dir:spec.sort[0].dir?null:"desc"}else if(l>0){spec.sort.splice(l,1)}if(l!=0){spec.sort.unshift({index:ind,dir:dir?dir:null})}if(spec.sort.length>2){spec.sort.pop()}}else{spec.sort.push({index:ind,dir:dir?dir:null})}page(spec.page.current)}function page(currentPage){let dat=null;if(props.data){if(Array.isArray(props.data))dat=props.data}else return;spec.status=tablevuStatuses.Loading;if(adapter){adapter({pageSize:spec.page.size,currPage:currentPage,sort:spec.sort,cols:spec.columns,filter:spec.filter,search:spec.search},dat).then(ada=>{if(spec.onData)rows=spec.onData(ada.rows);else rows=ada.rows;if(spec.group&&(typeof spec.group=="string"||typeof spec.group=="bigint"||typeof spec.group=="object"&&spec.group.value))prepareGroup(spec.group,rows);spec.page.count=ada.count>0&&spec.page.size>0?ada.count/spec.page.size:0;spec.page.current=currentPage;spec.status=tablevuStatuses.Ready;spec.time=Date.now()})}}function renderValue(col,val){if(val){let v;if(col.type=="datetime"||col.type=="date"||col.type=="time"){let t=new Date(val);if(col.type=="date")v=t.toLocaleDateString();else if(col.type=="time")v=t.toLocaleTimeString();else v=t.toLocaleString()}else{if(col.type=="numeric"){v=parseFloat(val)}else{if(col.type=="integer"){v=parseInt(val)}else v=val}}return v}else return""}function renderCell(col,val){const o={style:{}};if(col.colspan&&col.colspan>1){o.colspan=col.colspan}if(col.align){o.style["text-align"]=col.align}if(col.width){o.style["max-width"]=col.width}if(col.color){o.style["color"]=col.color}if(col.backgroundColor){o.style["background-color"]=col.backgroundColor}const v=renderValue(col,val);return h("td",o,v)}function renderCustomCell(col,row){const o={style:{}};if(col.colspan&&col.colspan>1){o.colspan=col.colspan}if(col.align){o.style["text-align"]=col.align}if(col.width){o.style["max-width"]=col.width}let f=col.render(row);return h("td",o,f)}function renderGroup(grp){const b=h("button",{title:grp.expand,onClick:event=>{grp.expand=grp.expand?false:true;event.currentTarget.value=grp.expand?"▼":"►";spec.time=Date.now();event.preventDefault()},style:{padding:0,margin:"0 6px 0 0",width:"12px",height:"100%",border:"none",outline:0,backgroundColor:"transparent"}},grp.expand?"▼":"►");const v=grp.content||grp.group;return h("tr",{},h("td",{colspan:spec.columns.length,class:spec.group.class},[b,v]))}function renderRow(index,row){const o={};const r=[];o.key=index;o.index=index;if(props.rowid){o.rowid=row[props.rowid]}for(let i=0;i<spec.columns.length;i+=1){let v;const c=spec.columns[i];if(c.render){v=renderCustomCell(c,row);r.push(v)}else{if(c.depth){v=row;for(let j=0;j<c.depth.length;j+=1){if(v)v=v[c.depth[j]]}}else{v=row[c.name]}r.push(renderCell(c,v))}}o.ondblclick=event=>{const r=rows[event.currentTarget.attributes.index.value];emit("onRowDblClick",event,r)};if(props.onRowClick){o.onClick=event=>{const r=rows[event.currentTarget.attributes.index.value];props.onRowClick(event,r)}}return h("tr",o,r)}function renderHeader(){let ar=[];let sp=1;for(let i=0;i<spec.columns.length;i+=1){if(sp>1){sp--;continue}const cl=[];if(spec.columns[i].label){cl.push(h("span",spec.columns[i].label))}else{cl.push(h("span",spec.columns[i].name))}if(spec.sort&&spec.sort.length>0&&spec.sort[0].index==i){if(spec.sort[0].dir=="desc")cl.push(h("span",{style:{float:"right"}},"▼"));else cl.push(h("span",{style:{float:"right"}},"▲"))}let ch={position:"relative"};if(spec.columns[i].width){ch.width=spec.columns[i].width;ch.minWidth=spec.columns[i].width;ch.maxWidth=spec.columns[i].width}let cy={display:"block","font-weight":500,textDecoration:"none",color:"black",textAlign:"center"};if(spec.columns[i].header){if(spec.columns[i].header.colspan)sp=parseInt(spec.columns[i].header.colspan)||1;if(spec.columns[i].header.align)cy.textAlign=spec.columns[i].header.align;if(spec.columns[i].header.backgroundColor)ch.backgroundColor=spec.columns[i].header.backgroundColor;if(spec.columns[i].header.color)cy.color=spec.columns[i].header.color}let a;let f;if(spec.columns[i].popup){const r=ref(null);let c=[h("a",{href:"#",onClick(event){orderby(i);event.preventDefault()},style:{display:"block",textDecoration:"none",color:"black",fontWeight:"initial",padding:".25rem"}},"Order by Ascending"),h("a",{href:"#",onClick(event){orderby(i,"desc");event.preventDefault()},style:{display:"block",textDecoration:"none",color:"black",fontWeight:"initial",padding:".25rem"}},"Order by Descending")];a=h("a",{href:"#",onClick(event){if(r.value&&r.value.style&&r.value.style.display&&r.value.style.display=="block")r.value.style.display="none";else r.value.style.display="block";event.preventDefault()},style:cy},cl);f=h("div",{ref:r,style:{position:"absolute",display:"none",width:spec.columns[i].width||"12rem",height:"fit-content",border:"1px solid lightgray",backgroundColor:"whitesmoke",zIndex:1,left:0,top:"2rem",bottom:0,right:0,padding:".25rem"}},c)}else a=h("a",{href:"#",onClick(event){orderby(i);event.preventDefault()},style:cy},cl);if(spec.columns[i].filter){}ar.push(h("th",{colspan:sp>1?sp:null,style:ch},[a,f]))}const tr=h("tr",{},ar);return[tr]}function renderBody(){const dr=[];if(rows&&rows.length>0){if(grps&&grps.length>0){let r=[];for(let g=0;g<grps.length;g++)r.push({index:g,childs:[]});for(let i=0;i<rows.length;i++){const x=rowg[i];r[x].childs.push(renderRow(i,rows[i]))}for(let g=0;g<grps.length;g++){dr.push(renderGroup(grps[g]));if(grps[g].expand)dr.push(r[g].childs)}}else{for(let i=0;i<rows.length;i++){dr.push(renderRow(i,rows[i]))}}}return dr}function renderFooter(){const fr=h("button",{class:spec.footer.button.class,style:"margin-right: .5rem",onClick:first,disabled:spec.page.current==1},"◀◀");const ls=h("button",{class:spec.footer.button.class,style:"margin-right: .5rem",onClick:last,disabled:spec.page.count==0},"▶▶");const pg=h("button",{class:spec.footer.button.class,style:"margin-right: .5rem"},spec.page.current);const pr=h("button",{class:spec.footer.button.class,style:"margin-right: .5rem",onClick:prior,disabled:spec.page.current==1},"◀");const nx=h("button",{class:spec.footer.button.class,style:"margin-right: .5rem",onClick:next,disabled:spec.page.count>0&&spec.page.current==spec.page.count},"▶");const td=h("td",{colspan:spec.columns.length,align:"center"},[fr,pr,pg,nx,ls]);const tr=h("tr",{},[td]);return[tr]}function renderCaption(){return null}if(spec.columns.length==0){alert("Columns not defined !")}for(let i=0;i<spec.columns.length;i++)if(spec.columns[i].name&&spec.columns[i].name.indexOf(".")>-1){spec.columns[i].depth=spec.columns[i].name.split(".")}page(1);onMounted(()=>{});return{spec:spec,renderHeader:renderHeader,renderBody:renderBody,renderFooter:renderFooter,renderCaption:renderCaption}},render(props){let prps={class:"tablevu"};if(props.class)prps.class="tablevu "+props.class;if(props.style)prps.style=props.style;let cntn=[];cntn.push(h("thead",{},this.renderHeader()));if(this.spec.status==tablevuStatuses.Ready)cntn.push(h("tbody",{"data-time":this.spec.time},this.renderBody()));if(this.spec.caption)cntn.push(h("caption",{},this.renderCaption()));if(this.spec.page.size>0)cntn.push(h("tfoot",{},this.renderFooter()));return h("table",prps,cntn)}};export default tablevu;
package/dist/webapi.js DELETED
@@ -1 +0,0 @@
1
- import get from"./get.js";export default class webapi{constructor(req,data,events){this.adapter=props=>{const u=new URL(req.url);if(props.pageSize){u.searchParams.append("skip",props.pageSize*(props.currPage-1));u.searchParams.append("top",props.pageSize)}if(props.search)u.searchParams.append("search",props.search);if(props.sort&&props.sort.length>0){u.searchParams.append("orderby",props.sort.map(m=>{let n={index:-1,name:""};if(Object.prototype.hasOwnProperty.call(m,"index")){n.index=m.index}else{n.name=m.name}return n}).map(m=>{return m.index>-1?props.cols[m.index].name:m.name}))}let r=null;if(events&&events.onfetch&&typeof events.onfetch=="function")r=events.onfetch(new Request(u,req));else r=new Request(u,req);return get(r)}}}