Ticket #1278: 01-allow-duplicate-entries-in-multiple.patch

File 01-allow-duplicate-entries-in-multiple.patch, 6.1 KB (added by fbennett, 8 years ago)
  • chrome/content/zotero/addCitationDialog.js

    diff -r -u zotero-trunk.orig/chrome/content/zotero/addCitationDialog.js zotero-trunk/chrome/content/zotero/addCitationDialog.js
    old new  
    5454        this.cancel = cancel; 
    5555         
    5656        /* 
     57         * To generate unique keys for items in multi-cite list 
     58         */ 
     59        function multiKey(itemID, pos) { 
     60                return itemID + '::' + pos; 
     61        } 
     62 
     63        /* 
    5764         * initialize add citation dialog 
    5865         */ 
    5966        function load() { 
     
    119126                                        var item = Zotero.Items.get(io.citation.citationItems[i].itemID); 
    120127                                        if(item) { 
    121128                                                _addItem(item); 
    122                                                 _itemData[io.citation.citationItems[i].itemID] = io.citation.citationItems[i]; 
     129                                                _itemData[ multiKey(io.citation.citationItems[i].itemID,i) ] = io.citation.citationItems[i]; 
    123130                                        } 
    124131                                } 
    125132                        } 
     
    151158                if(_multipleSourcesOn) { 
    152159                        var items = itemsView.getSelectedItems(true); 
    153160                        var itemID = (items.length ? items[0] : false); 
    154                         // var itemDataID = itemID+"::"+0; 
     161                        var itemDataID = multiKey(itemID,0); 
    155162                        document.getElementById("multiple-sources").hidden = undefined; 
    156163                        document.getElementById("zotero-add-citation-dialog").width = "750"; 
    157                         document.getElementById("multiple-sources-button").label = Zotero.getString("citation.singleSource");                    
    158                         // move user field content to multiple before adding XXXXX 
     164                        document.getElementById("multiple-sources-button").label = Zotero.getString("citation.singleSource"); 
    159165                        if (itemID) { 
    160                             // _itemData[itemDataID] = new Object(); 
    161                             _itemData[itemID] = new Object(); 
     166                            _itemData[itemDataID] = new Object(); 
    162167                            for (box in _preserveData) { 
    163168                                element = document.getElementById(box); 
    164                                 // _itemData[itemDataID][box] = element[_preserveData[box]]; 
    165                                 _itemData[itemID][box] = element[_preserveData[box]]; 
     169                                _itemData[itemDataID][box] = element[_preserveData[box]]; 
    166170                            } 
    167171                        } 
    168172                        window.sizeToContent(); 
     
    170174                        treeItemSelected(); 
    171175                        // disable adding info until citation added 
    172176                        _itemSelected(false); 
    173                         // add current selection 
    174177                        if (itemID) { 
    175178                            this.add(); 
    176179                        } else { 
     
    217220                        // disable boxes if item not added; otherwise, enable 
    218221                        _itemSelected(hasBeenAdded ? itemID : false); 
    219222                        // disable adding nothing, or things already added 
    220                         document.getElementById("add").disabled = !itemID || hasBeenAdded; 
     223                        document.getElementById("add").disabled = !itemID; 
     224                        document.getElementById("remove").disabled = true; 
     225                        pos = document.getElementById("citation-list").childNodes.length; 
    221226                } else { 
    222227                        _updateAccept(); 
    223228                        _updatePreview(); 
     
    230235        function listItemSelected() { 
    231236                var selectedListItem = document.getElementById("citation-list").getSelectedItem(0); 
    232237                var itemID = (selectedListItem ? selectedListItem.value : false); 
    233                 _itemSelected(itemID); 
     238                var pos = selectedListItem.parentNode.selectedIndex; 
     239                _itemSelected(itemID,pos); 
    234240                 
    235241                document.getElementById("remove").disabled = !itemID; 
     242                document.getElementById("add").disabled = true; 
    236243        } 
    237244         
    238245        /* 
     
    240247         */ 
    241248        function add() { 
    242249                var item = itemsView.getSelectedItems()[0]; // treeview from selectItemsDialog.js 
    243                 _itemSelected(item.getID()); 
     250                var citation_list = document.getElementById("citation-list"); 
     251                var pos = citation_list.childNodes.length; 
    244252                _addItem(item); 
     253                _itemSelected(item.getID(), pos); 
    245254                 
    246255                // don't let someone select it again 
    247                 document.getElementById("add").disabled = true; 
     256                document.getElementById("add").disabled = false; 
    248257                 
    249258                // allow user to press OK 
    250259                _updateAccept(); 
     
    260269                var selectedListItem = citationList.getSelectedItem(0); 
    261270                var itemID = selectedListItem.value; 
    262271                 
     272                var itemParent = selectedListItem.parentNode; 
     273                var pos = itemParent.selectedIndex; 
     274                var itemFamily = itemParent.childNodes; 
     275                var itemDataID = multiKey(itemID,pos); 
     276 
    263277                // remove from _itemData 
    264                 delete _itemData[itemID]; 
    265                 _itemData[itemID] = undefined; 
     278                delete _itemData[itemDataID]; 
     279                _itemData[itemDataID] = undefined; 
    266280                _lastSelected = null; 
    267281                 
     282                // renumber in _itemData 
     283                for (i = pos+1; i < itemFamily.length; i++) { 
     284                    var oldID = multiKey(itemFamily.item(i).value,i); 
     285                    var newID = multiKey(itemFamily.item(i).value,pos); 
     286                    _itemData[newID] = _itemData[oldID]; 
     287                    delete _itemData[oldID]; 
     288                    pos++; 
     289                } 
     290 
    268291                // re-select currently selected in left pane 
    269292                var itemIDs = itemsView.getSelectedItems(true); // treeview from selectItemsDialog.js 
    270293                if(itemIDs.length) { 
     
    429452         * called when an item is selected; if itemID is false, disables fields; if 
    430453         * itemID is undefined, only updates _itemData array 
    431454         */ 
    432         function _itemSelected(itemID) { 
     455        function _itemSelected(itemID,pos) { 
     456                var itemDataID = (itemID ? multiKey(itemID,pos) : undefined); 
    433457                if(_lastSelected && !_itemData[_lastSelected]) { 
    434458                        _itemData[_lastSelected] = new Object(); 
    435459                } 
     
    449473                        // restore previous property 
    450474                        if(itemID) { 
    451475                                domBox.disabled = false; 
    452                                 if(_itemData[itemID] && _itemData[itemID][box] !== undefined) { 
     476                                if(_itemData[itemDataID] && _itemData[itemDataID][box] !== undefined) { 
    453477                                        if(property == "locatorType") { 
    454                                                 domBox[property] = _locatorIndexArray[_itemData[itemID][box]]; 
     478                                                domBox[property] = _locatorIndexArray[_itemData[itemDataID][box]]; 
    455479                                        } else { 
    456                                                 domBox[property] = _itemData[itemID][box]; 
     480                                                domBox[property] = _itemData[itemDataID][box]; 
    457481                                        } 
     482                                } else { 
     483                                    domBox[property] = ""; 
    458484                                } 
    459485                        } else if(itemID !== undefined) { 
    460486                                domBox.disabled = true; 
    461487                                domBox[property] = ""; 
    462488                        } 
    463489                } 
    464                  
    465                 if(itemID !== undefined) _lastSelected = itemID; 
     490                if(itemID !== undefined) _lastSelected = itemDataID; 
    466491        } 
    467492         
    468493        /* 
     
    484509                                // generate citationItems 
    485510                                for(var i=0; i<listLength; i++) { 
    486511                                        var itemID = citationList.childNodes[i].value; 
     512                                        var itemDataID = multiKey(itemID,i); 
    487513                                         
    488                                         var citationItem = _itemData[itemID]; 
     514                                        var citationItem = _itemData[itemDataID]; 
    489515                                        citationItem.itemID = itemID; 
    490516                                        io.citation.citationItems.push(citationItem); 
    491517                                }