neos-ui icon indicating copy to clipboard operation
neos-ui copied to clipboard

BUG: View DataSource should Update on base workspace change

Open rolandschuetz opened this issue 1 year ago • 2 comments

Description

A Inspector View can use a datasource. Here's a very simple example of this: https://github.com/flownative/neos-workspace-preview/blob/main/Configuration/NodeTypes.yaml#L9-L11

Now when a user changes it's base workspace, the datasource is not reloaded: https://github.com/neos/neos-ui/blob/8.4/packages/neos-ui-views/src/Data/DataLoader/index.js#L53-L56

In most cases, reloading the datasoure, when the selectors.CR.Workspaces.baseWorkspaceSelector(state),changes would be expected. As an integrator you can't even force a reload, because the arguments only support ClientEval, and in ClientEval only the node is available, and it's workspace is always the user workspace.

Steps to Reproduce

  1. Install e.g. https://github.com/flownative/neos-workspace-preview or any Inspector View that uses a datasource
  2. Open the dev tools to monitor ajax requests
  3. Changte the base workspace

Expected behavior

Datasource is updated.

Actual behavior

Outdated data.

Affected Versions

Neos: *

UI: 5.0 - 9.0

Possible solution

In the neosContextConnector add baseWorkspace: selectors.CR.Workspaces.baseWorkspaceSelector(state), and in componentDidUpdate reload if the workspace changes.

rolandschuetz avatar Mar 21 '24 18:03 rolandschuetz

i noticed this problem when using dataSourcesDataLoader.resolveValue() directly in a neos ui plugin.

The resolve method will create a cache identifier of all the passed options makeCacheKey(options):

https://github.com/neos/neos-ui/blob/9da3060981e93676473b724f387e2f3ddc5a55e6/packages/neos-ui/src/manifest.dataloaders.js#L348

And as the contextNodePath will only ever include user-marchenry and not the baseworkspace, which can be switched without reloading the neos ui, i added a dummy parameter __baseWorkspaceName, which i will not use on the server but only to influence the cache key.

const baseWorkspaceName = useSelector(selectors.CR.Workspaces.baseWorkspaceSelector);

const dataSourcesDataLoader = neos.globalRegistry.get("dataLoaders").get("DataSources");

dataSourcesDataLoader.resolveValue({
  contextNodePath: documentNode.contextPath,
  dataSourceIdentifier: "vendor-site-data-source",
  // to invalidate datasource cache
  __baseWorkspaceName: baseWorkspaceName,
}).then((result) => {
  console.log(result)
});

mhsdesign avatar Mar 21 '24 21:03 mhsdesign

Sounds good, can we bring this in the neos-ui?

rolandschuetz avatar Apr 01 '24 19:04 rolandschuetz