Bibliothèque JavaScript Webix vue par un débutant. Partie 5. Travailler avec des données côté utilisateur



Je suis un développeur front-end débutant. Maintenant, j'étudie et je m'entraîne dans une entreprise informatique de Minsk. L'apprentissage des bases de web-ui s'effectue à l'aide de la bibliothèque Webix JS à titre d'exemple. Je veux partager ma modeste expérience et l'enregistrer en tant que petit tutoriel sur cette intéressante bibliothèque d'interface utilisateur.

CINQUIÈME TÂCHE


Dans un article précédent, Utilisation des données , basé sur les fonctions CRUD, j'ai écrit sur les tâches standard de gestion des données d'application. À ce stade, je vais essayer de rendre l'application plus conviviale et de réaliser la capacité de filtrer, trier et grouper les données. Dans l'article, je considérerai les tâches suivantes:


Dans la documentation, vous pouvez trouver les widgets List , Treetable , Table utilisés dans l'article .

Les sources sont sur le lien .

L'application terminée peut être trouvée ici .

Filtrage et tri des données de table


Commençons par les tableaux - je les ai le plus souvent utilisés pour travailler avec beaucoup de données. Les tables de la bibliothèque Webix ont un certain nombre de filtres intégrés qui sont définis directement dans l'en-tête des widgets Table et TreeTable. Dans le widget Table , j'utilise deux options: un simple filtre de texte ( textFilter ) et un filtre avec un ensemble d'options dans la liste déroulante ( selectFilter ). Le tableau vous permet d'ajouter un filtre pour chaque colonne. Je vais le faire pour deux: le titre et l'année. Je vais définir l'en-tête en eux au lieu d'une chaîne avec un tableau - pour s'adapter à l'en-tête et au filtre. Le deuxième élément du tableau est un objet avec une propriété de contenu et un nom de filtre.
Le code du widget Table est dans le fichier table.js et rendu dans l'onglet «Dashboard».

Lorsque des caractères sont entrés dans les "textFilter"données, ils seront filtrés par correspondance par sous-chaîne. Si vous sélectionnez l'option "selectFilter"- par la valeur sélectionnée.

columns:[
    { id:"rank", header:"", width:50, css:"rank"},
    { id:"title", header:["Film title", { content:"textFilter"}], fillspace:true },
    { id:"year",  header:["Released", {content:"selectFilter" }], width:100 },
    { id:"votes", header:"Votes", width:100 },
    { id:"rating", header:"Rating", width:100 },
    { header:"", template:"<span class='webix_icon wxi-close'></span>", width:35}
]

Résultat du filtrage par sous-chaîne "étoile":



Résultat du filtrage des éléments par valeur sélectionnée "1991":



Tri. Comme pour les filtres, le tri est tout aussi facile à mettre à la disposition de l'utilisateur. Pour ce faire, il suffit de compléter la configuration des colonnes avec la propriété sort . Il existe plusieurs types de tri prêts à l'emploi: par valeurs numériques, par date et par chaîne. Pour l'année, les votes et les colonnes de notation, je définirai le paramètre sort: «int» pour trier par valeurs numériques. Pour la colonne de titre, la valeur sera "chaîne".

    columns:[
        { id:"rank", header:"", width:50, css:"rank"},
        { id:"title", header:["Film title", { content:"textFilter"}], fillspace:true, 
         sort:"string"},
        { id:"year",  header:["Released", {content:"selectFilter" }], width:100, sort:"int"},
        { id:"votes", header:"Votes", width:100, sort:"int"},
        { id:"rating", header:"Rating", width:100, sort:"int"},
        { header:"", template:"<span class='webix_icon wxi-close'></span>", width:35}
    ]

En cliquant sur la colonne d'en-tête, les données seront triées selon leur type. Résultat du tri des notes:



Tri et filtrage API


Les solutions prêtes à l'emploi pour le filtrage et le tri des articles n'ont que des tableaux. Mais en général, tous les widgets prennent en charge ces fonctionnalités via les méthodes API appropriées - filtrer et trier. Je vais démontrer le filtrage et le tri à l'aide de l'API avec le widget List .

Le code du widget Liste se trouve dans le fichier users_module.js et est rendu dans l'onglet «Utilisateurs».

Filtration. Dans l'onglet Utilisateurs , après le bouton "Ajouter une nouvelle personne", j'installerai le widget Texte , que j'utilise comme filtre pour les noms de la liste.

cols:[
    { 
        view:"button", id:"btn_add_person", 
        value:"Add new person", width:150, css:"webix_primary", 
        click:addPerson
    },
    { 
        view:"text", id:"list_input" 
    },
]

Je vais maintenant ouvrir le fichier script.js et ajouter la logique responsable du filtrage des éléments.

$$("list_input").attachEvent("onTimedKeyPress",function(){
    var value = this.getValue().toLowerCase();
    $$("user_list").filter(function(obj){
        return obj.name.toLowerCase().indexOf(value) !== -1;
    })
});

Les éléments sont filtrés selon ce principe:
  • en utilisant la méthode attachEvent, j'ajoute un gestionnaire à l'événement onTimedKeyPress ;
  • l'événement onTimedKeyPress est déclenché par la saisie de caractères dans le champ de texte, mais avec un court délai, afin de ne pas activer le filtre à chaque frappe;
  • puis - je obtenir le texte saisi et utiliser le filtre méthode pour commencer le filtrage - matchs trouver dans le widget List.

Résultat du filtrage via l'API:



Trier. Les éléments du widget de liste seront triés en cliquant sur les boutons “Sort asc”et “Sort desc”.

Pour créer des boutons dans l' utilisateur onglet , après la zone de texte , je vais ajouter deux boutons widgets avec un clic gestionnaire d'événements .

cols:[
    { 
        view:"button", id:"btn_add_person", 
        value:"Add new person", width:150, css:"webix_primary", 
        click:addPerson
    },
    { 
        view:"text", id:"list_input" 
    },
    { view:"button", id:"btn_asc", width:150, value:"Sort asc", css:"webix_primary", 
        click:()=>{
            $$("user_list").sort("#name#","asc")
     }},
    { view:"button", id:"btn_desc", width:150, value:"Sort desc", css:"webix_primary", 
        click:()=>{
            $$("user_list").sort("#name#","desc")
    }},
]

À l'intérieur du gestionnaire de clic, la méthode de tri accepte pour le paramètre: le nom du champ selon lequel nous trions les données et la direction de tri “asc”(ascendant) - ascendant et “desc”(descendant) - descendant. Par défaut, les données sont considérées comme des lignes et triées en conséquence.

Résultat (les noms dans la feuille sont triés par ordre alphabétique):



Regroupement des données de la table arborescente


Considérons une situation où les données doivent être regroupées selon des paramètres arbitraires.
J'étudierai le regroupement en utilisant le widget TreeTable comme exemple.

Le code du widget TreeTable est situé dans le fichier products_module.js et rendu dans l'onglet «Poducts».

Dans cet article: modules, graphiques, arborescences et utilisation des données. CRUD , j'ai utilisé des données hiérarchiques dans une table arborescente. Pour résoudre ce problème, je les ai modifiés pour obtenir un tableau linéaire. Je me suis débarrassé de la hiérarchie et en ai transféré le champ à chaque enregistrement “category”.

[
    {"id": "1.1",   "title": "Standard Ticket",  "price": 21, "category":"Cinema", "rank":1.1},
    {"id": "2.1",   "title": "Cola",  "price": 10, "category":"Cafe", "rank":2.1},
    {"id": "3.1",   "title": "Flowers",  "price": 10, "category":"Other", "rank":3.1}
]

Il existe deux façons de regrouper des données dans une table:


Les paramètres de ces méthodes sont les mêmes et je dois regrouper les données une fois dès leur arrivée, donc j'utilise la première option.
Dans la configuration du widget TreeTable, j'ajoute la propriété du schéma . Cette propriété détermine par quel schéma les données seront traitées dans différentes situations. Parmi les gestionnaires de sheme se trouve la méthode $ group , dont j'ai besoin pour regrouper les données.

const products = {
    editable:true,
    view:"treetable",
    scrollX:false,
    columns:[
        { id:"rank", header:"", width:50 },
        { id:"title", header:"Title", fillspace:true, template:"{common.treetable()} #title#"},
        { id:"price", header:"Price", width:200, editor:"text" }
    ],
    select:"row",
    url:"data/products.js",
    scheme:{
        $group:{
            by:"category",
            map:{
                title:["category"]
            }
        },
        $sort:{ by:"value", dir:"asc" }
    }
}

À l'intérieur du gestionnaire $ group, deux paramètres sont utilisés:
  • paramètre requis par , par lequel les données sont regroupées. Voici l'un des champs («catégorie»);
  • objet de la carte - nous décrivons ici les champs de données pour les groupes créés. Le regroupement rompt les données source selon les paramètres spécifiés et crée pour eux des «enregistrements parents». Grâce à la carte, nous pouvons ajouter de nouveaux champs à ces enregistrements. Pour que les données du tableau s'affichent correctement, j'ajouterai le champ «titre». Je vais y passer la valeur du paramètre par lequel le regroupement se produit.

De plus, j'ai configuré la fonction $ sort pour trier les données groupées par ordre alphabétique.

Résultat de regroupement:



Synchronisation des composants


La tâche utilise des widgets Graphique et Liste, dont le code se trouve dans le fichier users_module.js et est rendu dans l'onglet «Utilisateurs»

Les widgets Graphique et Liste utilisent les mêmes données - un tableau JSON. Ces composants peuvent être liés de manière à ce que toutes les modifications de données dans l'un d'entre eux (la source) soient transmises à un autre. Pour ce faire, utilisez la méthode de synchronisation.

La méthode de synchronisation vous permet de copier des données d'un composant et de les transférer vers un autre. Dans le même temps, les modifications du composant principal, telles que l'ajout, la suppression, etc., se reflètent immédiatement dans un autre.

Pour commencer, dans le widget Graphique - graphique - je supprimerai le lien de données.

{
    view:"chart",
    id:"chart",
    type:"bar",
    value:"#age#",
    label:"#age#",
    xAxis:{
        template:"#name#",
        title:"Age"
    }
}

Maintenant, dans le fichier script.js, en utilisant la méthode de synchronisation, je synchronise le widget Graphique avec le widget Liste .

$$("chart").sync($$("user_list"));

Dans la fonction addPerson, l' ajout n'est laissé que pour le widget Liste.

let addPerson = () => {
    let obj = {
        name:"Some name",
        age:Math.floor(Math.random() * 80) + 10, 
        country:"Some country"
    }
    $$("user_list").add(obj);
};

Désormais, lors de l'ajout et de la suppression d'entrées de la liste, des modifications se produisent dans le graphique. Le tri et le filtrage dans le widget Liste affecteront désormais les données du graphique.



Généralisation


À l'aide d'exemples pratiques, j'ai montré comment vous pouvez améliorer l'expérience utilisateur. En plus du tri et du filtrage standard à l'aide de l'API, la capacité intégrée de le faire dans les widgets Table et TreeTable avec un paramètre a été maîtrisée. Une méthode de regroupement des données dans une table a été illustrée, et l'exemple de synchronisation a étendu la possibilité d'améliorer le fonctionnement des widgets qui utilisent la même source de données.

L'application terminée peut être trouvée ici .

All Articles