Changeset 16518

Show
Ignore:
Timestamp:
06/01/08 11:09:28 (4 months ago)
Author:
adrenalin
Message:

Chooser widget results are now sortable (widget_config key 'sortable'
=> true). This doesn't yet save anything and saving the results needs to be
implemented in storage.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/midcom/midcom.helper.datamanager2/static/chooser/jquery.chooser_widget.css

    r14455 r16518  
    137137} 
    138138 
     139ul.chooser_widget_results.ui-sortable .chooser_widget_item_part_status 
     140{ 
     141    margin-right: 23px; 
     142    margin-left: -30px; 
     143} 
     144 
    139145.chooser_widget_result_item_active 
    140146{ 
     
    178184    background : url('../../stock-icons/16x16/approved_fade_50.png') center center no-repeat; 
    179185} 
     186 
     187ul.chooser_widget_results.ui-sortable .chooser_widget_results_item_dragger 
     188{ 
     189    width: 20px; 
     190    height: 22px; 
     191    margin-left: -20px; 
     192    float: left; 
     193    cursor: move; 
     194} 
     195 
     196ul.chooser_widget_headers.ui-sortable 
     197{ 
     198    background : url('../../stock-icons/16x16/topic-score.png') left center no-repeat; 
     199} 
     200 
     201ul.chooser_widget_headers.ui-sortable li, 
     202ul.chooser_widget_results.ui-sortable li 
     203{ 
     204    padding-left: 20px; 
     205} 
  • trunk/midcom/midcom.helper.datamanager2/static/chooser/jquery.chooser_widget.js

    r16517 r16518  
    224224    function request(term, success, failure) 
    225225    { 
    226         console.log(success); 
    227226        last_term = term; 
    228227         
     
    265264    function stopLoading(type, expobj) 
    266265    { 
    267         console.log(expobj); 
    268266        input_element.removeClass(CLASSES.IDLE); 
    269267        input_element.removeClass(CLASSES.FAILED); 
     
    434432            if (last_term != 'undefined') 
    435433            { 
    436                 creation_url += '?defaults[' + options.creation_default_key + ']=' + last_term; 
     434                creation_url += '?defaults[' + options.creation_default_key + '] = ' + last_term; 
    437435            } 
    438436             
     
    468466    creation_handler: null, 
    469467    creation_default_key: null, 
     468    sortable: false, 
    470469    format_items: null 
    471470}; 
     
    490489    var headers = jQuery('<ul class="chooser_widget_headers"></ul>').appendTo(element); 
    491490    var list = jQuery('<ul class="chooser_widget_results"></ul>').appendTo(element); 
    492  
     491     
    493492    var has_content = false, 
    494493        list_items = [], 
     
    544543    function dataToDom() 
    545544    { 
    546         for (var i=0; i < data.length; i++) 
     545        for (var i = 0; i < data.length; i++) 
    547546        { 
    548547            if (!data[i]) 
     
    591590        //console.log('data.guid: ' + data.guid); 
    592591         
    593         var n=null; 
     592        var n = null; 
    594593         
    595594        var item_id = data[options.id_field]; 
     
    623622         
    624623        var li_elem = jQuery('<li>') 
    625         .attr({ id: options.widget_id + '_result_item_' + item_id }) 
    626         .attr('deleted','false') 
    627         .attr('keep_on_list','false') 
    628         .attr('pre_selected','false') 
    629         .addClass('chooser_widget_result_item') 
    630         .click(function(event) 
    631         { 
    632             var li_element = target(event); 
    633             jQuery('#' + options.widget_id + '_search_input').focus(); 
    634             var current_keep_status = jQuery(li_element).attr('keep_on_list'); 
    635             var current_delete_status = jQuery(li_element).attr('deleted'); 
    636             var current_presel_status = jQuery(li_element).attr('pre_selected'); 
    637              
    638             if (current_keep_status == 'true') 
    639             { 
    640                 if (current_delete_status == 'false') 
     624            .attr({ id: options.widget_id + '_result_item_' + item_id }) 
     625            .attr('deleted','false') 
     626            .attr('keep_on_list','false') 
     627            .attr('pre_selected','false') 
     628            .addClass('chooser_widget_result_item') 
     629            .click(function(event) 
     630            { 
     631                var li_element = target(event); 
     632                jQuery('#' + options.widget_id + '_search_input').focus(); 
     633                var current_keep_status = jQuery(li_element).attr('keep_on_list'); 
     634                var current_delete_status = jQuery(li_element).attr('deleted'); 
     635                var current_presel_status = jQuery(li_element).attr('pre_selected'); 
     636                 
     637                if (current_keep_status == 'true') 
    641638                { 
    642                     jQuery(li_element).removeClass(CLASSES.ACTIVE); 
    643                     if (current_presel_status == 'true') 
     639                    if (current_delete_status == 'false') 
    644640                    { 
    645                         remove(item_id); 
     641                        jQuery(li_element).removeClass(CLASSES.ACTIVE); 
     642                        if (current_presel_status == 'true') 
     643                        { 
     644                            remove(item_id); 
     645                        } 
     646                        else 
     647                        { 
     648                            inactivate(item_id); 
     649                        } 
    646650                    } 
    647651                    else 
    648652                    { 
    649                         inactivate(item_id); 
     653                        if(options.allow_multiple) 
     654                        { 
     655                            restore(item_id); 
     656                        } 
     657                        else 
     658                        { 
     659                            activate(item_id); 
     660                        } 
    650661                    } 
     662     
     663                    return false; 
    651664                } 
    652665                else 
    653666                { 
    654                     if(options.allow_multiple) 
    655                     { 
    656                         restore(item_id); 
    657                     } 
    658                     else 
    659                     { 
    660                         activate(item_id); 
    661                     } 
     667                    activate(item_id); 
    662668                } 
    663  
    664                 return false; 
    665             } 
    666             else 
    667             { 
    668                 activate(item_id); 
    669             } 
    670         }) 
    671         .mouseover( function(event) 
    672         { 
    673             var jq_elem = jQuery(target(event)).addClass(CLASSES.HOVER); 
    674         }) 
    675         .mouseout( function(event) 
    676         { 
    677             jQuery(target(event)).removeClass(CLASSES.HOVER); 
    678         }); 
     669            }) 
     670            .mouseover( function(event) 
     671            { 
     672                var jq_elem = jQuery(target(event)).addClass(CLASSES.HOVER); 
     673            }) 
     674            .mouseout( function(event) 
     675            { 
     676                jQuery(target(event)).removeClass(CLASSES.HOVER); 
     677            }); 
    679678         
    680679        if (data['pre_selected']) 
     
    710709            .prependTo(li_elem); 
    711710         
     711        jQuery('<input type="hidden" />') 
     712            .attr('name', 'sortable[' + options.widget_id + '][]') 
     713            .attr('value', item_id); 
     714         
    712715        li_elem.appendTo(list); 
    713          
    714716        list_items.push(item_id); 
    715     } 
    716  
     717         
     718        if (options.sortable) 
     719        { 
     720            jQuery(list).create_sortable(); 
     721        } 
     722    } 
     723 
     724     
     725    /** 
     726     *  
     727     *  
     728     * @param int step 
     729     */ 
    717730    function moveSelect(step) 
    718731    { 
     
    728741    }; 
    729742     
     743    /** 
     744     *  
     745     */ 
    730746    function wrapSelection() 
    731747    { 
     
    740756    } 
    741757     
     758    /** 
     759     * 
     760     * 
     761     * @param String id     ID of the chooser widget 
     762     */ 
    742763    function remove(id) 
    743764    { 
    744765        jQuery('#' + options.widget_id + '_result_item_' + id + '_input', list).attr({ value: 0 }); 
    745         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.ACTIVE); 
    746         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.INACTIVE); 
    747         jQuery('#' + options.widget_id + '_result_item_' + id).addClass(CLASSES.DELETED); 
    748         jQuery('#' + options.widget_id + '_result_item_' + id).attr('deleted','true'); 
    749         selected_items = jQuery.grep( selected_items, function(n,i) 
     766         
     767        jQuery('#' + options.widget_id + '_result_item_' + id) 
     768            .removeClass(CLASSES.ACTIVE) 
     769            .removeClass(CLASSES.INACTIVE) 
     770            .addClass(CLASSES.DELETED) 
     771            .attr('deleted','true'); 
     772         
     773        selected_items = jQuery.grep(selected_items, function(n,i) 
    750774        { 
    751775            return n != id; 
     
    753777    } 
    754778     
     779    /** 
     780     *  
     781     *  
     782     * @param String id     ID of the chooser widget 
     783     */ 
    755784    function restore(id) 
    756785    { 
    757786        jQuery('#' + options.widget_id + '_result_item_' + id + '_input', list).attr({ value: id }); 
    758         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.DELETED); 
    759         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.INACTIVE); 
    760         jQuery('#' + options.widget_id + '_result_item_' + id).addClass(CLASSES.ACTIVE); 
    761         jQuery('#' + options.widget_id + '_result_item_' + id).attr('deleted','false'); 
     787         
     788        jQuery('#' + options.widget_id + '_result_item_' + id) 
     789            .removeClass(CLASSES.DELETED) 
     790            .removeClass(CLASSES.INACTIVE) 
     791            .addClass(CLASSES.ACTIVE) 
     792            .attr('deleted','false'); 
     793         
    762794        selected_items.push(id); 
    763795    } 
    764796 
     797    /** 
     798     * Activate an item 
     799     *  
     800     * @param String id     ID of the chooser widget 
     801     */ 
    765802    function activate(id) 
    766803    { 
     
    772809         
    773810        jQuery('#' + options.widget_id + '_result_item_' + id + '_input', list).attr({ value: id }); 
    774         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.DELETED); 
    775         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.INACTIVE); 
    776         jQuery('#' + options.widget_id + '_result_item_' + id).addClass(CLASSES.ACTIVE); 
    777         jQuery('#' + options.widget_id + '_result_item_' + id).attr('keep_on_list','true'); 
    778         jQuery('#' + options.widget_id + '_result_item_' + id).attr('deleted','false'); 
     811         
     812        jQuery('#' + options.widget_id + '_result_item_' + id) 
     813            .removeClass(CLASSES.DELETED) 
     814            .removeClass(CLASSES.INACTIVE) 
     815            .addClass(CLASSES.ACTIVE) 
     816            .attr('keep_on_list','true') 
     817            .attr('deleted','false'); 
    779818        selected_items.push(id); 
    780819    } 
    781820     
     821    /** 
     822     * Inactivate an item 
     823     * 
     824     * @param String id     ID of the chooser widget 
     825     */ 
    782826    function inactivate(id) 
    783827    { 
    784828        jQuery('#' + options.widget_id + '_result_item_' + id + '_input', list).attr({ value: 0 }); 
    785         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.DELETED); 
    786         jQuery('#' + options.widget_id + '_result_item_' + id).removeClass(CLASSES.ACTIVE); 
    787         jQuery('#' + options.widget_id + '_result_item_' + id).addClass(CLASSES.INACTIVE); 
    788         jQuery('#' + options.widget_id + '_result_item_' + id).attr('keep_on_list','false'); 
    789         jQuery('#' + options.widget_id + '_result_item_' + id).attr('deleted','false'); 
     829         
     830        jQuery('#' + options.widget_id + '_result_item_' + id) 
     831            .removeClass(CLASSES.DELETED) 
     832            .removeClass(CLASSES.ACTIVE) 
     833            .addClass(CLASSES.INACTIVE) 
     834            .attr('keep_on_list','false') 
     835            .attr('deleted','false'); 
     836         
    790837        //selected_items.push(id); 
    791838        selected_items = jQuery.grep( selected_items, function(n,i) 
     
    795842    } 
    796843     
     844    /** 
     845     * Delete unselected items from the list 
     846     */ 
    797847    function delete_unseleted_from_list() 
    798848    { 
     
    816866        jQuery('#' + options.widget_id + '_results li.' + CLASSES.HOVER).removeClass(CLASSES.HOVER); 
    817867        active = -1; 
    818     } 
    819      
     868         
     869        if (   options.sortable 
     870            && jQuery(list).attr('sortable')) 
     871        { 
     872            // Get rid of the cached positions and create the sortable again 
     873            jQuery(list).sortable('destroy'); 
     874            jQuery(list).create_sortable(); 
     875        } 
     876    } 
     877     
     878    /** 
     879     *  
     880     *  
     881     * @param Array array 
     882     * @param String valueToUnset 
     883     */ 
    820884    function unset(array, valueToUnset, valueOrIndex, isHash) 
    821885    { 
     
    829893                    continue; 
    830894                }; 
    831                 if (! isHash) 
     895                if (!isHash) 
    832896                { 
    833                     output[++output.length-1]=array[i]; 
     897                    output[++output.length-1] = array[i]; 
    834898                } 
    835899                else 
    836900                { 
    837                     output[i]=array[i]; 
     901                    output[i] = array[i]; 
    838902                } 
    839903            } 
     
    846910                if (! isHash) 
    847911                { 
    848                     output[++output.length-1]=array[i]; 
     912                    output[++output.length-1] = array[i]; 
    849913                } 
    850914                else 
    851915                { 
    852                     output[i]=array[i]; 
     916                    output[i] = array[i]; 
    853917                } 
    854918            } 
     
    9481012{ 
    9491013    var formatted = ''; 
    950  
     1014     
    9511015    var item_parts = jQuery('<div>') 
    952     .attr({ id: options.widget_id + '_result_item_parts_' + item.id }) 
    953     .addClass('chooser_widget_result_item_parts'); 
     1016        .attr({ id: options.widget_id + '_result_item_parts_' + item.id }) 
     1017        .addClass('chooser_widget_result_item_parts'); 
     1018     
     1019    var item_dragger = jQuery('<div>') 
     1020        .attr({id: options.widget_id + '_result_item_dragger_' + item.id}) 
     1021        .addClass('chooser_widget_results_item_dragger') 
     1022        .appendTo(item_parts); 
    9541023 
    9551024    var item_content = jQuery('<div>') 
     
    9861055 
    9871056    item_content = jQuery('<div>') 
    988     .addClass('chooser_widget_item_part_status') 
    989     .html( '&nbsp;' ) 
    990     .appendTo(item_parts); 
     1057        .addClass('chooser_widget_item_part_status') 
     1058        .html( '&nbsp;' ) 
     1059        .appendTo(item_parts); 
    9911060     
    9921061    return item_parts; 
     
    10301099    return formatted; 
    10311100} 
     1101 
     1102 
     1103jQuery.fn.create_sortable = function() 
     1104{ 
     1105    // Create the sortable list, if there are more than one item in the list 
     1106    if (jQuery(this).find('li').size() <= 1) 
     1107    { 
     1108        if (jQuery(this).attr('sortable')) 
     1109        { 
     1110            jQuery(this).sortable('destroy'); 
     1111            jQuery(this).parent().find('ul.chooser_widget_headers').removeClass('ui-sortable'); 
     1112        } 
     1113        return; 
     1114    } 
     1115     
     1116    jQuery(this).sortable('destroy'); 
     1117    jQuery(this).sortable( 
     1118    { 
     1119        handle: 'div.chooser_widget_results_item_dragger', 
     1120        containment: jQuery(this) 
     1121    }); 
     1122     
     1123    if (!jQuery(this).attr('sortable')) 
     1124    { 
     1125        jQuery(this).attr('sortable'); 
     1126    } 
     1127     
     1128    // Add the sortable class also to the result headers to maintain consistency 
     1129    jQuery(this).parent().find('ul.chooser_widget_headers').addClass('ui-sortable'); 
     1130} 
  • trunk/midcom/midcom.helper.datamanager2/widget/chooser.php

    r16517 r16518  
    302302 
    303303    var $js_format_items = array(); 
     304     
     305    /** 
     306     * Should the sorting be enabled 
     307     *  
     308     * @var boolean    True if the sorting should be enabled 
     309     */ 
     310    var $sortable = false; 
    304311 
    305312    /** 
     
    380387            ) 
    381388        ); 
    382  
     389         
     390        if ($this->sortable) 
     391        { 
     392            $_MIDCOM->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/jquery.dimensions-1.1.2.pack.js'); 
     393            $_MIDCOM->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/ui/ui.mouse.js'); 
     394            $_MIDCOM->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/ui/ui.draggable.js'); 
     395            $_MIDCOM->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/ui/ui.droppable.js'); 
     396            $_MIDCOM->add_jsfile(MIDCOM_STATIC_URL . '/jQuery/ui/ui.sortable.js'); 
     397        } 
     398         
    383399        $_MIDCOM->add_jsfile(MIDCOM_STATIC_URL . '/midcom.helper.datamanager2/chooser/jquery.chooser_widget.js'); 
    384400 
     
    939955        $this->_js_widget_options['id_field'] = "'$this->id_field'"; 
    940956        $this->_js_widget_options['format_items'] = 'null'; 
     957         
     958        if ($this->sortable) 
     959        { 
     960            $this->_js_widget_options['sortable'] = 'true'; 
     961        } 
    941962 
    942963        if ($this->creation_mode_enabled) 
     
    15721593        // debug_pop(); 
    15731594    } 
    1574  
    15751595} 
    1576  
    15771596?>