From 67b6ff22bc2db42b53723e86d33e34cc49503d3c Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 23 Jul 2012 01:15:20 +0200 Subject: [PATCH] Cache DOM lookups, general cleanup. --- apps/contacts/js/contacts.js | 245 +++++++++++++++++++---------------- 1 file changed, 132 insertions(+), 113 deletions(-) diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index f9b60a0e4f..4c6c8bf3d9 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -222,11 +222,7 @@ Contacts={ var item = $('.contacts li[data-id="'+Contacts.UI.Card.id+'"]').detach(); $(item).find('a').html(name); Contacts.UI.Card.fn = name; - Contacts.UI.Contacts.insertContact({ - contactlist:$('#contacts ul[data-id="'+Contacts.UI.Card.bookid+'"]'), - contacts:$('#contacts ul[data-id="'+Contacts.UI.Card.bookid+'"] li'), - contact:item, - }); + Contacts.UI.Contacts.insertContact({contact:item}); Contacts.UI.Contacts.scrollTo(Contacts.UI.Card.id); }); @@ -315,10 +311,11 @@ Contacts={ newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id')); } else if(parseInt(params.cid) && !parseInt(params.aid)) { newid = parseInt(params.cid); - var listitem = $('#contacts li[data-id="'+newid+'"]'); + var listitem = Contacts.UI.Contacts.getContact(newid); //$('#contacts li[data-id="'+newid+'"]'); console.log('Is contact in list? ' + listitem.length); if(listitem.length) { - bookid = parseInt($('#contacts li[data-id="'+newid+'"]').data('bookid')); + //bookid = parseInt($('#contacts li[data-id="'+newid+'"]').data('bookid')); + bookid = parseInt(Contacts.UI.Contacts.getContact(newid).data('bookid')); } else { // contact isn't in list yet. bookid = 'unknown'; } @@ -406,19 +403,7 @@ Contacts={ $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ if(jsondata.status == 'success'){ Contacts.UI.Card.loadContact(jsondata.data, aid); - $('#contacts .active').removeClass('active'); - var item = $('
  • '+Contacts.UI.Card.fn+'
  • '); - var added = false; - $('#contacts ul[data-id="'+aid+'"] li').each(function(){ - if ($(this).text().toLowerCase() > Contacts.UI.Card.fn.toLowerCase()) { - $(this).before(item).fadeIn('fast'); - added = true; - return false; - } - }); - if(!added) { - $('#contacts ul[data-id="'+aid+'"]').append(item); - } + var item = Contacts.UI.Contacts.insertContact({data:jsondata.data}); if(isnew) { // add some default properties Contacts.UI.Card.addProperty('EMAIL'); Contacts.UI.Card.addProperty('TEL'); @@ -455,9 +440,14 @@ Contacts={ } }, delayedDelete:function() { + /* TODO: + $(window).unload(function() { + deleteFilesInQueue(); + }); + */ $('#contacts_deletecard').tipsy('hide'); var newid = '', bookid; - var curlistitem = $('#contacts li[data-id="'+Contacts.UI.Card.id+'"]'); + var curlistitem = Contacts.UI.Contacts.getContact(this.id); curlistitem.removeClass('active'); var newlistitem = curlistitem.prev('li'); if(!newlistitem) { @@ -468,9 +458,12 @@ Contacts={ newid = newlistitem.data('id'); bookid = newlistitem.data('bookid'); } - $('#rightcontent').data('id',newid); - this.id = this.fn = this.fullname = this.shortname = this.famname = this.givname = this.addname = this.honpre = this.honsuf = ''; - this.data = undefined; + $('#rightcontent').data('id', newid); + + with(this) { + delete id; delete fn; delete fullname; delete shortname; delete famname; + delete givname; delete addname; delete honpre; delete honsuf; delete data; + } if($('.contacts li').length > 0) { Contacts.UI.Card.update({cid:newid, aid:bookid}); @@ -479,8 +472,7 @@ Contacts={ $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ if(jsondata.status == 'success'){ id = ''; - $('#rightcontent').data('id',''); - $('#rightcontent').html(jsondata.data.page); + $('#rightcontent').html(jsondata.data.page).removeData('id'); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); @@ -520,21 +512,22 @@ Contacts={ this.loadAddresses(); this.loadSingleProperties(); Contacts.UI.loadListHandlers(); + var note = $('#note'); if(this.data.NOTE) { - $('#note').data('checksum', this.data.NOTE[0]['checksum']); - var note = $('#note').find('textarea'); + note.data('checksum', this.data.NOTE[0]['checksum']); + var textarea = note.find('textarea'); var txt = this.data.NOTE[0]['value']; var nheight = txt.split('\n').length > 4 ? txt.split('\n').length+2 : 5; - note.css('min-height', nheight+'em'); - note.attr('rows', nheight); - note.val(txt); - $('#note').show(); - note.expandingTextarea(); + textarea.css('min-height', nheight+'em'); + textarea.attr('rows', nheight); + textarea.val(txt); + note.show(); + textarea.expandingTextarea(); $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide(); } else { - $('#note').data('checksum', ''); - $('#note').find('textarea').val(''); - $('#note').hide(); + note.removeData('checksum'); + note.find('textarea').val(''); + note.hide(); $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show(); } }, @@ -560,10 +553,11 @@ Contacts={ var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10)); value = $.datepicker.formatDate('dd-mm-yy', val); } - $('#contact_identity').find('#'+propname.toLowerCase()).val(value); - $('#contact_identity').find('#'+propname.toLowerCase()+'_value').data('checksum', checksum); - $('#contact_identity').find('#'+propname.toLowerCase()+'_label').show(); - $('#contact_identity').find('#'+propname.toLowerCase()+'_value').show(); + var identcontainer = $('#contact_identity'); + identcontainer.find('#'+propname.toLowerCase()).val(value); + identcontainer.find('#'+propname.toLowerCase()+'_value').data('checksum', checksum); + identcontainer.find('#'+propname.toLowerCase()+'_label').show(); + identcontainer.find('#'+propname.toLowerCase()+'_value').show(); } else { $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().show(); } @@ -767,17 +761,9 @@ Contacts={ }, addProperty:function(type){ switch (type) { - case 'PHOTO': - this.loadPhoto(true); - $('#file_upload_form').show(); - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - $('#file_upload_start').trigger('click'); - break; case 'NOTE': - $('#note').show(); $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - $('#note').find('textarea').expandingTextarea(); - $('#note').find('textarea').focus(); + $('#note').find('textarea').expandingTextarea().show().focus(); break; case 'EMAIL': if($('#emaillist>li').length == 1) { @@ -832,8 +818,7 @@ Contacts={ } } else { $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('dl dd[data-element="'+proptype+'"]').data('checksum', ''); - $('dl dd[data-element="'+proptype+'"]').find('input').val(''); + $('dl dd[data-element="'+proptype+'"]').data('checksum', '').find('input').val(''); } $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); Contacts.UI.loading(obj, false); @@ -860,14 +845,14 @@ Contacts={ } } }, - editName:function(){ + editName:function() { var params = {id: this.id}; /* Initialize the name edit dialog */ - if($('#edit_name_dialog').dialog('isOpen') == true){ + if($('#edit_name_dialog').dialog('isOpen') == true) { $('#edit_name_dialog').dialog('moveToTop'); - }else{ - $.getJSON(OC.filePath('contacts', 'ajax', 'editname.php'),{id: this.id},function(jsondata){ - if(jsondata.status == 'success'){ + } else { + $.getJSON(OC.filePath('contacts', 'ajax', 'editname.php'),{id: this.id},function(jsondata) { + if(jsondata.status == 'success') { $('body').append('
    '); $('#name_dialog').html(jsondata.data.page).find('#edit_name_dialog' ).dialog({ modal: true, @@ -939,10 +924,11 @@ Contacts={ loadAddresses:function(){ $('#addresses').hide(); $('#addressdisplay dl.propertycontainer').remove(); + var addresscontainer = $('#addressdisplay'); for(var adr in this.data.ADR) { - $('#addressdisplay dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); - $('#addressdisplay dl').last().removeClass('template').addClass('propertycontainer'); - $('#addressdisplay dl').last().data('checksum', this.data.ADR[adr]['checksum']); + addresscontainer.find('dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); + addresscontainer.find('dl').last().removeClass('template').addClass('propertycontainer'); + addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); var adrarray = this.data.ADR[adr]['value']; var adrtxt = ''; if(adrarray[0] && adrarray[0].length > 0) { @@ -954,7 +940,7 @@ Contacts={ if(adrarray[2] && adrarray[2].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[2].strip_tags() + '
  • '; } - if((adrarray[3] && adrarray[5]) && adrarray[3].length > 0 || adrarray[5].length > 0) { + if((3 in adrarray && 5 in adrarray) && adrarray[3].length > 0 || adrarray[5].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '
  • '; } if(adrarray[4] && adrarray[4].length > 0) { @@ -963,7 +949,7 @@ Contacts={ if(adrarray[6] && adrarray[6].length > 0) { adrtxt = adrtxt + '
  • ' + adrarray[6].strip_tags() + '
  • '; } - $('#addressdisplay dl').last().find('.addresslist').html(adrtxt); + addresscontainer.find('dl').last().find('.addresslist').html(adrtxt); var types = new Array(); var ttypes = new Array(); for(var param in this.data.ADR[adr]['parameters']) { @@ -972,12 +958,12 @@ Contacts={ ttypes.push(this.data.ADR[adr]['parameters'][param]); } } - $('#addressdisplay dl').last().find('.adr_type_label').text(types.join('/')); - $('#addressdisplay dl').last().find('.adr_type').val(ttypes.join(',')); - $('#addressdisplay dl').last().find('.adr').val(adrarray.join(';')); - $('#addressdisplay dl').last().data('checksum', this.data.ADR[adr]['checksum']); + addresscontainer.find('dl').last().find('.adr_type_label').text(types.join('/')); + addresscontainer.find('dl').last().find('.adr_type').val(ttypes.join(',')); + addresscontainer.find('dl').last().find('.adr').val(adrarray.join(';')); + addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); } - if($('#addressdisplay dl').length > 1) { + if(addresscontainer.find('dl').length > 1) { $('#addresses').show(); $('#contact_communication').show(); } @@ -1022,9 +1008,6 @@ Contacts={ close : function(event, ui) { $(this).dialog('destroy').remove(); $('#address_dialog').remove(); - if(isnew) { - container.remove(); - } }, open : function(event, ui) { $( "#adr_city" ).autocomplete({ @@ -1063,7 +1046,7 @@ Contacts={ $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); } }); - $( "#adr_country" ).autocomplete({ + $('#adr_country').autocomplete({ source: function( request, response ) { $.ajax({ url: "http://ws.geonames.org/searchJSON", @@ -1114,15 +1097,23 @@ Contacts={ saveAddress:function(dlg, obj, isnew){ if(isnew) { container = $('#addressdisplay dl').last(); - obj = $('#addressdisplay dl:last-child').find('input').first(); + obj = container.find('input').first(); } else { checksum = Contacts.UI.checksumFor(obj); container = Contacts.UI.propertyContainerFor(obj); } - var adr = new Array($(dlg).find('#adr_pobox').val().strip_tags(),$(dlg).find('#adr_extended').val().strip_tags(),$(dlg).find('#adr_street').val().strip_tags(),$(dlg).find('#adr_city').val().strip_tags(),$(dlg).find('#adr_region').val().strip_tags(),$(dlg).find('#adr_zipcode').val().strip_tags(),$(dlg).find('#adr_country').val().strip_tags()); - $(container).find('.adr').val(adr.join(';')); - $(container).find('.adr_type').val($(dlg).find('#adr_type').val()); - $(container).find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase()))); + var adr = new Array( + $(dlg).find('#adr_pobox').val().strip_tags(), + $(dlg).find('#adr_extended').val().strip_tags(), + $(dlg).find('#adr_street').val().strip_tags(), + $(dlg).find('#adr_city').val().strip_tags(), + $(dlg).find('#adr_region').val().strip_tags(), + $(dlg).find('#adr_zipcode').val().strip_tags(), + $(dlg).find('#adr_country').val().strip_tags() + ); + container.find('.adr').val(adr.join(';')); + container.find('.adr_type').val($(dlg).find('#adr_type').val()); + container.find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase()))); Contacts.UI.Card.saveProperty($(container).find('input').first()); var adrtxt = ''; if(adr[0].length > 0) { @@ -1143,7 +1134,7 @@ Contacts={ if(adr[6].length > 0) { adrtxt = adrtxt + '
  • ' + adr[6] + '
  • '; } - $(container).find('.addresslist').html(adrtxt); + container.find('.addresslist').html(adrtxt); }, uploadPhoto:function(filelist) { if(!filelist) { @@ -1170,24 +1161,25 @@ Contacts={ form.submit(); } }, - loadPhotoHandlers:function(){ - $('#phototools li a').tipsy('hide'); - $('#phototools li a').tipsy(); + loadPhotoHandlers:function() { + var phototools = $('#phototools'); + phototools.find('li a').tipsy('hide'); + phototools.find('li a').tipsy(); if(this.data.PHOTO) { - $('#phototools .delete').click(function() { + phototools.find('.delete').click(function() { $(this).tipsy('hide'); Contacts.UI.Card.deleteProperty($('#contacts_details_photo'), 'single'); $(this).hide(); }); - $('#phototools .edit').click(function() { + phototools.find('.edit').click(function() { $(this).tipsy('hide'); Contacts.UI.Card.editCurrentPhoto(); }); - $('#phototools .delete').show(); - $('#phototools .edit').show(); + phototools.find('.delete').show(); + phototools.find('.edit').show(); } else { - $('#phototools .delete').hide(); - $('#phototools .edit').hide(); + phototools.find('.delete').hide(); + phototools.find('.edit').hide(); } }, cloudPhotoSelected:function(path){ @@ -1219,6 +1211,7 @@ Contacts={ // notify the user that the image could not be loaded Contacts.UI.notify({message:t('contacts','Error loading profile picture.')}); }).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+self.id+refreshstr); + this.loadPhotoHandlers() }, editCurrentPhoto:function(){ $.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){ @@ -1272,10 +1265,11 @@ Contacts={ }, addMail:function() { //alert('addMail'); - $('#emaillist li.template:first-child').clone(true).appendTo($('#emaillist')).show().find('a .tip').tipsy(); - $('#emaillist li.template:last-child').find('select').addClass('contacts_property'); - $('#emaillist li.template:last-child').removeClass('template').addClass('propertycontainer'); - $('#emaillist li:last-child').find('input[type="email"]').focus(); + var emaillist = $('#emaillist'); + emaillist.find('li.template:first-child').clone(true).appendTo(emaillist).show().find('a .tip').tipsy(); + emaillist.find('li.template:last-child').find('select').addClass('contacts_property'); + emaillist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); + emaillist.find('li:last-child').find('input[type="email"]').focus(); return false; }, loadMails:function() { @@ -1311,35 +1305,37 @@ Contacts={ return false; }, addPhone:function() { - $('#phonelist li.template:first-child').clone(true).appendTo($('#phonelist')); //.show(); - $('#phonelist li.template:last-child').find('select').addClass('contacts_property'); - $('#phonelist li.template:last-child').removeClass('template').addClass('propertycontainer'); - $('#phonelist li:last-child').find('input[type="text"]').focus(); - $('#phonelist li:last-child').find('select').multiselect({ + var phonelist = $('#phonelist'); + phonelist.find('li.template:first-child').clone(true).appendTo(phonelist); //.show(); + phonelist.find('li.template:last-child').find('select').addClass('contacts_property'); + phonelist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); + phonelist.find('li:last-child').find('input[type="text"]').focus(); + phonelist.find('li:last-child').find('select').multiselect({ noneSelectedText: t('contacts', 'Select type'), header: false, selectedList: 4, classes: 'typelist' }); - $('#phonelist li:last-child').show(); + phonelist.find('li:last-child').show(); return false; }, loadPhones:function() { $('#phones').hide(); $('#phonelist li.propertycontainer').remove(); + var phonelist = $('#phonelist'); for(var phone in this.data.TEL) { this.addPhone(); - $('#phonelist li:last-child').find('select').multiselect('destroy'); - $('#phonelist li:last-child').data('checksum', this.data.TEL[phone]['checksum']) - $('#phonelist li:last-child').find('input[type="text"]').val(this.data.TEL[phone]['value']); + phonelist.find('li:last-child').find('select').multiselect('destroy'); + phonelist.find('li:last-child').data('checksum', this.data.TEL[phone]['checksum']) + phonelist.find('li:last-child').find('input[type="text"]').val(this.data.TEL[phone]['value']); for(var param in this.data.TEL[phone]['parameters']) { if(param.toUpperCase() == 'PREF') { - $('#phonelist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); + phonelist.find('li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); } else if(param.toUpperCase() == 'TYPE') { for(ptype in this.data.TEL[phone]['parameters'][param]) { var pt = this.data.TEL[phone]['parameters'][param][ptype]; - $('#phonelist li:last-child').find('select option').each(function(){ + phonelist.find('li:last-child').find('select option').each(function(){ //if ($(this).val().toUpperCase() == pt.toUpperCase()) { if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) { $(this).attr('selected', 'selected'); @@ -1348,14 +1344,14 @@ Contacts={ } } } - $('#phonelist li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); + phonelist.find('li:last-child').find('select').multiselect({ + noneSelectedText: t('contacts', 'Select type'), + header: false, + selectedList: 4, + classes: 'typelist' + }); } - if($('#phonelist li').length > 1) { + if(phonelist.find('li').length > 1) { $('#phones').show(); $('#contact_communication').show(); } @@ -1480,7 +1476,25 @@ Contacts={ } }, Contacts:{ + contacts:{}, batchnum:50, + getContact:function(id) { + if(!this.contacts[id]) { + this.contacts[id] = $('#contacts li[data-id="'+id+'"]'); + if(!this.contacts[id]) { + self = this; + $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ + if(jsondata.status == 'success'){ + self.contacts[id] = self.insertContact({data:jsondata.data}); + } + else{ + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + } + } + return this.contacts[id]; + }, drop:function(event, ui) { var dragitem = ui.draggable, droptarget = $(this); if(dragitem.is('li')) { @@ -1519,13 +1533,16 @@ Contacts={ * If 'contactlist' or 'contacts' aren't defined they will be search for based in the properties in 'data'. */ insertContact:function(params) { + var id, bookid; if(!params.contactlist) { // FIXME: Check if contact really exists. - var bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); + bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); + id = params.data ? params.data.id : params.contact.data('id'); params.contactlist = $('#contacts ul[data-id="'+bookid+'"]'); } if(!params.contacts) { - var bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); + bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); + id = params.data ? params.data.id : params.contact.data('id'); params.contacts = $('#contacts ul[data-id="'+bookid+'"] li'); } var contact = params.data @@ -1545,6 +1562,7 @@ Contacts={ if(!added || !params.contacts) { params.contactlist.append(contact); } + //this.contacts[id] = contact; return contact; }, next:function(reverse) { @@ -1991,14 +2009,15 @@ $(document).ready(function(){ $('#selectaddressbook_dialog').dialog('moveToTop'); } else { $('#dialog_holder').html(jsondata.data.page).ready(function($) { - $('#selectaddressbook_dialog').dialog({ + var select_dlg = $('#selectaddressbook_dialog'); + select_dlg.dialog({ modal: true, height: 'auto', width: 'auto', buttons: { 'Ok':function() { - aid = $('#selectaddressbook_dialog').find('input:checked').val(); + aid = select_dlg.find('input:checked').val(); if(aid == 'new') { - var displayname = $('#selectaddressbook_dialog').find('input.name').val(); - var description = $('#selectaddressbook_dialog').find('input.desc').val(); + var displayname = select_dlg.find('input.name').val(); + var description = select_dlg.find('input.desc').val(); if(!displayname.trim()) { OC.dialogs.alert(t('contacts', 'The address book name cannot be empty.'), t('contacts', 'Error')); return false;