@@ -41,6 +41,7 @@ | |||
"public/css/navbar.css", | |||
"public/css/slickgrid.css", | |||
"public/css/tree_grid.css", | |||
"public/css/tree.css", | |||
"public/css/nprogress.css" | |||
], | |||
"js/frappe.min.js": [ | |||
@@ -344,13 +344,6 @@ ul.linked-with-list li { | |||
font-weight: bold; | |||
} | |||
.tree-node-toolbar { | |||
padding: 2px 5px; | |||
margin-left: 15px; | |||
border-radius: 3px; | |||
background-color: #ddd; | |||
} | |||
.print-preview { | |||
padding: 50px 20px; | |||
margin: 0px -15px; | |||
@@ -0,0 +1,31 @@ | |||
.tree li { | |||
list-style: none; | |||
} | |||
.tree ul { | |||
margin-top: 2px; | |||
} | |||
.tree-link { | |||
cursor: pointer; | |||
} | |||
.tree-hover { | |||
background-color: #eee; | |||
min-height: 20px; | |||
border: 1px solid #ddd; | |||
} | |||
.tree-node-toolbar { | |||
display: inline-block; | |||
padding: 0px 5px; | |||
margin-left: 15px; | |||
border-radius: 3px; | |||
background-color: #ddd; | |||
} | |||
.tree-toolbar-item { | |||
display: inline-block; | |||
padding: 0px 5px; | |||
padding-top: 1px; | |||
border-right: 1px solid #aaa; | |||
font-size: 90%; | |||
} | |||
.tree-toolbar-item:last-child { | |||
border-right: 0px; | |||
} |
@@ -16,38 +16,45 @@ frappe.ui.Tree = Class.extend({ | |||
parent_label: null, | |||
expandable: true | |||
}); | |||
this.set_style(); | |||
this.rootnode.toggle(); | |||
}, | |||
get_selected_node: function() { | |||
return this.$w.find('.tree-link.selected').data('node'); | |||
return this.selected_node; | |||
}, | |||
set_style: function() { | |||
frappe.dom.set_style("\ | |||
.tree li { list-style: none; }\ | |||
.tree ul { margin-top: 2px; }\ | |||
.tree-link { cursor: pointer; }\ | |||
.tree-hover { background-color: #eee; min-height: 20px; border: 1px solid #ddd; }\ | |||
") | |||
toggle: function() { | |||
this.get_selected_node().toggle(); | |||
} | |||
}) | |||
frappe.ui.TreeNode = Class.extend({ | |||
init: function(args) { | |||
var me = this; | |||
$.extend(this, args); | |||
this.loaded = false; | |||
this.expanded = false; | |||
this.tree.nodes[this.label] = this; | |||
if(this.parent_label) | |||
this.parent_node = this.tree.nodes[this.parent_label]; | |||
this.make(); | |||
this.setup_drag_drop(); | |||
if(this.tree.onrender) { | |||
this.tree.onrender(this); | |||
} | |||
}, | |||
make: function() { | |||
var me = this; | |||
this.$a = $('<span class="tree-link">') | |||
.click(function() { | |||
if(me.expandable && me.tree.method && !me.loaded) { | |||
me.load() | |||
} else { | |||
me.selectnode(); | |||
me.tree.selected_node = me; | |||
if(me.tree.toolbar) { | |||
me.show_toolbar(); | |||
} | |||
if(me.toggle_on_click) { | |||
me.toggle(); | |||
} | |||
if(me.tree.click) me.tree.click(this); | |||
if(me.tree.click) | |||
me.tree.click(this); | |||
}) | |||
.bind('reload', function() { me.reload(); }) | |||
.data('label', this.label) | |||
@@ -55,8 +62,53 @@ frappe.ui.TreeNode = Class.extend({ | |||
.appendTo(this.parent); | |||
this.$ul = $('<ul class="tree-children">') | |||
.css({"min-height": "5px"}) | |||
.toggle(false).appendTo(this.parent); | |||
this.make_icon(); | |||
}, | |||
make_icon: function() { | |||
// label with icon | |||
var icon_html = '<i class="icon-fixed-width icon-file"></i>'; | |||
if(this.expandable) { | |||
icon_html = '<i class="icon-fixed-width icon-folder-close"></i>'; | |||
} | |||
$(icon_html + ' <a class="tree-label">' + this.label + "</a>"). | |||
appendTo(this.$a); | |||
}, | |||
toggle: function(callback) { | |||
if(this.expandable && this.tree.method && !this.loaded) { | |||
this.load(callback) | |||
} else { | |||
this.toggle_node(callback); | |||
} | |||
}, | |||
show_toolbar: function() { | |||
if(this.tree.cur_toolbar) | |||
$(this.tree.cur_toolbar).toggle(false); | |||
if(!this.toolbar) | |||
this.make_toolbar(); | |||
this.tree.cur_toolbar = this.toolbar; | |||
this.toolbar.toggle(true); | |||
}, | |||
make_toolbar: function() { | |||
var me = this; | |||
this.toolbar = $('<span class="tree-node-toolbar"></span>').insertAfter(this.$a); | |||
$.each(this.tree.toolbar, function(i, d) { | |||
$("<a class='tree-toolbar-item'>") | |||
.html(d.label) | |||
.appendTo(me.toolbar) | |||
.click(function() { d.click(me, this); return false; }); | |||
}) | |||
}, | |||
setup_drag_drop: function() { | |||
// experimental | |||
var me = this; | |||
if(this.tree.drop && this.parent_label) { | |||
this.$ul.droppable({ | |||
hoverClass: "tree-hover", | |||
@@ -70,18 +122,7 @@ frappe.ui.TreeNode = Class.extend({ | |||
} | |||
}); | |||
} | |||
// label with icon | |||
var icon_html = '<i class="icon-fixed-width icon-file"></i>'; | |||
if(this.expandable) { | |||
icon_html = '<i class="icon-fixed-width icon-folder-close"></i>'; | |||
} | |||
$(icon_html + ' <a class="tree-label">' + this.label + "</a>"). | |||
appendTo(this.$a); | |||
if(this.tree.onrender) { | |||
this.tree.onrender(this); | |||
} | |||
}, | |||
addnode: function(data) { | |||
var $li = $('<li class="tree-node">'); | |||
@@ -95,14 +136,16 @@ frappe.ui.TreeNode = Class.extend({ | |||
data: data | |||
}); | |||
}, | |||
selectnode: function() { | |||
toggle_node: function(callback) { | |||
// expand children | |||
if(this.$ul) { | |||
this.$ul.toggle(); | |||
if(this.$ul.children().length) { | |||
this.$ul.toggle(!this.expanded); | |||
} | |||
// open close icon | |||
this.$a.find('i').removeClass(); | |||
if(this.$ul.css('display').toLowerCase()=='block') { | |||
if(!this.expanded) { | |||
this.$a.find('i').addClass('icon-fixed-width icon-folder-open'); | |||
} else { | |||
this.$a.find('i').addClass('icon-fixed-width icon-folder-close'); | |||
@@ -114,30 +157,22 @@ frappe.ui.TreeNode = Class.extend({ | |||
.removeClass('selected'); | |||
this.$a.toggleClass('selected'); | |||
this.expanded = !this.expanded; | |||
if(callback) callback(); | |||
}, | |||
reload: function() { | |||
if(this.expanded) { | |||
this.$a.click(); // collapse | |||
} | |||
if(this.$ul) { | |||
this.$ul.empty(); | |||
} | |||
this.load(); | |||
}, | |||
load: function() { | |||
load: function(callback) { | |||
var me = this; | |||
args = $.extend(this.tree.args || {}, { | |||
parent: this.data ? this.data.value : null | |||
}); | |||
$(me.$a).set_working(); | |||
return frappe.call({ | |||
method: this.tree.method, | |||
args: args, | |||
callback: function(r) { | |||
$(me.$a).done_working(); | |||
me.$ul.empty(); | |||
if (r.message) { | |||
$.each(r.message, function(i, v) { | |||
node = me.addnode(v); | |||
@@ -147,10 +182,10 @@ frappe.ui.TreeNode = Class.extend({ | |||
}); | |||
} | |||
if(!me.expanded) | |||
me.toggle_node(callback); | |||
me.loaded = true; | |||
// expand | |||
me.selectnode(); | |||
} | |||
}) | |||
} |
@@ -30,7 +30,8 @@ class DocType(DocTypeNestedSet): | |||
self.rename() | |||
self.check_if_page_name_is_unique() | |||
self.make_private_if_parent_is_private() | |||
self.renumber_if_moved() | |||
if not self.doc.is_new(): | |||
self.renumber_if_moved() | |||
self.set_idx() | |||
def renumber_if_moved(self): | |||
@@ -45,12 +45,7 @@ class DocType: | |||
def rebuild_website_sitemap_config(): | |||
# TODO | |||
frappe.flags.in_rebuild_config = True | |||
frappe.conn.sql("""update `tabWeb Page` set idx=null""") | |||
frappe.conn.sql("""update `tabBlog Post` set idx=null""") | |||
frappe.conn.sql("""update `tabBlog Category` set idx=null""") | |||
frappe.conn.sql("""update `tabWebsite Group` set idx=null""") | |||
frappe.conn.sql("""delete from `tabWebsite Sitemap Config`""") | |||
for app in frappe.get_installed_apps(): | |||
if app=="webnotes": app="frappe" | |||
@@ -81,7 +76,7 @@ def build_website_sitemap_config(app): | |||
if config_type=="pages": | |||
pages.append(["Page", app, path, fname, basepath]) | |||
else: | |||
generators(["Generator", app, path, fname, basepath]) | |||
generators.append(["Generator", app, path, fname, basepath]) | |||
for args in pages: | |||
add_website_sitemap_config(*args) | |||
@@ -9,7 +9,7 @@ frappe.pages['sitemap-browser'].onload = function(wrapper) { | |||
wrapper.appframe.add_module_icon("Website") | |||
wrapper.appframe.set_title_right('Refresh', function() { | |||
wrapper.make_tree(); | |||
frappe.website.sitemap.tree.rootnode.reload(); | |||
}); | |||
$(wrapper) | |||
@@ -37,18 +37,41 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
parent: $(parent), | |||
label: "Sitemap", | |||
method: 'frappe.website.page.sitemap_browser.sitemap_browser.get_children', | |||
click: function(link) { | |||
if(me.cur_toolbar) | |||
$(me.cur_toolbar).toggle(false); | |||
if(!link.toolbar) | |||
me.make_link_toolbar(link); | |||
if(link.toolbar) { | |||
me.cur_toolbar = link.toolbar; | |||
$(me.cur_toolbar).toggle(true); | |||
toolbar: [ | |||
{ | |||
label:frappe._("Expand"), | |||
click:function(node, btn) { | |||
node.toggle(function() { | |||
$(btn).html(node.expanded ? frappe._("Collapse") : frappe._("Expand")); | |||
}); | |||
} | |||
}, | |||
{ | |||
label: frappe._("Update Parent"), | |||
click: function(node, btn) { | |||
me.update_parent(); | |||
} | |||
}, | |||
{ | |||
label: frappe._("Up"), | |||
click: function(node, btn) { | |||
me.up_or_down("up"); | |||
} | |||
}, | |||
{ | |||
label: frappe._("Down"), | |||
click: function(node, btn) { | |||
me.up_or_down("down"); | |||
} | |||
}, | |||
{ | |||
label: frappe._("Open"), | |||
click: function(node, btn) { | |||
frappe.set_route("Form", node.data.ref_doctype, node.data.docname); | |||
} | |||
} | |||
}, | |||
] | |||
// drop: function(dragged_node, dropped_node, dragged_element, dropped_element) { | |||
// frappe.website.sitemap.update_parent(dragged_node.label, dropped_node.label, function(r) { | |||
// if(!r.exc) { | |||
@@ -62,22 +85,6 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
.data('node-data', {value: "Sitemap", expandable:1}) | |||
.click(); | |||
}, | |||
make_link_toolbar: function(link) { | |||
var data = $(link).data('node-data'); | |||
if(!data) return; | |||
link.toolbar = $('<span class="tree-node-toolbar"></span>').insertAfter(link); | |||
// edit | |||
var node_links = []; | |||
node_links.push('<a onclick="frappe.website.sitemap.open();">'+frappe._('Edit')+'</a>'); | |||
node_links.push('<a onclick="frappe.website.sitemap.update_parent();">'+frappe._('Move')+'</a>'); | |||
node_links.push('<a onclick="frappe.website.sitemap.up_or_down(\'up\');">'+frappe._('Up')+'</a>'); | |||
node_links.push('<a onclick="frappe.website.sitemap.up_or_down(\'down\');">'+frappe._('Down')+'</a>'); | |||
link.toolbar.append(node_links.join(" | ")); | |||
}, | |||
selected_node: function() { | |||
return this.tree.$w.find('.tree-link.selected'); | |||
}, | |||
@@ -126,7 +133,7 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
var node = me.tree.get_selected_node(); | |||
var values = me.move_dialog.get_values(); | |||
if(!values) return; | |||
me.update_parent(node.label, values.new_parent, function(r) { | |||
me._update_parent(node.label, values.new_parent, function(r) { | |||
me.move_dialog.hide(); | |||
(node.parent_node || node).reload(); | |||
}) | |||
@@ -135,7 +142,7 @@ frappe.website.SitemapBrowser = Class.extend({ | |||
this.move_dialog.show(); | |||
this.move_dialog.get_input("new_parent").val(""); | |||
}, | |||
update_parent: function(name, parent, callback) { | |||
_update_parent: function(name, parent, callback) { | |||
frappe.call({ | |||
method: "frappe.website.page.sitemap_browser.sitemap_browser.update_parent", | |||
args: { | |||