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)
|
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,8 +503,15 @@ Zotero.CollectionTreeCommandController.prototype.onEvent = function(evt)
|
||||||
*/
|
*/
|
||||||
Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
|
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;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Zotero.debug('Row is ' + row);
|
||||||
|
//Zotero.debug('Orient is ' + orient);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -529,9 +537,7 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
|
||||||
{
|
{
|
||||||
var rowCollection = this._getItemAtRow(row).ref; //the collection we are dragging over
|
var rowCollection = this._getItemAtRow(row).ref; //the collection we are dragging over
|
||||||
|
|
||||||
// TODO: Dragging URLs not yet supported
|
if (dataType == 'zotero/item') {
|
||||||
if (dataType == 'zotero/item' || dataType == "text/x-moz-url")
|
|
||||||
{
|
|
||||||
var ids = data.data.split(',');
|
var ids = data.data.split(',');
|
||||||
for each(var id in ids)
|
for each(var id in ids)
|
||||||
{
|
{
|
||||||
|
@ -549,6 +555,11 @@ Zotero.CollectionTreeView.prototype.canDrop = function(row, orient)
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else if (dataType == 'text/x-moz-url') {
|
||||||
|
if (!this._getItemAtRow(row).isSearch()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (dataType == 'zotero/collection'
|
else if (dataType == 'zotero/collection'
|
||||||
&& data.data != rowCollection.getID()
|
&& data.data != rowCollection.getID()
|
||||||
&& !Zotero.Collections.get(data.data).hasDescendent('collection', 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 data = dataSet.first.first;
|
||||||
var dataType = data.flavour.contentType;
|
var dataType = data.flavour.contentType;
|
||||||
|
|
||||||
|
if (!this.canDrop(row, orient)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if(dataType == 'zotero/collection')
|
if(dataType == 'zotero/collection')
|
||||||
{
|
{
|
||||||
var oldCount = this.rowCount;
|
|
||||||
|
|
||||||
var targetCollectionID;
|
var targetCollectionID;
|
||||||
if(this._getItemAtRow(row).isCollection())
|
if(this._getItemAtRow(row).isCollection())
|
||||||
targetCollectionID = this._getItemAtRow(row).ref.getID();
|
targetCollectionID = this._getItemAtRow(row).ref.getID();
|
||||||
|
@ -585,10 +598,8 @@ Zotero.CollectionTreeView.prototype.drop = function(row, orient)
|
||||||
this.selection.clearSelection();
|
this.selection.clearSelection();
|
||||||
this.selection.select(selectRow);
|
this.selection.select(selectRow);
|
||||||
this.selection.selectEventsSuppressed = false;
|
this.selection.selectEventsSuppressed = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(dataType == 'zotero/item' && this.canDrop(row, orient))
|
else if (dataType == 'zotero/item') {
|
||||||
{
|
|
||||||
var ids = data.data.split(',');
|
var ids = data.data.split(',');
|
||||||
var targetCollection = this._getItemAtRow(row).ref;
|
var targetCollection = this._getItemAtRow(row).ref;
|
||||||
for each(var id in ids)
|
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];
|
var url = data.data.split("\n")[0];
|
||||||
|
|
||||||
/* WAITING FOR INGESTER SUPPORT
|
if (this._getItemAtRow(row).isCollection()) {
|
||||||
var newItem = Zotero.Ingester.scrapeURL(url);
|
var parentCollectionID = this._getItemAtRow(row).ref.getID();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var parentCollectionID = false;
|
||||||
|
}
|
||||||
|
|
||||||
if(newItem)
|
Zotero.Attachments.importFromURL(url, false, false, parentCollectionID);
|
||||||
this._getItemAtRow(row).ref.addItem(newItem.getID());
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -631,10 +643,9 @@ Zotero.CollectionTreeView.prototype.onDragStart = function(evt,transferData,acti
|
||||||
Zotero.CollectionTreeView.prototype.getSupportedFlavours = function ()
|
Zotero.CollectionTreeView.prototype.getSupportedFlavours = function ()
|
||||||
{
|
{
|
||||||
var flavors = new FlavourSet();
|
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/collection");
|
||||||
|
flavors.appendFlavour("zotero/item");
|
||||||
|
flavors.appendFlavour("text/x-moz-url");
|
||||||
return flavors;
|
return flavors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -994,13 +994,16 @@ Zotero.ItemTreeView.prototype.getSupportedFlavours = function ()
|
||||||
{
|
{
|
||||||
var flavors = new FlavourSet();
|
var flavors = new FlavourSet();
|
||||||
flavors.appendFlavour("zotero/item");
|
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;
|
return flavors;
|
||||||
}
|
}
|
||||||
|
|
||||||
Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
||||||
{
|
{
|
||||||
|
if (row == -1 && orient == -1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var dataSet = nsTransferable.get(this.getSupportedFlavours(),
|
var dataSet = nsTransferable.get(this.getSupportedFlavours(),
|
||||||
|
@ -1017,11 +1020,15 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
||||||
|
|
||||||
var data = dataSet.first.first;
|
var data = dataSet.first.first;
|
||||||
var dataType = data.flavour.contentType;
|
var dataType = data.flavour.contentType;
|
||||||
var ids = data.data.split(','); // ids of rows we are dragging in
|
|
||||||
|
|
||||||
if (row==-1 && orient==-1)
|
switch (dataType) {
|
||||||
{
|
case 'zotero/item':
|
||||||
return true;
|
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
|
// workaround... two different services call canDrop
|
||||||
|
@ -1032,6 +1039,7 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
||||||
// If drag to different window
|
// If drag to different window
|
||||||
if (nsDragAndDrop.mDragSession.sourceNode!=row.target)
|
if (nsDragAndDrop.mDragSession.sourceNode!=row.target)
|
||||||
{
|
{
|
||||||
|
if (dataType == 'zotero/item') {
|
||||||
// Check if at least one item (or parent item for children) doesn't
|
// Check if at least one item (or parent item for children) doesn't
|
||||||
// already exist in target
|
// already exist in target
|
||||||
for each(var id in ids)
|
for each(var id in ids)
|
||||||
|
@ -1052,6 +1060,14 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (dataType == 'text/x-moz-url') {
|
||||||
|
if (this._itemGroup.isSearch()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1096,12 +1112,19 @@ Zotero.ItemTreeView.prototype.canDrop = function(row, orient)
|
||||||
|
|
||||||
return false;
|
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 true;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1129,8 +1152,11 @@ Zotero.ItemTreeView.prototype.drop = function(row, orient)
|
||||||
var data = dataSet.first.first;
|
var data = dataSet.first.first;
|
||||||
var dataType = data.flavour.contentType;
|
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
|
var ids = data.data.split(','); // ids of rows we are dragging in
|
||||||
|
|
||||||
// Dropped directly on a row
|
// 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,
|
// If item was a top-level item and it exists in a collection,
|
||||||
// replace it in collections with the parent item
|
// 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)
|
for each(var id in ids)
|
||||||
{
|
{
|
||||||
var item = Zotero.Items.get(id);
|
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];
|
var url = data.data.split("\n")[0];
|
||||||
|
|
||||||
/* WAITING FOR INGESTER SUPPORT
|
var sourceItemID = false;
|
||||||
var newItem = Zotero.Ingester.scrapeURL(url);
|
var parentCollectionID = false;
|
||||||
|
|
||||||
if(newItem)
|
if (orient == 0) {
|
||||||
this._getItemAtRow(row).ref.addItem(newItem.getID());
|
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