@fto-consult/expo-ui
Version:
Bibliothèque de composants UI Expo,react-native
118 lines (112 loc) • 5.21 kB
JavaScript
import _Footer from "./Footer";
import View from "$ecomponents/View";
import React from "$react";
import memoize from "$react/memoize";
export {default as FooterItem} from "./Footer";
import {parseDecimal,defaultObj,defaultStr,isNonNullString} from "$cutils";
import { aggregatorFunctions as mAggregatorFunctions } from "./Footer";
export * from "./Footer";
/***évalue la valeur décimale selon les paramètres */
export const getFooterColumnValue = ({data,columnDef,field,result,columnField}) =>{
data = defaultObj(data)
columnDef = defaultObj(columnDef);
columnField = defaultStr(columnField,columnDef.field,field);
let val = data[columnField];
if(typeof val !=='number' && isObj(columnDef.datagrid) && typeof columnDef.datagrid.render =='function'){
const v = columnDef.datagrid.render({rowData:data,data,isDatagridFooter:true,columnDef,columnField,action:"footer",isFooterRendering:true});
if(typeof v ==='number'){
val = v;
}
}
if(typeof columnDef.multiplicater ==='function'){
val = defaultDecimal(columnDef.multiplicater({value:val,columnField,field,columnDef,rowData:data,item:data}),val)
}
return typeof val =='number'? parseDecimal(val.toFixed(12)) : 0;
}
export const evalSingleValue = ({data,columnDef,field,count,columnField,aggregatorFunctions,withLabel,result,displayLabel,onlyVisible})=>{
if(!isNonNullString(field) || !isObj(columnDef) || !isObj(data)) return result;
aggregatorFunctions = defaultObj(aggregatorFunctions,mAggregatorFunctions);
onlyVisible = defaultBool(onlyVisible,true);
if(onlyVisible === true && !(columnDef.visible !== false)) result;
let val = getFooterColumnValue({data,columnDef,columnField,result,field});
(Array.isArray(result) ? result : [result]).map((currentResult)=>{
currentResult = defaultObj(currentResult);
if(!isObj(currentResult[field])){
let label = defaultStr(columnDef.label,columnDef.text);
if(!label && displayLabel !== false && withLabel !== false) return currentResult;
currentResult[field] = {
label,
visible : columnDef.visible,
format : defaultStr(columnDef.format).toLowerCase()
}
}
const obj = currentResult[field];
//obj.max = isDecimal(obj.max) ? Math.max(obj.max,val) : val;
//obj.min = isDecimal(obj.min) ? Math.min(obj.min,val) : val;
//obj.count = isDecimal(obj.count) ? obj.count : 0;
//obj.sum = isDecimal(obj.sum) ? (parseDecimal((obj.sum+val).toFixed(10))) : val;
Object.map(aggregatorFunctions,(aggegatorFunction,key)=>{
const code = aggegatorFunction.code;
obj[code] = aggegatorFunction.eval({columnDef,columnField,data,value : val,count,...obj,total:defaultNumber(obj[code])});
});
if(typeof obj.count =='number' && obj.count >0 && typeof obj.sum =='number'){
obj.average = obj.sum / obj.count;
}
return currentResult;
})
return result;
}
export const evalValues = memoize(({data,columns,aggregatorFunctions,onlyVisible,withLabel,displayLabel})=>{
let result = {};
Object.map(data,(rowData,i)=>{
if(!isObj(rowData)) return result;
Object.map(columns,(columnDef,field)=>{
result = evalSingleValue({data:rowData,aggregatorFunctions,columnDef,field,result,withLabel,displayLabel,onlyVisible})
})
})
return result;
});
/****
* @param : columns {object} : la liste de toutes les colonnes pouvant être rendu par le footer
* @param : data {array{object}}: les données à exploiter pour le rendu des footers
* @param : Component {React.Element|string}
* @param : children {func}, fonction permettant de générer le contenu du footer
*/
export default function DGGridFooters (props){
let {columns,children,displayLabel,aggregatorFunctions,Component,data,onlyVisible,...rest} = props;
rest = defaultObj(rest)
if(Component === false){
Component = React.Fragment;
rest = {};
} else {
Component = defaultVal(Component,View)
}
const [state,setState] = React.useState({
columns,
data,
})
React.useEffect(()=>{
setState({...state,columns:props.columns})
},[props.columns])
React.useEffect(()=>{
setState({...state,data:props.data})
},[props.data]);
let footers = evalValues({data:state.data,aggregatorFunctions,columns:state.columns,onlyVisible,displayLabel});
return <Component {...rest}>
{children({
footers,
columns,
render:({footer,field,props})=>{
if(!isObj(footer) || !isNonNullString(field) || !isObj(footers[field])) return null;
props = defaultObj(props);
return <_Footer
{...props}
key = {field}
displayLabel = {displayLabel}
{...footer}
/>
}
})}
</Component>
}
export {_Footer as Footer};