UNPKG

json-object-editor

Version:

JOE the Json Object Editor | Platform Edition

281 lines (266 loc) 11.9 kB
function ReportBuilder(){ var self = this; this.default = function(data,req,response){ var rBM = new Benchmarker(); var reportid =data.reportid; if(!reportid){ return {errors:'no report id',failedat:'reportbuilder'}; } var report = JOE.Cache.findByID('report',reportid); var source = req.headers.referer || req.headers.host; var payload = { source:source, data:data, report:report }; var item,itemid,schema; if(data.itemid){ //var reportName = data.name; itemid = data.itemid; item = JOE.Cache.findByID(itemid)||false; schema = JOE.Schemas.raw_schemas[item.itemtype]; } if(!report && reportid){ var posReps = JOE.Cache.search({itemtype:'report',id:reportid})[0]; if(posReps){ report = posReps; payload.report = posReps; } } if(!report){ if(!item){ return {errors:'report not found (1)',failedat:'reportbuilder'}; }else{ if(schema.reports && schema.reports[reportid]){ report = schema.reports[reportid]; report.format = 'json'; console.log(report); if(!report){ return {errors:`report not found (3)`,failedat:'reportbuilder'}; } }else{ return {errors:`report not found (${reportid})`,failedat:'reportbuilder'}; } } } if(!CheckAuth(null,report,req,response)){ return {unauthorized:true}; } try{ var webconfig = Object.assign({},JOE.webconfig); delete webconfig.authorization; delete webconfig.joedb; var report_includes = ''; if(report.includes){ report_includes = getIncludes(report); } var template_data = { REPORT:report, WEBCONFIG:webconfig, INCLUDE_STRING:report_includes, request:{ query:req.query, params:req.params }, response } //logit('webconfig',webconfig); var c_obj,item; if(report.content_items){ report.content_items.map(function(content){ if(data[content.reference]){ c_obj = JOE.Cache.findByID(content.itemtype,data[content.reference])||{name:content.reference+' not found'}; template_data[content.reference] = c_obj; } }) if(report.content_items.length == 1 && c_obj){ item = c_obj; } } //console.log('content items done.') //if template, get items and populate template_data.TIME = rBM.stop(); var payload; if(report.template){ // console.log(report.template_type); switch(report.template_type){ case "module": if(report.format == "json"){ try{ var modFunc = report.template; payload = modFunc(Object.assign(template_data,{ITEM:item}),{renderHTMLFramework:renderHTMLFramework}); if(payload && payload.use_callback){ return payload; } }catch(e){ console.error(e); return {errors:e} } }else{ try{ var modFunc = JOE.Utils.requireFromString(report.template,report._id); payload = modFunc(template_data,{renderHTMLFramework:renderHTMLFramework}); if(payload && payload.use_callback){ return payload; } }catch(e){ console.error(e); return {errors:e} } } break; case "code": case "wysiwyg": default: var template = report.template; if(template.indexOf("function") == 0){ var f = tryEval(template); if(f){ template = f(item,template_data); } } //template_data.JOE = JOE; payload = fillTemplate(template,template_data); break; } } logit(JOE.Utils.color('[reportbuilder]','plugin')+' in '+rBM.stop()); function getIncludes(report){ var i_html = ''; report.includes.map(inc=>{ let include = $J.get(inc); switch(include.filetype){ case 'css': i_html +=`<link rel="stylesheet" href="/_include/${inc}"/>`; break; case 'js': i_html +=`<script src="/_include/${inc}"></script>`; break; } }) return i_html; } if(report.includes){ payload = report_includes+payload; } if(report.use_htmlframework){ payload = renderHTMLFramework(report,item,payload); logit('using html > '+payload.length); //+payload+'</body></html>'; } }catch(e){ console.error(e); return e; } return payload; } function renderMinimalFramework(){ } function renderHTMLFramework(report,item,content,title){ var title = title || report.name+': '+item.name; var html ='<html><head><meta name="viewport" content="initial-scale=1.0, user-scalable=no" />' + '<title>'+title+'</title>' +'<link rel="stylesheet" href="/JsonObjectEditor/js/plugins/c3/c3.min.css"/>' +'<link rel="stylesheet" href="/JsonObjectEditor/capp/capp.css"/>' +'<script src="/JsonObjectEditor/_joeinclude.js"></script>' +'<script src="/JsonObjectEditor/capp/capp.js"></script>' +'<script src="/JsonObjectEditor/js/plugins/c3/d3.v3.min.js"></script>' +'<script src="/JsonObjectEditor/js/plugins/c3/c3.min.js"></script>' +'<link rel="stylesheet" href="/JsonObjectEditor/css/joe.css" />' +'<link rel="stylesheet" href="/JsonObjectEditor/css/report-styles.css" />' +'<script src="/JsonObjectEditor/web-components/report-components.js"></script>' +'</head><body>'; if(content){ html +=content+'</body></html>'; } return html; } function CheckAuth(item,report,req,res){ //console.log(req.cookies); var username = req.cookies && req.cookies._j_user; var user = {}; if(username){ user = JOE.Data.user.where({name:req.cookies._j_user,token:req.cookies._j_token})[0]||{}; } var rep_auth = JOE.Utils.propAsFuncOrValue(report._protected,item,null,user._id); var item_auth = (item && JOE.Utils.propAsFuncOrValue(item._protected,item,null,user._id))||false; var group_auth = false; if(item && item.group){ let group = $J.get(item.group); console.log(group); group_auth = (group && JOE.Utils.propAsFuncOrValue(group._protected,group,null,user._id))||false; } //logit('auths: rep-'+rep_auth+' item-'+item_auth); if(!rep_auth && !item_auth && !group_auth){ return true; } //logit('report requires auth'); return JOE.isAuthorized(req,res); } this.renderStandardHeader = function(item,report){ var schema = JOE.Schemas.raw_schemas[item.itemtype]; var template = '<joe-report>\ <report-header>'+ ((schema.menuicon &&'<report-icon>'+schema.menuicon+'</report-icon>')||'')+ `<a href="/JOE/joe#/${item.itemtype}/${item._id}" class="report-link report-block"><joe-subtext>goto</joe-subtext>joe</a> <joe-subtext>${this.REPORT.name}</joe-subtext> <report-title>${(item.name||item._id||'')}</report-title> <report-subtitle>${(item.info||'')}</report-subtitle> </report-header>`; }; this.standard = function(data,req,res){ var webconfig = Object.assign({},JOE.webconfig); delete webconfig.authorization; delete webconfig.joedb; var rBM = new Benchmarker(); var payload = { data:data }; var template_data={ WEBCONFIG:webconfig }; //var reportName = data.name; var itemid = data.itemid; var item = JOE.Cache.findByID(itemid)||false; if(!item){ payload.error = "no item found for "+itemid; return payload; } var itemtype = item.itemtype.toUpperCase(); var schema = JOE.Schemas.raw_schemas[item.itemtype]; var template = ''; if(!schema || !schema.report){ payload.error = "no standard report found for schema "+item.itemtype; return payload; } var report = schema.report.standard || schema.report; //CHECK AUTH if(!CheckAuth(item,report,req,res)){ return {unauthorized:true}; } template_data[itemtype] = item; template_data.TIMESTAMP = rBM.stop(); template_data.REPORT = report; template = JOE.Utils.propAsFuncOrValue(report.template,item,null,template_data); var header = renderHTMLFramework(report,item); var status = (item.status && JOE.Cache.findByID(item.status)[0]) || false; template = '<joe-report>\ <report-header>'+ ((schema.menuicon &&'<report-icon>'+schema.menuicon+'</report-icon>')||'')+ '<a href="/JOE/joe#/'+item.itemtype+'/'+item._id+'" class="report-link report-block"><joe-subtext>goto</joe-subtext>joe</a>\ <joe-subtext>${this.REPORT.name}</joe-subtext>\ <report-title>'+(item.name||item._id||'')+'</report-title>\ <report-subtitle>'+(item.info||'')+'</report-subtitle>\ </report-header>'+ ((status && `<report-status class="report-block" style="background:${status.color}"><span class="joe-subtext">status </span>${status.name}</report-status>` )||'')+ `<report-content>`+ template+'</report-content></joe-report>'; payload = header+fillTemplate(template,template_data); payload+='</body></html>'; logit(JOE.Utils.color('[reportbuilder]','plugin')+' in '+rBM.stop()); return payload; } return self; } module.exports = new ReportBuilder();