kibana-123
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
69 lines (55 loc) • 1.65 kB
JavaScript
export default function DelayedUpdaterFactory($http, chrome, Promise) {
let unsavedChanges = {};
let unresolvedPromises = [];
let saveTimeout = null;
return function delayedUpdate(key, value) {
unsavedChanges[key] = value;
return new Promise(saveSoon)
.then(res => res.data.settings);
};
function saveSoon(resolve, reject) {
if (saveTimeout) {
clearTimeout(saveTimeout);
}
saveTimeout = setTimeout(fire, 200);
unresolvedPromises.push({ resolve, reject });
}
function fire() {
const changes = unsavedChanges;
const promises = unresolvedPromises;
unresolvedPromises = [];
unsavedChanges = {};
persist(changes)
.then(result => settle(promises, `resolve`, result))
.catch(reason => settle(promises, `reject`, reason));
}
function settle(listeners, decision, data) {
listeners.forEach(listener => listener[decision](data));
}
function persist(changes) {
const keys = Object.keys(changes);
if (keys.length === 1) {
const [key] = keys;
const value = changes[key];
const update = value === null ? remove : edit;
return update(key, value);
}
return editMany(changes);
}
function remove(key) {
return sync(`delete`, { postfix: `/${key}` });
}
function edit(key, value) {
return sync(`post`, { postfix: `/${key}`, data: { value } });
}
function editMany(changes) {
return sync(`post`, { data: { changes } });
}
function sync(method, { postfix = '', data } = {}) {
return $http({
method,
url: chrome.addBasePath(`/api/kibana/settings${postfix}`),
data
});
}
};