IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Bug dans select all/none


Sujet :

Servlets/JSP Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut Bug dans select all/none
    Bonjour,

    Question principale :
    Je ne comprend pas pourquoi ma case select all/none fonctionne bien en select all (les cases se cochent et quand je récupère la liste dans ma form et j'ai bien tout = 59) mais quand je décoche, même si toutes les cases se décochent, ça me retourne la dernière liste qui était renvoyée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <script type="text/javascript">
                    checked=false;
                    function checkedAll (myForm) {
                            var aa= document.getElementById('myForm');
                            if (checked == false)
                            {
                                    checked = true
                            }
                            else
                            {
                                    checked = false
                            }
                            for (var i =0; i < aa.elements.length; i++) 
                            {
                                    aa.elements[i].checked = checked;
                            }
                    }
    </script>

    Question subsidiaire : comment initialiser mes checkbox à partir de l'action (partie Java)

    EDIT : voici mes checkbox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html-el:checkbox property="selectedItem" value="${itemMap.key}"/>

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Pour la question subsidiaire, j'ai la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <c:set var="ici">true</c:set>
    <c:forEach var="item" items="${myForm.selectedItem}">
    <c:if test="${item eq itemMap.key}">
    <td align="center"><input type="checkbox" name="selectedItem" value="${itemMap.key}" checked="checked"/></td>
    <c:set var="ici">false</c:set>
    </c:if>							</c:forEach>							
    <c:if test="${ici eq true}">
    <td align="center"><input type="checkbox" name="selectedItem" value="${itemMap.key}"/></td>
    </c:if>
    Par contre personne n'a pu m'expliquer pourquoi dans le sens "cocher tout" ma liste selectedItem se remplissait bien mais quand je fais "cocher rien" cette liste n'est pas mise à jour (tant qu'on ne clique pas sur une case par exemple)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ca n'intéresse probablement personne mais j'ai compris :
    en fait, ce qui se passe c'est que quand aucune case n'est cochée, ça refuse de me remplir ma liste selectedItem, ce qui fait qu'elle reste dans l'état où elle était juste avant.

    Comment contourner ça?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Pas d'idée?

  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Je ne connais pas quelle bibliothèque que tu utilises "html-el:checkbox".

    Mais si ce composant réagit comme le composant HTML (<input type="checkbox" name="option1" value="Valeur1"> ) alors aucune valeur n'est envoyée par le formulaire si la case n'est pas cochée.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ouf, je ne suis pas seul au monde.

    Oublie le "html-el:checkbox" : si tu regardes le dernier code que j'ai posté, tu vois que je suis repassé au simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="selectedItem" value="${itemMap.key}" checked="checked"/></td>
    alors aucune valeur n'est envoyée par le formulaire si la case n'est pas cochée
    C'est bien ce que je vois...mais moi j'aimerais dans ce cas que ma liste selectedItem soit vide...

    Un ami m'a dit de mettre une checkbox invisible avec une value=-1 par exemple que j'ignore à chaque fois quand je parcours ma liste pour contourner le problème mais c'est sale.

    Alors que me conseilleriez-vous pour contourner ce problème?

  7. #7
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Une liste nommée 'selectedItem', d'où sort-elle? De la variable myForm.selectedItem?

    Si c'est le cas, avant le traitement des cases à cocher, tu fais un clear de la liste.

    Dans le cas où l'utilisateur a sélectionné aucune case, ta liste est vide.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    C'est une application struts ?
    Si oui, lorsque tu utilises des checkbox, il est impératif de réinitialiser les valeurs associées dans la méthode reset de l'ActionForm.
    Le problème de base vient du fait qu'une checkbox non cochée ne renvoie rien (c'est html le coupable)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Je suis désolé mais j'ai pas du tout compris ce que je devais faire :

    selectedItem est une liste Integer[] qui est située dans ma form.
    Mais je n'ai pas de méthode reset.

    Dans mon action, avant l'affichage je fais :
    1°/Remplir la liste des cases cochées dans ma form (liste lue à partir d'un fichier)
    2°/mapping.findForward vers la page jsp qui m'affiche mon tableau

    Et quand j'appuie sur mon bouton valid
    1°/Je récupère la liste des cases cochées de ma form (correctement mise çà jour par la jsp, sauf quand aucune case n'est cochée)
    2°/je fais mes traitements (mise à jour du fichier qui contient la liste).

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    La classe représentant les données de ta page étend ActionForm.
    ActionForm possède une méthode reset dont la signature est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void reset(ActionMapping mapping, HttpServletRequest request)
    Il suffit de définir cette méthode dans ta classe et elle sera appelée au début du cycle de traitement de struts.
    En résumé, ce serait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    requête http -> ActionServlet -> ActionForm (reset) -> ActionForm (populate) -> Action
    Donc, tu mets les propriétés représentant la checkbox à false (ou 0 en fonction du type) dans cette méthode et tout ira...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Miracle, t'as bien compris mon problème qui consistait à redéfinir la fonction
    reset(ActionMapping mapping, HttpServletRequest request)

    Bon, pendant que j'ai des bons qui sont là, je vais parler de mon second bug (le titre du post est toujours valable) :

    J'ai une fonction de tri sur mes checkbox qui fonctionne uniquement sur les checkbox cochée à la création de la page :

    Si l'item appartient à ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td align="center"><input type="checkbox" name="selectedItem" value="${itemMap.key}" checked="checked"/></td>
    Sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td align="center"><input type="checkbox" name="selectedItem" value="${itemMap.key}"/></td>
    la fonction de tri est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var st = new SortableTable( document.getElementById("portfolios"), ["Number", "String", "CheckBox"] );
     
    function getCheckBoxValue (oRow, nColumn) {
    return oRow.cells[nColumn].firstChild.checked ? 1 : 0;
    };	
    st.addSortType("CheckBox", null, null, getCheckBoxValue);
    Je pense savoir à quoi est du le problème :
    Les nouvelles cases cochées ne prennent pas l'attribut checked="checked"
    <td align="center"><input type="checkbox" name="selectedItem" value="602"/></td>

    Après ça c'est bon

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu utilises du DHTML pour ajouter des lignes dynamiquement ou c'est toujours un ensemble de lignes qui viennent du serveur ?

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    J'ai fait un petit test sur la base de ton code et ô surprise c'est l'opération suivante qui pose problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    oRow.cells[nColumn].firstChild.checked ? 1 : 0
    Remplace par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (oRow.cells[nColumn].firstChild.checked) return 1;
    return 0;

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Non, c'est pareil :

    1°/j'ai 2 cases cochées initialement.
    2°J'en coche une troisième.
    3°/je trie et hop, je ne vois plus que mes 2 cases initiales apparaître en haut de mes lignes.

    Je crois vraiment que c'est parce que quand je coche les cases elles ne passent pas en attribut checked="checked", non?

  15. #15
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Je ne pense pas, l'attribut "checked" est géré par l'objet checkbox, tout checkbox l'a donc...

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Je ne pense pas, l'attribut "checked" est géré par l'objet checkbox, tout checkbox l'a donc...
    Je te dis ça en fonction du code source que je visualise : après avoir coché une nouvelle case, celle-ci n'a pas la même forme que celles déjà cochées (que je construis en checked="checked".

    Mais c'est peut-être pas ça, juste une piste. je ne sais pas trop quoi faire...

  17. #17
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Normalement, si tu passes par les balises html, la présence de l'attribut "checked" fait que visuellement, la case est cochée (tu peux mettre n'importe quel valeur derrière, c'est pareil)
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Celle-ci est cochée
    <input type="checkbox" name="..." value="..." checked/> 
     
    // Celle-là non
    <input type="checkbox" name="..." value="..."/>
    Le checked="checked" est ce qu'on met dans certaine bibliothèque de tag mais à l'arrivée, soit tu as checked soit tu ne l'a pas (mais c'est la balise qui gère)
    Dans tous les cas, comme tout objet <input type="checkbox"> A l'attribut checked, le problème ne doit pas venir de là... enfin, je ne pense pas

    Peux-tu montrer le code de SortableTable ?

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Je t'assure qu'on ne vois pas dans le code source les nouvelles cases mises à checked="checked".

    Je remet le code principal :
    les cases initialement cochées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td align="center"><input type="checkbox" name="selectedItem" value="${itemMap.key}" checked="checked"/></td>
    les cases initialement non cochées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td align="center"><input type="checkbox" name="selectedtem" value="${itemMap.key}"/></td>
    la fonction de tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script type="text/javascript">
    //<![CDATA[                     
    var st = new SortableTable( document.getElementById("myItems"), ["Number", "String", "CheckBox"] );
                                    
    function getCheckBoxValue (oRow, nColumn) {
    return oRow.cells[nColumn].firstChild.checked ? 0 : 1;
    };      
    st.addSortType("CheckBox", null, null, getCheckBoxValue);
    //]]>
    </script>

  19. #19
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par stof Voir le message
    Je t'assure qu'on ne vois pas dans le code source les nouvelles cases mises à checked="checked".
    Que veux-tu dire ?
    Quel rapport entre le code source et l'état en cours ?

    Tu ne veux pas montrer le code de SortableTable ?

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Que veux-tu dire ?
    Quel rapport entre le code source et l'état en cours ?
    Bah...quand on modifie l'écran, le code source n'est pas sensé changer aussi...je dis peut-être une bêtise là...

    Citation Envoyé par OButterlin Voir le message
    Tu ne veux pas montrer le code de SortableTable ?
    Excuse, je croyais que c'était standard mais voilà le code (qui a été pioché sur Internet d'après les commentaires) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    function SortableTable(oTable, oSortTypes) {
     
    	this._sortTypes = oSortTypes || [];
     
    	this.sortColumn = null;
    	this.descending = null;
     
    	var oThis = this;
    	this._headerOnclick = function (e) {
    		oThis.headerOnclick(e);
    	};
     
    	if (oTable) {
    		this.setTable( oTable );
    		this.document = oTable.ownerDocument || oTable.document;
    	}
    	else {
    		this.document = document;
    	}
     
     
    	// only IE needs this
    	var win = this.document.defaultView || this.document.parentWindow;
    	this._onunload = function () {
    		oThis.destroy();
    	};
    	if (win && typeof win.attachEvent != "undefined") {
    		win.attachEvent("onunload", this._onunload);
    	}
    }
     
    SortableTable.gecko = navigator.product == "Gecko";
    SortableTable.msie = /msie/i.test(navigator.userAgent);
    // Mozilla is faster when doing the DOM manipulations on
    // an orphaned element. MSIE is not
    SortableTable.removeBeforeSort = SortableTable.gecko;
     
    SortableTable.prototype.onsort = function () {};
     
    // default sort order. true -> descending, false -> ascending
    SortableTable.prototype.defaultDescending = false;
     
    // shared between all instances. This is intentional to allow external files
    // to modify the prototype
    SortableTable.prototype._sortTypeInfo = {};
     
    SortableTable.prototype.setTable = function (oTable) {
    	if ( this.tHead )
    		this.uninitHeader();
    	this.element = oTable;
    	this.setTHead( oTable.tHead );
    	this.setTBody( oTable.tBodies[0] );
    };
     
    SortableTable.prototype.setTHead = function (oTHead) {
    	if (this.tHead && this.tHead != oTHead )
    		this.uninitHeader();
    	this.tHead = oTHead;
    	this.initHeader( this._sortTypes );
    };
     
    SortableTable.prototype.setTBody = function (oTBody) {
    	this.tBody = oTBody;
    };
     
    SortableTable.prototype.setSortTypes = function ( oSortTypes ) {
    	if ( this.tHead )
    		this.uninitHeader();
    	this._sortTypes = oSortTypes || [];
    	if ( this.tHead )
    		this.initHeader( this._sortTypes );
    };
     
    // adds arrow containers and events
    // also binds sort type to the header cells so that reordering columns does
    // not break the sort types
    SortableTable.prototype.initHeader = function (oSortTypes) {
    	if (!this.tHead) return;
    	var cells = this.tHead.rows[0].cells;
    	var doc = this.tHead.ownerDocument || this.tHead.document;
    	this._sortTypes = oSortTypes || [];
    	var l = cells.length;
    	var img, c;
    	for (var i = 0; i < l; i++) {
    		c = cells[i];
    		if (this._sortTypes[i] != null && this._sortTypes[i] != "None") {
    			img = doc.createElement("IMG");
    			img.src = "common/img/blank.png";
    			c.appendChild(img);
    			if (this._sortTypes[i] != null)
    				c._sortType = this._sortTypes[i];
    			if (typeof c.addEventListener != "undefined")
    				c.addEventListener("click", this._headerOnclick, false);
    			else if (typeof c.attachEvent != "undefined")
    				c.attachEvent("onclick", this._headerOnclick);
    			else
    				c.onclick = this._headerOnclick;
    		}
    		else
    		{
    			c.setAttribute( "_sortType", oSortTypes[i] );
    			c._sortType = "None";
    		}
    	}
    	this.updateHeaderArrows();
    };
     
    // remove arrows and events
    SortableTable.prototype.uninitHeader = function () {
    	if (!this.tHead) return;
    	var cells = this.tHead.rows[0].cells;
    	var l = cells.length;
    	var c;
    	for (var i = 0; i < l; i++) {
    		c = cells[i];
    		if (c._sortType != null && c._sortType != "None") {
    			c.removeChild(c.lastChild);
    			if (typeof c.removeEventListener != "undefined")
    				c.removeEventListener("click", this._headerOnclick, false);
    			else if (typeof c.detachEvent != "undefined")
    				c.detachEvent("onclick", this._headerOnclick);
    			c._sortType = null;
    			c.removeAttribute( "_sortType" );
    		}
    	}
    };
     
    SortableTable.prototype.updateHeaderArrows = function () {
    	if (!this.tHead) return;
    	var cells = this.tHead.rows[0].cells;
    	var l = cells.length;
    	var img;
    	for (var i = 0; i < l; i++) {
    		if (cells[i]._sortType != null && cells[i]._sortType != "None") {
    			img = cells[i].lastChild;
    			if (i == this.sortColumn)
    				img.className = "sort-arrow " + (this.descending ? "descending" : "ascending");
    			else
    				img.className = "sort-arrow";
    		}
    	}
    };
     
    SortableTable.prototype.headerOnclick = function (e) {
    	// find TD element
    	var el = e.target || e.srcElement;
    	while (el.tagName != "TD")
    		el = el.parentNode;
     
    	this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);
    };
     
    // IE returns wrong cellIndex when columns are hidden
    SortableTable.getCellIndex = function (oTd) {
    	var cells = oTd.parentNode.childNodes
    	var l = cells.length;
    	var i;
    	for (i = 0; cells[i] != oTd && i < l; i++)
    		;
    	return i;
    };
     
    SortableTable.prototype.getSortType = function (nColumn) {
    	return this._sortTypes[nColumn] || "String";
    };
     
    // only nColumn is required
    // if bDescending is left out the old value is taken into account
    // if sSortType is left out the sort type is found from the sortTypes array
     
    SortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {
    	if (!this.tBody) return;
    	if (sSortType == null)
    		sSortType = this.getSortType(nColumn);
     
    	// exit if None
    	if (sSortType == "None")
    		return;
     
    	if (bDescending == null) {
    		if (this.sortColumn != nColumn)
    			this.descending = this.defaultDescending;
    		else
    			this.descending = !this.descending;
    	}
    	else
    		this.descending = bDescending;
     
    	this.sortColumn = nColumn;
     
    	if (typeof this.onbeforesort == "function")
    		this.onbeforesort();
     
    	var f = this.getSortFunction(sSortType, nColumn);
    	var a = this.getCache(sSortType, nColumn);
    	var tBody = this.tBody;
     
    	a.sort(f);
     
    	if (this.descending)
    		a.reverse();
     
    	if (SortableTable.removeBeforeSort) {
    		// remove from doc
    		var nextSibling = tBody.nextSibling;
    		var p = tBody.parentNode;
    		p.removeChild(tBody);
    	}
     
    	// insert in the new order
    	var l = a.length;
    	for (var i = 0; i < l; i++)
    		tBody.appendChild(a[i].element);
     
    	if (SortableTable.removeBeforeSort) {
    		// insert into doc
    		p.insertBefore(tBody, nextSibling);
    	}
     
    	this.updateHeaderArrows();
     
    	this.destroyCache(a);
     
    	if (typeof this.onsort == "function")
    		this.onsort();
    };
     
    SortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {
    	var oThis = this;
    	this._asyncsort = function () {
    		oThis.sort(nColumn, bDescending, sSortType);
    	};
    	window.setTimeout(this._asyncsort, 1);
    };
     
    SortableTable.prototype.getCache = function (sType, nColumn) {
    	if (!this.tBody) return [];
    	var rows = this.tBody.rows;
    	var l = rows.length;
    	var a = new Array(l);
    	var r;
    	for (var i = 0; i < l; i++) {
    		r = rows[i];
    		a[i] = {
    			value:		this.getRowValue(r, sType, nColumn),
    			element:	r
    		};
    	};
    	return a;
    };
     
    SortableTable.prototype.destroyCache = function (oArray) {
    	var l = oArray.length;
    	for (var i = 0; i < l; i++) {
    		oArray[i].value = null;
    		oArray[i].element = null;
    		oArray[i] = null;
    	}
    };
     
    SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {
    	// if we have defined a custom getRowValue use that
    	if (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)
    		return this._sortTypeInfo[sType].getRowValue(oRow, nColumn);
     
    	var s;
    	var c = oRow.cells[nColumn];
    	if (typeof c.innerText != "undefined")
    		s = c.innerText;
    	else
    		s = SortableTable.getInnerText(c);
    	return this.getValueFromString(s, sType);
    };
     
    SortableTable.getInnerText = function (oNode) {
    	var s = "";
    	var cs = oNode.childNodes;
    	var l = cs.length;
    	for (var i = 0; i < l; i++) {
    		switch (cs[i].nodeType) {
    			case 1: //ELEMENT_NODE
    				s += SortableTable.getInnerText(cs[i]);
    				break;
    			case 3:	//TEXT_NODE
    				s += cs[i].nodeValue;
    				break;
    		}
    	}
    	return s;
    };
     
    SortableTable.prototype.getValueFromString = function (sText, sType) {
    	if (this._sortTypeInfo[sType])
    		return this._sortTypeInfo[sType].getValueFromString( sText );
    	return sText;
    	/*
    	switch (sType) {
    		case "Number":
    			return Number(sText);
    		case "CaseInsensitiveString":
    			return sText.toUpperCase();
    		case "Date":
    			var parts = sText.split("-");
    			var d = new Date(0);
    			d.setFullYear(parts[0]);
    			d.setDate(parts[2]);
    			d.setMonth(parts[1] - 1);
    			return d.valueOf();
    	}
    	return sText;
    	*/
    	};
     
    SortableTable.prototype.getSortFunction = function (sType, nColumn) {
    	if (this._sortTypeInfo[sType])
    		return this._sortTypeInfo[sType].compare;
    	return SortableTable.basicCompare;
    };
     
    SortableTable.prototype.destroy = function () {
    	this.uninitHeader();
    	var win = this.document.parentWindow;
    	if (win && typeof win.detachEvent != "undefined") {	// only IE needs this
    		win.detachEvent("onunload", this._onunload);
    	}
    	this._onunload = null;
    	this.element = null;
    	this.tHead = null;
    	this.tBody = null;
    	this.document = null;
    	this._headerOnclick = null;
    	this.sortTypes = null;
    	this._asyncsort = null;
    	this.onsort = null;
    };
     
    // Adds a sort type to all instance of SortableTable
    // sType : String - the identifier of the sort type
    // fGetValueFromString : function ( s : string ) : T - A function that takes a
    //    string and casts it to a desired format. If left out the string is just
    //    returned
    // fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort
    //    compare function. Takes two values and compares them. If left out less than,
    //    <, compare is used
    // fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function
    //    that takes the row and the column index and returns the value used to compare.
    //    If left out then the innerText is first taken for the cell and then the
    //    fGetValueFromString is used to convert that string the desired value and type
     
    SortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {
    	this._sortTypeInfo[sType] = {
    		type:				sType,
    		getValueFromString:	fGetValueFromString || SortableTable.idFunction,
    		compare:			fCompareFunction || SortableTable.basicCompare,
    		getRowValue:		fGetRowValue
    	};
    };
     
    // this removes the sort type from all instances of SortableTable
    SortableTable.prototype.removeSortType = function (sType) {
    	delete this._sortTypeInfo[sType];
    };
     
    SortableTable.basicCompare = function compare(n1, n2) {
    	if (n1.value < n2.value)
    		return -1;
    	if (n2.value < n1.value)
    		return 1;
    	return 0;
    };
     
    SortableTable.idFunction = function (x) {
    	return x;
    };
     
    SortableTable.toUpperCase = function (s) {
    	return s.toUpperCase();
    };
     
    SortableTable.toDate = function (s) {
    	var parts = s.split("/");
    	var d = new Date(0);
    	d.setFullYear(parts[2]);
    	d.setDate(parts[1]);
    	d.setMonth(parts[0]);
    	return d.valueOf();
    };
     
     
    SortableTable.toFloat = function (s) {
    	//Supprime les espaces dans la chaine de caracteres
    	//var n = s.replace(/(^\s*)|(\s*$)/g,'');
    	var n = s.replace(/\s*/g,'');
    	var i = n.indexOf( "," );
    	var result;
    	if ( i != -1 )
    	{
    		var p1 = n.substr( 0, i );
    		var p2 = n.substr( i + 1, s.length );
    		//Remplace la "," par un "."
    		result = p1 + "." + p2;
    	}else{
    		result = n;
    	}
     
    	return parseFloat( result );
    };
     
    // add sort types
    SortableTable.prototype.addSortType("Number", Number);
    SortableTable.prototype.addSortType("CaseInsensitiveString", SortableTable.toUpperCase);
    SortableTable.prototype.addSortType("Date", SortableTable.toDate);
    SortableTable.prototype.addSortType("String");
    SortableTable.prototype.addSortType("Float", SortableTable.toFloat);
    // None is a special case

Discussions similaires

  1. [Dojo] Select All dans un Dojo enhancedGrid
    Par Knarf64 dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 30/05/2011, 08h58
  2. Ajout de critères dans Select utilisé par xp_sendmail
    Par bd0606 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 28/05/2004, 17h02
  3. Bug dans les expressions régulières ?
    Par SergioF dans le forum Linux
    Réponses: 8
    Dernier message: 12/05/2004, 15h14
  4. [PROPERTIES] Bug dans java.util.Properties ?
    Par mathieu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 28/04/2004, 15h11
  5. bug dans une base Access
    Par bizouard dans le forum Access
    Réponses: 5
    Dernier message: 29/12/2003, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo