System.perspective.navigate doesn't work on session custom property tag change script

I am attempting to use the session prperty lastActivity to drive a session custom property that acts as an inactivity timer. That expression binding is working well and when displayed on a page the number is accurate. The expression fails to evaluate in designer but does evaluate correctly on any other session.

I then wanted to add a change script to this new custom property to navigate to the home page but that does not work. The script works when used on a button.

Since the error mentioned no perspective page attached to the thread, I attempted to also use pageId='/' as an optional parameter to system.perspective.navigate, but although that resolved the error on clicking save/apply it did not actually navigate to the page '/' as I was hoping. This syntax does not work on a button either. The manual page doesn't have an example of the optional parameter pageId, I'm looking to the community for help on formatting that correctly.

You're getting caught up in a common Designer vs. Session context issue.

In the Designer, there are no pages; the concept doesn't exist. But some pieces are dependent on a reference to pageId not being null, so we provide the View name as a placeholder within the Designer. IN a running Session, that pageId value is actually a unique value generated as each tab is opened.

Now, the Session has no idea which page of the potentially multiple you could have open that you want to navigate, so you'll have to manage that yourself.

  • Loop over every page of the session by making use of system.perspective.getSessionInfo() and filter the results based on the sessionId of this Session.
if currentValue.value > 2:
    all_sessions = system.perspective.getSessionInfo()
    for session in all_sessions:
        if session.id == self.session.props.id:
            page_ids = session.pageIds
            for page_id in page_ids:
                system.perspective.navigate(page="/", sessionId=session.id,  pageId=page_id)

You might also be able to do something like this:

if currentValue.value > 2:
    for page in self.pages:
        system.perspective.navigate(page="/", sessionId=self.id,  pageId=page.id)

Thanks! The first solution you proposed worked well for my application.

Is it possible to use your first code example on a Session Startup event?

I get a log error stating that global name 'self' is not defined. So I changed it to session.props.id and got object has no attribute 'props'.

Is there another way? thanks

It would probably work with some changes, but you're going to run into name collisions just trying to use it like it is because the supplied kwarg is session.

if currentValue.value > 2:
    all_sessions = system.perspective.getSessionInfo()
    for user_session in all_sessions:
        if user_session.id == session.props.id:
            page_ids = user_session.pageIds
            for page_id in page_ids:
                system.perspective.navigate(page="/", sessionId=user_session.id,  pageId=page_id)

I am having a similar issue and I fell upon this page. I have a system.perspective.navigateBack() on a menu tree but it would not sync up with session customs. Not sure how I should go about it right now.

Here is the code I have for reference (which is in onItemClicked action):

Machine_6802 is the fall back if anything happens or fails (which that is the case right now)

def runAction(self, event):
    if event.path and event.path[0] == 0:
        if self.session.custom.previousMachine:
            self.session.custom.selectedMachine = self.session.custom.previousMachine
        else:
            self.session.custom.selectedMachine = "Machine_6802"

        system.perspective.navigateBack()

Having the script is nice, but only if we know what isn't working for you with regard to your expectations. Under what scenario does your script not do what you want?

It goes back to the previous page but it wouldn't sync up with session customs.

Session customs is bind with a drop-down box bidirectionally, which makes the entire view change based on the machine selected.

If item clicked, it would go back to Machine_6802 despite other machines being clicked

Clearer example:
Machine_1 is on the page, I clicked on Machine_7. I clicked the button that is supposed to navigate me back to the previous screen (Machine_1) but it shows me Machine_6802 instead.

Going back to the page (such as switching a view page from Summary to Tracker, etc.) is fine but just the session custom is not syncing up.

Let me know if you need anymore clarification.

That tells me you either have "Machine_6802" as the default value of that self.session.custom.previousMachine prop, or self.session.custom.previousMachineis evaluating as false-y.

Or self.session.custom.previousMachineis "Machine_6802" and you're never updating it.

self.session.custom.previousMachine is empty even when that code is executed (after the item is clicked on the menu tree)

So then you'd always enter the else statement and therefore always use the hard-coded value. You need to update that previousMachine prop anytime a user clicks a machine. Also, it will only ever hold one value, so you won't be able to go back through a historical list; you're limited to going back to the singular most recent machine.

Would it be helpful changing that to an array/list? That's what I have it on

Potentially, but then you're looking at tracking an index across that list. User navigation history is messy. I can't recommend a great way to manage their history - all I can do is point out that the script you supplied won't manage it.