neos-ui
neos-ui copied to clipboard
BUG: View DataSource should Update on base workspace change
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
- Install e.g. https://github.com/flownative/neos-workspace-preview or any Inspector View that uses a datasource
- Open the dev tools to monitor ajax requests
- 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.
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)
});
Sounds good, can we bring this in the neos-ui?