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

Ext JS / Sencha Discussion :

"e.reject is not a function" & total colonne


Sujet :

Ext JS / Sencha

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut "e.reject is not a function" & total colonne
    Bonjour,

    Je relance une discussion claire sur deux problèmes que j'ai sur deux editGrid.

    1 - e.reject is not a function :

    Dans ce tableau on ne doit pas pouvoir rentrer une valeur supérieur à 1. Je fais un teste sur la valeur(avec une version adapté du code de Takitano) mais il plante sur le reject.
    Voici le code de mon editGrid :
    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
     
    		var gridTR = new Ext.grid.EditorGridPanel({
    			store: storeTR,
    			cm: cmTR,
    			height: 150,
    			title: 'Repas',
    			frame: true,
    			clicksToEdit: 1,
    			listeners:{
    				afteredit: function(e){
    					if(e.value > 1){
    					e.reject();
    					}
    				}
    			}
    		});
    2 - Total d'une colonne :
    Je voudrais faire la même chose pour un autre tableau, mais pour le total d'une colonne qui ne doit pas dépasser 24. Je connais le total de mes colonnes grâce à gridSummary. Voici le code de mon editGrid.
    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
     
        var summary = new Ext.ux.grid.GridSummary();
     
        // create the editor grid
        var grid = new Ext.grid.EditorGridPanel({
            store: store,
    		plugins: [summary],
            cm: cm,
            height: 380,
            title: 'TimeSheet',
            frame: true,
            // specify the check column plugin on the grid so the plugin is initialized
            clicksToEdit: 1,
     
            tbar: [{
                text: 'Add',
                iconCls: 'silk-add',
                handler: function(){
                    // access the Record constructor through the grid's store
                    var Plant = grid.getStore().recordType;
                    var p = new Plant();
                    grid.stopEditing();
                    store.insert(0, p);
                    grid.startEditing(0, 0);
    				},
                scope: this
            }, '-',{
                text: 'Delete',
                iconCls: 'silk-delete',
    			handler: function(){
    				var index = grid.getSelectionModel().getSelectedCell();
    				if (!index) {
    					return false;
    					}
    				var rec = store.getAt(index[0]);
    				store.remove(rec);
    				},
    			scope: this
    		}, '-']
        });
    Le problème c'est que je ne sais pas quoi et comment le tester pour rejeter la saisie.

    Merci de votre aide, en espèrent avoir été beaucoup plus clair que lors de l'autre poste.

    Bonne journée, TsDr.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Par défaut
    1- remplace e.reject par e.record.reject
    2- je regarderais ton pb ce soir ... car en ce moment j'ai pas mal de boulot ... :s

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    1 - Question bête pourquoi fallait mettre un record, il en parle pas dans l'api... en tout cas ça marche.

    2 - Désolé pour le double poste, mais avec le recule mon autre discussion était vraiment pas clair, et n'aidait pas l'aideur à avoir envie d'aider.

    Merci.

    PS : si tu passe par Lyon, préviens je te paierai un café pour toute l'aide apporté.

    TsDr.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Bon j'ai continué à creuser, mais pas mieux. Au début je suis partis sur les topics du forum d'extjs parlant de ce GridSummary, mais avec mes compétences actuelles sa me dépasse juste après le "hello" .

    Du coup j'ai essayé un truc tout simple, qui je vous rassure ne marche pas. Re

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        var summary = new Ext.ux.grid.GridSummary(
    		{
    		listeners:{
    			afteredit: function(e){
    				if(e.value > 24){
    				e.record.reject();
    					}
    				}		
    			}
    		});
    Déjà je peux faire ça ? le listener sera-t-il vu ? Est ce un début de piste viable ?

    Merci, bonne journée.

    TsDr

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Par défaut
    ola ...

    voici un exemple qui marche ...

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    		'afteredit':function(e){
    			var cmp 	= 0;
    			for(var i=0;i<store.getCount();i++)
    				// "genre" est le dataIndex de ton datagrid ... à modifier !
    				cmp		+=	parseInt(store.getAt(i).data.genre);
     
    			if(cmp>24){
    				Ext.MessageBox.show({
    	    			title:'Alerte !',
    	        		msg:'Erreur, temps sup à 24 heures !',
    	        		buttons: Ext.Msg.OK});
    				e.record.reject();}
    			e.record.commit();

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Merci, j'essaye dès que je peux, et te tiens au courant.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Par défaut
    alors, c'est fait ... ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Edit :

    i1 is not defined
    [Break on this error] var dtidx = grid.getColumnModel().getDataIndex(i1);
    Alors que dans mon columnModel je les définie ainsi :
    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
    foreach($leCalendrier as $cle => $element)
    	{
    	$numJ = $cle+1;
    	$numXml = 'i'.$numJ;
    	if($numJ < 10)
    		{
    		$numJf = '0'.$numJ;
    		}
    	else
    		{
    		$numJf = $numJ;
    		}
    	if(($element == 'Saturday') || ($element == 'Sunday'))
    		{
    		echo "{header: '$numJ',
    		id: '$numXml',
    		dataIndex: '$numXml',
    		width: 20,
    		css:'background-color:#e6e6e6;',
    		summaryType: 'sum',
    		// use shorthand alias defined above
    		editor: new fm.NumberField({
    			allowBlank: true
    		})}\n";
    		if($totEnrg != $cle)
    			{
    			echo ",";
    			}
    		}
    	}
    Donc "i1" devrait bien définie, non ?

    Après je comptais remplacer "genre" par dtidx.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 267
    Par défaut
    essayes ca ...

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var temp =null;
    var dtidx = null;
     
    if(typeof(i1)!='undefined')
       temp = parseInt(i1.substr(1,i1.length-1));
    if( temp !=null)
       // dans la phrase d en dessous, je ne sais pas s'il faut mettre temp ou temp-1 ... a tester ... 
       var dtidx = grid.getColumnModel().getDataIndex(temp);

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    En fait c'est bon. J'avais une erreur de ";" que firebug ne me disait pas.

    Du coup en mettant i1 en directe là dedans ça tourne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmp += parseInt(store.getAt(j).data.i1);
    Par contre "e" est un objet contenant toutes les infos sur ce qu'on vient de modifier dans le grid, c'est bien ça ?

    Par ce que vu que chaque mois le nombre de colonnes change faudra forcément que je récup le dataIndex par un getDataIndex.

    Est ce qu'a partir de "e" y a un moyen de savoir dans qu'elle colonne il est ?

    Edit : Vu comme mon grid est construit avec le nom de "e" s'il en a un ça doit pouvoir le faire aussi.

    API inside, c'est une jungle ici y a des propriétés de partout

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Le "e" dont tu parles, ce ne serait pas l'évènement associé ? Dans ton exemple, pour ta fonction 'afteredit', cela doit correspondre à l'édition.

    Mako

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    En voyant les choses sous cette angle en effet c'est très probable.

    Par contre retour à la case départ... Comment je sais quelle est la colonne que l'utilisateur est en train de modifier ?

    Merci en tout cas de vos réponses, le problème à jamais été aussi proche d'être résolu, je vous en suis très reconnaissant.

  13. #13
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Pour récupérer l'index de la colonne en cours, soit tu utilises un évènement qui te le renvoie (par exemple, 'rowclick' utilise une fonction dont les paramètres sont la grille, l'index de la colonne et l'évènement).

    Deuxième façon, beaucoup moins jolie. Tu crées une variable 'index' au départ. Tu interceptes l'évènement 'sélection d'une colonne', et tu mets ta valeur dans index. Enfin, dans ton 'afteredit', tu peux utiliser ta variable index (bon, c'est vraiment moche en fait).

    Mako

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Merci Mako, j'étais justement entrain de lire l'événement cellclick dans l'API .

    Par contre il me prend le nom de la variable au lieu de prendre la valeur. Euh je m'explique avec un exemple en fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    listeners:{
    	cellclick:function(grid, rowIndex, columnIndex, e){
    		var record = grid.getStore().getAt(rowIndex);  // Get the Record
    		var dataId = grid.getColumnModel().getDataIndex(columnIndex); // Get field name
    		var value = record.get(dataId);
    		},
     
    	afteredit:function(e){			
    		var cmp = 0;
    		for(var j=0;j<store.getCount();j++)
    			cmp += parseInt(store.getAt(j).data.dataId); //il ne prend pas l'index contenu dans la variable "dataId"
    		}
    	},
    Ce qui est logique il me semble. Mais du coup comment tu lui fais lire la valeur ?

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Initialise ta variable (voire tes variables) avant tout. C'est à dire, avant la déclaration de ta grille, tu mets un puis, dans ton listener, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value = record.get(dataId);
    Pour récupérer la valeur de value (ou de dataId, c'est le même principe), tu n'as plus qu'à faire appel à ta variable, pas la peine de faire des store.get...

    Bonne chance !

    Mako

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Je me suis mal exprimé.

    J'ai justement besoin du store.getAd...etc. Car c'est ce qui permet de récupérer les valeur de chaque ligne dans une colonne donnée. Pour celà j'ai besoin du dataIndex.

    Pour une colonne avec comme dataIndex "i1", par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp += parseInt(store.getAt(j).data.i1
    Le truc c'est que les colonnes de mon grid sont générées en fonction du mois. D'où ma question de tout à l'heure. Grâce à ton poste j'arrive maintenant à récupérer n'importe quel dataIndex du grid. Le dataIndex est stocké dans la variable dataId.

    Mais au lieu de lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp += parseInt(store.getAt(j).data.i1
    il lit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp += parseInt(store.getAt(j).data.dataId
    Je pense avoir été plus clair, enfin j'espère

  17. #17
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Je me suis mal exprimé.
    Au temps pour moi, j'ai mal compris.

    Tu pourrais pas avoir ce que tu veux en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp += parseInt(store.getAt(j).get(dataId);
    par hasard ?

    Sinon, je ne vois pas, désolé.

    Mako

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 39
    Par défaut
    Ca m'avais même pas effleuré l'esprit, dur dur le lundi.

    Et donc si, j'ai tout a fait ce que je veux.

    Droooppyyy !

    Merci beaucoup tous les deux, vous venez de me résoudre un problème que je bataillé dessus depuis un long moment.

  19. #19
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Content d'avoir pu t'aider.
    Bonne chance pour la suite.

    Mako

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. indexOf is not a function : pourquoi
    Par avogadro dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/08/2006, 18h50
  2. document.getElementByTagName is not a function ?
    Par krolineeee dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/05/2006, 11h41
  3. window.document.forms[0].submit is not a function ?????
    Par michaelbob dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 04/01/2006, 17h08

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