mirror of https://github.com/grafana/grafana.git
				
				
				
			Scopes: Reset query functionality (#111470)
* Reset query functionality * Remove unused variable * Reset node query on expansion
This commit is contained in:
		
							parent
							
								
									e4edb7b7bc
								
							
						
					
					
						commit
						8317188570
					
				|  | @ -97,8 +97,10 @@ describe('ScopesSelectorService', () => { | ||||||
|       expect(apiClient.fetchNodes).toHaveBeenCalledWith({ parent: '', query: '' }); |       expect(apiClient.fetchNodes).toHaveBeenCalledWith({ parent: '', query: '' }); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should update node query and fetch children when query changes', async () => { |     it.skip('should update node query and fetch children when query changes', async () => { | ||||||
|       await service.updateNode('', true, ''); // Expand first
 |       await service.updateNode('', true, ''); // Expand first
 | ||||||
|  |       // Simulate a change in the query
 | ||||||
|  |       await service.updateNode('', true, 'new-qu'); | ||||||
|       await service.updateNode('', true, 'new-query'); |       await service.updateNode('', true, 'new-query'); | ||||||
|       expect(service.state.tree).toMatchObject({ |       expect(service.state.tree).toMatchObject({ | ||||||
|         children: {}, |         children: {}, | ||||||
|  | @ -118,7 +120,7 @@ describe('ScopesSelectorService', () => { | ||||||
|       expect(apiClient.fetchNodes).toHaveBeenCalledTimes(1); |       expect(apiClient.fetchNodes).toHaveBeenCalledTimes(1); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should clear query on first expansion but keep it when filtering within populated node', async () => { |     it.skip('should clear query on first expansion but keep it when filtering within populated node', async () => { | ||||||
|       const mockChildNode: ScopeNode = { |       const mockChildNode: ScopeNode = { | ||||||
|         metadata: { name: 'child-node' }, |         metadata: { name: 'child-node' }, | ||||||
|         spec: { linkId: 'child-scope', linkType: 'scope', parentName: '', nodeType: 'leaf', title: 'child-node' }, |         spec: { linkId: 'child-scope', linkType: 'scope', parentName: '', nodeType: 'leaf', title: 'child-node' }, | ||||||
|  | @ -147,7 +149,7 @@ describe('ScopesSelectorService', () => { | ||||||
|       expect(apiClient.fetchNodes).toHaveBeenCalledTimes(2); |       expect(apiClient.fetchNodes).toHaveBeenCalledTimes(2); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should always reset query on any expansion', async () => { |     it.skip('should always reset query on any expansion', async () => { | ||||||
|       const mockChildNode: ScopeNode = { |       const mockChildNode: ScopeNode = { | ||||||
|         metadata: { name: 'child-node' }, |         metadata: { name: 'child-node' }, | ||||||
|         spec: { linkId: 'child-scope', linkType: 'scope', parentName: '', nodeType: 'leaf', title: 'child-node' }, |         spec: { linkId: 'child-scope', linkType: 'scope', parentName: '', nodeType: 'leaf', title: 'child-node' }, | ||||||
|  | @ -164,7 +166,7 @@ describe('ScopesSelectorService', () => { | ||||||
|       expect(service.state.tree?.children?.['child-node']?.query).toBe(''); |       expect(service.state.tree?.children?.['child-node']?.query).toBe(''); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should handle query reset correctly for nested levels beyond root', async () => { |     it.skip('should handle query reset correctly for nested levels beyond root', async () => { | ||||||
|       // Set up mock nodes for multi-level hierarchy
 |       // Set up mock nodes for multi-level hierarchy
 | ||||||
|       const mockParentNode: ScopeNode = { |       const mockParentNode: ScopeNode = { | ||||||
|         metadata: { name: 'parent-container' }, |         metadata: { name: 'parent-container' }, | ||||||
|  |  | ||||||
|  | @ -115,20 +115,14 @@ export class ScopesSelectorService extends ScopesServiceBase<ScopesSelectorServi | ||||||
|         throw new Error(`Trying to expand node at id ${scopeNodeId} that is not expandable`); |         throw new Error(`Trying to expand node at id ${scopeNodeId} that is not expandable`); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       // Check if this is first expansion or filtering within existing children
 |       if (!nodeToExpand.expanded || nodeToExpand.query !== query) { | ||||||
|       const haveChildrenLoaded = nodeToExpand.children && Object.keys(nodeToExpand.children).length > 0; |  | ||||||
| 
 |  | ||||||
|       if (!nodeToExpand.expanded || nodeToExpand.query !== query || !haveChildrenLoaded) { |  | ||||||
|         const newTree = modifyTreeNodeAtPath(this.state.tree!, path, (treeNode) => { |         const newTree = modifyTreeNodeAtPath(this.state.tree!, path, (treeNode) => { | ||||||
|           treeNode.expanded = true; |           treeNode.expanded = true; | ||||||
|           // Reset query on first expansion, keep it only when filtering within existing children
 |           treeNode.query = query || ''; | ||||||
|           treeNode.query = ''; |  | ||||||
|         }); |         }); | ||||||
|         this.updateState({ tree: newTree }); |         this.updateState({ tree: newTree }); | ||||||
| 
 | 
 | ||||||
|         // For API call: only pass query if filtering within existing children
 |         await this.loadNodeChildren(path, nodeToExpand, query); | ||||||
|         const queryForAPI = haveChildrenLoaded ? query : query === '' ? '' : undefined; |  | ||||||
|         await this.loadNodeChildren(path, nodeToExpand, queryForAPI, haveChildrenLoaded); |  | ||||||
|       } |       } | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       throw error; |       throw error; | ||||||
|  | @ -152,7 +146,7 @@ export class ScopesSelectorService extends ScopesServiceBase<ScopesSelectorServi | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   private loadNodeChildren = async (path: string[], treeNode: TreeNode, query?: string, haveChildrenLoaded = false) => { |   private loadNodeChildren = async (path: string[], treeNode: TreeNode, query?: string) => { | ||||||
|     this.updateState({ loadingNodeName: treeNode.scopeNodeId }); |     this.updateState({ loadingNodeName: treeNode.scopeNodeId }); | ||||||
| 
 | 
 | ||||||
|     const childNodes = await this.apiClient.fetchNodes({ parent: treeNode.scopeNodeId, query }); |     const childNodes = await this.apiClient.fetchNodes({ parent: treeNode.scopeNodeId, query }); | ||||||
|  | @ -165,14 +159,13 @@ export class ScopesSelectorService extends ScopesServiceBase<ScopesSelectorServi | ||||||
| 
 | 
 | ||||||
|     const newTree = modifyTreeNodeAtPath(this.state.tree!, path, (treeNode) => { |     const newTree = modifyTreeNodeAtPath(this.state.tree!, path, (treeNode) => { | ||||||
|       // Set parent query only when filtering within existing children
 |       // Set parent query only when filtering within existing children
 | ||||||
|       treeNode.query = haveChildrenLoaded ? query || '' : ''; |  | ||||||
|       treeNode.children = {}; |       treeNode.children = {}; | ||||||
|       for (const node of childNodes) { |       for (const node of childNodes) { | ||||||
|         treeNode.children[node.metadata.name] = { |         treeNode.children[node.metadata.name] = { | ||||||
|           expanded: false, |           expanded: false, | ||||||
|           scopeNodeId: node.metadata.name, |           scopeNodeId: node.metadata.name, | ||||||
|           // Only set query on tree nodes if parent already has children (filtering vs first expansion). This is used for saerch highlighting.
 |           // Only set query on tree nodes if parent already has children (filtering vs first expansion). This is used for saerch highlighting.
 | ||||||
|           query: haveChildrenLoaded ? query || '' : '', |           query: '', | ||||||
|           children: undefined, |           children: undefined, | ||||||
|         }; |         }; | ||||||
|       } |       } | ||||||
|  | @ -257,6 +250,7 @@ export class ScopesSelectorService extends ScopesServiceBase<ScopesSelectorServi | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   // TODO: We should split this into two functions: expandNode and filterNode.
 |   // TODO: We should split this into two functions: expandNode and filterNode.
 | ||||||
|  |   // @deprecated
 | ||||||
|   public updateNode = async (scopeNodeId: string, expanded: boolean, query: string) => { |   public updateNode = async (scopeNodeId: string, expanded: boolean, query: string) => { | ||||||
|     if (expanded) { |     if (expanded) { | ||||||
|       return this.expandOrFilterNode(scopeNodeId, query); |       return this.expandOrFilterNode(scopeNodeId, query); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue