You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
6.0 KiB
JavaScript

10 years ago
var editor_factory = aa_aceeditor(window.ace),
editor = editor_factory.get_editor(),
listing_url = d3.select("link[rel='listing-data-source']").attr("href"),
save_url = d3.select("link[rel='save-url']").attr("href")
preview_div = d3.select("#editor")
.append("div")
.attr("class", "preview"),
preview_iframe = preview_div
.append("iframe"),
make_div = d3.select("#editor")
.append("div")
.attr("class", "make"),
make_body = make_div.append("div")
.attr("class", "body"),
make_busy = make_div
.append("div")
.attr("class", "busy");
function path_for_href (href) {
var p = new RegExp("^/projects/([^/]+)/(.*)$"),
m = href.match(p);
if (m != null) {
return m[2];
}
}
editor.save(function (data) {
console.log("save", data);
$.ajax({
url: save_url,
method: "post",
data: {
text: data.text,
f: path_for_href(data.href)
},
dataType: "json",
success: function (data) {
console.log("save.success", data);
},
error: function (err) {
console.log("save error", err);
}
})
});
make_body
.append("div")
.attr("class", "stdout");
make_body
.append("div")
.attr("class", "stderr");
make_busy.append("img")
.attr("src", "/imgs/gear.gif");
aa_frames(document.getElementById("split"));
document.getElementById("editor").appendChild(editor.elt);
function edit (url) {
editor.href(url);
preview_div
.style("display", "none");
make_div.style("display", "none");
}
function preview (url) {
preview_div
.style("display", "block");
preview_iframe
.attr("src", url);
make_div.style("display", "none");
}
function make (path, done) {
// console.log("make", path);
var make_url = d3.select("link[rel='make-url']").attr("href");
make_div.style("display", "block");
make_busy.style("display", "block");
make_url += "&f="+encodeURIComponent(path);
d3.json(make_url, function (data) {
d3.select("#editor .make .stdout").text(data.stdout);
d3.select("#editor .make .stderr").text(data.stderr);
make_busy.style("display", "none");
refresh_listing();
if (done) {
done.call(data, data);
}
});
}
function update_selection() {
var checkboxes = d3.selectAll(".itemcheckbox"),
checked = d3.selectAll(".itemcheckbox:checked"),
ss = checked.size(),
select_all_button = d3.select("#listing_select_all"),
selfunk = d3.select("#listing .selection_functions");
if (ss >= 1) {
selfunk.style("display", "inline");
} else {
selfunk.style("display", "none");
}
if (ss > 0 && ss == checkboxes.size()) {
select_all_button.text("deselect all");
} else {
select_all_button.text("select all");
}
}
function select_all () {
var checkboxes = d3.selectAll(".itemcheckbox"),
checked = d3.selectAll(".itemcheckbox:checked");
if (checkboxes.size() == checked.size()) {
checkboxes.property("checked", false);
} else {
checkboxes.property("checked", true);
}
update_selection();
}
function delete_selection () {
var rm_url = d3.select("link[rel='rm-url']").attr("href"),
checked = d3.selectAll(".itemcheckbox:checked"),
ss = checked.size(),
paths = checked.data().map(function (d) { return d.path });
if (ss == 0) return;
var ok = confirm("Delete " + ss + " items?");
if (ok) {
$.ajax({
url: rm_url,
method: "post",
data: {
'f[]': paths
},
dataType: "json",
success: function (data) {
checked.property("checked", false);
update_selection();
// console.log("rm response", data);
refresh_listing();
}
});
}
}
function refresh_listing() {
d3.json(listing_url, function (data) {
// console.log("data", data);
var div = d3.select("#listing .body");
item = div
.selectAll("div.item")
.data(data.items, function (d) { return d.path });
var newitem = item.enter()
.append("div")
.attr("class", "item");
newitem
.append("input")
.attr("class", "itemcheckbox")
.attr("type", "checkbox")
.on("change", update_selection);
newitem
.append("a")
.text(function(d) { return d.path })
.attr("href", function (d) { return d.url })
.on("click", function (d) {
d3.event.preventDefault();
// console.log("d", d);
if (d.remake) {
// alert("make");
make(d.path, function () {
if (!d.binary) {
edit(d.url);
} else {
preview(d.url);
}
});
return false;
} else if (!d.binary) {
edit(d.url);
} else {
preview(d.url);
}
});
// console.log("item.update", item);
item
.select("a")
.classed("normal", function (d) { return d.exists && !d.remake })
.classed("make", function (d) { return d.exists && d.remake })
.classed("potential", function (d) { return !d.exists })
.classed("exists", function (d) { return d.exists })
.classed("remake", function (d) { return d.remake });
item.exit()
.remove();
});
}
refresh_listing();
$("#listing .body").niceScroll({cursorcolor:"#0F0"});
$("#listing_refresh_button").click(refresh_listing);
$("#listing_delete_selection").click(delete_selection);
$("#listing_select_all").click(select_all);