Closes #142, Dragging a URL over an item in the Zotero pane should create an attachment
Can drag links, images, or the favicon of the current page Also allows dragging over collections and item pane whitespace to create standalone attachments, but if we want to allow that at all, it would probably be better to create new webpage items with snapshot items (like Create New Item from Current Page) instead.
This commit is contained in:
parent
a1485213e4
commit
42f2b56bb4
|
@ -424,7 +424,8 @@ Zotero.CollectionTreeView.prototype.deleteSelection = function()
|
|||
*/
|
||||
Zotero.CollectionTreeView.prototype._showItem = function(itemGroup, level, beforeRow)
|
||||
{
|
||||
this._dataItems.splice(beforeRow, 0, [itemGroup, false, level]); this.rowCount++;
|
||||
this._dataItems.splice(beforeRow, 0, [itemGroup, false, level]);
|
||||
this.rowCount++;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -502,9 +503,16 @@ Zotero.CollectionTreeCommandController.prototype.onEvent = function(evt)
|
|||
*/
|
||||
Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
|
||||
{
|
||||
if(typeof row == 'object') //workaround... two different services call canDrop (nsDragAndDrop, and the tree)
|
||||
// workaround... two different services call canDrop
|
||||
// (nsDragAndDrop, and the tree) -- this is for the former,
|
||||
// used when dragging between windows
|
||||
if (typeof row == 'object') {
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
//Zotero.debug('Row is ' + row);
|
||||
//Zotero.debug('Orient is ' + orient);
|
||||
|
||||
try
|
||||
{
|
||||
var dataSet = nsTransferable.get(this.getSupportedFlavours(),nsDragAndDrop.getDragData, true);
|
||||
|
@ -529,9 +537,7 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
|
|||
{
|
||||
var rowCollection = this._getItemAtRow(row).ref; //the collection we are dragging over
|
||||
|
||||
// TODO: Dragging URLs not yet supported
|
||||
if (dataType == 'zotero/item' || dataType == "text/x-moz-url")
|
||||
{
|
||||
if (dataType == 'zotero/item') {
|
||||
var ids = data.data.split(',');
|
||||
for each(var id in ids)
|
||||
{
|
||||
|
@ -549,6 +555,11 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
|
|||
}
|
||||
return false;
|
||||
}
|
||||
else if (dataType == 'text/x-moz-url') {
|
||||
if (!this._getItemAtRow(row).isSearch()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (dataType == 'zotero/collection'
|
||||
&& data.data != rowCollection.getID()
|
||||
&& !Zotero.Collections.get(data.data).hasDescendent('collection', rowCollection.getID())) {
|
||||
|
@ -567,10 +578,12 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient)
|
|||
var data = dataSet.first.first;
|
||||
var dataType = data.flavour.contentType;
|
||||
|
||||
if (!this.canDrop(row, orient)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(dataType == 'zotero/collection')
|
||||
{
|
||||
var oldCount = this.rowCount;
|
||||
|
||||
var targetCollectionID;
|
||||
if(this._getItemAtRow(row).isCollection())
|
||||
targetCollectionID = this._getItemAtRow(row).ref.getID();
|
||||
|
@ -585,10 +598,8 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient)
|
|||
this.selection.clearSelection();
|
||||
this.selection.select(selectRow);
|
||||
this.selection.selectEventsSuppressed = false;
|
||||
|
||||
}
|
||||
else if(dataType == 'zotero/item' && this.canDrop(row, orient))
|
||||
{
|
||||
else if (dataType == 'zotero/item') {
|
||||
var ids = data.data.split(',');
|
||||
var targetCollection = this._getItemAtRow(row).ref;
|
||||
for each(var id in ids)
|
||||
|
@ -601,16 +612,17 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if(dataType == 'text/x-moz-url' && this.canDrop(row, orient))
|
||||
{
|
||||
else if (dataType == 'text/x-moz-url') {
|
||||
var url = data.data.split("\n")[0];
|
||||
|
||||
/* WAITING FOR INGESTER SUPPORT
|
||||
var newItem = Zotero.Ingester.scrapeURL(url);
|
||||
if (this._getItemAtRow(row).isCollection()) {
|
||||
var parentCollectionID = this._getItemAtRow(row).ref.getID();
|
||||
}
|
||||
else {
|
||||
var parentCollectionID = false;
|
||||
}
|
||||
|
||||
if(newItem)
|
||||
this._getItemAtRow(row).ref.addItem(newItem.getID());
|
||||
*/
|
||||
Zotero.Attachments.importFromURL(url, false, false, parentCollectionID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -631,10 +643,9 @@ Zotero.CollectionTreeView.prototype.onDragStart = function(evt,transferData,acti
|
|||
Zotero.CollectionTreeView.prototype.getSupportedFlavours = function ()
|
||||
{
|
||||
var flavors = new FlavourSet();
|
||||
// TODO: Dragging of URLs not yet supported
|
||||
//flavors.appendFlavour("text/x-moz-url");
|
||||
flavors.appendFlavour("zotero/item");
|
||||
flavors.appendFlavour("zotero/collection");
|
||||
flavors.appendFlavour("zotero/item");
|
||||
flavors.appendFlavour("text/x-moz-url");
|
||||
return flavors;
|
||||
}
|
||||
|
||||
|
|
|
@ -994,13 +994,16 @@ Zotero.ItemTreeView.prototype.getSupportedFlavours = function ()
|
|||
{
|
||||
var flavors = new FlavourSet();
|
||||
flavors.appendFlavour("zotero/item");
|
||||
// TODO: Dragging of URLs not yet supported
|
||||
//flavors.appendFlavour("text/x-moz-url");
|
||||
flavors.appendFlavour("text/x-moz-url");
|
||||
return flavors;
|
||||
}
|
||||
|
||||
Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
||||
{
|
||||
if (row == -1 && orient == -1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var dataSet = nsTransferable.get(this.getSupportedFlavours(),
|
||||
|
@ -1017,11 +1020,15 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
|||
|
||||
var data = dataSet.first.first;
|
||||
var dataType = data.flavour.contentType;
|
||||
var ids = data.data.split(','); // ids of rows we are dragging in
|
||||
|
||||
if (row==-1 && orient==-1)
|
||||
{
|
||||
return true;
|
||||
switch (dataType) {
|
||||
case 'zotero/item':
|
||||
var ids = data.data.split(','); // ids of rows we are dragging in
|
||||
break;
|
||||
|
||||
case 'text/x-moz-url':
|
||||
var url = data.data.split("\n")[0];
|
||||
break;
|
||||
}
|
||||
|
||||
// workaround... two different services call canDrop
|
||||
|
@ -1032,24 +1039,33 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
|||
// If drag to different window
|
||||
if (nsDragAndDrop.mDragSession.sourceNode!=row.target)
|
||||
{
|
||||
// Check if at least one item (or parent item for children) doesn't
|
||||
// already exist in target
|
||||
for each(var id in ids)
|
||||
{
|
||||
var item = Zotero.Items.get(id);
|
||||
if (dataType == 'zotero/item') {
|
||||
// Check if at least one item (or parent item for children) doesn't
|
||||
// already exist in target
|
||||
for each(var id in ids)
|
||||
{
|
||||
var item = Zotero.Items.get(id);
|
||||
|
||||
// Skip non-top-level items
|
||||
if (!item.isRegularItem() && item.getSource())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// DISABLED: move parent on child drag
|
||||
//var source = item.isRegularItem() ? false : item.getSource();
|
||||
//if (!this._itemGroup.ref.hasItem(source ? source : id))
|
||||
if (this._itemGroup.ref && !this._itemGroup.ref.hasItem(id))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (dataType == 'text/x-moz-url') {
|
||||
if (this._itemGroup.isSearch()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Skip non-top-level items
|
||||
if (!item.isRegularItem() && item.getSource())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// DISABLED: move parent on child drag
|
||||
//var source = item.isRegularItem() ? false : item.getSource();
|
||||
//if (!this._itemGroup.ref.hasItem(source ? source : id))
|
||||
if (this._itemGroup.ref && !this._itemGroup.ref.hasItem(id))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1096,12 +1112,19 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
|||
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
else if (dataType == "text/x-moz-url")
|
||||
{
|
||||
else if (dataType == "text/x-moz-url") {
|
||||
// Disallow direct drop on a non-regular item (e.g. note)
|
||||
if (orient == 0) {
|
||||
if (!rowItem.isRegularItem()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (this._itemGroup.isSearch()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
*/
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -1129,8 +1152,11 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient)
|
|||
var data = dataSet.first.first;
|
||||
var dataType = data.flavour.contentType;
|
||||
|
||||
if (dataType == 'zotero/item' && this.canDrop(row, orient))
|
||||
{
|
||||
if (!this.canDrop(row, orient)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dataType == 'zotero/item') {
|
||||
var ids = data.data.split(','); // ids of rows we are dragging in
|
||||
|
||||
// Dropped directly on a row
|
||||
|
@ -1138,7 +1164,7 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient)
|
|||
{
|
||||
// If item was a top-level item and it exists in a collection,
|
||||
// replace it in collections with the parent item
|
||||
rowItem = this._getItemAtRow(row).ref; // the item we are dragging over
|
||||
var rowItem = this._getItemAtRow(row).ref; // the item we are dragging over
|
||||
for each(var id in ids)
|
||||
{
|
||||
var item = Zotero.Items.get(id);
|
||||
|
@ -1184,16 +1210,21 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (dataType == 'text/x-moz-url' && this.canDrop(row, orient))
|
||||
{
|
||||
else if (dataType == 'text/x-moz-url') {
|
||||
var url = data.data.split("\n")[0];
|
||||
|
||||
/* WAITING FOR INGESTER SUPPORT
|
||||
var newItem = Zotero.Ingester.scrapeURL(url);
|
||||
var sourceItemID = false;
|
||||
var parentCollectionID = false;
|
||||
|
||||
if(newItem)
|
||||
this._getItemAtRow(row).ref.addItem(newItem.getID());
|
||||
*/
|
||||
if (orient == 0) {
|
||||
var rowItem = this._getItemAtRow(row).ref;
|
||||
sourceItemID = rowItem.getID()
|
||||
}
|
||||
else if (this._itemGroup.isCollection()) {
|
||||
var parentCollectionID = this._itemGroup.ref.getID();
|
||||
}
|
||||
|
||||
Zotero.Attachments.importFromURL(url, sourceItemID, false, parentCollectionID);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user