Make context menu items hookable.

This commit is contained in:
Dave Page 2015-02-20 09:56:02 -05:00
parent 37be918074
commit a36cb5ae10
4 changed files with 51 additions and 26 deletions

View File

@ -24,17 +24,28 @@ def get_nodes():
value = value[:-1]
return value
def get_file_menu_items():
"""Return a (set) of dicts of file menu items, with name, priority and URL."""
return [
{'name': 'Add a server group...', 'priority': 10, 'url': '#', 'onclick': 'add_server_group()'}
]
def get_context_menu_items():
"""Return a (set) of dicts of content menu items with name, text, priority and JS"""
return [
{'name': 'delete', 'label': 'Delete server group', 'priority': 100, 'onclick': 'delete_server_group(item);'},
{'name': 'rename', 'label': 'Rename server group...', 'priority': 200, 'onclick': 'rename_server_group(item);'}
]
def get_script_snippets():
"""Return the script snippets needed to handle treeview node operations."""
return render_template('server_groups/server_groups.js')
def get_css_snippets():
"""Return the CSS needed to display the treeview node image."""
css = ".icon-server-group {\n"

View File

@ -18,7 +18,7 @@ function add_server_group() {
icon: 'icon-server-group'
}
treeApi.append(null, {
tree.append(null, {
itemData: item
});
@ -35,21 +35,21 @@ function add_server_group() {
function delete_server_group(item) {
alertify.confirm(
'Delete server group?',
'Are you sure you wish to delete the server group "{0}"?'.replace('{0}', treeApi.getLabel(item)),
'Are you sure you wish to delete the server group "{0}"?'.replace('{0}', tree.getLabel(item)),
function() {
var id = treeApi.getId(item)
var id = tree.getId(item)
$.post("{{ url_for('NODE-server-group.delete') }}", { id: id })
.done(function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
var next = treeApi.next(item);
var prev = treeApi.prev(item);
treeApi.remove(item);
var next = tree.next(item);
var prev = tree.prev(item);
tree.remove(item);
if (next.length) {
treeApi.select(next);
tree.select(next);
} else if (prev.length) {
treeApi.select(prev);
tree.select(prev);
}
}
}
@ -64,15 +64,15 @@ function rename_server_group(item) {
alertify.prompt(
'Rename server group',
'Enter a new name for the server group',
treeApi.getLabel(item),
tree.getLabel(item),
function(evt, value) {
var id = treeApi.getId(item)
var id = tree.getId(item)
$.post("{{ url_for('NODE-server-group.rename') }}", { id: id, name: value })
.done(function(data) {
if (data.success == 0) {
report_error(data.errormsg, data.info);
} else {
treeApi.setLabel(item, { label: value });
tree.setLabel(item, { label: value });
}
}
)

View File

@ -1,3 +1,7 @@
// Page globals
var editor
var tree
// Store the main browser layout
function storeLayout(pane, $pane, paneState, paneOptions) {
state = layout.readState();
@ -79,7 +83,7 @@ $(document).ready(function(){
})
// Syntax highlight the SQL Pane
var editor = CodeMirror.fromTextArea(document.getElementById("sql-textarea"), {
editor = CodeMirror.fromTextArea(document.getElementById("sql-textarea"), {
lineNumbers: true,
mode: "text/x-sql",
readOnly: true,
@ -91,26 +95,22 @@ $(document).ready(function(){
url: '{{ url_for('browser.get_nodes') }}'
},
});
var treeApi = $('#tree').aciTree('api');
tree = $('#tree').aciTree('api');
// Build the treeview context menu
$('#tree').contextMenu({
selector: '.aciTreeLine',
build: function(element) {
var item = treeApi.itemFrom(element);
var item = tree.itemFrom(element);
var menu = {
};
menu['rename'] = {
name: 'Rename server group',
callback: function() { rename_server_group(item); }
{% if context_items is defined %}
{% for context_item in context_items %}
menu['{{ context_item.name }}'] = {
name: '{{ context_item.label }}',
callback: function() { {{ context_item.onclick }} }
};
menu['delete'] = {
name: 'Delete server group',
callback: function() { delete_server_group(item); }
};
{% endfor %}{% endif %}
return {
autoHide: true,
items: menu,

View File

@ -82,7 +82,7 @@ def index():
# Get the help menu items
if 'hooks' in dir(module) and 'get_help_menu_items' in dir(module.hooks):
help_items.extend(module.hooks.get_help_menu_items())
# Get any stylesheets
if 'hooks' in dir(module) and 'get_stylesheets' in dir(module.hooks):
stylesheets += module.hooks.get_stylesheets()
@ -113,13 +113,26 @@ def browser_js():
modules_and_nodes = modules + nodes
# Load the core browser code first
# Get the context menu items
context_items = [ ]
modules_and_nodes = modules + nodes
for module in modules_and_nodes:
if 'hooks' in dir(module) and 'get_context_menu_items' in dir(module.hooks):
context_items.extend(module.hooks.get_context_menu_items())
context_items = sorted(context_items, key=lambda k: k['priority'])
layout_settings = { }
layout_settings['sql_size'] = get_setting('Browser/SQLPane/Size', default=250)
layout_settings['sql_closed'] = get_setting('Browser/SQLPane/Closed', default="false")
layout_settings['browser_size'] = get_setting('Browser/BrowserPane/Size', default=250)
layout_settings['browser_closed'] = get_setting('Browser/BrowserPane/Closed', default="false")
snippets += render_template('browser/js/browser.js', layout_settings=layout_settings)
snippets += render_template('browser/js/browser.js',
layout_settings=layout_settings,
context_items=context_items)
# Add module and node specific code
for module in modules_and_nodes:
@ -149,6 +162,7 @@ def browser_css():
return resp
@blueprint.route("/root-nodes.json")
@login_required
def get_nodes():