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.

440 lines
12 KiB
JavaScript

/*
(c) 2014 Michael Murtaugh and contributors to the Digital Publishing Toolkit
License: GPL3
This code has been developed as part of the [Digital Publishing Toolkit](http://digitalpublishingtoolkit.org).
with the support of Institute for [Network Cultures](http://networkcultures.org)
and [Creating 010](http://creating010.com).
*/
10 years ago
var editor_factory = aa_aceeditor(window.ace),
editor = editor_factory.get_editor(),
editor_elt = d3.select(editor.elt),
cgi_url = d3.select("link[rel='cgi-url']").attr("href"),
10 years ago
preview_div = d3.select("#editor")
.append("div")
.attr("class", "preview"),
preview_iframe = preview_div
.append("iframe"),
10 years ago
make_div = d3.select("#editor")
.append("div")
.attr("class", "make"),
make_body = make_div.append("div")
.attr("class", "body"),
make_icon = make_div
.append("div")
.attr("class", "icon"),
make_gear = make_icon
10 years ago
.append("div")
.attr("class", "gear");
function url_for (script) {
return cgi_url+script+"?p=" + encodeURIComponent(project);
}
10 years ago
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: url_for("save.cgi"),
10 years ago
method: "post",
data: {
text: data.text,
f: path_for_href(data.href)
},
dataType: "json",
success: function (data) {
// console.log("save.success", data);
refresh_listing();
10 years ago
},
error: function (err) {
console.log("save error", err);
}
})
});
make_body
.append("div")
.attr("class", "stdout");
make_body
.append("div")
.attr("class", "stderr");
make_gear.on("click", toggle_make);
var make_height = 300;
function open_make () {
var cur_height = parseInt(make_div.style("height"));
if (cur_height == 0) {
make_div.style("height", make_height+"px");
}
}
function close_make () {
var cur_height = parseInt(make_div.style("height"));
if (cur_height > 0) {
make_div.style("height", 0);
}
}
function toggle_make () {
var cur_height = parseInt(make_div.style("height"));
if (cur_height > 0) {
make_height = cur_height;
make_div.style("height", 0);
} else {
make_div.style("height", make_height+"px");
}
}
10 years ago
aa_frames(document.getElementById("split"));
document.getElementById("editor").appendChild(editor.elt);
var activeURL;
function updateActiveItem () {
var item = d3.selectAll("#listing div.item")
.classed("active", function (d) {
return d.url == activeURL;
});
}
function edit (url, done, forceReload) {
activeURL = url;
editor.href(url, done, forceReload);
editor.aceeditor.focus();
editor_elt
.style("display", "block");
10 years ago
preview_div
.style("display", "none");
close_make();
updateActiveItem();
// make_div.style("display", "none");
10 years ago
}
function preview (url) {
activeURL = url;
10 years ago
preview_div
.style("display", "block");
editor_elt
.style("display", "none");
10 years ago
preview_iframe
.attr("src", url);
close_make();
updateActiveItem();
// make_div.style("display", "none");
10 years ago
}
function make (path, done) {
// console.log("make", path);
var make_url = url_for("make.cgi");
make_busy(true);
open_make();
10 years ago
make_url += "&f="+encodeURIComponent(path);
// 1. DRY-RUN TO SEE THE COMMAND THAT *WILL* HAPPEN NEXT
// (and display it)
d3.json(make_url+"&n=1", function (data) {
d3.select("#editor .make .stdout").text(data.stdout);
d3.select("#editor .make .stderr").text(data.stderr);
if (data.returncode == 0) {
// NOW MAKE FOR REAL
d3.json(make_url, function (data) {
console.log("make done", data);
d3.select("#editor .make .stdout").text(data.stdout);
d3.select("#editor .make .stderr").text(data.stderr);
if (data.returncode == 0) {
close_make();
}
make_busy(false);
refresh_listing(done); // nb done will get called with refresh data, not make data
});
}
})
10 years ago
}
function make_busy (val) {
make_div.classed("busy", val);
10 years ago
}
10 years ago
function select_all () {
d3.selectAll("#listing div.item").each(item_select);
10 years ago
update_selection();
}
function delete_selection () {
var items_selected = d3.selectAll("#listing div.selected"),
num_selected = items_selected.size(),
paths = items_selected.data().map(function (d) { return d.path });
10 years ago
if (num_selected == 0) return;
var ok = confirm("Delete "+num_selected+" selected file"+((num_selected==1)?"":"s") + "?");
10 years ago
if (ok) {
$.ajax({
url: url_for("rm.cgi"),
10 years ago
method: "post",
data: {
'f[]': paths
},
dataType: "json",
success: function (data) {
items_selected.each(item_deselect);
10 years ago
update_selection();
// console.log("rm response", data);
refresh_listing();
}
});
}
}
function download_selection () {
var items_selected = d3.selectAll("#listing div.selected"),
num_selected = items_selected.size(),
paths = items_selected.data().map(function (d) { return d.path });
if (num_selected == 0) return;
var ok = true; //confirm("Download "+num_selected+" selected file"+((num_selected==1)?"":"s") + "?");
if (ok) {
var url = url_for("download.cgi");
url += paths.map(function(x) { return "&f[]="+encodeURIComponent(x); }).join("");
// console.log("download", url);
preview_iframe
.attr("src", url);
items_selected.each(item_deselect);
update_selection();
}
}
var longclick_begin;
function item_select (d) {
var elt = d3.select(this),
eltwidth = $("a", this).width();
elt
.classed("selected", true)
.select("input.itemcheckbox")
.property("checked", true);
if (d.exists) {
elt
.append("input")
.attr("type", "text")
.attr("class", "rename")
.property("value", d.path)
.style("width", eltwidth+"px");
elt.select("a").classed("rename", true);
}
}
function item_deselect (d) {
var elt = d3.select(this);
elt
.classed("selected", false)
.select("input.itemcheckbox")
.property("checked", false);
elt.select("a").classed("rename", false);
elt
.select("input.rename")
.remove();
}
function checkbox_click (d) {
var checked = d3.select(this).property("checked");
if (checked) {
d3.select(this.parentNode).each(item_select);
} else {
d3.select(this.parentNode).each(item_deselect);
}
update_selection();
}
function item_longclick(d) {
d3.select(this.parentNode).each(item_select);
update_selection();
}
function update_selection() {
var items_all = d3.selectAll("#listing div.item"),
items_selected = d3.selectAll("#listing div.selected"),
numselected = items_selected.size(),
selfunk = d3.select("#listing .selection_functions"),
regfunk = d3.select("#listing .regular_functions");
if (numselected >= 1) {
selfunk.style("display", "inline");
regfunk.style("display", "none");
} else {
selfunk.style("display", "none");
regfunk.style("display", "inline")
}
}
function listing_cancel () {
d3.selectAll("#listing div.selected").each(item_deselect);
update_selection();
}
function rename () {
var ss = d3.selectAll("#listing a.rename"),
frompaths = [],
topaths = [];
if (ss.size() == 0) {
$("#listing .listing_rename_buttons").hide();
return;
}
var ok = true; // confirm("Rename "+ss.size()+" file"+((ss==1)?"":"s") + "?");
if (ok) {
ss.each(function (d) {
var newpath = d3.select(this.parentNode).select("input.rename").property("value");
frompaths.push(d.path);
topaths.push(newpath);
});
console.log("data", frompaths, topaths);
$.ajax({
url: url_for("mv.cgi"),
method: "post",
data: {
'f[]': frompaths,
't[]': topaths
},
dataType: "json",
success: function (data) {
// console.log("success", data);
listing_cancel();
refresh_listing();
},
error: function () {
listing_cancel();
}
});
} else {
listing_cancel();
}
}
function new_file () {
d3.json(url_for("touch.cgi"), function (data) {
refresh_listing();
})
}
function refresh_listing(done) {
d3.json(url_for("listing.cgi"), function (data) {
10 years ago
// 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", checkbox_click);
10 years ago
newitem
.append("a")
.text(function(d) { return d.path })
.attr("href", function (d) { return d.url })
.on("click", function (d) {
var that = this;
10 years ago
d3.event.preventDefault();
if (d3.select(this).classed("rename")) return;
if (longclick_begin) {
click_time = new Date().getTime() - longclick_begin;
if (click_time > 700 && click_time < 2500) {
item_longclick.call(this, d);
return;
}
}
10 years ago
if (d.remake) {
// alert("make");
activeURL = d.url;
updateActiveItem();
10 years ago
make(d.path, function () {
// re-get the d in case of change!
var d = d3.select(that).datum();
// console.log("d", d, d.binary, d.url);
10 years ago
if (!d.binary) {
// force reload!
console.log("force reload")
edit(d.url, null, true);
10 years ago
} else {
preview(d.url);
}
});
return false;
} else if (!d.binary) {
edit(d.url);
} else {
preview(d.url);
}
})
.on("mousedown", function () {
longclick_begin = new Date().getTime();
10 years ago
});
// 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();
item.order();
if (done) {
done.call(data, data);
}
10 years ago
});
}
refresh_listing();
$("#listing .body").niceScroll({cursorcolor:"#0F0"});
$("#editor .make .body").niceScroll({cursorcolor:"#0F0"});
$("#listing_select_all").click(select_all);
$("#listing_refresh").click(refresh_listing);
$("#listing_delete").click(delete_selection);
$("#listing_download").click(download_selection);
$("#listing_rename").click(rename);
$("#listing_cancel").click(listing_cancel);
$("#listing_new_file").click(new_file);
// $("#listing_select_all").click(select_all);
/* File drop */
$(function () {
$('#listing').fileupload({
url: url_for("upload.cgi"),
dataType: 'json',
done: function (e, data) {
refresh_listing();
console.log(data.result);
//$.each(data.result.files, function (index, file) {
// $('<p/>').text(file.name).appendTo(document.body);
//});
}
});
});