All Downloads are FREE. Search and download functionalities are using the official Maven repository.

public.javascript.rexster.ui.terminal.js Maven / Gradle / Ivy

The newest version!
/**
 * Manages the Gremlin Terminal. Migrated from Webling (https://github.com/xedin/webling).  
 * 
 * Credit to Neo Technology (http://neotechnology.com/) for most of the code related to the 
 * Gremlin Terminal in Rexster.  Specifically, this code was borrowed from 
 * https://github.com/neo4j/webadmin and re-purposed for Rexster's needs.
 * 
 * Refitted from webling - [https://github.com/xedin/webling]
 * Original header comments below. 
 * 
 * TryMongo
 * Original version from: Kyle Banker (http://www.kylebanker.com)
 * Rerewritten to fit gremlin needs by: Pavel A. Yaskevich
 * Date: September 1, 2009
 * (c) Creative Commons 2010
 * http://creativecommons.org/licenses/by-sa/2.5/
 */

// Readline class to handle line input.
var ReadLine = function(options, history) {
  this.options      = options || {};
  this.htmlForInput = this.options.htmlForInput;
  this.inputHandler = function(h, v, scope) { 
	/*
    if(v == 'help') {
      h.insertResponse('Coming soon');
      h.newPromptLine();
      return null;
    }
    */
    
    req = '';

    if(scope == true) {
      for(i = 0; i < h.scopeHistory.length; i++) {
          req += h.scopeHistory[i] + "\n";
      }
      req += "end\n";
    } else {
      req = v;
    }

    var state = history.getApplicationState();
    $.ajax({
            data: { code : req, "g" : state.graph },
            type: "POST",
            url: '/doghouse/exec',
            contentType: "application/x-www-form-urlencoded;charset=UTF-8",
            success: function(value) {
              h.insertResponse(value.replace(/\n/g, "
")); // Save to the command history... if((lineValue = $.trim(v)) !== "") { h.history.push(lineValue); h.historyPtr = h.history.length; } h.scopeHistory = []; h.newPromptLine(); }}); }; this.terminal = $(this.options.terminalId || "#terminal"); this.lineClass = this.options.lineClass || '.readLine'; this.history = []; this.historyPtr = 0; this.scopeHistory = []; this.initialize(); }; ReadLine.prototype = { initialize: function() { this.addInputLine(); }, newPromptLine: function() { this.activeLine.value = ''; this.activeLine.attr({disabled: true}); this.activeLine.next('.spinner').remove(); this.activeLine.removeClass('active'); this.addInputLine(this.depth); }, // Enter a new input line with proper behavior. addInputLine: function(depth) { stackLevel = depth || 0; this.terminal.append(this.htmlForInput(stackLevel)); var ctx = this; ctx.activeLine = $(this.lineClass + '.active'); // Bind key events for entering and navigating history. ctx.activeLine.bind("keydown", function(ev) { switch (ev.keyCode) { case EnterKeyCode: ctx.processInput(this.value); break; case UpArrowKeyCode: ctx.getCommand('previous'); ev.preventDefault(); break; case DownArrowKeyCode: ctx.getCommand('next'); ev.preventDefault(); break; } }); $(document).bind("keydown", function(ev) { ctx.activeLine.focus(); }); this.activeLine.focus(); }, // Returns the 'next' or 'previous' command in this history. getCommand: function(direction) { if(this.history.length === 0) { return; } this.adjustHistoryPointer(direction); this.activeLine[0].value = this.history[this.historyPtr]; var lenOfCommand = this.activeLine[0].value.length; $(this.activeLine[0]).selectRange(lenOfCommand, lenOfCommand); }, // Moves the history pointer to the 'next' or 'previous' position. adjustHistoryPointer: function(direction) { if(direction == 'previous') { if(this.historyPtr - 1 >= 0) { this.historyPtr -= 1; } } else { if(this.historyPtr + 1 < this.history.length) { this.historyPtr += 1; } } }, // Return the handler's response. processInput: function(value) { if($.trim(value) == '') { this.newPromptLine(); return null; } /* if($.trim(value) == 'end') { this.depth--; if(this.depth == 0) { this.inputHandler(this, value, true); return false; } } */ this.scopeHistory.push(value); this.inputHandler(this, value); }, insertResponse: function(response) { if(response !== "") { this.activeLine.parent().append("

" + response + "

"); } }, // Simply return the entered string if the user hasn't specified a smarter handler. mockHandler: function(inputString) { return function() { this._process = function() { return inputString; }; }; } }; $htmlFormat = function(obj) { return tojson(obj, ' ', ' ', true); } $.fn.selectRange = function(start, end) { return this.each(function() { if(this.setSelectionRange) { this.focus(); this.setSelectionRange(start, end); } else if(this.createTextRange) { var range = this.createTextRange(); range.collapse(true); range.moveEnd('character', end); range.moveStart('character', start); range.select(); } }); }; var DefaultInputHtml = function(stack) { var linePrompt = ""; for(var i=0; i <= stack; i++) { linePrompt += "gremlin>"; } return "
" + linePrompt + "" + "
"; } var EnterKeyCode = 13; var UpArrowKeyCode = 38; var DownArrowKeyCode = 40; define( [ "rexster/history", "rexster/ajax", "rexster/template/template", "rexster/history" ], function (history, ajax, template, history) { // public methods return { initTerminal : function(onInitComplete){ $("#panelGremlinMenuGraph").empty(); $("#terminal .line").remove(); $("#gremlinVersion").text("Gremlin " + GREMLIN_VERSION); ajax.getGraphs(function(result){ var ix = 0, max = 0, graphs = [], state = history.getApplicationState(); // construct a list of graphs that can be pushed into the graph menu max = result.graphs.length; for (ix = 0; ix < max; ix += 1) { graphs.push({ "menuName": result.graphs[ix], "panel" : "gremlin" }); } template.applyMenuGraphTemplate(graphs, $("#panelGremlinMenuGraph")); $("#panelGremlinMenuGraph").find("div").unbind("hover"); $("#panelGremlinMenuGraph").find("div").hover(function() { $(this).toggleClass("ui-state-hover"); }); $("#panelGremlinMenuGraph").find("div").unbind("click"); $("#panelGremlinMenuGraph").find("div").click(function(evt) { evt.preventDefault(); $("#panelGremlinMenuGraph").find(".graph-item").removeClass("ui-state-active"); $(this).addClass("ui-state-active"); var selectedLink = $(this).find("a"); var uri = selectedLink.attr('href'); history.historyPush(uri); }); // check the state, if it is at least two items deep then the state // of the graph is also selected and an attempt to make the graph active // should be made. if (state.hasOwnProperty("graph")) { $("#panelGremlinMenuGraph").find(".graph-item").removeClass("ui-state-active"); $("#panelGremlinMenuGraph").find("#graphItemgremlin" + state.graph).addClass("ui-state-active"); if (onInitComplete != undefined) { onInitComplete(); } } // if the state does not specify a graph then select the first one. if (!state.hasOwnProperty("graph")) { $("#panelGremlinMenuGraph").find("#graphItemgremlin" + graphs[0].menuName).click(); if (onInitComplete != undefined) { onInitComplete(); } } var terminal = new ReadLine({htmlForInput: DefaultInputHtml}, history); }); } }; });




© 2015 - 2025 Weber Informatics LLC | Privacy Policy