Perpustakaan Webix JavaScript melalui mata seorang pemula. Bagian 5. Bekerja dengan data di sisi pengguna



Saya adalah pengembang front-end pemula. Sekarang saya belajar dan berlatih di perusahaan IT Minsk. Mempelajari dasar-dasar web-ui terjadi menggunakan perpustakaan Webix JS sebagai contoh. Saya ingin berbagi pengalaman sederhana saya dan menyimpannya sebagai tutorial kecil di perpustakaan UI yang menarik ini.

TUGAS KELIMA


Dalam artikel sebelumnya, Bekerja dengan data , berdasarkan fungsi CRUD, saya menulis tentang tugas standar untuk mengelola data aplikasi. Pada titik ini, saya akan mencoba membuat aplikasi lebih ramah pengguna dan menyadari kemampuan untuk menyaring, mengurutkan dan mengelompokkan data. Dalam artikel ini saya akan mempertimbangkan tugas-tugas berikut:


Dalam dokumentasi Anda dapat menemukan Daftar , Treetable , widget Meja yang digunakan dalam artikel .

Sumber ada di tautan .

Aplikasi yang sudah selesai dapat ditemukan di sini .

Memfilter dan menyortir data tabel


Mari kita mulai dengan tabel - Saya paling sering menggunakannya untuk bekerja dengan banyak data. Tabel di pustaka Webix memiliki sejumlah filter bawaan yang diatur langsung di header tabel dan widget TreeTable. Dalam widget Tabel , saya menggunakan dua opsi: filter teks sederhana ( textFilter ) dan filter dengan serangkaian opsi dalam daftar drop-down ( selectFilter ). Tabel memungkinkan Anda untuk menambahkan satu filter untuk setiap kolom. Saya akan melakukan ini untuk dua: judul dan tahun. Saya akan mengatur Header di dalamnya bukannya string dengan array - agar sesuai dengan header dan filter. Elemen kedua array adalah objek dengan properti konten dan nama filter.
Kode untuk widget Table ada di file table.js dan ditampilkan di tab "Dashboard".

Ketika karakter dimasukkan ke dalam "textFilter"data, mereka akan difilter dengan mencocokkan dengan substring. Jika Anda memilih opsi "selectFilter"- berdasarkan nilai yang dipilih.

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}
]

Memfilter hasil dengan substring "bintang":



Hasil elemen pemfilteran dengan nilai yang dipilih "1991":



Penyortiran. Seperti halnya filter, pengurutan juga mudah tersedia bagi pengguna. Untuk melakukan ini, cukup menambah konfigurasi kolom dengan properti sortir . Ada beberapa jenis penyortiran yang sudah jadi: menurut nilai numerik, tanggal, dan menurut string. Untuk tahun ini, kolom penilaian dan penilaian, saya akan mengatur pengurutan: "int" pengaturan untuk mengurutkan berdasarkan nilai numerik. Untuk kolom judul, nilainya akan menjadi "string".

    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}
    ]

Dengan mengklik kolom tajuk, data akan diurutkan berdasarkan jenisnya. Hasil pengurutan peringkat:



Penyortiran dan penyaringan API


Solusi siap pakai untuk memfilter dan menyortir item hanya memiliki tabel. Namun secara umum, semua widget mendukung fitur ini melalui metode API yang sesuai - filter dan sortir. Saya akan menunjukkan pemfilteran dan pengurutan menggunakan API dengan widget Daftar .

Kode untuk widget Daftar ada di file users_module.js dan ditampilkan di tab “Users”.

Penyaringan. Di tab Pengguna , setelah tombol "Tambahkan orang baru", saya akan menginstal widget Teks , yang saya gunakan sebagai filter untuk nama-nama dari daftar.

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

Sekarang saya akan membuka file script.js dan menambahkan logika yang bertanggung jawab untuk memfilter elemen.

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

Elemen-elemen disaring sesuai dengan prinsip ini:
  • menggunakan metode attachEvent, saya menambahkan handler ke acara onTimedKeyPress ;
  • acara onTimedKeyPress dipicu dengan memasukkan karakter di bidang teks, tetapi dengan jeda singkat, sehingga tidak mengaktifkan filter dengan setiap penekanan tombol;
  • kemudian saya mendapatkan teks yang dimasukkan dan menggunakan metode filter untuk mulai memfilter - mencari kecocokan di widget Daftar.

Menyaring hasil melalui API:



Sortir. Elemen daftar widget akan diurutkan dengan mengklik tombol “Sort asc”dan “Sort desc”.

Untuk membuat tombol di tab Pengguna , setelah kotak teks saya akan menambahkan dua widget Tombol dengan pengendali event klik .

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")
    }},
]

Di dalam click handler, metode sortir menerima parameter: nama bidang yang digunakan untuk menyortir data, dan arah pengurutan “asc”(ascending) - ascending, dan “desc”(descending) - descending. Secara default, data dianggap baris dan disortir sesuai.

Hasil (nama-nama dalam lembar diurutkan berdasarkan abjad):



Pengelompokan data tabel pohon


Pertimbangkan situasi di mana data harus dikelompokkan sesuai dengan parameter sewenang-wenang.
Saya akan mempelajari pengelompokan menggunakan widget TreeTable sebagai contoh.

Kode widget TreeTable terletak di file products_module.js dan ditampilkan di tab “Poducts”.

Dalam artikel ini: Modul, Bagan, Tabel Pohon, dan Bekerja dengan Data. CRUD , saya menggunakan data hierarkis dalam tabel pohon. Untuk mengatasi masalah ini, saya mengubahnya untuk mendapatkan array linier. Saya menyingkirkan hierarki dan memindahkan bidang dari itu ke setiap rekaman “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}
]

Ada dua cara untuk mengelompokkan data dalam tabel:

  • segera saat memuatnya;
  • secara dinamis menggunakan metode grup dan tanpa grup .

Parameter untuk metode ini sama dan saya perlu mengelompokkan data begitu mereka tiba, jadi saya menggunakan opsi pertama.
Dalam konfigurasi widget TreeTable, saya menambahkan properti skema . Properti ini menentukan skema mana data akan diproses dalam situasi yang berbeda. Di antara penangan di sheme adalah metode $ group , yang saya perlukan untuk mengelompokkan data.

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" }
    }
}

Di dalam $ group handler, dua parameter digunakan:
  • diperlukan parameter oleh , dimana data dikelompokkan. Inilah salah satu bidang ("kategori");
  • objek peta - di sini kami menjelaskan bidang data untuk grup yang dibuat. Pengelompokan memecah data sumber sesuai dengan parameter yang ditentukan dan membuat "catatan induk" untuknya. Melalui peta kita dapat menambahkan bidang baru ke catatan ini. Agar data dalam tabel ditampilkan dengan benar, saya akan menambahkan bidang "judul". Saya akan memberikan nilai parameter di mana pengelompokan terjadi.

Selain itu, saya mengatur fungsi $ sort untuk mengurutkan data yang dikelompokkan dalam urutan abjad.

Hasil Pengelompokan:



Sinkronisasi komponen


Tugas ini menggunakan widget Chart and List, kode yang ada di file users_module.js dan ditampilkan di tab “Users”

Widget Chart dan List menggunakan data yang sama - array JSON. Komponen-komponen ini dapat dihubungkan sedemikian rupa sehingga semua perubahan data di salah satu dari mereka (sumber) dikirimkan ke yang lain. Untuk melakukan ini, gunakan metode sinkronisasi.

Metode sinkronisasi memungkinkan Anda untuk menyalin data dari satu komponen dan mentransfernya ke yang lain. Pada saat yang sama, perubahan dalam komponen utama, seperti menambah, menghapus, dll, segera tercermin di komponen lainnya.

Untuk mulai dengan, di widget Bagan - bagan - Saya akan menghapus tautan data.

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

Sekarang, dalam file script.js, menggunakan metode sinkronisasi, saya menyinkronkan widget Chart dengan widget List .

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

Dalam fungsi addPerson, penambahan hanya dibiarkan untuk widget Daftar.

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

Sekarang, ketika menambah dan menghapus entri dari daftar, perubahan akan terjadi pada bagan. Menyortir dan memfilter dalam widget Daftar sekarang akan memengaruhi data dalam Bagan.



Generalisasi


Menggunakan contoh-contoh praktis, saya menunjukkan bagaimana Anda dapat meningkatkan pengalaman pengguna. Selain pengurutan standar dan pemfilteran menggunakan API, kemampuan bawaan untuk melakukan ini di Tabel dan widget TreeTable dengan satu pengaturan dikuasai. Metode untuk pengelompokan data dalam tabel ditunjukkan, dan contoh sinkronisasi memperluas kemampuan untuk meningkatkan operasi widget yang menggunakan sumber data yang sama.

Aplikasi yang sudah selesai dapat ditemukan di sini .

All Articles