mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-02 17:50:39 +00:00
- Change scrolling behaviour to lock headers in place
- Enable filtering (hitting enter in the search bar) in grid-mode
- Little more top-margin for k8s (can have 3 topos) + taller rows.
- Trying out rank-color + node.relatives in the grid-mode
- First pass at selecting rows.
- Needs a bit more a fiddle, colors + click areas
- Store grid sort direction (asc/desc) in url state
- Simplify node selection to one method. (over-ride existing card)
- Remove clicking on name directly (links) to overlay new cards for now.
- Playing w/ grid-mode-toggle icons and labels
- Improves rendering in ff, change of shortcut keys for grid-mode-toggle
- Playing w/ clearer selection colors for grid-mode
- Slight change to selection-ui
- Fixes showNodeInTopology button visibility on the details-panel
- Was using an old heuristic. Table-mode allows you to open child cards
before the parent.
- Make it clear what the default sort is in tables
- E.g. always show a sorting caret
- Sort grid-mode columns, first meta then metrics
- dancing-nodes rememdy #1: pause updates onRowHover
- Splits relatives out into their own columns
- Take into account scrollbar width for grid-mode col header position
- Tooltips on table column headers
- grid-mode: fixes first column headers (proc/container/c-by-image)
- Disable pause-on-hover, too aggresive
- reduce label column width a bit (33pc -> 25pc) for big tables
- Filter grid-mode onSearchChange
- Rather than previous behaviour of waiting for an <enter>
- Show label_minor on pseudo nodes, that might not have much other info
- grid-mode: further reduce width of id column.
- Fixes go tests, properly moves parents into node-summary
- Fixes sorting of string columns w/ missing fields.
- E.g. uptime. Where -1e-10 > '3days' doesn't work.
115 lines
3.2 KiB
JavaScript
115 lines
3.2 KiB
JavaScript
import _ from 'lodash';
|
|
import debug from 'debug';
|
|
import Immutable from 'immutable';
|
|
|
|
import { receiveNodesDelta } from '../actions/app-actions';
|
|
|
|
const log = debug('scope:update-buffer-utils');
|
|
const makeList = Immutable.List;
|
|
const feedInterval = 1000;
|
|
const bufferLength = 100;
|
|
|
|
let deltaBuffer = makeList();
|
|
let updateTimer = null;
|
|
|
|
function isPaused(getState) {
|
|
return getState().get('updatePausedAt') !== null;
|
|
}
|
|
|
|
export function resetUpdateBuffer() {
|
|
clearTimeout(updateTimer);
|
|
deltaBuffer = deltaBuffer.clear();
|
|
}
|
|
|
|
function maybeUpdate(getState) {
|
|
if (isPaused(getState)) {
|
|
clearTimeout(updateTimer);
|
|
resetUpdateBuffer();
|
|
} else {
|
|
if (deltaBuffer.size > 0) {
|
|
const delta = deltaBuffer.first();
|
|
deltaBuffer = deltaBuffer.shift();
|
|
receiveNodesDelta(delta);
|
|
}
|
|
if (deltaBuffer.size > 0) {
|
|
updateTimer = setTimeout(() => maybeUpdate(getState), feedInterval);
|
|
}
|
|
}
|
|
}
|
|
|
|
// consolidate first buffer entry with second
|
|
function consolidateBuffer() {
|
|
const first = deltaBuffer.first();
|
|
deltaBuffer = deltaBuffer.shift();
|
|
const second = deltaBuffer.first();
|
|
let toAdd = _.union(first.add, second.add);
|
|
let toUpdate = _.union(first.update, second.update);
|
|
let toRemove = _.union(first.remove, second.remove);
|
|
log('Consolidating delta buffer', 'add', _.size(toAdd), 'update',
|
|
_.size(toUpdate), 'remove', _.size(toRemove));
|
|
|
|
// check if an added node in first was updated in second -> add second update
|
|
toAdd = _.map(toAdd, node => {
|
|
const updateNode = _.find(second.update, {id: node.id});
|
|
if (updateNode) {
|
|
toUpdate = _.reject(toUpdate, {id: node.id});
|
|
return updateNode;
|
|
}
|
|
return node;
|
|
});
|
|
|
|
// check if an updated node in first was updated in second -> updated second update
|
|
// no action needed, successive updates are fine
|
|
|
|
// check if an added node in first was removed in second -> dont add, dont remove
|
|
_.each(first.add, node => {
|
|
const removedNode = _.find(second.remove, {id: node.id});
|
|
if (removedNode) {
|
|
toAdd = _.reject(toAdd, {id: node.id});
|
|
toRemove = _.reject(toRemove, {id: node.id});
|
|
}
|
|
});
|
|
|
|
// check if an updated node in first was removed in second -> remove
|
|
_.each(first.update, node => {
|
|
const removedNode = _.find(second.remove, {id: node.id});
|
|
if (removedNode) {
|
|
toUpdate = _.reject(toUpdate, {id: node.id});
|
|
}
|
|
});
|
|
|
|
// check if an removed node in first was added in second -> update
|
|
// remove -> add is fine for the store
|
|
|
|
// update buffer
|
|
log('Consolidated delta buffer', 'add', _.size(toAdd), 'update',
|
|
_.size(toUpdate), 'remove', _.size(toRemove));
|
|
deltaBuffer.set(0, {
|
|
add: toAdd.length > 0 ? toAdd : null,
|
|
update: toUpdate.length > 0 ? toUpdate : null,
|
|
remove: toRemove.length > 0 ? toRemove : null
|
|
});
|
|
}
|
|
|
|
export function bufferDeltaUpdate(delta) {
|
|
if (delta.add === null && delta.update === null && delta.remove === null) {
|
|
log('Discarding empty nodes delta');
|
|
return;
|
|
}
|
|
|
|
if (deltaBuffer.size >= bufferLength) {
|
|
consolidateBuffer();
|
|
}
|
|
|
|
deltaBuffer = deltaBuffer.push(delta);
|
|
log('Buffering node delta, new size', deltaBuffer.size);
|
|
}
|
|
|
|
export function getUpdateBufferSize() {
|
|
return deltaBuffer.size;
|
|
}
|
|
|
|
export function resumeUpdate(getState) {
|
|
maybeUpdate(getState);
|
|
}
|