#1 2016-04-28 10:32:14

Glandike
Member
Registered: 2015-11-10

Some more issues and bugs

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 sad

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 sad

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

#2 2016-04-28 13:00:22

Thorsten J. Krause
Guest

Re: Some more issues and bugs

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

#3 2016-04-28 14:00:49

Glandike
Member
Registered: 2015-11-10

Re: Some more issues and bugs

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 sad"


There is small step-by-step instructions to reproduce unreadable report:

Executed report via scheduler
image.jpg

Here it is in teamspace
image.jpg

Then i double clicked it and opened
image.png

That how i saw message attachment on email
image.jpg

And that how it opens in preview or downloads
image.png

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

#4 2016-04-28 21:21:43

Thorsten J. Krause
Guest

Re: Some more issues and bugs

"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

#5 2016-04-29 13:05:25

Glandike
Member
Registered: 2015-11-10

Re: Some more issues and bugs

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 smile

May you clarify about XMessages ? I attach some sreenshots to describe this problem.

image.png

image.png

image.jpg

If relevant, i replaced all data in reportserver.jar/***/XMessages_ru.properties  by data from XMessages_en.properties but that make no effect sad Seems this is setting in source code, or somewhere in others properties.

Last edited by Glandike (2016-04-29 13:16:46)

Offline

#6 2016-04-29 17:44:26

Thorsten J. Krause
Guest

Re: Some more issues and bugs

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 smile

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

#7 2016-05-04 12:47:49

Glandike
Member
Registered: 2015-11-10

Re: Some more issues and bugs

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

#8 2016-05-04 13:09:26

Thorsten J. Krause
Guest

Re: Some more issues and bugs

You should be able to place a script in the /bin/onstartup.d folder to do this:

GLOBALS.execCmd("localization importMessages");

#9 2016-05-04 13:18:10

Glandike
Member
Registered: 2015-11-10

Re: Some more issues and bugs

Yep! I've already tried this. But that's doesn't work for me sad
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

#10 2016-12-16 18:37:08

bpeikes
Member
Registered: 2016-10-29

Re: Some more issues and bugs

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

#11 2016-12-17 10:53:43

karolina
Member
Registered: 2014-08-09

Re: Some more issues and bugs

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

#12 2016-12-19 18:22:25

bpeikes
Member
Registered: 2016-10-29

Re: Some more issues and bugs

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

#13 2016-12-22 08:13:40

eduardo
Administrator
Registered: 2016-11-01
Website

Re: Some more issues and bugs

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

#14 2017-01-05 17:51:03

phillipjohnson
Member
From: Columbus, OH, USA
Registered: 2016-11-03
Website

Re: Some more issues and bugs

Is it possible to trigger a dashboard "reset" for all users automatically via a script hook?

Offline

#15 2017-01-06 14:46:09

eduardo
Administrator
Registered: 2016-11-01
Website

Re: Some more issues and bugs

phillipjohnson wrote:

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

#16 2017-01-06 14:50:38

eduardo
Administrator
Registered: 2016-11-01
Website

Re: Some more issues and bugs

bpeikes wrote:

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

#17 2017-01-06 15:04:41

phillipjohnson
Member
From: Columbus, OH, USA
Registered: 2016-11-03
Website

Re: Some more issues and bugs

Thanks, Eduardo!

Offline

#18 2017-01-06 15:24:01

eduardo
Administrator
Registered: 2016-11-01
Website

Re: Some more issues and bugs

bpeikes wrote:

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

#19 2017-01-06 18:49:36

eduardo
Administrator
Registered: 2016-11-01
Website

Re: Some more issues and bugs

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

#20 2017-01-06 23:55:26

eduardo
Administrator
Registered: 2016-11-01
Website

Re: Some more issues and bugs

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

#21 2017-05-31 17:54:01

bpeikes
Member
Registered: 2016-10-29

Re: Some more issues and bugs

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

Board footer

Powered by FluxBB