1
/* Copyright 2008 Orbitz WorldWide
3
Licensed under the Apache License, Version 2.0 (the "License");
4
you may not use this file except in compliance with the License.
5
You may obtain a copy of the License at
7
http://www.apache.org/licenses/LICENSE-2.0
9
Unless required by applicable law or agreed to in writing, software
10
distributed under the License is distributed on an "AS IS" BASIS,
11
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
See the License for the specific language governing permissions and
13
limitations under the License. */
15
function GraphiteBrowser () {
16
var treePanel = createTreePanel();
17
var searchPanel = createSearchPanel();
18
var completerPanel = createCompleterPanel();
19
var treeRoot = treePanel.getRootNode();
22
graphite: treeRoot.findChild('id', 'GraphiteTree'),
23
mygraphs: treeRoot.findChild('id', 'MyGraphsTree'),
24
usergraphs: treeRoot.findChild('id', 'UserGraphsTree')
27
this.panel = new Ext.TabPanel({
29
items: [treePanel, searchPanel, completerPanel],
39
function createTreePanel(){
40
var rootNode = new Ext.tree.TreeNode({});
42
function setParams(loader, node) {
43
var node_id = node.id.replace(/^[A-Za-z]+Tree\.?/,"");
44
loader.baseParams.query = (node_id == "") ? "*" : (node_id + ".*");
45
loader.baseParams.format = 'treejson';
46
loader.baseParams.contexts = '1';
47
loader.baseParams.path = node_id;
49
if (node.parentNode && node.parentNode.id == "UserGraphsTree") {
50
loader.baseParams.user = node.id;
54
var graphiteNode = new Ext.tree.AsyncTreeNode({
57
loader: new Ext.tree.TreeLoader({
58
url: "../metrics/find/",
60
listeners: {beforeload: setParams}
63
rootNode.appendChild(graphiteNode);
65
//function reloadOnce (node) {
66
// node.un('beforeexpand', reloadOnce);
68
// setTimeout(function () { node.on('beforeexpand', reloadOnce); }, 1000);
71
if (GraphiteConfig.showMyGraphs) {
72
var myGraphsNode = new Ext.tree.AsyncTreeNode({
79
//listeners: {beforeexpand: reloadOnce},
80
loader: new Ext.tree.TreeLoader({
81
url: "../browser/mygraph/",
83
listeners: {beforeload: setParams}
86
rootNode.appendChild(myGraphsNode);
89
var userGraphsNode = new Ext.tree.AsyncTreeNode({
92
//listeners: {beforeexpand: reloadOnce},
93
loader: new Ext.tree.TreeLoader({
94
url: "../browser/usergraph/",
96
listeners: {beforeload: setParams}
99
rootNode.appendChild(userGraphsNode);
101
var treePanel = new Ext.tree.TreePanel({
104
containerScroll: true,
112
treePanel.on("click", function (node,evt) {
113
if (node.id == 'no-click') {
122
if (node.attributes.graphUrl) {
123
var url = decodeURIComponent(node.attributes.graphUrl).replace(/#/,'%23');
124
Composer.loadMyGraph(node.attributes.text, url);
128
Composer.toggleTarget(node.id);
135
function createSearchPanel() {
136
return new Ext.form.FormPanel({
137
formId: 'searchForm',
139
disabled: (!GraphiteConfig.searchEnabled),
141
containerScroll: true,
144
new Ext.form.TextField({
145
emptyText: "search for metrics",
148
listeners: {specialkey: sendSearchRequest}
151
listeners: {render: setupSearchForm}
155
function setupSearchForm(formEl) {
156
var html = '<a id="searchHelpLink" > Help </a> <p id="searchError"></p> <ul id="searchResults"></ul>';
157
Ext.DomHelper.append("searchForm", html);
158
var helpAction = 'javascript: void window.open';
159
var helpPage = '"../content/html/searchHelp.html"';
160
var helpTitle = '"Searching Graphite"';
161
var helpOptions = '"width=500,height=400,toolbar=no,location=no,directories=no,status=no,menubar=no"';
162
Ext.getDom('searchHelpLink').href = helpAction+"("+helpPage+","+helpTitle+","+helpOptions+");";
163
var formPanel = Ext.get("searchForm");
164
formPanel.un("render",setupSearchForm);
167
function showSearchError(message) {
168
Ext.getDom('searchError').innerHTML = '<font color="red">' + message + '</font><br/>';
171
function sendSearchRequest (searchField, evt) {
172
if (evt.getCharCode() != Ext.EventObject.RETURN) {
175
//Clear any previous errors
177
//Clear the result list
178
var resultList = Ext.getDom('searchResults');
179
while (resultList.childNodes[0]) {
180
resultList.removeChild( resultList.childNodes[0] );
183
url: '../browser/search/',
185
success: handleSearchResponse,
186
failure: handleSearchFailure,
187
params: {query: searchField.getValue()}
191
function handleSearchResponse (response, options) {
192
var text = response.responseText;
194
showSearchError("Nothing matched your query");
197
var resultList = Ext.getDom('searchResults');
198
var results = text.split(',');
199
Ext.each(results, function (item) {
200
var li = document.createElement('li');
201
li.innerHTML = "<a href=\"javascript: Composer.toggleTarget('" + item + "');\">" + item + "</a>";
202
resultList.appendChild(li);
206
function handleSearchFailure (response, options)
208
showSearchError("Search request failed");
212
function createCompleterPanel() {
213
var metricCompleter = new MetricCompleter({emptyText: "Start typing a metric name..."});
215
metricCompleter.on('specialkey', function (field, e) {
216
if (e.getKey() == e.ENTER) {
217
var target = metricCompleter.getValue();
218
Composer.toggleTarget(target);
222
return new Ext.Panel({
223
title: "Auto-Completer",
230
new Ext.form.Label({html: '<a id="completerHelpLink" href="../content/html/completerHelp.html", target="_new"> Help </a>'})
235
return new Ext.form.FormPanel({
236
formId: "completerForm",
237
title: "Auto-Completer",
240
new Ext.form.TextField({
241
id: "completerField",
242
emptyText: "start typing a metric path",
245
listeners: {render: setupCompleterField, specialkey: completerToggle}
248
listeners: {render: setupCompleterForm}
253
function setupCompleterForm(formEl) {
254
html = '<a id="completerHelpLink" > Help </a> <div id="completerResults"/>';
255
Ext.DomHelper.append("completerForm",html);
256
var helpAction = 'javascript: void window.open';
257
var helpPage= '"../content/html/completerHelp.html"';
258
var helpTitle = '"Using the Auto-Completer"';
259
var helpOptions = '"width=500,height=400,toolbar=no,location=no,directories=no,status=no,menubar=no"';
260
Ext.getDom('completerHelpLink').href = helpAction+"("+helpPage+","+helpTitle+","+helpOptions+");";
261
completer = Ext.get("completerForm");
262
completer.un("render", setupCompleterForm);
265
function setupCompleterField(field) {
266
field.el.on("keyup", sendCompleterRequest);
269
function completerToggle(field, evt) {
270
if (evt.getKey() != Ext.EventObject.RETURN) {
274
Composer.toggleTarget( field.getValue() );
277
function sendCompleterRequest(evt, el) {
278
if(Ext.Ajax.isLoading()) {
282
url: '../cli/autocomplete/',
284
success: handleCompleterResponse,
285
failure: handleCompleterFailure,
286
params: {short:true, path: el.value}
290
function handleCompleterResponse(response, options) {
291
var resultList = Ext.getDom('completerResults');
292
while (resultList.childNodes[0]) {
293
resultList.removeChild( resultList.childNodes[0] );
295
Ext.DomHelper.append('completerResults',response.responseText);
298
function handleCompleterFailure(response, options) {
299
var resultList = Ext.getDom('completerResults');
300
while (resultList.childNodes[0]) {
301
resultList.removeChild( resultList.childNodes[0] );