diff --git a/modules/collections.xql b/modules/collections.xql
index 14bfe96a..55c3d941 100755
--- a/modules/collections.xql
+++ b/modules/collections.xql
@@ -249,19 +249,30 @@ declare function local:delete($collection as xs:string, $selection as xs:string+
$response
};
-declare function local:copy($target as xs:string, $sources as xs:string+, $user as xs:string) {
+declare function local:copyOrMove($operation as xs:string, $target as xs:string, $sources as xs:string+,
+ $user as xs:string) {
if (local:canWrite($target, $user)) then
for $source in $sources
let $isCollection := xmldb:collection-available($source)
return
try {
if ($isCollection) then
- let $null := xmldb:copy($source, $target)
+ let $null :=
+ switch ($operation)
+ case "move" return
+ xmldb:move($source, $target)
+ default return
+ xmldb:copy($source, $target)
return
else
let $split := text:groups($source, "^(.*)/([^/]+)$")
- let $null := xmldb:copy($split[2], $target, $split[3])
+ let $null :=
+ switch ($operation)
+ case "move" return
+ xmldb:move($split[2], $target, $split[3])
+ default return
+ xmldb:copy($split[2], $target, $split[3])
return
} catch * {
@@ -278,6 +289,7 @@ declare function local:copy($target as xs:string, $sources as xs:string+, $user
let $deleteCollection := request:get-parameter("remove", ())
let $deleteResource := request:get-parameter("remove[]", ())
let $copy := request:get-parameter("copy[]", ())
+let $move := request:get-parameter("move[]", ())
let $createCollection := request:get-parameter("create", ())
let $view := request:get-parameter("view", "c")
let $collection := request:get-parameter("root", "/db")
@@ -285,7 +297,13 @@ let $collName := replace($collection, "^.*/([^/]+$)", "$1")
let $user := if (session:get-attribute('myapp.user')) then session:get-attribute('myapp.user') else "guest"
return
if (exists($copy)) then
- local:copy(xmldb:encode-uri($collection), $copy, $user)
+ let $result := local:copyOrMove("copy", xmldb:encode-uri($collection), $copy, $user)
+ return
+ ($result[@status = "fail"], $result[1])[1]
+ else if (exists($move)) then
+ let $result := local:copyOrMove("move", xmldb:encode-uri($collection), $move, $user)
+ return
+ ($result[@status = "fail"], $result[1])[1]
else if (exists($deleteResource)) then
local:delete(xmldb:encode-uri($collection), $deleteResource, $user)
else if ($createCollection) then
diff --git a/resources/images/cut.png b/resources/images/cut.png
new file mode 100644
index 00000000..f215d6f6
Binary files /dev/null and b/resources/images/cut.png differ
diff --git a/src/eXide.js b/src/eXide.js
index 359fc376..d875d85d 100644
--- a/src/eXide.js
+++ b/src/eXide.js
@@ -385,7 +385,7 @@ eXide.app = (function() {
manage: function() {
eXide.app.requireLogin(function() {
- dbBrowser.reload(["reload", "create", "upload", "open", "copy", "paste"], "manage");
+ dbBrowser.reload(["reload", "create", "upload", "open", "cut", "copy", "paste"], "manage");
$("#open-dialog").dialog("option", "title", "DB Manager");
$("#open-dialog").dialog("option", "buttons", {
"Close": function() { $(this).dialog("close"); }
diff --git a/src/resources.js b/src/resources.js
index cdadd47c..4a0a15d7 100644
--- a/src/resources.js
+++ b/src/resources.js
@@ -179,6 +179,7 @@ eXide.browse.ResourceBrowser = (function () {
var $this = this;
this.container = $(container);
this.clipboard = [];
+ this.clipboardMode = "copy";
this.events = {
"activate": [],
"activateCollection": [],
@@ -192,9 +193,12 @@ eXide.browse.ResourceBrowser = (function () {
this.grid.setSelectionModel(selectionModel);
selectionModel.onSelectedRangesChanged.subscribe(function(e, args) {
var rows = selectionModel.getSelectedRows();
+ if ($this.data.length == 0) {
+ return;
+ }
var enableWrite = true;
for (var i = 0; i < rows.length; i++) {
- if (!$this.data[rows[i]].writable) {
+ if ($this.data.length > rows[i] && !$this.data[rows[i]].writable) {
enableWrite = false;
break;
}
@@ -343,6 +347,11 @@ eXide.browse.ResourceBrowser = (function () {
});
},
+ cut: function() {
+ this.clipboardMode = "move";
+ this.copy();
+ },
+
copy: function() {
var selected = this.grid.getSelectionModel().getSelectedRows();
this.clipboard = [];
@@ -359,10 +368,9 @@ eXide.browse.ResourceBrowser = (function () {
paste: function() {
var $this = this;
$.log("Copying resources %o to %s", this.clipboard, this.collection);
- $.getJSON("modules/collections.xql", {
- copy: this.clipboard,
- root: this.collection
- },
+ var params = { root: this.collection };
+ params[this.clipboardMode] = this.clipboard;
+ $.getJSON("modules/collections.xql", params,
function (data) {
$.log(data.status);
if (data.status == "fail") {
@@ -524,7 +532,8 @@ eXide.browse.Browser = (function () {
});
button = createButton(toolbar, "Copy", "copy", 7, "page_copy.png");
- button = createButton(toolbar, "Paste", "paste", 8, "page_paste.png");
+ button = createButton(toolbar, "Cut", "cut", 8, "cut.png");
+ button = createButton(toolbar, "Paste", "paste", 9, "page_paste.png");
this.selection = $(".eXide-browse-form input", container);
this.container = container;
@@ -548,6 +557,10 @@ eXide.browse.Browser = (function () {
ev.preventDefault();
$this.resources.copy();
});
+ $("#eXide-browse-toolbar-cut").click(function (ev) {
+ ev.preventDefault();
+ $this.resources.cut();
+ });
$("#eXide-browse-toolbar-paste").click(function (ev) {
ev.preventDefault();
$this.resources.paste();