You are not logged in.
Pages: 1
Hi there!
There is some interesting stuff, what we discovered during ReportServer usage:
1) The checkbox display of database parameter has wrong behaviour. When it selected at first time - all works fine, but then i try to change it, he starts working extremely badly. Dataset is absolutely wrong
2) In dashboard tab, the report(and non-dinamic-list) dadgets has button at top, called "Edit report parameter". Firstly, it seems a bit needless(because the same exist directly in dadget), but secondly - parameters are displayed in strange layout and in wrong orders.
3) When ReportServer scheduler sends the reports by email, seems like they have wrong UTF configuration, because all data replaced by "???", but in teamspace they stored in correct form.
And next, i have several small questions
4) Is it possible to set default/remember columns width in interface(for example i want to set width of column "Name" in teamspace and remember it for my account)
5) Is it possible to set permissions for the Variant of report? Now it seems like variant inherit the report permissions, but is it possible to set own permissions for each variant?
6) Is it possible to share the dashboard between multiple users? Or moreover, to set permission to read dashboard without writing?
7) Is it possible to configure what kind of report can user add to dadget? For example, only reports from teamspaces, what user be able to see. Without "catalog" tab with all report. Set reports permission for every user is too annoying
8) And last, but not least - what should i do to define translation of XMessages ? When i change locale to mine, all XMessages displays like "NULL". But i found them in reportserver.jar, and there exists locale, what i need, and it translated correctly, but seems that RS can't find right .properties file.
The last question is a bit more important then others, and as fee if you interested in, i can send to you correct and full russian translate.
Last edited by Glandike (2016-04-28 12:32:16)
Offline
Hi Glandike,
thank you for reporting these!
1) Checkbox parameters
Already fixed this (the problem was that values once selected could never be deselected). The change will be part of the 3.0.2 release.
2) Dashboard Parameters
Fixed the problem with the incorrect order which I believe was also the reason for the broken layout. This change will be in 3.0.2 as well. The "Edit report parameters" button actually is not the same as the parameter button for the individual dadgets. It collects all the dadgets parameters and allows to set them in one step.
3) Scheduler text encoding
Could you give me step-by-step instructions to reproduce this? I only gave it a quick test, but I seem to be looking in the wrong place.
4) Remember column width
Unfortunately this is not possible, at least at the moment.
5) Variant permission
As a variant can never give you access to more data than its base report (and having access to the base report is required to use a variant), there are no permissions on variants. You can however use the different teamspace roles to prevent users from changing variants in a teamspace.
6) Shared dashboards
Currently dashboards are strictly per-user, but allowing shared dashboards is something we already have on our agenda.
The best thing you can do at the moment is to create a dashboard in the dashboard library and import it for each user. The user can then still edit the dashboard, but changes are not shared between users and there is also a reset button. If you also revoke the generic "write" permission to the dashboard componend, editing will be disabled (but also creating new dashboards)
7) localization
The .properties file should be the right place to do this. But if sharing your translation is a possibility I would suggest you send it to me and I will just build a version that includes your changes (And also the work we did for 3.0.2 until now). If that sounds good, send me an email at thorsten.krause@datenwerke.net so we can discuss the details.
Cheers,
Thorsten
Thanks a lot for your quick answers! Sadly, what all my issues are irrealizable, but I thought so.
One more question, what i have added in post, when you were answering:
"7) Is it possible to configure what kind of report can user add to dadget? For example, only reports from teamspaces, what user be able to see. Without "catalog" tab with all report. Set reports permission for every user is too annoying "
There is small step-by-step instructions to reproduce unreadable report:
Then i double clicked it and opened
That how i saw message attachment on email
And that how it opens in preview or downloads
As i guess, this happens all time with cyrillic characters in HTML/PDF version.
Last edited by Glandike (2016-04-28 14:39:40)
Offline
"7) Is it possible to configure what kind of report can user add to dadget? For example, only reports from teamspaces, what user be able to see. Without "catalog" tab with all report. Set reports permission for every user is too annoying sad"
Unfortunately, once again the answers is no. Sorry! The idea we had when designing the permissions was that it would always need an administrator to define which user can access what data. Teamspace permissions are just "on top" and we don't really consider them a security feature but more as a possibility to hide complexity.
If you just want to share the administrative work with others, maybe consider making them administrators: The various functions of the administration module can be enabled/disabled per user, so you should be able to create users that can change permissions, but nothing else.
Another option would be to look into scripting: You could use scripts to automatically create groups from teamspaces and then use these groups to assign permissions. Not sure if that would help.
As for the character encoding issue: Thanks to your instructions I was able to find the issue: It will also be fixed in the 3.0.2 release. Thank you!
Cheers,
Thorsten
Thanks a lot! Sadly, but your advice doesn't appropriate for us, but we trust in datenwerke and sure what you do great stuff and all we asked will appear in nearest future
May you clarify about XMessages ? I attach some sreenshots to describe this problem.
If relevant, i replaced all data in reportserver.jar/***/XMessages_ru.properties by data from XMessages_en.properties but that make no effect Seems this is setting in source code, or somewhere in others properties.
Last edited by Glandike (2016-04-29 13:16:46)
Offline
I didn't look into this very closely before because I hoped you would go for my offer of me fixing it in exchange for the translation files
As it turns out the XMessages are indeed handled differently than other messages files, as they override texts from a 3rd party library. I don't really see why this should be a problem, but who knows.
Maybe try to set the text directly in the libraries message file instead of the reportserver.jar. You can find them in com.sencha.gxt.messages.client.XMessages in gxt-3.1.4.jar
Cheers,
Thorsten
And one last question: As said here, every time when i restart RS, i have to execute "localization importMessages" via terminal to activate translations. Is it possible to set automatic execute this command at restart RS?
Offline
You should be able to place a script in the /bin/onstartup.d folder to do this:
GLOBALS.execCmd("localization importMessages");
Yep! I've already tried this. But that's doesn't work for me
Oh, i mean i added new row to localeimporter.groovy and that doesn't work. I'll try to create new file then.
UPD. No metter, new file, or just line in localeimporter.groovy. I supposed that folder doesn't work, because on clear RS 3.0 this folder becomes empty(instead of in RS 2.*) and i assumed, what it's just artefact now.
Last edited by Glandike (2016-05-04 13:25:21)
Offline
Great to see that shared dashboards are on the roadmap for the product. Any ideas as to when they may be available? We're currently evaluating the product, and without having the ability to "push" shared dashboards to users, we'll never be able to get anyone outside of the technical staff to use the product. We need to be able to set up a dashboard, and have it appear as an option for all the users in a particular group.
Business users will not have the skills to "import" dashboards.
Offline
Hi,
It is already possible to create a predefined dashboard in the dashboard library and give permissions to everyone to use it. Then you probably need to show this 4-click process of importing dashboard to business users. (Unless you work with power users, you will anyway have to give people some kind of training to use the RS fully).
Karolina
Offline
I understand how to give people access to a dashboard, the issue is that if we want to update it, we have to then tell everyone to re-import. We're looking for the ability to add and update dashboards across the enterprise.
Offline
Hi bpeikes,
please refer to https://forum.reportserver.net/viewtopi … 2782#p2782. We are working on a user property "defaultDashboard", which should achieve this. It is planned to have this new feature with the next reportserver version. We will keep you informed.
Best regards,
Eduardo
Offline
Is it possible to trigger a dashboard "reset" for all users automatically via a script hook?
Offline
Is it possible to trigger a dashboard "reset" for all users automatically via a script hook?
Hi Phillip,
yes, of course this is possible, a script which resets all dashboards for all users is attached.
Thus, for the functionality of pushing a dashboard for all users, you should have two scripts:
1) An (initial) script which copies a "mother"-dashboard to all users and sets this new dashboard as a default dashboard for them. So in fact this script is doing the "import" for the users.
2) A script for resetting the dashboards of all users to the "mother"-dashboard (the script attached). You would need to execute this when changing the "mother-"dashboard in order for all the copied dashboards to get these changes.
For 1), the next reportserver version will most probably include the possibility of setting a user property "dashboard:primaryDashboard". So in fact, after copying the "mother"-dashboard to all users, the script needs only to set this user property with the id of the copied dashboard.
If you try this script, please remember to execute it with the -c flag turned on, so that the changes are commited to the database (exec -c resetScript.groovy)
import net.datenwerke.security.service.usermanager.entities.User;
import net.datenwerke.rs.dashboard.service.dashboard.DashboardService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardContainer;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardReference;
import net.datenwerke.security.service.usermanager.UserManagerService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardNode;
import net.datenwerke.security.service.security.SecurityService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.Dadget;
import net.datenwerke.rs.dashboard.service.dashboard.entities.Dashboard;
import net.datenwerke.security.service.security.rights.Read;
import net.datenwerke.rs.utils.entitycloner.EntityClonerService;
UserManagerService userManagerService = GLOBALS.getRsService(UserManagerService.class);
DashboardService dashboardService = GLOBALS.getRsService(DashboardService.class);
SecurityService securityService = GLOBALS.getRsService(SecurityService.class);
EntityClonerService entityCloner = GLOBALS.getRsService(EntityClonerService.class);
for (User user: userManagerService.getAllUsers()) {
DashboardContainer container = dashboardService.getDashboardFor(user);
// we only reset the first dashboard, since this is the default dashboard. It must be a DashboardReference, i.e. imported
if (!container.getDashboards().isEmpty() && container.getDashboards().get(0) instanceof DashboardReference) {
DashboardReference dashboardReference = (DashboardReference)container.getDashboards().get(0)
DashboardNode node = dashboardReference.getDashboardNode();
if(null == node)
throw new IllegalStateException("Corresponding dashboard node not found.");
if(! securityService.checkRights(node, Read.class))
throw new IllegalArgumentException("Insufficient rights to read dashboard");
for(Dadget d : new ArrayList<>(dashboardReference.getDadgets())){
dashboardReference.removeDadget(d);
dashboardService.remove(d);
}
/* copy dashboard */
dashboardReference.setName(node.getName());
dashboardReference.setDescription(node.getDescription());
dashboardReference.setLayout(node.getDashboard().getLayout());
dashboardReference.setSinglePage(node.getDashboard().isSinglePage());
for(Dadget d : node.getDashboard().getDadgets()){
Dadget dClone = entityCloner.cloneEntity(d);
dashboardService.persist(dClone);
dashboardReference.addDadgetPlain(dClone);
}
dashboardService.merge(dashboardReference);
}
}
Cheers,
Eduardo
Offline
I understand how to give people access to a dashboard, the issue is that if we want to update it, we have to then tell everyone to re-import. We're looking for the ability to add and update dashboards across the enterprise.
Hi bpeikes,
please take a look at #15, this should fulfill your requirement to add (1.) and update (2.) dashboards.
Cheers,
Eduardo
Offline
Thanks, Eduardo!
Offline
I understand how to give people access to a dashboard, the issue is that if we want to update it, we have to then tell everyone to re-import. We're looking for the ability to add and update dashboards across the enterprise.
Hi bpeikes,
you don't need to re-import. You can reset the dashboards of all users with the script above and they will get the newest version of your dashboard.
Cheers,
Eduardo
Offline
Hi,
for 1): you can use some script similar as the one attached (with the next reportserver version). As with the previous script, you have to enable the commit parameter (exec -c ).
The script copies a given dashboard to all users and sets the user property "dashboard:primaryDashboard" to contain the new dashboard id.
Note that this user property doesn't have any effect on the current reportserver version. I will check if I can provide a script for the current version.
import net.datenwerke.security.service.usermanager.entities.User;
import net.datenwerke.rs.dashboard.service.dashboard.DashboardService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardContainer;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardReference;
import net.datenwerke.security.service.usermanager.UserManagerService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardNode;
import net.datenwerke.security.service.security.SecurityService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.Dadget;
import net.datenwerke.rs.dashboard.service.dashboard.entities.Dashboard;
import net.datenwerke.security.service.security.rights.Read;
import net.datenwerke.rs.utils.entitycloner.EntityClonerService;
import net.datenwerke.security.service.usermanager.UserPropertiesService;
UserManagerService userManagerService = GLOBALS.getRsService(UserManagerService.class);
DashboardService dashboardService = GLOBALS.getRsService(DashboardService.class);
SecurityService securityService = GLOBALS.getRsService(SecurityService.class);
EntityClonerService entityCloner = GLOBALS.getRsService(EntityClonerService.class);
UserPropertiesService userPropertiesService = GLOBALS.getRsService(UserPropertiesService.class);
Dashboard dashboardToImport = dashboardService.getDashboardById(43132L);
DashboardNode node = dashboardService.getNodeFor(dashboardToImport);
for (User user: userManagerService.getAllUsers()) {
// Import
DashboardContainer container = dashboardService.getDashboardFor(user);
DashboardReference dashboardReference = new DashboardReference();
dashboardReference.setDashboardNode(node);
/* copy dashboard */
dashboardReference.setName(node.getName());
dashboardReference.setDescription(node.getDescription());
dashboardReference.setLayout(node.getDashboard().getLayout());
dashboardReference.setSinglePage(node.getDashboard().isSinglePage());
for(Dadget d : node.getDashboard().getDadgets()){
Dadget dClone = entityCloner.cloneEntity(d);
dashboardService.persist(dClone);
dashboardReference.addDadgetPlain(dClone);
}
dashboardService.persist(dashboardReference);
container.addDashboard(dashboardReference);
dashboardService.merge(container);
Long dashboardReferenceId = dashboardReference.getId();
userPropertiesService.setPropertyValue(user, "dashboard:primaryDashboard", dashboardReferenceId);
}
Cheers,
Eduardo
Offline
Hello,
for 1) for the current reportserver version you only have to set the order of the dashboards: the new dashboard (the copy) has to be in the first position, so it will be the default dashboard. Refer to the attached script for an example of this.
So now you have 1) and 2). This should fulfill the requirements. In future versions we are planning shared dashboards.
import net.datenwerke.security.service.usermanager.entities.User;
import net.datenwerke.rs.dashboard.service.dashboard.DashboardService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardContainer;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardReference;
import net.datenwerke.security.service.usermanager.UserManagerService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.DashboardNode;
import net.datenwerke.security.service.security.SecurityService;
import net.datenwerke.rs.dashboard.service.dashboard.entities.Dadget;
import net.datenwerke.rs.dashboard.service.dashboard.entities.Dashboard;
import net.datenwerke.security.service.security.rights.Read;
import net.datenwerke.rs.utils.entitycloner.EntityClonerService;
import net.datenwerke.security.service.usermanager.UserPropertiesService;
UserManagerService userManagerService = GLOBALS.getRsService(UserManagerService.class);
DashboardService dashboardService = GLOBALS.getRsService(DashboardService.class);
SecurityService securityService = GLOBALS.getRsService(SecurityService.class);
EntityClonerService entityCloner = GLOBALS.getRsService(EntityClonerService.class);
UserPropertiesService userPropertiesService = GLOBALS.getRsService(UserPropertiesService.class);
Dashboard dashboardToImport = dashboardService.getDashboardById(43132L);
DashboardNode node = dashboardService.getNodeFor(dashboardToImport);
for (User user: userManagerService.getAllUsers()) {
// Import
DashboardContainer container = dashboardService.getDashboardFor(user);
List<Long> dashboardIds = new ArrayList<>();
for (Dashboard dashboard: container.getDashboards()) {
dashboardIds.add(dashboard.getId());
}
DashboardReference dashboardReference = new DashboardReference();
dashboardReference.setDashboardNode(node);
/* copy dashboard */
dashboardReference.setName(node.getName());
dashboardReference.setDescription(node.getDescription());
dashboardReference.setLayout(node.getDashboard().getLayout());
dashboardReference.setSinglePage(node.getDashboard().isSinglePage());
for(Dadget d : node.getDashboard().getDadgets()){
Dadget dClone = entityCloner.cloneEntity(d);
dashboardService.persist(dClone);
dashboardReference.addDadgetPlain(dClone);
}
dashboardService.persist(dashboardReference);
container.getDashboards().add(0, dashboardReference);
dashboardService.merge(container);
Long dashboardReferenceId = dashboardReference.getId();
// change order
HashMap<Long, Dashboard> tmp = new HashMap<>();
for(Dashboard d : container.getDashboards()){
tmp.put(d.getId(), d);
}
container.getDashboards().clear();
dashboardIds.add(0, dashboardReferenceId);
int n = 0;
for(Long id : dashboardIds){
Dashboard d = tmp.remove(id);
if(null != d){
d.setN(n++);
container.getDashboards().add(d);
}
}
for(Long id : tmp.keySet()){
Dashboard d = tmp.get(id);
if(null != d){
d.setN(n++);
container.getDashboards().add(d);
}
}
dashboardService.merge(container);
}
You can of course include the user property too, so it can be used with the next reportserver version:
userPropertiesService.setPropertyValue(user, "dashboard:primaryDashboard", dashboardReferenceId);
Cheers,
Eduardo
Offline
We are still using community edition since the product does not have all of the functionality we would need to rely on it for production use. It appears that there hasn't been a release since June 2016, and there is mention of the ability to share or publish dashboards in this thread, when do you think a release with this functionality be available?
Offline
Pages: 1