annotate noderef_view.js @ 8:1f9c278126f9

Don't put the value twice in autocomplete fields.
author Franck Deroche <franck@defr.org>
date Tue, 27 Jan 2009 11:55:21 +0100
parents 281e131cb6c3
children b942365b70eb
rev   line source
franck@4 1 // vim: set ts=2 sw=2 expandtab:
franck@0 2 /**
franck@0 3 * Attach the noderef_view behavior.
franck@0 4 */
franck@0 5 Drupal.behaviors.noderef_view = function(context) {
franck@6 6 $('.noderef-view-wrapper div[id$="-wrapper"]:first-child').addClass('noderef-view-items');
franck@0 7 $('.noderef_view_link', context).each(function(i, obj) {
franck@0 8 $(obj).addClass('noderef_view_link_processed').click(function() {
franck@0 9 // Get the wrapper
franck@7 10 var wrapper = $(this)
franck@7 11 .parent()
franck@7 12 .find('.noderef-view-items')
franck@7 13 .filter(':first');
franck@7 14 var element = $(this);
franck@0 15
franck@4 16 // Hide existing "No space left" message
franck@7 17 $('div.noderef_outofspace', element.parent()).fadeOut();
franck@4 18
franck@0 19 // Suppress behavior if it was previsously attached
franck@0 20 $(document).unbind('popups_form_success.noderef_view');
franck@0 21
franck@0 22 // And now bind it. This code will be executed after successful
franck@0 23 // completion of the popup select form
franck@0 24 $(document).bind('popups_form_success.noderef_view', function() {
franck@4 25 var selection = noderef_view_get_selection(), left = [];
franck@0 26 for(nid in selection) {
franck@4 27 count = 0;
franck@8 28 // Let's compute the potential value for autocomplete fields
franck@8 29 acvalue = selection[nid] +' [nid:'+ nid +']';
franck@0 30 // Autocomplete field
franck@8 31 count += $('input.form-autocomplete[value="'+ acvalue +'"], input.form-autocomplete:not([value])', wrapper)
franck@0 32 .filter(':first')
franck@8 33 .val(acvalue)
franck@4 34 .length;
franck@4 35 // Select field (exclude the weight of autocomplete fields)
franck@4 36 count += $('select:not([id$="--weight"])', wrapper).val(nid).length;
franck@0 37 // Radio field
franck@4 38 count += $('input:radio[value='+ nid + '], input:checkbox[value='+ nid +']', wrapper)
franck@4 39 .attr('checked', 'checked')
franck@4 40 .length;
franck@4 41 if (count == 0) {
franck@4 42 left.push(selection[nid]);
franck@4 43 }
franck@4 44 }
franck@4 45 if (left.length) {
franck@4 46 message = Drupal.t('No space left for value(s): @titles',
franck@4 47 { '@titles': left.join(', ')});
franck@7 48 text = $('<br /><div>'+ message + '<div>')
franck@7 49 .css('display', 'inline')
franck@7 50 .addClass('warning')
franck@7 51 .addClass('noderef_outofspace');
franck@7 52 element.after(text);
franck@0 53 }
franck@0 54 });
franck@0 55 });
franck@0 56 });
franck@0 57 }
franck@0 58
franck@0 59 /**
franck@0 60 * Helper function to extract the references values
franck@0 61 */
franck@0 62 function noderef_view_get_selection() {
franck@0 63 var cookies = document.cookie.split(';'), selection = {};
franck@0 64 for(var i = 0; i < cookies.length; i++) {
franck@0 65 var cookie = $.trim(cookies[i]).split('=');
franck@0 66 if (cookie[0].indexOf('noderef[') == 0) {
franck@0 67 var nid = cookie[0].replace(/noderef\[(\d+)\]/, "$1");
franck@0 68 var title = decodeURIComponent(cookie[1]);
franck@0 69 selection[nid] = title;
franck@0 70 }
franck@0 71 }
franck@0 72 return selection;
franck@0 73 }