Changeset 16519

Show
Ignore:
Timestamp:
06/01/08 17:17:10 (3 months ago)
Author:
adrenalin
Message:

Chooser widget can store order information now. Documented Chooser
widget JavaScript? files for other people to get Jerry's ideas open
faster.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/midcom/midcom.helper.datamanager2/documentation/CHANGES

    r16485 r16519  
    88  which might even break existing functionality. 
    99- All items marked with "+" represent completely new features. 
     10 
     112008-06-01 adrenalin 
     12  + Chooser widget can store order information now 
     13  - Documented Chooser widget JavaScript files 
    1014 
    11152008-05-28 adrenalin 
  • trunk/midcom/midcom.helper.datamanager2/static/chooser/jquery.chooser_widget.css

    r16518 r16519  
    187187ul.chooser_widget_results.ui-sortable .chooser_widget_results_item_dragger 
    188188{ 
     189    background : url('../../stock-icons/16x16/topic-score.png') center center no-repeat; 
    189190    width: 20px; 
    190191    height: 22px; 
    191192    margin-left: -20px; 
    192193    float: left; 
    193     cursor: move; 
     194    cursor: n-resize; 
    194195} 
    195196 
  • trunk/midcom/midcom.helper.datamanager2/static/chooser/jquery.chooser_widget.js

    r16518 r16519  
    671671            { 
    672672                var jq_elem = jQuery(target(event)).addClass(CLASSES.HOVER); 
     673                jQuery(target(event)).find('div.chooser_widget_results_item_dragger').fadeIn('slow'); 
    673674            }) 
    674675            .mouseout( function(event) 
    675676            { 
    676677                jQuery(target(event)).removeClass(CLASSES.HOVER); 
     678                jQuery(target(event)).find('div.chooser_widget_results_item_dragger').fadeOut('fast'); 
    677679            }); 
    678680         
     
    709711            .prependTo(li_elem); 
    710712         
    711         jQuery('<input type="hidden" />') 
    712             .attr('name', 'sortable[' + options.widget_id + '][]') 
    713             .attr('value', item_id); 
     713        if (options.sortable) 
     714        { 
     715            jQuery('<input type="hidden" />') 
     716                .attr('name', options.widget_id + '[sortable][]') 
     717                .attr('value', item_id) 
     718                .appendTo(li_elem); 
     719        } 
    714720         
    715721        li_elem.appendTo(list); 
     
    10201026        .attr({id: options.widget_id + '_result_item_dragger_' + item.id}) 
    10211027        .addClass('chooser_widget_results_item_dragger') 
     1028        .fadeOut(0) 
    10221029        .appendTo(item_parts); 
    10231030 
     
    10281035        .appendTo(item_parts); 
    10291036 
    1030     jQuery.each( options.result_headers, function(i,n) 
     1037    jQuery.each(options.result_headers, function(i,n) 
    10311038    { 
    10321039        var value = null; 
     
    10411048         
    10421049        item_content = jQuery('<div>') 
    1043         .addClass('chooser_widget_item_part') 
    1044         .attr( 
    1045        
    1046             title: midcom_helper_datamanager2_widget_chooser_format_value('html2text', value) 
    1047         }) 
    1048         .css( 
    1049        
    1050             width: block_width + '%' 
    1051         }) 
    1052         .html( value ) 
    1053         .appendTo(item_parts); 
     1050            .addClass('chooser_widget_item_part') 
     1051            .attr( 
     1052           
     1053                title: midcom_helper_datamanager2_widget_chooser_format_value('html2text', value) 
     1054            }) 
     1055            .css( 
     1056           
     1057                width: block_width + '%' 
     1058            }) 
     1059            .html( value ) 
     1060            .appendTo(item_parts); 
    10541061    }); 
    10551062 
     
    11001107} 
    11011108 
    1102  
     1109/** 
     1110 * Create the sortable list 
     1111 */ 
    11031112jQuery.fn.create_sortable = function() 
    11041113{ 
    1105     // Create the sortable list, if there are more than one item in the list 
     1114    // If there is less than two items in the list, sortable shouldn't be created 
    11061115    if (jQuery(this).find('li').size() <= 1) 
    11071116    { 
     
    11141123    } 
    11151124     
    1116     jQuery(this).sortable('destroy'); 
     1125    if (jQuery(this).attr('sortable')) 
     1126    { 
     1127        jQuery(this).sortable('destroy'); 
     1128    } 
     1129     
    11171130    jQuery(this).sortable( 
    11181131    { 
  • trunk/midcom/midcom.helper.datamanager2/type/mnrelation.php

    r14806 r16519  
    8181 *   are available at the site of import. This flag is not set by default. Note, that 
    8282 *   this does not affect import, which is only available with keys, not values. 
     83 * - <i>boolean sortable:</i> Switch for determining if the order selected by the widget 
     84 *   should be stored to the metadata object 
     85 * - <i>string sortable_sort_order:</i> Direction that metadata.score should go. If this 
     86 *   is set to `ASC`, lower scores will be displayed first. If this is set to `DESC`, higher 
     87 *   scores will be displayed first. `DESC` is default, since then new member objects will 
     88 *   be left at the end of the line rather than appearing first. This field is not case 
     89 *   sensitive and string can be extended e.g. to `ascend`. 
    8390 * 
    8491 * (These list is complete, including all allowed options from the base type. Base type 
     
    162169     */ 
    163170    var $_membership_objects = null; 
     171     
     172    /** 
     173     * Should the sorting feature be enabled. This will affect the way chooser widget will act 
     174     * and how the results will be presented. If the sorting feature is enabled,  
     175     * 
     176     * @access public 
     177     * @var boolean 
     178     */ 
     179    var $sortable = false; 
     180     
     181    /** 
     182     * Sort order. Which direction should metadata.score force the results. This should be either 
     183     * `ASC` or `DESC` 
     184     * 
     185     * @access public 
     186     * @var string 
     187     */ 
     188    var $sortable_sort_order = 'DESC'; 
     189     
     190    /** 
     191     * Sorted order, which is returned by the widget. 
     192     *  
     193     * @access public 
     194     * @var Array 
     195     */ 
     196    var $sorted_order = array(); 
    164197 
    165198    /** 
     
    240273        $qb = $_MIDCOM->dbfactory->new_query_builder($this->mapping_class_name); 
    241274        $qb->add_constraint($this->master_fieldname, '=', $this->_get_master_foreign_key()); 
     275         
     276        if (   $this->sortable 
     277            && preg_match('/^(ASC|DESC)/i', $this->sortable_sort_order, $regs)) 
     278        { 
     279            $order = strtoupper($regs[1]); 
     280            $qb->add_order('metadata.score', $order); 
     281        } 
     282         
    242283        if ($this->member_limit_like) 
    243284        { 
     
    313354            $existing_members[$key] = $index; 
    314355        } 
    315  
     356         
     357        // Cache the total quantity of items and get the order if the field is supposed to store the member order 
     358        if (   $this->sortable 
     359            && isset($this->sorted_order)) 
     360        { 
     361            $count = count($this->sorted_order); 
     362             
     363            if (preg_match('/ASC/i', $this->sortable_sort_order)) 
     364            { 
     365                $direction = 'asc'; 
     366            } 
     367            else 
     368            { 
     369                $direction = 'desc'; 
     370            } 
     371        } 
     372         
     373        $i = 0; 
     374         
    316375        $new_membership_objects = Array(); 
    317376        foreach ($this->selection as $key) 
     
    330389            if (array_key_exists($key, $existing_members)) 
    331390            { 
     391                // Update the existing member 
     392                if ($this->sortable) 
     393                { 
     394                    $index = $existing_members[$key]; 
     395                     
     396                    if ($direction === 'asc') 
     397                    { 
     398                        $this->_membership_objects[$index]->metadata->score = $i; 
     399                    } 
     400                    else 
     401                    { 
     402                        $this->_membership_objects[$index]->metadata->score = $count - $i; 
     403                    } 
     404                     
     405                    if (!$this->_membership_objects[$index]->update()) 
     406                    { 
     407                        debug_add("Failed to update the member record for key {$key}. Couldn't store the order information", MIDCOM_LOG_ERROR); 
     408                        debug_add('Last Midgard error was ' . mgd_errstr(), MIDCOM_LOG_ERROR); 
     409                        debug_print_r('Tried to update this object', $this->_membership_objects[$index]); 
     410                    } 
     411                     
     412                    $i++; 
     413                } 
     414                 
    332415                $index = $existing_members[$key]; 
    333416                $new_membership_objects[] = $this->_membership_objects[$index]; 
     
    340423                $member->{$this->master_fieldname} = $this->_get_master_foreign_key(); 
    341424                $member->{$this->member_fieldname} = $key; 
    342                 if (! $member->create()) 
     425                 
     426                // Set the score if requested 
     427                if ($this->sortable) 
     428                { 
     429                    if ($direction === 'asc') 
     430                    { 
     431                        $member->metadata->score = $i; 
     432                    } 
     433                    else 
     434                    { 
     435                        $member->metadata->score = $count - $i; 
     436                    } 
     437                     
     438                    $i++; 
     439                } 
     440                 
     441                if (!$member->create()) 
    343442                { 
    344443                    debug_add("Failed to create a new member record for key {$key}, skipping it. " . 
     
    356455        foreach ($this->_membership_objects as $member) 
    357456        { 
    358             if (! $member->delete()) 
     457            if (!$member->delete()) 
    359458            { 
    360459                debug_add("Failed to delete a no longer needed member record #{$member->id}, ignoring silently. " . 
  • trunk/midcom/midcom.helper.datamanager2/type/select.php

    r15380 r16519  
    4040 * - <i>string multiple_storagemode:</i> Controls how multiple options are stored in 
    4141 *   a single field. See below "multiselect storagemodes". Defaults to "serialized". 
     42 * - <i>boolean sortable:</i> Switch for determining if the order selected by the widget 
     43 *   should be stored to the metadata object 
    4244 * 
    4345 * Keys should be alphanumeric only. 
     
    206208 
    207209    /** 
     210     * Should the sorting feature be enabled. This will affect the way chooser widget will act 
     211     * and how the results will be presented. If the sorting feature is enabled,  
     212     * 
     213     * @access public 
     214     * @var boolean 
     215     */ 
     216    var $sortable = false; 
     217     
     218    /** 
    208219     * Initialize the class, if necessary, create a callback instance, otherwise 
    209220     * validate that an option array is present. 
  • trunk/midcom/midcom.helper.datamanager2/widget/chooser.php

    r16518 r16519  
    308308     * @var boolean    True if the sorting should be enabled 
    309309     */ 
    310     var $sortable = false
     310    var $sortable = null
    311311 
    312312    /** 
     
    325325            debug_pop(); 
    326326            return false; 
     327        } 
     328         
     329        // Determine the sortability from the type configuration 
     330        if (   is_null($this->sortable) 
     331            && isset($this->_type->sortable)) 
     332        { 
     333            $this->sortable = $this->_type->sortable; 
    327334        } 
    328335 
     
    15361543            return; 
    15371544        } 
     1545         
    15381546        $real_results =& $results["{$this->_element_id}_selections"]; 
    15391547        if (is_array($real_results)) 
     
    15531561        { 
    15541562            $this->_type->selection[] = $real_results; 
     1563        } 
     1564         
     1565        if (   $this->sortable 
     1566            && isset($results[$this->_element_id]) 
     1567            && isset($results[$this->_element_id]['sortable'])) 
     1568        { 
     1569            $this->_type->sorted_order = array(); 
     1570             
     1571            foreach ($results[$this->_element_id]['sortable'] as $i => $id) 
     1572            { 
     1573                $this->_type->sorted_order[$id] = $i; 
     1574            } 
    15551575        } 
    15561576