报表的资源 -- 跳转、主题、内嵌图片等
ARJS是一款交互式能力非常丰富的报表,可以使用各种各样的主题,报表跳转,内嵌的图片供大家使用。但是桌面端的直接在同级目录下,很多资源有了就会自动加载,但是作为一款纯前端的产品,大家肯定是想要在web端使用。
但是web端就会发现很多资源,包括跳转,主题这些的,我应该如何加载,不同于桌面端。没有办法扫描统计目录。那如果我们需要使用这些资源。应该如果实现呢。
今天就给大家说说 ARJS的web端资源使用方法。
首先需要明确一点,ARJS的所有文件本身其实都是以json格式存储和使用的,包括我们设计的报表模板,也是json格式的,ARJS本身会根据解析这些JSON然后加载渲染报表。无论是数据的展示还是别的,都是一样的,所有我们就知道,只要最终返回的是json就是了,但是我们使用的时候,又不能选择一个大json。肯定还是要通过一个名字,比如我们A报表,我无论是打开,或者跳转 ,都是选择的A,但是后台加载A对应的json就可以。
知道了这一点我们就知道,ARJS的资源配置基本都是前台使用看到和选择的都是key。然后根据key去发起一个网络请求,然后得到一个json的value。然后就可以加载这个json的value了。这个也就引出了我们提到的资源的使用和渲染。首先使用就是指设计的时候,我能选择到,比如我要在web端配置跳转,这个时候下拉框就得把我能跳转的报表自动列举出来,但是这个时候其实是不需要渲染的。真正渲染的时候是预览的时候,根据设计器设计的key,然后加载json即可。
好了,说了这么多其实就是为了给大家理清楚设计和查看的不同,我们要给设计器配置不同的资源,还要区分key。
但是查看器不用,只需要根据key,去找对应的json就行了。
那我们接下来就具体来说实现吧。
设计器
设计器我们存在哪些常用的资源选择呢。
报表、图片、主题(设计风格,一般也可以不用)
这几个就是我们一般需要选择的:
报表:
用来设计子报表组件,我们可以在下拉框中选择到所有可以用的子报表。同样假如我们设置单元格跳转,也可以在下拉框中选择到可以跳转的子报表。
图片:
用来使用的内嵌图片,在图片组件,背景,一般是常用的logo可以使用。不需要每次上传。
主题:
主题比较特殊,很多人都不知道,其实我们报表设计是有主题的,在有主题的时候,组件拖动进来就会以默认的主题色为底色,包括字体的格式等,都会根据主题走,而全局设置也有一个主题的选择:
一个好看的主题可以帮助我们设计报表事半功倍,
而且快速切换主题,可以做到快速切换设计的风格,这是因为我们配置主题后,背景色这些的,使用的就是主题颜色,而非固定颜色。
那么以上几个实现方法,也非常相似。参考链接
对应的三个方法:
getReportsList、getImagesList、getThemesList
返回的就是对应类型的数组的对象即可。可以参考下面代码:
const getImages = () => {
return Promise.resolve([{
//id is important will be wrote as image value
id: "resources/images/image.jpeg",
displayName: "image.jpeg",
mimeType: "image/jpeg",
thumbnail: "***base64 string of image***"
}])
}
const getReport = () => {
return Promise.resolve([{
id: "resources/reports/report.rdlx-json",
displayName: "report.rdlx-json"
}])
}
const themes = [
{id: "resources/themes/theme1.json", displayName: "theme1"},
{id: "resources/themes/theme2.json", displayName: "theme2"}
];
const getTheme = (themeInfo) => {
return fetch(themeInfo.id)
.then(response => response.json())
.then(content => ({
id: themeInfo.id,
displayName: themeInfo.displayName,
info: content.Theme.Colors
}))
};
const getThemes = () => {
return Promise.all(themes.map(getTheme));
};
var resourceProvider = {
getImagesList: getImages,
getReportsList: getReport,
getThemesList: getThemes
}
designer.setResourceProvider(resourceProvider);可以看到,基本都是返回对应的对象数组.
报表:报表ID和名称。
图片:名称,类型(可忽略)和base64。
主题:id,名称,和一个info
因为主题需要设计直接使用到,所以需要返回具体的信息,而返回的结果可以参考如下:
{
"Theme": {
"Colors": {
"Dark1": "#ffffff",
"Dark2": "#f8f8f8",
"Light1": "#1e1e37",
"Light2": "#1a1b1f",
"Accent1": "#1eebeb",
"Accent2": "#1eb4f8",
"Accent3": "#ffbf70",
"Accent4": "#fd7192",
"Accent5": "#4670ff",
"Accent6": "#fa52e7",
"Hyperlink": "#2b9de9",
"HyperlinkFollowed": "#358ab6"
},
"Fonts": {
"MajorFont": {
"Family": "微软雅黑",
"Style": "Normal",
"Size": "14pt",
"Weight": "Normal"
},
"MinorFont": {
"Family": "微软雅黑",
"Style": "Normal",
"Size": "10pt",
"Weight": "Normal"
}
}
},
"Images": [
{
"Name": "Logo",
"MIMEType": "image/jpeg",
"ImageData": "base64 String"
}
]
}以上设计好后,我们的主题下拉选择框就可以直接选择。包括子报表的选择,就是上面返回的report的数组。依次类推。
查看器:
设计器其实很好理解的,其实基本就是json数组,可以选哪些,数组就有哪些。而查看器略有不同,但是按照之前的说法。就是把上面设计器选择好的json的那个对象,渲染出来即可。所以对应的方法也就只有一个,就是根据ID返回资源即可:
viewer.open(report.definition, {
ResourceLocator: {
getResource: async (resourceId) => {
return result
},
},
});可以看到,我们的参数就是一个resourceId。也就是设计器设计的ID,我们根绝ID去判断,当前是图片的话,返回图片资源,当前是主题的话,返回主题的json对象。
如果是报表的,返回对应的报表json即可。
至此,web端的资源设置就完成了,大家快去试试吧。
Demo可以参考这个:点击这里
页:
[1]