Changeset 16926f in indico


Ignore:
Timestamp:
04/13/10 18:13:47 (3 years ago)
Author:
Pedro Ferreira <jose.pedro.ferreira@…>
Branches:
master, burotel, hello-world-walkthrough, ipv6, new-webex, v0.97-series, v0.98-series, v0.98.2, v0.98.3, v0.98b1, v0.98b2, v0.99, b8c30da8ebdbdcbd675a873997cc3e95f567de49, 4287315ec967a3da168d83963c14001db8487d53
Children:
bdd862
Parents:
1db73e
git-author:
Pedro Ferreira <jose.pedro.ferreira@…> (04/13/10 18:10:59)
git-committer:
Pedro Ferreira <jose.pedro.ferreira@…> (04/13/10 18:13:47)
Message:

[IMP] Refactored filters for Registrant List

  • New rendering classes for filtercriteria;
  • Simplified structure, moved HTML code to templates;
  • Something that can be extended to other areas of Indico;
  • Fixed some bugs regarding session filtering (first choice only);
Location:
indico
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • indico/MaKaC/common/filters.py

    r9033fd r16926f  
    185185                    satisfy in order to make it pass the filter. 
    186186        """ 
     187 
    187188        self._conf=conf 
    188189        self._fields = {} 
  • indico/MaKaC/registration.py

    ra0203b r16926f  
    844844class BaseForm(Persistent): 
    845845 
     846    """ 
     847    Base class for registration forms 
     848 
     849    It includes iterators/getters, provided if the class attribute 
     850    _iterableContainer is present. _iterableContainer is a simple workaround for 
     851    the problem of having a generic iterator interface over all the forms, even 
     852    if the initial design didn't unify the form container into a BaseForm 
     853    attribute. Since it is too late now for redesigning the DB schema, this 
     854    attribute kind of fixes it. 
     855 
     856    """ 
     857 
     858    # should be overloaded if iteration is to be provided 
     859    _iterableContainer = None 
     860 
    846861    def __init__(self): 
    847862        self._enabled = True # it means that the form cannot be used either in the registration display or in the management area. 
     
    857872            self._enabled = True 
    858873        return self._enabled 
     874 
     875    def __iter__(self): 
     876        return getattr(self, self._iterableContainer).__iter__(); 
     877 
     878    def __getitem__(self, key): 
     879        return getattr(self, self._iterableContainer)[key] 
     880 
    859881 
    860882class FieldInputType(Persistent): 
     
    21732195class AccommodationForm(BaseForm): 
    21742196 
     2197    _iterableContainer = '_accommodationTypes' 
     2198 
    21752199    def __init__(self, regForm, data=None): 
    21762200        BaseForm.__init__(self) 
     
    23532377            self.removeAccommodationType(at) 
    23542378 
     2379 
    23552380class ReasonParticipationForm(BaseForm): 
    23562381 
     
    24812506    def getTitle(self): 
    24822507        return self._session.getTitle() 
     2508 
     2509    # for compatibility with other fields 
     2510    getCaption = getTitle 
    24832511 
    24842512    def getStartDate(self): 
     
    24992527 
    25002528class SessionsForm(BaseForm): 
     2529 
     2530    _iterableContainer = '_sessions' 
    25012531 
    25022532    def __init__(self, data=None): 
     
    27752805 
    27762806class SocialEventForm(BaseForm): 
     2807 
     2808    _iterableContainer = '_socialEvents' 
    27772809 
    27782810    def __init__(self, regForm, data=None): 
  • indico/MaKaC/webinterface/common/regFilters.py

    r5997aa r16926f  
    5454 
    5555    def satisfies( self, reg ): 
    56  
    57         """ 
    58         """ 
     56        """ 
     57        """ 
     58 
    5959        if reg.getSessionList(): 
    6060            for sess in reg.getSessionList(): 
     
    7676        """ 
    7777        """ 
     78 
    7879        if len(reg.getSessionList()) > 0: 
    7980            sess=reg.getSessionList()[0] 
  • indico/MaKaC/webinterface/pages/registrants.py

    rfb1fc8 r16926f  
    101101        self._dispopts["more"]=["RegistrationDate"] 
    102102        for sect in self._conf.getRegistrationForm().getGeneralSectionFormsList(): 
    103             #if sect.isEnabled(): 
    104103            self._dispopts[sect.getId()]=[] 
    105             ################ 
    106             #jmf-start 
    107             # 
    108             #for fld in sect.getFields(): 
    109             #    self._dispopts[sect.getId()].append("%s-%s"%(sect.getId(),fld.getId())) 
     104 
    110105            for fld in sect.getSortedFields(): 
    111106                self._dispopts[sect.getId()].append("%s-%s"%(sect.getId(),fld.getId())) 
    112             # 
    113             #jmf-end 
    114             ################ 
    115107 
    116108    def _getKeyDispOpts(self, value): 
     
    197189        return url 
    198190 
    199     def _getSessHTML(self): 
     191 
     192    def _getFilterBoxesHTML(self): 
    200193        regForm = self._conf.getRegistrationForm() 
    201         sessform =regForm.getSessionsForm() 
    202         sesstypes = sessform.getSessionList() 
    203         checked="" 
    204         if self._filterCrit.getField(self._sessionFilterName).getShowNoValue(): 
    205             checked=" checked" 
    206         res=[ _("""<input type="checkbox" name="sessionShowNoValue" value="--none--"%s> --_("not specified")--""")%checked] 
    207         for sess in sesstypes: 
    208             checked="" 
    209             if sess.getId() in self._filterCrit.getField(self._sessionFilterName).getValues(): 
    210                 checked=" checked" 
    211             res.append("""<input type="checkbox" name="session" value=%s%s>%s"""%(quoteattr(str(sess.getId())),checked,self.htmlText(sess.getTitle()))) 
    212         if sessform.getType() == "2priorities": 
    213             checked="" 
    214             if self._sessionFilterName == "sessionfirstpriority": 
    215                 checked=" checked" 
    216             res.append( _("""<b>------</b><br><input type="checkbox" name="firstChoice" value="firstChoice"%s><i> _("Only by first choice")</i>""")%checked) 
    217         return "<br>".join(res) 
    218  
    219     def _getAcomHTML(self): 
    220         regForm = self._conf.getRegistrationForm() 
    221         accommform = regForm.getAccommodationForm() 
    222         accommtypes = accommform.getAccommodationTypesList() 
    223         checked="" 
    224         if self._filterCrit.getField("accomm").getShowNoValue(): 
    225             checked=" checked" 
    226         res=[ _("""<input type="checkbox" name="accommShowNoValue" value="--none--"%s> --_("not specified")--""")%checked] 
    227         for accomm in accommtypes: 
    228             checked="" 
    229             if accomm.getId() in self._filterCrit.getField("accomm").getValues(): 
    230                 checked=" checked" 
    231             res.append("""<input type="checkbox" name="accomm" value=%s%s>%s"""%(quoteattr(str(accomm.getId())),checked,self.htmlText(accomm.getCaption()))) 
    232         return "<br>".join(res) 
    233  
    234     def _getEventHTML(self): 
    235         regForm = self._conf.getRegistrationForm() 
    236         eventForm = regForm.getSocialEventForm() 
    237         events = eventForm.getSocialEventList() 
    238         checked="" 
    239         if self._filterCrit.getField("event").getShowNoValue(): 
    240             checked=" checked" 
    241         res=[ _("""<input type="checkbox" name="eventShowNoValue" value="--none--"%s> --_("not specified")--""")%checked] 
    242         for event in events: 
    243             checked="" 
    244             if event.getId() in self._filterCrit.getField("event").getValues(): 
    245                 checked=" checked" 
    246             res.append("""<input type="checkbox" name="event" value=%s%s>%s"""%(quoteattr(str(event.getId())),checked,self.htmlText(event.getCaption()))) 
    247         return "<br>".join(res) 
     194 
     195        options = [ 
     196            ('accomm', regForm.getAccommodationForm()), 
     197            ('event', regForm.getSocialEventForm()), 
     198            (self._sessionFilterName, regForm.getSessionsForm()) 
     199            ] 
     200 
     201        p = WFilterCriteria(options, self._filterCrit) 
     202 
     203        return p.getHTML() 
    248204 
    249205    def _getStatusesHTML(self): 
     
    503459 
    504460    def _getFilterMenu(self): 
    505         menu =  _("""<div class="CRLDiv" style="display: none;" id="filterMenu"><table width="95%%" align="center" border="0"> 
    506         <tr> 
    507             <td> 
    508                 <table width="100%%"> 
    509                     <tr> 
    510                     </tr> 
    511                     <tr> 
    512                         <td> 
    513                             <table align="center" cellspacing="0" width="100%%"> 
    514                                 <tr> 
    515                                     <td width="33%%" class="titleCellFormat" style="border-bottom: 1px solid #888;">%(accomtitle)s %(checkAcco)s%(uncheckAcco)s</td> 
    516                     <td width="33%%"class="titleCellFormat" style="border-bottom: 1px solid #888;">%(eventtitle)s %(checkEvent)s%(uncheckEvent)s</td> 
    517                     <td width="33%%"class="titleCellFormat" style="border-bottom: 1px solid #888;">%(sesstitle)s %(checkSession)s%(uncheckSession)s</td> 
    518                                 </tr> 
    519                                 <tr> 
    520                                     <td valign="top" >%(acom)s</td> 
    521                     <td valign="top" >%(eve)s</td> 
    522                     <td valign="top">%(ses)s</td> 
    523                                 </tr> 
    524                             </table> 
    525                         </td> 
    526                     </tr> 
     461        menu =  _("""<div class="CRLDiv" style="display: none;" id="filterMenu"> 
     462                     %(filterBoxes)s 
    527463                    """) 
    528464        if self._conf.getRegistrationForm().getStatusesList(): 
    529             menu +=  _("""<tr> 
    530                         <td> 
    531                             <table align="center" cellspacing="0" width="100%%"> 
     465            menu +=  _("""<table align="center" cellspacing="0" width="100%%"> 
    532466                                <tr> 
    533467                                    <td align="left" class="titleCellFormat" style="border-bottom: 1px solid #888; padding-right:10px">  _("Statuses") %(checkStatuses)s%(uncheckStatuses)s</td> 
     
    537471                                </tr> 
    538472                            </table> 
    539                         </td> 
    540                     </tr>""") 
    541         menu +=  _(""" 
    542                     <tr> 
    543                         <td align="center" ><input type="submit" class="btn" name="OK" value=  _("apply filter")></td> 
    544                     </tr> 
    545                 </table> 
    546             </td> 
    547         </tr> 
    548     </table></div>""") 
     473                        """) 
     474        menu +=  _("""<div style="text-align: center;"><input type="submit" class="btn" name="OK" value=  _("Apply filter")></div></div>""") 
    549475 
    550476        return menu 
     
    620546        vars["pdfUrl"] = quoteattr(str(Config.getInstance().getSystemIconURL("pdf"))) 
    621547        vars["excelUrl"] = quoteattr(str(Config.getInstance().getSystemIconURL("excel"))) 
    622         vars ["acom"] = self._getAcomHTML() 
    623         vars ["ses"]=self._getSessHTML() 
    624         vars ["eve"]+=self._getEventHTML() 
     548        vars ["filterBoxes"] = self._getFilterBoxesHTML() 
    625549        vars ["status"]= self._getStatusesHTML() 
    626550        vars ["disp"]= self._getDispHTML() 
     
    661585 
    662586class WRegistrantsFilterStatuses (wcomponents.WTemplated): 
     587 
    663588    def __init__(self, statuses, filter, statusObjects): 
    664589        wcomponents.WTemplated.__init__(self) 
     
    676601 
    677602        return vars 
     603 
     604 
     605 
     606class WFilterCriteria(wcomponents.WTemplated): 
     607    """ 
     608    Draws the options for a filter criteria object 
     609    This means rendering the actual table that contains 
     610    all the HTML for the several criteria 
     611    """ 
     612 
     613    def __init__(self, options, filterCrit): 
     614        wcomponents.WTemplated.__init__(self) 
     615        self._filterCrit = filterCrit 
     616        self._options = options 
     617 
     618    def _drawFieldOptions(self, formName, form): 
     619 
     620        # since sessions have a special extra checkbox ("only by first choice"), 
     621        # we need to use a different template 
     622 
     623        if formName in ['session', 'sessionfirstpriority']: 
     624            page = WFilterSessionCriterionOptions(formName, form, self._filterCrit) 
     625        else: 
     626            page = WFilterCriterionOptions(formName, form, self._filterCrit) 
     627 
     628        # TODO: remove when we have a better template system 
     629        return page.getHTML().replace('%','%%') 
     630 
     631    def getVars(self): 
     632 
     633        vars = wcomponents.WTemplated.getVars( self ) 
     634 
     635        vars["content"] =  list((name, self._drawFieldOptions(name, form)) 
     636                                for (name, form) in self._options) 
     637        return vars 
     638 
     639 
     640class WFilterCriterionOptions(wcomponents.WTemplated): 
     641    """ 
     642    Draws the list of options (and checkboxes) for a specific filter criterion, 
     643    with all the checkboxes (properly checked if necessary) 
     644    """ 
     645 
     646    def __init__(self, formName, formData, filterCrit): 
     647        self._formName = formName 
     648        self._formData = formData 
     649        self._filterCrit = filterCrit 
     650 
     651    def getVars(self): 
     652        parentVars = wcomponents.WTemplated.getVars( self ) 
     653        parentVars["critFormName"] = self._formName 
     654        parentVars["htmlFormName"] = self._formName 
     655        parentVars["form"] = self._formData 
     656        parentVars["filterCrit"] = self._filterCrit 
     657 
     658        return parentVars 
     659 
     660 
     661class WFilterSessionCriterionOptions(WFilterCriterionOptions): 
     662    """ 
     663    Sub-class for the session "criterion", since it requires an 
     664    extra checkbox. 
     665    """ 
     666 
     667    def getVars(self): 
     668        parentVars = WFilterCriterionOptions.getVars( self ) 
     669        parentVars["htmlFormName"] = "session" 
     670 
     671        return parentVars 
     672 
    678673 
    679674class WRegSentMail  (wcomponents.WTemplated): 
  • indico/MaKaC/webinterface/rh/registrantsModif.py

    rb03b51 r16926f  
    6767 
    6868class RHRegistrantListModif( RHRegistrantListModifBase ): 
     69    """ 
     70    Registrant List - management area 
     71    Handles filtering and display of different columns 
     72    """ 
     73 
    6974    _uh = urlHandlers.UHConfModifRegistrantList 
    7075 
    7176    def _resetFilters( self, sessionData ): 
     77        """ 
     78        Brings the filter data to a consistent state (websession), 
     79        marking everything as "checked" 
     80        """ 
    7281 
    7382        regForm = self._conf.getRegistrationForm() 
    74         accommform = regForm.getAccommodationForm() 
    75         laccomm = map(lambda accom: accom.getId(), 
    76                       accommform.getAccommodationTypesList()) 
     83        accommTypes = regForm.getAccommodationForm().getAccommodationTypesList() 
     84        sessionData["accomm"] = map(lambda accom: accom.getId(), 
     85                                    accommTypes) 
    7786 
    7887        lstatuses = [] 
    79         for st in self._conf.getRegistrationForm().getStatusesList(): 
    80             lstatuses.append(st.getCaption()+st.getId()+"-NoValue") 
     88        for st in regForm.getStatusesList(): 
     89            lstatuses.append(st.getCaption() + st.getId() + "-NoValue") 
    8190            for stInt in st.getStatusValues(): 
    82                 lstatuses.append(st.getCaption()+st.getId()+"-"+st.getStatusValues()[stInt].getCaption()) 
    83  
    84         sessform =regForm.getSessionsForm() 
    85         sesstypes = sessform.getSessionList() 
    86         lsessions = map(lambda session: session.getId(), sesstypes) 
    87  
    88         eventForm = regForm.getSocialEventForm() 
    89         events = eventForm.getSocialEventList() 
    90         levents = map(lambda event: event.getId(), events) 
    91  
    92         sessionData["accomm"] = laccomm 
     91                lstatuses.append(st.getCaption() + st.getId() + "-" + 
     92                                 st.getStatusValues()[stInt].getCaption()) 
    9393        sessionData["statuses"] = lstatuses 
    94         sessionData[self._sessionFilterName] = lsessions 
    95         sessionData["event"] = levents 
    96  
     94 
     95        sessTypes = regForm.getSessionsForm().getSessionList() 
     96        sessionData["session"] = map(lambda session: session.getId(), sessTypes) 
     97 
     98        socialEvents = regForm.getSocialEventForm().getSocialEventList() 
     99        sessionData["event"] = map(lambda event: event.getId(), socialEvents) 
     100 
     101        # By default, check '--none--' 
    97102        sessionData["accommShowNoValue"] = True 
    98103        sessionData["sessionShowNoValue"] = True 
    99104        sessionData["eventShowNoValue"] = True 
    100         sessionData["statusesShowNoValue"] = True 
    101105 
    102106        return sessionData 
    103107 
    104108    def _updateFilters( self, sessionData, params ): 
     109        """ 
     110        Updates the filter parameters in the websession with those 
     111        coming from the HTTP request 
     112        """ 
    105113 
    106114        sessionData['event'] = [] 
    107115        sessionData['accomm'] = [] 
    108116        sessionData['statuses'] = [] 
    109         sessionData['session'] = [] 
    110         sessionData['sessionfirstpriority'] = [] 
    111117 
    112118        sessionData.update(params) 
    113         sessionData[self._sessionFilterName] = params.get('session',[]) 
     119        sessionData['session'] = utils.normalizeToList(params.get('session',[])) 
    114120 
    115121        # update these elements in the session so that the parameters that are 
     
    121127        sessionData['eventShowNoValue'] = params.has_key('eventShowNoValue') 
    122128        sessionData['sessionShowNoValue'] = params.has_key('sessionShowNoValue') 
    123         sessionData['statusesShowNoValue'] = params.has_key('statusesShowNoValue') 
     129        sessionData['firstChoice'] = params.has_key("firstChoice") 
    124130 
    125131        return sessionData 
    126132 
    127     def _checkFilterParams( self, params, filtersActive, sessionData, operation ): 
     133    def _buildFilteringCriteria(self, sessionData): 
     134        """ 
     135        Creates the Filtering Criteria object, without changint the existing 
     136        session data (sessionData is cloned, not directly changed) 
     137        """ 
     138        sessionCopy = sessionData.copy() 
     139 
     140        # filtering criteria needs a proper "filter name" 
     141        del sessionCopy['session'] 
     142        sessionCopy[self._sessionFilterName] = sessionData['session'] 
     143 
     144        # Build the filtering criteria 
     145        filterCrit = regFilters.RegFilterCrit(self._conf, sessionCopy) 
     146 
     147        filterCrit.getField("accomm").setShowNoValue( 
     148            sessionCopy.get("accommShowNoValue") ) 
     149        filterCrit.getField(self._sessionFilterName).setShowNoValue( 
     150            sessionCopy.get("sessionShowNoValue") ) 
     151        filterCrit.getField("event").setShowNoValue( 
     152            sessionCopy.get("eventShowNoValue") ) 
     153 
     154        return filterCrit 
     155 
     156    def _checkAction( self, params, filtersActive, sessionData, operation ): 
     157        """ 
     158        Decides what to do with the request parameters, depending 
     159        on the type of operation that is requested 
     160        """ 
    128161 
    129162        # user chose to reset the filters 
     
    131164            self._filterUsed = False 
    132165            sessionData = self._resetFilters(sessionData) 
     166 
    133167        # user set the filters 
    134168        elif operation ==  'setFilters': 
    135169            self._filterUsed = True 
    136170            sessionData = self._updateFilters(sessionData, params) 
     171 
    137172        # user has changed the display options 
    138173        elif operation == 'setDisplay': 
    139174            self._filterUsed = filtersActive 
    140175            sessionData['disp'] = params.get('disp',[]) 
     176 
    141177        # session is empty (first time) 
    142178        elif not filtersActive: 
     
    153189 
    154190    def _checkParams( self, params ): 
     191        """ 
     192        Main parameter checking routine 
     193        """ 
    155194 
    156195        RHRegistrantListModifBase._checkParams(self, params) 
     
    191230            self._sessionFilterName="session" 
    192231 
    193         sessionData = self._checkFilterParams(params, filtersActive, sessionData, operation) 
    194  
    195  
    196         self._filterCrit = regFilters.RegFilterCrit(self._conf, sessionData) 
    197  
    198  
    199         self._filterCrit.getField("accomm").setShowNoValue( 
    200             sessionData.get("accommShowNoValue") ) 
    201         self._filterCrit.getField(self._sessionFilterName).setShowNoValue( 
    202             sessionData.get("sessionShowNoValue") ) 
    203         self._filterCrit.getField("event").setShowNoValue( 
    204             sessionData.get("eventShowNoValue") ) 
    205         self._filterCrit.getField("statuses").setShowNoValue( 
    206             sessionData.get("statusesShowNoValue") ) 
     232        sessionData = self._checkAction(params, filtersActive, sessionData, operation) 
     233 
     234        # Maintain the state abotu filter usage 
     235        sessionData['filtersActive'] = self._filterUsed; 
     236 
     237        # Save the web session 
     238        websession.setVar("registrantsFilterAndSortingConf%s"%self._conf.getId(), sessionData) 
     239 
     240        self._filterCrit = self._buildFilteringCriteria(sessionData) 
    207241 
    208242        self._sortingCrit = regFilters.SortingCriteria( [sessionData.get( "sortBy", "Name" ).strip()] ) 
    209243 
    210  
    211244        self._order = sessionData.get("order","down") 
    212245 
    213         self._display = sessionData.get("disp",[]) 
    214  
    215         # normalize ? 
    216         if not isinstance(self._display, list): 
    217             self._display = [self._display] 
    218  
    219         sessionData['filtersActive'] = self._filterUsed; 
    220         websession.setVar("registrantsFilterAndSortingConf%s"%self._conf.getId(), sessionData) 
     246        self._display = utils.normalizeToList(sessionData.get("disp",[])) 
    221247 
    222248 
     
    227253 
    228254class RHRegistrantListModifAction( RHRegistrantListModifBase ): 
    229  
    230255    def _checkParams( self, params ): 
    231256        RHRegistrantListModifBase._checkParams(self, params) 
  • indico/MaKaC/webinterface/tpls/ConfModifRegistrants.tpl

    r553e39 r16926f  
    22<!-- 
    33    var newUser = false; 
    4  
    5     function selectAcco() 
    6     { 
    7         document.filterOptionForm.accommShowNoValue.checked=true 
    8         if (!document.filterOptionForm.accomm.length) 
    9         { 
    10             document.filterOptionForm.accomm.checked=true 
    11         }else{ 
    12             for (i = 0; i < document.filterOptionForm.accomm.length; i++) 
    13             { 
    14                 document.filterOptionForm.accomm[i].checked=true 
    15             } 
    16         } 
    17     } 
    18  
    19     function unselectAcco() 
    20     { 
    21         document.filterOptionForm.accommShowNoValue.checked=false 
    22         if (!document.filterOptionForm.accomm.length) 
    23         { 
    24             document.filterOptionForm.accomm.checked=false 
    25         }else{ 
    26             for (i = 0; i < document.filterOptionForm.accomm.length; i++) 
    27             { 
    28                 document.filterOptionForm.accomm[i].checked=false 
    29             } 
    30         } 
    31     } 
    32     function selectEvent() 
    33     { 
    34         document.filterOptionForm.eventShowNoValue.checked=true 
    35         if (!document.filterOptionForm.event.length) 
    36         { 
    37             document.filterOptionForm.event.checked=true 
    38         }else{ 
    39             for (i = 0; i < document.filterOptionForm.event.length; i++) 
    40             { 
    41                 document.filterOptionForm.event[i].checked=true 
    42             } 
    43         } 
    44     } 
    45  
    46     function unselectEvent() 
    47     { 
    48         document.filterOptionForm.eventShowNoValue.checked=false 
    49         if (!document.filterOptionForm.event.length) 
    50         { 
    51             document.filterOptionForm.event.checked=false 
    52         }else{ 
    53             for (i = 0; i < document.filterOptionForm.event.length; i++) 
    54                 { 
    55                     document.filterOptionForm.event[i].checked=false 
    56             } 
    57         } 
    58     } 
    59     function selectSession() 
    60     { 
    61         document.filterOptionForm.sessionShowNoValue.checked=true 
    62         if (!document.filterOptionForm.session.length) 
    63         { 
    64             document.filterOptionForm.session.checked=true 
    65         }else{ 
    66             for (i = 0; i < document.filterOptionForm.session.length; i++) 
    67             { 
    68                 document.filterOptionForm.session[i].checked=true 
    69             } 
    70         } 
    71     } 
    72  
    73     function unselectSession() 
    74     { 
    75         document.filterOptionForm.sessionShowNoValue.checked=false 
    76         if (!document.filterOptionForm.session.length) 
    77         { 
    78             document.filterOptionForm.session.checked=false 
    79         }else{ 
    80             for (i = 0; i < document.filterOptionForm.session.length; i++) 
    81             { 
    82                 document.filterOptionForm.session[i].checked=false; 
    83             } 
    84         } 
    85     } 
    864 
    875    function selectStatuses() 
  • indico/htdocs/css/Default.css

    r9e3b7ff r16926f  
    58795879    right:0px; 
    58805880} 
     5881 
     5882.filterTable { 
     5883    border-collapse: collapse; 
     5884} 
Note: See TracChangeset for help on using the changeset viewer.