@@ -41,6 +41,7 @@ | |||||
"public/css/navbar.css", | "public/css/navbar.css", | ||||
"public/css/slickgrid.css", | "public/css/slickgrid.css", | ||||
"public/css/tree_grid.css", | "public/css/tree_grid.css", | ||||
"public/css/tree.css", | |||||
"public/css/nprogress.css" | "public/css/nprogress.css" | ||||
], | ], | ||||
"js/frappe.min.js": [ | "js/frappe.min.js": [ | ||||
@@ -344,13 +344,6 @@ ul.linked-with-list li { | |||||
font-weight: bold; | font-weight: bold; | ||||
} | } | ||||
.tree-node-toolbar { | |||||
padding: 2px 5px; | |||||
margin-left: 15px; | |||||
border-radius: 3px; | |||||
background-color: #ddd; | |||||
} | |||||
.print-preview { | .print-preview { | ||||
padding: 50px 20px; | padding: 50px 20px; | ||||
margin: 0px -15px; | 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, | parent_label: null, | ||||
expandable: true | expandable: true | ||||
}); | }); | ||||
this.set_style(); | |||||
this.rootnode.toggle(); | |||||
}, | }, | ||||
get_selected_node: function() { | 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({ | frappe.ui.TreeNode = Class.extend({ | ||||
init: function(args) { | init: function(args) { | ||||
var me = this; | |||||
$.extend(this, args); | $.extend(this, args); | ||||
this.loaded = false; | this.loaded = false; | ||||
this.expanded = false; | this.expanded = false; | ||||
this.tree.nodes[this.label] = this; | this.tree.nodes[this.label] = this; | ||||
if(this.parent_label) | if(this.parent_label) | ||||
this.parent_node = this.tree.nodes[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">') | this.$a = $('<span class="tree-link">') | ||||
.click(function() { | .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(); }) | .bind('reload', function() { me.reload(); }) | ||||
.data('label', this.label) | .data('label', this.label) | ||||
@@ -55,8 +62,53 @@ frappe.ui.TreeNode = Class.extend({ | |||||
.appendTo(this.parent); | .appendTo(this.parent); | ||||
this.$ul = $('<ul class="tree-children">') | this.$ul = $('<ul class="tree-children">') | ||||
.css({"min-height": "5px"}) | |||||
.toggle(false).appendTo(this.parent); | .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) { | if(this.tree.drop && this.parent_label) { | ||||
this.$ul.droppable({ | this.$ul.droppable({ | ||||
hoverClass: "tree-hover", | 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) { | addnode: function(data) { | ||||
var $li = $('<li class="tree-node">'); | var $li = $('<li class="tree-node">'); | ||||
@@ -95,14 +136,16 @@ frappe.ui.TreeNode = Class.extend({ | |||||
data: data | data: data | ||||
}); | }); | ||||
}, | }, | ||||
selectnode: function() { | |||||
toggle_node: function(callback) { | |||||
// expand children | // expand children | ||||
if(this.$ul) { | if(this.$ul) { | ||||
this.$ul.toggle(); | |||||
if(this.$ul.children().length) { | |||||
this.$ul.toggle(!this.expanded); | |||||
} | |||||
// open close icon | // open close icon | ||||
this.$a.find('i').removeClass(); | 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'); | this.$a.find('i').addClass('icon-fixed-width icon-folder-open'); | ||||
} else { | } else { | ||||
this.$a.find('i').addClass('icon-fixed-width icon-folder-close'); | this.$a.find('i').addClass('icon-fixed-width icon-folder-close'); | ||||
@@ -114,30 +157,22 @@ frappe.ui.TreeNode = Class.extend({ | |||||
.removeClass('selected'); | .removeClass('selected'); | ||||
this.$a.toggleClass('selected'); | this.$a.toggleClass('selected'); | ||||
this.expanded = !this.expanded; | this.expanded = !this.expanded; | ||||
if(callback) callback(); | |||||
}, | }, | ||||
reload: function() { | reload: function() { | ||||
if(this.expanded) { | |||||
this.$a.click(); // collapse | |||||
} | |||||
if(this.$ul) { | |||||
this.$ul.empty(); | |||||
} | |||||
this.load(); | this.load(); | ||||
}, | }, | ||||
load: function() { | |||||
load: function(callback) { | |||||
var me = this; | var me = this; | ||||
args = $.extend(this.tree.args || {}, { | args = $.extend(this.tree.args || {}, { | ||||
parent: this.data ? this.data.value : null | parent: this.data ? this.data.value : null | ||||
}); | }); | ||||
$(me.$a).set_working(); | |||||
return frappe.call({ | return frappe.call({ | ||||
method: this.tree.method, | method: this.tree.method, | ||||
args: args, | args: args, | ||||
callback: function(r) { | callback: function(r) { | ||||
$(me.$a).done_working(); | |||||
me.$ul.empty(); | |||||
if (r.message) { | if (r.message) { | ||||
$.each(r.message, function(i, v) { | $.each(r.message, function(i, v) { | ||||
node = me.addnode(v); | node = me.addnode(v); | ||||
@@ -147,10 +182,10 @@ frappe.ui.TreeNode = Class.extend({ | |||||
}); | }); | ||||
} | } | ||||
if(!me.expanded) | |||||
me.toggle_node(callback); | |||||
me.loaded = true; | me.loaded = true; | ||||
// expand | |||||
me.selectnode(); | |||||
} | } | ||||
}) | }) | ||||
} | } |
@@ -30,7 +30,8 @@ class DocType(DocTypeNestedSet): | |||||
self.rename() | self.rename() | ||||
self.check_if_page_name_is_unique() | self.check_if_page_name_is_unique() | ||||
self.make_private_if_parent_is_private() | self.make_private_if_parent_is_private() | ||||
self.renumber_if_moved() | |||||
if not self.doc.is_new(): | |||||
self.renumber_if_moved() | |||||
self.set_idx() | self.set_idx() | ||||
def renumber_if_moved(self): | def renumber_if_moved(self): | ||||
@@ -45,12 +45,7 @@ class DocType: | |||||
def rebuild_website_sitemap_config(): | def rebuild_website_sitemap_config(): | ||||
# TODO | # TODO | ||||
frappe.flags.in_rebuild_config = True | 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`""") | frappe.conn.sql("""delete from `tabWebsite Sitemap Config`""") | ||||
for app in frappe.get_installed_apps(): | for app in frappe.get_installed_apps(): | ||||
if app=="webnotes": app="frappe" | if app=="webnotes": app="frappe" | ||||
@@ -81,7 +76,7 @@ def build_website_sitemap_config(app): | |||||
if config_type=="pages": | if config_type=="pages": | ||||
pages.append(["Page", app, path, fname, basepath]) | pages.append(["Page", app, path, fname, basepath]) | ||||
else: | else: | ||||
generators(["Generator", app, path, fname, basepath]) | |||||
generators.append(["Generator", app, path, fname, basepath]) | |||||
for args in pages: | for args in pages: | ||||
add_website_sitemap_config(*args) | add_website_sitemap_config(*args) | ||||
@@ -9,7 +9,7 @@ frappe.pages['sitemap-browser'].onload = function(wrapper) { | |||||
wrapper.appframe.add_module_icon("Website") | wrapper.appframe.add_module_icon("Website") | ||||
wrapper.appframe.set_title_right('Refresh', function() { | wrapper.appframe.set_title_right('Refresh', function() { | ||||
wrapper.make_tree(); | |||||
frappe.website.sitemap.tree.rootnode.reload(); | |||||
}); | }); | ||||
$(wrapper) | $(wrapper) | ||||
@@ -37,18 +37,41 @@ frappe.website.SitemapBrowser = Class.extend({ | |||||
parent: $(parent), | parent: $(parent), | ||||
label: "Sitemap", | label: "Sitemap", | ||||
method: 'frappe.website.page.sitemap_browser.sitemap_browser.get_children', | 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) { | // drop: function(dragged_node, dropped_node, dragged_element, dropped_element) { | ||||
// frappe.website.sitemap.update_parent(dragged_node.label, dropped_node.label, function(r) { | // frappe.website.sitemap.update_parent(dragged_node.label, dropped_node.label, function(r) { | ||||
// if(!r.exc) { | // if(!r.exc) { | ||||
@@ -62,22 +85,6 @@ frappe.website.SitemapBrowser = Class.extend({ | |||||
.data('node-data', {value: "Sitemap", expandable:1}) | .data('node-data', {value: "Sitemap", expandable:1}) | ||||
.click(); | .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() { | selected_node: function() { | ||||
return this.tree.$w.find('.tree-link.selected'); | 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 node = me.tree.get_selected_node(); | ||||
var values = me.move_dialog.get_values(); | var values = me.move_dialog.get_values(); | ||||
if(!values) return; | 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(); | me.move_dialog.hide(); | ||||
(node.parent_node || node).reload(); | (node.parent_node || node).reload(); | ||||
}) | }) | ||||
@@ -135,7 +142,7 @@ frappe.website.SitemapBrowser = Class.extend({ | |||||
this.move_dialog.show(); | this.move_dialog.show(); | ||||
this.move_dialog.get_input("new_parent").val(""); | this.move_dialog.get_input("new_parent").val(""); | ||||
}, | }, | ||||
update_parent: function(name, parent, callback) { | |||||
_update_parent: function(name, parent, callback) { | |||||
frappe.call({ | frappe.call({ | ||||
method: "frappe.website.page.sitemap_browser.sitemap_browser.update_parent", | method: "frappe.website.page.sitemap_browser.sitemap_browser.update_parent", | ||||
args: { | args: { | ||||