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();