مكتبة Webix JavaScript من خلال عيون مبتدئ. الجزء 5. العمل مع البيانات من جانب المستخدم



أنا مطور أمامي مبتدئ. أنا الآن أدرس وتدرب في شركة تكنولوجيا معلومات مينسك. يتم تعلم أساسيات واجهة مستخدم الويب باستخدام مكتبة Webix JS كمثال. أريد مشاركة تجربتي المتواضعة وحفظها كبرنامج تعليمي صغير في مكتبة واجهة المستخدم المثيرة للاهتمام هذه.

المهمة الخامسة


في مقال سابق ، باستخدام البيانات ، استنادًا إلى وظائف CRUD ، كتبت عن المهام القياسية لإدارة بيانات التطبيق. في هذه المرحلة ، سأحاول جعل التطبيق أكثر سهولة في الاستخدام وإدراك القدرة على تصفية البيانات وفرزها وتجميعها. في المقالة سأدرس المهام التالية:


في الوثائق ، يمكنك العثور على عناصر واجهة استخدام القائمة ، Treetable ، Table المستخدمة في المقالة .

المصادر على الرابط .

يمكن العثور على التطبيق النهائي هنا .

تصفية وفرز بيانات الجدول


لنبدأ بالجداول - غالبًا ما استخدمتها للعمل مع الكثير من البيانات. تحتوي الجداول الموجودة في مكتبة Webix على عدد من عوامل التصفية المضمنة التي يتم تعيينها مباشرةً في رأس عناصر واجهة مستخدم Table و TreeTable. في عنصر واجهة استخدام الجدول ، أستخدم خيارين: عامل تصفية نص بسيط ( textFilter ) وفلتر بمجموعة من الخيارات في القائمة المنسدلة ( selectFilter ). يتيح لك الجدول إضافة فلتر واحد لكل عمود. سأفعل هذا لمدة سنتين: العنوان والسنة. سأقوم بتعيين الرأس فيها بدلاً من سلسلة مع صفيف - لتناسب الرأس والفلتر. العنصر الثاني في المصفوفة هو كائن له خاصية محتوى واسم مرشح.
كود عنصر واجهة تعامل الجدول موجود في ملف table.js ويتم عرضه في علامة تبويب "لوحة المعلومات".

عند إدخال الأحرف في "textFilter"البيانات ، سيتم تصفيتها عن طريق المطابقة بواسطة السلسلة الفرعية. إذا قمت بتحديد الخيار "selectFilter"- بالقيمة المحددة.

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

نتيجة الترشيح بواسطة سلسلة فرعية "نجمة":



نتيجة عناصر التصفية حسب القيمة المحددة "1991":



الفرز. كما هو الحال مع الفلاتر ، يكون الفرز سهلًا تمامًا لإتاحته للمستخدم. للقيام بذلك ، يكفي استكمال تكوين العمود بخاصية الفرز . هناك العديد من أنواع الفرز الجاهزة: حسب القيم العددية والتاريخ والسلسلة. بالنسبة للسنة والتصويت وأعمدة التقييم ، سأقوم بتعيين الترتيب: إعداد "int" للترتيب حسب القيم الرقمية. بالنسبة لعمود العنوان ، ستكون القيمة "سلسلة".

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

من خلال النقر على عمود العنوان ، سيتم فرز البيانات وفقًا لنوعها. نتيجة تصنيف التصنيف:



الفرز والتصفية API


تحتوي الحلول الجاهزة لتصفية العناصر وفرزها على جداول فقط. ولكن بشكل عام ، تدعم جميع التطبيقات المصغرة هذه الميزات من خلال طرق API المناسبة - التصفية والفرز. سأوضح التصفية والفرز باستخدام واجهة برمجة التطبيقات باستخدام أداة القائمة .

رمز عنصر واجهة المستخدم List موجود في ملف users_module.js ويتم عرضه في علامة التبويب "المستخدمون".

الترشيح. في علامة التبويب المستخدمون ، بعد الزر "إضافة شخص جديد" ، سوف أقوم بتثبيت أداة النص ، التي أستخدمها كمرشح للأسماء من القائمة.

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

الآن سأفتح ملف script.js وأضيف المنطق المسؤول عن تصفية العناصر.

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

تتم تصفية العناصر وفقًا لهذا المبدأ:
  • باستخدام طريقة attachEvent ، أقوم بإضافة معالج إلى حدث onTimedKeyPress ؛
  • يتم تشغيل حدث onTimedKeyPress عن طريق إدخال أحرف في حقل النص ، ولكن مع تأخير قصير ، حتى لا يتم تنشيط الفلتر مع كل ضغطة مفتاح ؛
  • ثم أحصل على النص الذي تم إدخاله وأستخدم طريقة التصفية لبدء التصفية - ابحث عن التطابقات في أداة القائمة.

نتيجة التصفية عبر API:



فرز. قائمة القطعة عناصر ستحفظ بالضغط على “Sort asc”و أزرار “Sort desc”.

لإنشاء أزرار في علامة تبويب المستخدمون ، بعد مربع النص ، سأضيف أداتي زر مع معالج أحداث النقر .

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

داخل معالج النقر ، تقبل طريقة الفرز للمعلمة: اسم الحقل الذي نقوم بفرز البيانات من خلاله ، واتجاه الفرز “asc”(تصاعدي) - تصاعدي ، و “desc”(تنازلي) - تنازلي. بشكل افتراضي ، تعتبر البيانات صفوفًا ويتم ترتيبها وفقًا لذلك.

النتيجة (يتم فرز الأسماء في الورقة أبجديًا):



تجميع بيانات جدول الشجرة


ضع في اعتبارك موقفًا حيث يجب تجميع البيانات وفقًا للمعايير التعسفية.
سأدرس التجميع باستخدام عنصر واجهة مستخدم TreeTable كمثال.

يوجد رمز القطعة TreeTable في ملف products_module.js ويتم تقديمه في علامة التبويب "المنتجات".

في هذا المقال: الوحدات والرسوم البيانية وجداول الشجرة والعمل مع البيانات. CRUD ، استخدمت البيانات الهرمية في جدول شجرة. لحل هذه المشكلة ، قمت بتغييرها للحصول على صفيف خطي. تخلصت من التسلسل الهرمي ونقل الحقل منه إلى كل سجل “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}
]

هناك طريقتان لتجميع البيانات في جدول:


معلمات هذه الطرق هي نفسها وأحتاج إلى تجميع البيانات مرة واحدة بمجرد وصولها ، لذلك أستخدم الخيار الأول.
في تكوين عنصر واجهة مستخدم TreeTable ، أقوم بإضافة خاصية المخطط . تحدد هذه الخاصية أي مخطط ستتم معالجة البيانات في مواقف مختلفة. من بين المعالجات في النظام طريقة $ group ، والتي أحتاجها لتجميع البيانات.

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

يتم استخدام معلمتين داخل معالج المجموعة $:
  • المعلمة المطلوبة بواسطة ، والتي يتم من خلالها تجميع البيانات. هنا أحد الحقول ("الفئة") ؛
  • كائن الخريطة - هنا نصف حقول البيانات للمجموعات التي تم إنشاؤها. يؤدي التجميع إلى فصل بيانات المصدر وفقًا للمعايير المحددة وإنشاء "سجلات رئيسية" لها. من خلال الخريطة يمكننا إضافة حقول جديدة لهذه السجلات. لكي يتم عرض البيانات في الجدول بشكل صحيح ، سأضيف حقل "العنوان". سأمرر فيه قيمة المعلمة التي يتم من خلالها التجميع.

بالإضافة إلى ذلك ، قمت بإعداد الدالة $ sort لفرز البيانات المجمعة بترتيب أبجدي.

نتيجة التجميع:



مزامنة المكونات


تستخدم المهمة عناصر واجهة مستخدم المخطط والقائمة ، التي يوجد رمزها في ملف users_module.js ويتم عرضها في علامة تبويب "المستخدمون"

تستخدم عناصر واجهة استخدام الرسوم البيانية والقائمة نفس البيانات - صفيف JSON. يمكن ربط هذه المكونات بطريقة يتم بها نقل جميع تغييرات البيانات في أحدها (المصدر) إلى آخر. للقيام بذلك ، استخدم طريقة المزامنة. تتيح لك

طريقة المزامنة نسخ البيانات من أحد المكونات ونقلها إلى آخر. في الوقت نفسه ، تنعكس التغييرات في المكون الرئيسي ، مثل الإضافة والحذف وما إلى ذلك ، على الفور في عنصر آخر.

بادئ ذي بدء ، في أداة الرسم البياني - الرسم البياني - سأحذف رابط البيانات.

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

الآن ، في ملف script.js ، باستخدام طريقة المزامنة ، أقوم بمزامنة عنصر واجهة مستخدم المخطط مع عنصر واجهة مستخدم القائمة .

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

في وظيفة addPerson ، يتم ترك الإضافة لعنصر واجهة مستخدم List فقط.

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

الآن ، عند إضافة وإزالة الإدخالات من القائمة ، ستحدث تغييرات في المخطط. سيؤثر التصنيف والتصفية في أداة القائمة الآن على البيانات في المخطط.



تعميم


باستخدام أمثلة عملية ، أوضحت كيف يمكنك تحسين تجربة المستخدم. بالإضافة إلى الفرز والتصفية القياسيين باستخدام واجهة برمجة التطبيقات ، تم إتقان القدرة المضمنة للقيام بذلك في عناصر واجهة استخدام الجدول و TreeTable بإعداد واحد. تم عرض طريقة لتجميع البيانات في جدول ، وقام مثال المزامنة بتوسيع القدرة على تحسين تشغيل الأدوات التي تستخدم نفس مصدر البيانات.

يمكن العثور على التطبيق النهائي هنا .

All Articles