mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-28 01:31:17 +00:00
Merge pull request #1904 from weaveworks/1864-apply-filters-to-details-panel
Apply filters from current view to details panel
This commit is contained in:
@@ -350,6 +350,11 @@ func (r *registry) rendererForTopology(topologyID string, values url.Values, rpt
|
||||
}
|
||||
topology = updateFilters(rpt, []APITopologyDesc{topology})[0]
|
||||
|
||||
if len(values) == 0 {
|
||||
// Do not apply filtering if no options where provided
|
||||
return topology.renderer, nil, nil
|
||||
}
|
||||
|
||||
var decorators []render.Decorator
|
||||
for _, group := range topology.Options {
|
||||
value := values.Get(group.ID)
|
||||
|
||||
@@ -36,13 +36,14 @@ func handleTopology(ctx context.Context, renderer render.Renderer, decorator ren
|
||||
}
|
||||
|
||||
// Individual nodes.
|
||||
func handleNode(ctx context.Context, renderer render.Renderer, _ render.Decorator, report report.Report, w http.ResponseWriter, r *http.Request) {
|
||||
func handleNode(ctx context.Context, renderer render.Renderer, decorator render.Decorator, report report.Report, w http.ResponseWriter, r *http.Request) {
|
||||
var (
|
||||
vars = mux.Vars(r)
|
||||
topologyID = vars["topology"]
|
||||
nodeID = vars["id"]
|
||||
rendered = renderer.Render(report, nil)
|
||||
node, ok = rendered[nodeID]
|
||||
vars = mux.Vars(r)
|
||||
topologyID = vars["topology"]
|
||||
nodeID = vars["id"]
|
||||
preciousRenderer = render.PreciousNodeRenderer{PreciousNodeID: nodeID, Renderer: renderer}
|
||||
rendered = preciousRenderer.Render(report, decorator)
|
||||
node, ok = rendered[nodeID]
|
||||
)
|
||||
if !ok {
|
||||
http.NotFound(w, r)
|
||||
|
||||
@@ -170,6 +170,8 @@ export function changeTopologyOption(option, value, topologyId) {
|
||||
);
|
||||
getNodeDetails(
|
||||
state.get('topologyUrlsById'),
|
||||
state.get('currentTopologyId'),
|
||||
getActiveTopologyOptions(state),
|
||||
state.get('nodeDetails'),
|
||||
dispatch
|
||||
);
|
||||
@@ -260,6 +262,8 @@ export function clickNode(nodeId, label, origin) {
|
||||
const state = getState();
|
||||
getNodeDetails(
|
||||
state.get('topologyUrlsById'),
|
||||
state.get('currentTopologyId'),
|
||||
getActiveTopologyOptions(state),
|
||||
state.get('nodeDetails'),
|
||||
dispatch
|
||||
);
|
||||
@@ -285,6 +289,8 @@ export function clickRelative(nodeId, topologyId, label, origin) {
|
||||
const state = getState();
|
||||
getNodeDetails(
|
||||
state.get('topologyUrlsById'),
|
||||
state.get('currentTopologyId'),
|
||||
getActiveTopologyOptions(state),
|
||||
state.get('nodeDetails'),
|
||||
dispatch
|
||||
);
|
||||
@@ -543,6 +549,8 @@ export function receiveTopologies(topologies) {
|
||||
);
|
||||
getNodeDetails(
|
||||
state.get('topologyUrlsById'),
|
||||
state.get('currentTopologyId'),
|
||||
getActiveTopologyOptions(state),
|
||||
state.get('nodeDetails'),
|
||||
dispatch
|
||||
);
|
||||
@@ -645,6 +653,8 @@ export function route(urlState) {
|
||||
);
|
||||
getNodeDetails(
|
||||
state.get('topologyUrlsById'),
|
||||
state.get('currentTopologyId'),
|
||||
getActiveTopologyOptions(state),
|
||||
state.get('nodeDetails'),
|
||||
dispatch
|
||||
);
|
||||
|
||||
@@ -163,13 +163,19 @@ export function getNodesDelta(topologyUrl, options, dispatch) {
|
||||
}
|
||||
}
|
||||
|
||||
export function getNodeDetails(topologyUrlsById, nodeMap, dispatch) {
|
||||
export function getNodeDetails(topologyUrlsById, currentTopologyId, options, nodeMap, dispatch) {
|
||||
// get details for all opened nodes
|
||||
const obj = nodeMap.last();
|
||||
if (obj && topologyUrlsById.has(obj.topologyId)) {
|
||||
const topologyUrl = topologyUrlsById.get(obj.topologyId);
|
||||
const url = [topologyUrl, '/', encodeURIComponent(obj.id)]
|
||||
.join('').substr(1);
|
||||
let urlComponents = [topologyUrl, '/', encodeURIComponent(obj.id)];
|
||||
if (currentTopologyId === obj.topologyId) {
|
||||
// Only forward filters for nodes in the current topology
|
||||
const optionsQuery = buildOptionsQuery(options);
|
||||
urlComponents = urlComponents.concat(['?', optionsQuery]);
|
||||
}
|
||||
const url = urlComponents.join('').substr(1);
|
||||
|
||||
reqwest({
|
||||
url,
|
||||
success: (res) => {
|
||||
|
||||
@@ -10,6 +10,30 @@ import (
|
||||
"github.com/weaveworks/scope/report"
|
||||
)
|
||||
|
||||
// PreciousNodeRenderer ensures a node is never filtered out by decorators
|
||||
type PreciousNodeRenderer struct {
|
||||
PreciousNodeID string
|
||||
Renderer
|
||||
}
|
||||
|
||||
// Render implements Renderer
|
||||
func (p PreciousNodeRenderer) Render(rpt report.Report, dct Decorator) report.Nodes {
|
||||
undecoratedNodes := p.Renderer.Render(rpt, nil)
|
||||
preciousNode, foundBeforeDecoration := undecoratedNodes[p.PreciousNodeID]
|
||||
finalNodes := applyDecorator{ConstantRenderer(undecoratedNodes)}.Render(rpt, dct)
|
||||
if _, ok := finalNodes[p.PreciousNodeID]; !ok && foundBeforeDecoration {
|
||||
finalNodes[p.PreciousNodeID] = preciousNode
|
||||
}
|
||||
return finalNodes
|
||||
}
|
||||
|
||||
// Stats implements Renderer
|
||||
func (p PreciousNodeRenderer) Stats(rpt report.Report, dct Decorator) Stats {
|
||||
// default to the underlying renderer
|
||||
// TODO: we don't take into account the precious node, so we may be off by one
|
||||
return p.Renderer.Stats(rpt, dct)
|
||||
}
|
||||
|
||||
// CustomRenderer allow for mapping functions that received the entire topology
|
||||
// in one call - useful for functions that need to consider the entire graph.
|
||||
// We should minimise the use of this renderer type, as it is very inflexible.
|
||||
|
||||
@@ -185,3 +185,16 @@ func (cr conditionalRenderer) Stats(rpt report.Report, dct Decorator) Stats {
|
||||
}
|
||||
return Stats{}
|
||||
}
|
||||
|
||||
// ConstantRenderer renders a fixed set of nodes
|
||||
type ConstantRenderer report.Nodes
|
||||
|
||||
// Render implements Renderer
|
||||
func (c ConstantRenderer) Render(_ report.Report, _ Decorator) report.Nodes {
|
||||
return report.Nodes(c)
|
||||
}
|
||||
|
||||
// Stats implements Renderer
|
||||
func (c ConstantRenderer) Stats(_ report.Report, _ Decorator) Stats {
|
||||
return Stats{}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user