1. #1
    Sencha Premium Member sencha-dev2's Avatar
    Join Date
    Jun 2012
    Location
    France
    Posts
    59
    Answers
    2
    Vote Rating
    0
    sencha-dev2 is on a distinguished road

      0  

    Exclamation Answered: URL issue

    Answered: URL issue


    Hi all, I have a (new) problem with one of the files I work with. For an undefined reason, it doesn't seem to load conveniently. I spent three entire days on trying to debug that by myself, but I finally give up. I'm unable to fix the problem...

    Please, help me. I'll give you the file which is not working, and the Trace given by the Debugger for the Exception. I just can't figure out why it doesn't work, hope you'll be able to...

    Here's the file (commented in french while debugging) :

    Code:
    Ext.define('Infologis.view.MoniteurRepas', { // définition du nom de la classe
        extend: 'Ext.grid.Panel', // classe qui sert de base à SuiviRepas
        itemId: 'gridSuiviRepas', // identifiant local permettant de retrouver l'élément (n'est pas soumis à unicité, contrairement à id)
        id: 'moniteurRepas', // identifiant global unique
        title: 'Moniteur de Suivi des Repas', // titre du panel
        columnLines: true, // permet d'afficher le tracé des colonnes et donc de mieux dissocier les données à l'écran
        store: 'SaisiePortage', // le store qui contient les données à afficher dans le tableau
        alias: 'widget.moniteurRepas', // raccourci nominal permettant l'appel du composant sans citer le nom de sa classe complète et définissant sa nature (widget, plugin, etc...)
        closable: true, // l'onglet dispose d'un bouton de fermeture
        
        // fonction d'initialisation du composant
        initComponent: function() {
            var me = this;
            
            Ext.applyIf(me, {
                columns: [
                    {
                        xtype: 'gridcolumn', // colonne simple de tableau, moins spécialisée que les autres types
                        minWidth: 100, // largeur minimale
                        maxWidth: 300, // largeur maximale
                        draggable: false, // ne peut être déplacée
                        sortable: false, // son contenu ne peut être trié
                        align: 'center', // tout ce qu'elle contient possède un alignement au centre
                        dataIndex: 'nomPrenom', // donnée du store à laquelle elle est reliée
                        flex: 2, // peut s'adapter en taille suivant l'espace disponible (proportionnalité de poids double)
                        menuDisabled: true, // le menu d'en-tête est indisponible (évite l'affichage de données inintéressantes pour l'utilisateur)
                        text: 'Bénéficiaire' // texte inscrit dans l'en-tête (il faut respecter les normes d'encodage HTML pour les lettres accentuées)
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) { // fonction qui permet d'intercepter les données avant leur affichage et de construire l'affichage avec diverses propriétés suivant la valeur interceptée
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxLundi',
                        flex: 1, // peut s'adapter en taille suivant l'espace disponible (proportionnalité de poids simple)
                        menuDisabled: true,
                        text: 'Lundi',
                        editor: { // permet de paramétrer le champ affiché par le plugin d'édition par cellules en cas de modifications
                            xtype: 'numberfield', // champ spécialisé pour les nombres avec un sélecteur de valeur
                            allowBlank: false, // le champ doit être renseigné pour valider la modification (mais dans ce cas, la valeur null correspond également à 0)
                            allowDecimals: false, // les nombres décimaux ne sont pas autorisés
                            decimalPrecision: 0, // donc on n'utilise que les nombres entiers
                            minValue: 0, // valeur minimale autorisée pour le champ
                            maxValue: 9 // valeur maximale autorisée pour le champ
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) { // fonction qui permet d'intercepter les données avant leur affichage et de construire l'affichage avec diverses propriétés suivant la valeur interceptée
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxMardi',
                        flex: 1, // peut s'adapter en taille suivant l'espace disponible (proportionnalité de poids simple)
                        menuDisabled: true,
                        text: 'Mardi',
                        editor: { // permet de paramétrer le champ affiché par le plugin d'édition par cellules en cas de modifications
                            xtype: 'numberfield', // champ spécialisé pour les nombres avec un sélecteur de valeur
                            allowBlank: false, // le champ doit être renseigné pour valider la modification (mais dans ce cas, la valeur null correspond également à 0)
                            allowDecimals: false, // les nombres décimaux ne sont pas autorisés
                            decimalPrecision: 0, // donc on n'utilise que les nombres entiers
                            minValue: 0, // valeur minimale autorisée pour le champ
                            maxValue: 9 // valeur maximale autorisée pour le champ
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxMercredi',
                        flex: 1,
                        menuDisabled: true,
                        text: 'Mercredi',
                        editor: {
                            xtype: 'numberfield',
                            allowBlank: false,
                            allowDecimals: false,
                            decimalPrecision: 0,
                            minValue: 0,
                            maxValue: 9
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxJeudi',
                        flex: 1,
                        menuDisabled: true,
                        text: 'Jeudi',
                        editor: {
                            xtype: 'numberfield',
                            allowBlank: false,
                            allowDecimals: false,
                            decimalPrecision: 0,
                            minValue: 0,
                            maxValue: 9
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxVendredi',
                        flex: 1,
                        menuDisabled: true,
                        text: 'Vendredi',
                        editor: {
                            xtype: 'numberfield',
                            allowBlank: false,
                            allowDecimals: false,
                            decimalPrecision: 0,
                            minValue: 0,
                            maxValue: 9
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxSamedi',
                        flex: 1,
                        menuDisabled: true,
                        text: 'Samedi',
                        editor: {
                            xtype: 'numberfield',
                            allowBlank: false,
                            allowDecimals: false,
                            decimalPrecision: 0,
                            minValue: 0,
                            maxValue: 9
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                            if(value === 0 || value === null) {
                                metaData.style = 'background-color: #FFC2C2';
                                var str = "Absence justifiée du.... au .... pour cause de......";
                                metaData.tdAttr = 'data-qtip="' + str + '"';
                                return null;
                            } else {
                                return value;
                            }
                        },
                        draggable: false, 
                        maxWidth: 100,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'plateauxDimanche',
                        flex: 1,
                        menuDisabled: true,
                        text: 'Dimanche',
                        editor: {
                            xtype: 'numberfield',
                            allowBlank: false,
                            allowDecimals: false,
                            decimalPrecision: 0,
                            minValue: 0,
                            maxValue: 9
                        }
                    },
                    {
                        xtype: 'gridcolumn',
                        draggable: false,
                        maxWidth: 60,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'totalSemaine',
                        flex: 2,
                        menuDisabled: true,
                        text: 'Total'
                    },
                    {
                        xtype: 'gridcolumn',
                        hidden: true, // la colonne est cachée par défaut
                        dataIndex: 'idBeneficiaire',
                        hideable: false, // mais on ne peut changer son état de visibilité
                        menuDisabled: true,
                        text: 'idBeneficiaire'
                    },
                    {
                        xtype: 'gridcolumn',
                        renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {
                            if(value === 'Facturé') {
                                metaData.style = 'color: green';
                            } else {
                                if(value === 'Non traité') {
                                    metaData.style = 'color: red';
                                } else {
                                    metaData.style = '';
                                }
                            }
                            
                            return value;
                        },
                        draggable: false,
                        maxWidth: 200,
                        sortable: false,
                        align: 'center',
                        dataIndex: 'libelleEtat',
                        menuDisabled: true,
                        text: 'Etat'
                    },
                    {
                        xtype: 'actioncolumn', // ce type de colonne est prévu pour contenir des icônes actives
                        draggable: false,
                        itemId: 'actionBeneficiaire',
                        sortable: false,
                        hideable: false,
                        menuDisabled: true,
                        items: [ // chaque élément doit donc disposer d'une image, d'un texte alternatif (si on ne peut afficher l'image), d'une fonction se déclenchant au clic et, éventuellement, d'une bulle d'information
                            {
                                handler: function(view, rowIndex, colIndex, item, e, record, row) {
                                    Ext.MessageBox.alert('Info', 'Vous avez cliqué sur "Consulter".');
                                },
                                altText: 'Consulter',
                                icon: 'images/icons/magnifier.png',
                                tooltip: 'Consulter'
                            },
                            {
                                handler: function(view, rowIndex, colIndex, item, e, record, row) {
                                    Ext.MessageBox.alert('Info', 'Vous avez cliqué sur "Modifier".');
                                },
                                altText: 'Modifier',
                                icon: 'images/icons/edit.png',
                                tooltip: 'Modifier'
                            },
                            {
                                handler: function(view, rowIndex, colIndex, item, e, record, row) {
                                    Ext.MessageBox.alert('Info', 'Vous avez cliqué sur "Editer".');
                                },
                                altText: 'Editer',
                                icon: 'images/icons/printer.png',
                                tooltip: 'Editer'
                            },
                            {
                                handler: function(view, rowIndex, colIndex, item, e, record, row) {
                                    Ext.MessageBox.alert('Info', 'Vous avez cliqué sur "Valider".');
                                },
                                altText: 'Valider',
                                icon: 'images/icons/tick.png',
                                tooltip: 'Valider'
                            }
                        ]
                    }
                ],
                plugins: [ // les différents plugins associés au tableau sont définis ici
                    Ext.create('Ext.grid.plugin.CellEditing', { // ici se trouvent le nom de la classe du plugin,
                        ptype: 'cellediting', // son raccourci,
                        clicksToEdit: 1 // et le nombre de cilcs nécessaires pour le déclencher
                    })
                ],
                dockedItems: [ // ici se trouvent les objets ancrés
                    {
                        xtype: 'toolbar', // une barre d'outils
                        dock: 'top', // ancrée en haut
                        items: [ // dont les éléments suivent ci-après
                            {
                                xtype: 'button', // bouton
                                cls: 'x-btn-text-icon', // qui dispose d'une classe CSS permettant de mêler texte et image
                                itemId: 'btnSMoins',
                                width: 25, // largeur
                                icon: 'images/icons/arrow_left.png', // et icône
                                listeners: { // la liste des évènements à surveiller pour l'élément
                                    click: {
                                        fn: me.onBtnSMoinsClick, // la fonction à appeler lors du clic, en l'occurrence
                                        scope: me // et la valeur que this doit représenter au sein de la fonction
                                    }
                                }
                            },
                            {
                                xtype: 'datefield', // champ de type date
                                itemId: 'dateDebut',
                                width: 160,
                                fieldLabel: 'Semaine du ', // label précédant le champ
                                labelWidth: 70, // largeur du label
                                format: 'd/m/Y', // définition du format d'affichage de la date (jour/mois/année complète)
                                listeners: {
                                    select: { // sur sélection d'une date
                                        fn: me.onDateDebutSelect,
                                        scope: me
                                    },
                                    beforerender: { // avant de créer l'élément
                                        fn: me.onDateDebutBeforeRender,
                                        scope: me
                                    }
                                }
                            },
                            {
                                xtype: 'datefield',
                                itemId: 'dateFin',
                                margin: '0 0 0 5', // on peut spécifier des marges pour les éléments (haut droite bas gauche)
                                width: 120,
                                fieldLabel: ' Au ',
                                labelWidth: 30,
                                format: 'd/m/Y'
                            },
                            {
                                xtype: 'button',
                                itemId: 'btnSPlus',
                                width: 25,
                                icon: 'images/icons/arrow_right.png',
                                listeners: {
                                    click: {
                                        fn: me.onBtnSPlusClick,
                                        scope: me
                                    }
                                }
                            },
                            {
                                xtype: 'container', // un container vide se comporte comme un espacement
                                width: 10 // qui réagit suivant la largeur qu'on lui attribue
                            },
                            {
                                xtype: 'combobox', // combo, ou liste déroulante
                                itemId: 'cboEtat',
                                width: 160,
                                fieldLabel: 'Etat ',
                                labelWidth: 40,
                                displayField: 'libelleEtat', // on spécifie le champ affiché dans la liste
                                queryMode: 'local', // le mode de requête (permet de saisir dans le champ et de déterminer si la liste est alimentée, puis on s'en sert, ou si l'on doit l'alimenter dynamiquement afin de péserver de l'espace de mémoire, comme dans le cas d'une combo concernant les villes du pays)
                                store: 'Etat', // le store d'alimentation
                                valueField: 'idEtat', // on spécifie le champ renvoyé au système
                                listeners: {
                                    afterrender: { // après création de l'élément
                                        fn: me.onComboboxAfterRender,
                                        scope: me
                                    },
                                    select: { // sur sélection d'un enregistrement
                                        fn: me.onComboboxSelect,
                                        scope: me
                                    }
                                }
                            },
                            {
                                xtype: 'container',
                                width: 10
                            },
                            {
                                xtype: 'textfield', // champ texte simple 
                                itemId: 'txtNom',
                                width: 160,
                                fieldLabel: 'Nom ',
                                labelWidth: 40,
                                enableKeyEvents: true, // on autorise l'écoute de la saisie utilisateur sur ce champ
                                listeners: {
                                    keyup: { // sur relâchement d'une touche
                                        fn: me.onTextfieldKeyup,
                                        scope: me
                                    }
                                }
                            },
                            {
                                xtype: 'container',
                                flex: 1
                            },
                            {
                                xtype: 'button',
                                icon: 'images/icons/tick.png',
                                iconCls: 'x-btn-text-icon',
                                text: 'Valider'
                            }
                        ]
                    }
                ]
            });
            
            me.callParent(arguments);
        },
        
        // fonction déclenchée par un clic sur le bouton btnSMoins de la toolbar
        onBtnSMoinsClick: function(button, e, options) { // l'évènement clic renvoe trois paramètres (le bouton appelant, les informations relatives et les éventuelles options passées)
            var date = Ext.ComponentQuery.query('datefield[itemId="dateDebut"]')[0]; // On cherche le premier champ date correspondant pour le référencer dans la variable
            var dt = new Date(date.value.getFullYear(), date.value.getMonth(), (parseInt(date.value.getDate(), 10) - 7)); // on crée une date à partir de l'ancienne valeur du champ moins sept jours (l'ajustement est automatique en cas de changement de mois ou d'année)
            date.setValue(dt); // on force la valeur du champ sur la nouvelle date
            date.fireEvent('select', date, date.getValue()); // et on lance l'évènement de sélection de la date
            Ext.ComponentQuery.query('textfield[itemId="txtNom"]').setValue(''); // on réinitialise le champ texte
            Ext.ComponentQuery.query('combobox[itemId="cboEtat"]').setValue(0); // et la liste déroulante, afin d'éviter des soucis de filtrage
        },
        
        // fonction déclenchée par la sélection d'une date
        onDateDebutSelect: function(field, value, options) { // l'évènement de sélection renvoie trois paramètres (l'élément appelant, sa valeur, et les éventuelles options passées)
            var headerL = field.up().up().down('gridcolumn[dataIndex="plateauxLundi"]'), // on définit les variables qui vont pointer sur les colonnes
                headerM = field.up().up().down('gridcolumn[dataIndex="plateauxMardi"]'),
                headerMe = field.up().up().down('gridcolumn[dataIndex="plateauxMercredi"]'),
                headerJ = field.up().up().down('gridcolumn[dataIndex="plateauxJeudi"]'),
                headerV = field.up().up().down('gridcolumn[dataIndex="plateauxVendredi"]'),
                headerS = field.up().up().down('gridcolumn[dataIndex="plateauxSamedi"]'),
                headerD = field.up().up().down('gridcolumn[dataIndex="plateauxDimanche"]'),
                head = [headerL, headerM, headerMe, headerJ, headerV, headerS, headerD], // on crée un tableau pour stocker les références
                jour, // ainsi que deux varibles vides
                mois,
                dt = new Date(value); // et une qui contiendra un objet Date créé à partir de la valeur du champ
            
            // récupération du jour sélectionné (/mois)
            var jourMois = dt.getDate();
            // récupération de l'indice du jour dans la semaine
            var jourSemaine = dt.getDay();
            // création d'une variable qui place le jour de départ au lundi
            if(jourSemaine === 0 || jourSemaine === '0') {
                jour = jourMois - 7;
            } else {
                jour = jourMois - jourSemaine + 1; // le +1 est dû à l'indice commencant le dimanche à 0, pour obtenir le lundi il faut donc ajouter un
            }
            
            // affectation des dates aux en-têtes de colonnes
            for(var i = 0; i < 7; i++) {
                var m = 1;
                var d = jour + i;
                if(dt.getMonth() === 1 || dt.getMonth() === '1') {
                    if(dt.isLeapYear() && d > 29) {
                        d = d - 29;
                        m = 2;
                    } else {
                        if(d > 28) {
                            d = d - 28;
                            m = 2;
                        }
                    }
                } else {
                    if((dt.getMonth() === 3 || dt.getMonth() === '3' ||
                        dt.getMonth() === 5 || dt.getMonth() === '5' ||
                        dt.getMonth() === 8 || dt.getMonth() === '8' ||
                        dt.getMonth() === 10 || dt.getMonth() === '10') && d > 30
                    ) {
                        d = d - 30;
                        m = 2;
                    } else {
                        if(d > 31) {
                            d = d - 31;
                            m = 2;
                        }
                    }
                }
                if(dt.getMonth() + m > 12) {
                    mois = '01';
                } else {
                    mois = (((dt.getMonth() + m) < 10) ? ('0' + (dt.getMonth() + m)) : (dt.getMonth() + m));
                }
                head[i].setText(head[i].text.split(' ')[0] + ' ' + d + '/' + mois);
            }
                
            Ext.ComponentQuery.query('gridpanel[itemId="gridSuiviRepas"]')[0].store.filterBy(function(record) { // on filtre ici les résultats du store en comparant les dates des résultats avec la valeur du champ
                var date = record.get('date').split('/');
                var semaine = new Date(date[2], (parseInt(date[1], 10) - 1), date[0]);
                semaine = Ext.Date.format(semaine, 'W/o'); // le format 'W/o' permet d'extraire d'une date la semaine et l'année ISO qui la concernent
                var s = Ext.Date.format(field.getValue(), 'W/o');
                if(semaine === s) return true;
            });
            
            Ext.ComponentQuery.query('textfield[itemId="txtNom"]')[0].setValue(''); // on remet à zéro le champ texte
            Ext.ComponentQuery.query('combobox[itemId="cboEtat"]')[0].setValue(0); // et la combo pour éviter les problèmes de filtrage
        },
        
        // fonction déclenchée par la création du champ date de début (à retravailler pour placer la date du lundi et du dimanche de la semaine)
        onDateDebutBeforeRender: function(abstractcomponent, options) { // l'évènement avant création renvoie deux paramètres (l'élément appelant et les éventuelles options passées)
            abstractcomponent.setValue(new Date()); // on place dans le composant la date du jour
            var dt = new Date();
            Ext.ComponentQuery.query('datefield[itemId="dateFin"]')[0].setValue(dt.getFullYear(), dt.getMonth(), (parseInt(dt.getDate(), 10) + 6)); // on place dans le champ date de fin la date du jour plus 6 qui correspond donc au dernier jour du cycle
            abstractcomponent.fireEvent('select', abstractcomponent, abstractcomponent.getValue()); // on lance l'évènement de sélection d'une date 
        },
        
        // fonction déclenchée par le clic sur le bouton btnSPlus
        onBtnSPlusClick: function(button, e, options) {
            var date = Ext.ComponentQuery.query('datefield[itemId="dateDebut"]')[0];
            date.setValue(new Date(date.value.getFullYear(), date.value.getMonth(), (parseInt(date.value.getDate(), 10) + 7)));
            date.fireEvent('select', date, date.getValue());
            Ext.ComponentQuery.query('textfield[itemId="txtNom"]')[0].setValue('');
            Ext.ComponentQuery.query('combobox[itemId="cboEtat"]')[0].setValue(0);
        },
        
        // fonction déclenchée par la création de la combo 
        onComboboxAfterRender: function(abstractcomponent, options) { // afterrender renvoie les mêmes paramètres que beforerender
            abstractcomponent.store.insert(0, [{'libelleEtat': 'Afficher tout', 'idEtat': 0}]); // on insère dans le store de la combo l'élément à l'indice de position 0
            abstractcomponent.setValue(0); // et on force la valeur de la combo dessus
        },
        
        // fonction déclenchée par la sélection d'un élément de données dans la combo
        onComboboxSelect: function(combo, records, options) {
            Ext.ComponentQuery.query('gridSuiviRepaspanel[itemId="gridSuiviRepas"]')[0].store.filterBy(function(record) {
                var date = record.get('date').split('/'); // on récupère la donnée date stockée dans le store sous la forme ('jour/mois/année complète') et on la divise sur tous les caractères '/'
                if(combo.getValue() === 0 && Ext.Date.format(new Date(date[2], parseInt(date[1], 10) - 1, date[0]), 'W/o') === Ext.Date.format(Ext.ComponentQuery.query('datefield[itemId="dateDebut"]')[0].getValue(), 'W/o')) { // si les semaines iso et les années iso sont identiques, on laisse l'enregistrement dans le tableau (combo sur afficher tout)
                    return true;
                } else { // dans le cas contraire
                    if(record.get('idEtat') === combo.getValue() && Ext.Date.format(new Date(date[2], (parseInt(date[1], 10) - 1), date[0]), 'W/o') === Ext.Date.format(Ext.ComponentQuery.query('datefield[itemId="dateDebut"]')[0].getValue(), 'W/o')) { // on vérifie de nouveau l'égalité, en tenant compte de la valeur de l'état' de l'enregistrement
                        return true;
                    } else {
                        return false;
                    }
                }
            });
            Ext.ComponentQuery.query('textfield[itemId="txtNom"]')[0].setValue(''); // et on réinitialise le champ texte
        },
        
        // fonction déclenchée par le relâchement d'une touche dans le champ de saisie
        onTextfieldKeyup: function(textfield, e, options) {
            if(e.getCharCode() === 13) { // si la touche relâchée est la touche 'Entrée'
                Ext.ComponentQuery.query('gridSuiviRepaspanel[itemId="gridSuiviRepas"]')[0].store.filterBy(function(record) {
                    if(Ext.Date.format(Ext.ComponentQuery.query('datefield[itemId="dateDebut"]')[0].getValue(), 'W/o') === Ext.Date.format(new Date(record.get('date').split('/')[2], parseInt(record.get('date').split('/')[2], 10) - 1, record.get('date').split('/')[0]), 'W/o')) { // que les semaines ISO et les années ISO correspondent et
                        if(textfield.getRawValue() === '') { // que le champ est vide
                            return true; // on garde l'enregistrement
                        } else { // sinon
                            if(record.get('nomIndividu').substring(0, textfield.getRawValue().length).toUpperCase() === textfield.getRawValue().toUpperCase()) { // si le nomIndividu de l'enregistrement coupé à la longueur de la saisie et la saisie sont identiques (en majuscules pour permettre à tous types de casse de correspondre)
                                return true; // on garde l'enregistrement
                            } else { // sinon
                                return false; // on le retire
                            }
                        }
                    } else {
                        return false; // si les semaines et années ISO ne correspondent pas, on retire l'enregistrement
                    }
                });
                Ext.ComponentQuery.query('combobox[itemId="cboEtat"]')[0].setValue(0); // on réinitialise également la combo des états pour éviter les incohérences
            }
        }
    });
    Here's the caller :

    Code:
    var ctrlerPrinc=null;
    
    
    Ext.define('Infologis.controller.Principal', {
        extend: 'Ext.app.Controller',
    
    
        /** Les vues contrôlées */
        views: [
            //'Beneficiaire.PanelBeneficiaire',
            'menuPrincipal',
            'MoniteurRepas'
        ],
        
        stores: [
            'SaisiePortage',
            'Etat'
        ],
        
        models: [
            'SaisiePortage',
            'Etat'
        ]
    
    
    });
        
    function ouvrirOption(id, parent){
        if(parent != '' && parent != null) var idParent = parent.id, nomDossier = parent.text.split(" ")[0] + " " + parent.text.split(" ")[1];
        
        switch(id){
            case "BeneficiaireRecherche":
                // Ouverture de la recherche bénéficiaire
                if(!Ext.getCmp('rechercheBeneficiaire'))
                {
                    Ext.getCmp('centre').add(Ext.widget('rechercheBeneficiaire'));
                }
                Ext.getCmp('centre').setActiveTab('rechercheBeneficiaire');
                Ext.getCmp('champRecherche').focus();
            break;
            
            case "SuiviRepas":
                // Ouverture du moniteur de controle des repas
                if(!Ext.getCmp('moniteurRepas'))
                {
                    Ext.getCmp('centre').add(
                        {
                            xtype: 'moniteurRepas'
                        }
                    );
                }
                Ext.getCmp('centre').setActiveTab('moniteurRepas');
            break;
            
            case "UtilisateurComptes":
                if(!Ext.getCmp('ongletUtilisateur'))
                {
                    Ext.getCmp('centre').setVisible(true);
                    Ext.getCmp('centre').add(Ext.widget('listeUtilisateurs'));
                }
                Ext.getCmp('centre').setActiveTab('ongletUtilisateur');
            break;
    
    
            case "UtilisateurProfils":
                if(!Ext.getCmp('ongletProfilUtilisateur'))
                {
                    Ext.getCmp('centre').setVisible(true);
                    Ext.getCmp('centre').add(Ext.widget('profilUtilisateur'));
                }
                Ext.getCmp('centre').setActiveTab('ongletProfilUtilisateur');
            break;
    
    
            case "ParamsRegimes":
                if(!Ext.getCmp('ongletParamRegimes'))
                {
                    Ext.getCmp('centre').setVisible(true);
                    Ext.getCmp('centre').add(Ext.widget('paramregimes'));
                }
                Ext.getCmp('centre').setActiveTab('ongletParamRegimes');
            break;
            
            case "ParamsTarifs":
                if(!Ext.getCmp('ongletParamTarifs'))
                {
                    Ext.getCmp('centre').setVisible(true);
                    Ext.getCmp('centre').add(Ext.widget('paramtarifs'));
                }
                Ext.getCmp('centre').setActiveTab('ongletParamTarifs');
            break;
            
            case "ParamsCivilite":
                if(!Ext.getCmp('ongletParamCivilite'))
                {
                    Ext.getCmp('centre').setVisible(true);
                    Ext.getCmp('centre').add({xtype: 'paramcivilite'});
                }
                Ext.getCmp('centre').setActiveTab('ongletParamCivilite');
            break;
            
            case "ParamsVoies":
                if(!Ext.getCmp('ongletParamTypeVoie'))
                {
                    Ext.getCmp('centre').setVisible(true);
                    Ext.getCmp('centre').add({xtype: 'paramtypevoie'});
                }
                Ext.getCmp('centre').setActiveTab('ongletParamTypeVoie');
            break;
            
            case "EtatCivil"+id.match(/\d+/g):
                //La fonction match(/\d+/g) permet de récupérér le contenu numérique d'une chaîne, par conséquent ici, l'id bénéficiaire
                if(typeof(Ext.ComponentQuery.query('panel[id="EtatCivil'+idParent.match(/\d+/g)+'"]')[0]) == 'undefined')
                {
                    Ext.getCmp('centre').setVisible(true);
                    menu.fireEvent('etatCivilBeneficiaire', idParent.match(/\d+/g), nomDossier);
                }
                Ext.getCmp('centre').setActiveTab('EtatCivil'+idParent.match(/\d+/g));
            break;
        }
    }
    And here's the Trace given by the Debugger :
    Code:
    • [COLOR=red !important]Uncaught TypeError: Cannot call method 'indexOf' of undefined ext-all-debug.js:550[/COLOR]
      • [COLOR=red !important]Ext.String.urlAppend[/COLOR]ext-all-debug.js:550
      • [COLOR=red !important]Ext.apply.urlAppend[/COLOR]ext-all-debug.js:4252
      • [COLOR=red !important]Ext.define.buildUrl[/COLOR]ext-all-debug.js:33780
      • [COLOR=red !important]Ext.define.buildRequest[/COLOR]ext-all-debug.js:33617
      • [COLOR=red !important]Ext.define.doRequest[/COLOR]ext-all-debug.js:43987
      • [COLOR=red !important]Ext.define.create[/COLOR]ext-all-debug.js:33572
      • [COLOR=red !important]Ext.define.runOperation[/COLOR]ext-all-debug.js:31216
      • [COLOR=red !important]Ext.define.start[/COLOR]ext-all-debug.js:31163
      • [COLOR=red !important]Ext.define.batch[/COLOR]ext-all-debug.js:33412
      • [COLOR=red !important]Ext.define.sync[/COLOR]ext-all-debug.js:42116
      • [COLOR=red !important]Ext.define.insert[/COLOR]ext-all-debug.js:44502
      • [COLOR=red !important]Ext.define.onComboboxAfterRender[/COLOR]/portage3/app/view/MoniteurRepas.js?_dc=1357307357668:532
      • [COLOR=red !important]Ext.util.Event.Ext.extend.fire[/COLOR]ext-all-debug.js:5674
      • [COLOR=red !important]Ext.define.continueFireEvent[/COLOR]ext-all-debug.js:19117
      • [COLOR=red !important]Ext.define.fireEvent[/COLOR]ext-all-debug.js:19095
      • [COLOR=red !important]Ext.override.fireEvent[/COLOR]ext-all-debug.js:51627
      • [COLOR=red !important]Ext.define.finishRender[/COLOR]ext-all-debug.js:20432
      • [COLOR=red !important]Ext.define.finishRenderItems[/COLOR]ext-all-debug.js:36156
      • [COLOR=red !important]Ext.define.finishRender[/COLOR]ext-all-debug.js:67929
      • [COLOR=red !important]Ext.define.finishRenderChildren[/COLOR]ext-all-debug.js:68327
      • [COLOR=red !important]Ext.define.afterRender[/COLOR]ext-all-debug.js:20159
      • [COLOR=red !important]Base.implement.callParent[/COLOR]ext-all-debug.js:2541
      • [COLOR=red !important]Ext.define.afterRender[/COLOR]ext-all-debug.js:50909
      • [COLOR=red !important]Ext.define.finishRender[/COLOR]ext-all-debug.js:20430
      • [COLOR=red !important]Ext.define.finishRenderItems[/COLOR]ext-all-debug.js:36156
      • [COLOR=red !important]Ext.define.finishRender[/COLOR]ext-all-debug.js:62545
      • [COLOR=red !important]Ext.define.finishRenderChildren[/COLOR]ext-all-debug.js:20447
      • [COLOR=red !important]Base.implement.callParent[/COLOR]ext-all-debug.js:2541
      • [COLOR=red !important]Ext.define.finishRenderChildren[/COLOR]ext-all-debug.js:68322
      • [COLOR=red !important]Ext.define.afterRender[/COLOR]ext-all-debug.js:20159
      • [COLOR=red !important]Base.implement.callParent[/COLOR]ext-all-debug.js:2541
      • [COLOR=red !important]Ext.define.afterRender[/COLOR]ext-all-debug.js:50909
      • [COLOR=red !important]Ext.define.finishRender[/COLOR]ext-all-debug.js:20430
      • [COLOR=red !important]Ext.define.render[/COLOR]ext-all-debug.js:20713
      • [COLOR=red !important]Ext.define.renderItem[/COLOR]ext-all-debug.js:36225
      • [COLOR=red !important]Ext.define.renderItems[/COLOR]ext-all-debug.js:36183
      • [COLOR=red !important]Ext.define.renderChildren[/COLOR]ext-all-debug.js:71512
      • [COLOR=red !important]Ext.define.invalidate[/COLOR]ext-all-debug.js:49594
      • [COLOR=red !important]Ext.define.flushInvalidates[/COLOR]ext-all-debug.js:49455
      • [COLOR=red !important]Ext.define.run[/COLOR]ext-all-debug.js:49938
      • [COLOR=red !important]Ext.define.statics.flushLayouts[/COLOR]ext-all-debug.js:38577
      • [COLOR=red !important]Ext.define.statics.resumeLayouts[/COLOR]ext-all-debug.js:38584
      • [COLOR=red !important]Ext.resumeLayouts[/COLOR]ext-all-debug.js:40612
      • [COLOR=red !important]Ext.define.add[/COLOR]ext-all-debug.js:68500
      • [COLOR=red !important]ouvrirOption[/COLOR]/portage3/app/controller/Principal.js?_dc=1357307357637:43
      • [COLOR=red !important]Ext.applyIf.items.listeners.itemclick[/COLOR]/portage3/app/view/menuPrincipal.js?_dc=1357307357655:48
      • [COLOR=red !important]Ext.util.Event.Ext.extend.fire[/COLOR]ext-all-debug.js:5674
      • [COLOR=red !important]Ext.define.continueFireEvent[/COLOR]ext-all-debug.js:19117
      • [COLOR=red !important]Ext.define.fireEvent[/COLOR]ext-all-debug.js:19095
      • [COLOR=red !important]Ext.override.fireEvent[/COLOR]ext-all-debug.js:51627
      • [COLOR=red !important](anonymous function)[/COLOR]ext-all-debug.js:19321
      • [COLOR=red !important]Ext.util.Event.Ext.extend.fire[/COLOR]ext-all-debug.js:5674
      • [COLOR=red !important]Ext.define.continueFireEvent[/COLOR]ext-all-debug.js:19117
      • [COLOR=red !important]Ext.define.fireEvent[/COLOR]ext-all-debug.js:19095
      • [COLOR=red !important]Ext.override.fireEvent[/COLOR]ext-all-debug.js:51627
      • [COLOR=red !important]Ext.define.processUIEvent[/COLOR]ext-all-debug.js:97767
      • [COLOR=red !important]Base.implement.callParent[/COLOR]ext-all-debug.js:2541
      • [COLOR=red !important]Ext.define.processUIEvent[/COLOR]ext-all-debug.js:101763
      • [COLOR=red !important]Ext.define.handleEvent[/COLOR]ext-all-debug.js:97681
      • [COLOR=red !important](anonymous function)[/COLOR]
      • [COLOR=red !important]wrap[/COLOR]ext-all-debug.js:6086
    Thanks in advance...

    [EDIT]

    I noticed that when the file is integrated, even if it's not called, the close icons of the tabpanel are not visible... Maybe can help ?
    Last edited by sencha-dev2; 4 Jan 2013 at 6:45 AM. Reason: notification

  2. The error actually looks to be the SaisiePortage store. You are inserting a record in it and the store is trying to sync to a server but cannot build the url.

  3. #2
    Sencha - Senior Forum Manager mitchellsimoens's Avatar
    Join Date
    Mar 2007
    Location
    Gainesville, FL
    Posts
    37,095
    Answers
    3503
    Vote Rating
    855
    mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute mitchellsimoens has a reputation beyond repute

      0  

    Default


    The error actually looks to be the SaisiePortage store. You are inserting a record in it and the store is trying to sync to a server but cannot build the url.
    Mitchell Simoens @SenchaMitch
    Sencha Inc, Senior Forum Manager
    ________________
    Check out my GitHub, lots of nice things for Ext JS 4 and Sencha Touch 2
    https://github.com/mitchellsimoens

    Think my support is good? Get more personalized support via a support subscription. https://www.sencha.com/store/

    Need more help with your app? Hire Sencha Services services@sencha.com

    Want to learn Sencha Touch 2? Check out Sencha Touch in Action that is in print!

    When posting code, please use BBCode's CODE tags.

  4. #3
    Sencha Premium Member sencha-dev2's Avatar
    Join Date
    Jun 2012
    Location
    France
    Posts
    59
    Answers
    2
    Vote Rating
    0
    sencha-dev2 is on a distinguished road

      0  

    Thumbs up


    I see. Thanks for help !

Thread Participants: 1

Tags for this Thread