lsFusion 4: tabel pivot, bagan, peta dan kalender, autentikasi OAuth, tema gelap, dan lainnya





Beberapa hari yang lalu, versi keempat baru dari platform terbuka gratis lsFusion dirilis. Dalam artikel ini saya akan mencoba memberi tahu Anda secara singkat tentang fitur-fitur baru utama versi ini dan mengilustrasikannya sebanyak mungkin dengan gambar gif dan contoh (setidaknya bagi mereka yang tidak suka membaca banyak teks). Selain itu, banyak dari fitur ini dapat dicoba secara online di situs web resmi atau, misalnya, dalam versi demo dari salah satu solusi di lsFusion.







lsFusion ( ). , ( , ).







, ( ), ( ) โ€” UI .







, , . . , , ( ). MyCompany. ( , , ), , . , , , , .







, , .











. : . , , โ€” , , , , - , , .







, , . , frontend ( javascript HTML). , , ( Java Swing RCP) . . . , , , - ( http-). - lsFusion OLTP-, , . - , lsFusion -.









, lsFusion ( , , ) , , (BI) ( , BI- ). , , , , .







lsFusion . ( ) , , . , , .











Perhatikan bahwa di tingkat fisik, operasi pengelompokan dalam tampilan pengelompokan dapat dilakukan di server database dan klien. Platform mengelola pilihan ini secara otomatis: jika jumlah grup berkurang, atau jumlah data awal kurang dari ambang batas, maka data diproses di klien (untuk mengecualikan panggilan yang tidak perlu ke server). Dalam kebanyakan kasus lain, pengelompokan dilakukan di server SQL menggunakan kueri (namun, subtotal masih dihitung di klien).







Pengelompokan dapat diubah oleh pengguna menggunakan antarmuka seret-lepas yang sesuai. Pengembang dapat menentukan pengelompokan menggunakan sintaks yang sesuai dalam pernyataan FORM.

FORM myReport

    OBJECTS l = Ledger PIVOT 'Area Chart'

    PROPERTIES (l) customer ROW, sum MEASURE

;





Tabel pivot



. , :







  • . , โ€” --, .
  • . , .


, , , , Excel . :







  1. ( ), ( drag-drop ). , ( , ).
  2. Excel , , /


(drill-down) โ€” , , , , , .







, , , (, ), . - , .

















, .







/ :







  • ( / , / )






. open-source plotly, ( ). , ( , , , ), .







img-, ( / ) . , , , , , .









, ( -) , . , time-tracking, ..







lsFusion :







    • / .
    • , , ..
    • ,
    • ( ), ( ).
    • .
    • ( ).










, , . :







    • longitude โ€”
    • latitude โ€”
    • polygon โ€”
    • line โ€”
    • icon โ€”
    • ..
    • date, dateTime โ€” /
    • dateFrom, dateTimeFrom โ€” /
    • dateTo, dateTimeTo โ€” /
    • name โ€”
    • ..
FORM map 'Map'

    OBJECTS o = Element MAP

    PROPERTIES (o) longitude, latitude, polygon

    PROPERTIES name = name(o) IF o IS Point, color = RGB(25500IF isInAnyArea(o)

    PROPERTIES SHOWIF o IS Point namePopup = name(o) PANEL, inParis '' = 'I am ' + (CASE WHEN isInAnyArea(o) THEN '' ELSE 'not ') + 'in Paris. Drag me' PANEL

    PROPERTIES (o) 'Add point' = NEW[Point], 'Add area' = NEW[Area], DELETE

;

FORM calendar 'Calendar'

    OBJECTS e = Event CALENDAR

    PROPERTIES (e) date, name, NEWDELETE

;





Jika mau, Anda dapat bereksperimen dengan peta dan kalender di situs web resmi lsFusion di bagian Coba Online (Mode Platform -> Peta dan Kalender).



Tampilan kustom



Tampilan apa pun yang tidak didukung secara langsung di lsFusion, mungkin tidak selalu cukup (baik, atau mungkin tidak ada cukup pengaturan dalam tampilan yang ada). Untuk mengatasi masalah dalam kasus umum, platform mendukung apa yang disebut tampilan kustom.







Ada dua bagian untuk mendukung pandangan ini:







  1. javascript css web-. , web ( ) , -, , web-. , , , , .
  2. . javascript-, ( window , javascript function window, ). :
    • element โ€” DOM,
    • objects โ€” javascript-, ( = , = )
    • controller โ€” javascript-, / (, , ).


.







web js css ( , test.js test.css):



function calendar(element, objects, controller) {
    if(controller.calendar == null) { // lazy initialization
        controller.calendar = new FullCalendar.Calendar(element, {
            height: 'parent',
            editable: true,
            eventChange: function(info) {
                controller.changeDateProperty('date', controller.objects[info.event.extendedProps.index], info.event.start.getFullYear(),
                    info.event.start.getMonth() + 1,info.event.start.getUTCDate() + 1); // month and day are zero-based in full calendar
            },
            eventClick: function(info) {
                controller.changeSimpleGroupObject(controller.objects[info.event.extendedProps.index], false, info.el);
            }
        });
        setTimeout(function () {
            controller.calendar.render();
        }, 0);
    }

    controller.objects = objects; // need to save it to work with changes
    controller.calendar.setOption('events', objects.map((obj, index) =>
        Object.assign({}, obj, {
            index: index, // needed to work with changes
            classNames: controller.isCurrent(obj) ? 'event-highlight' : '' // highlighting current element
        })));
}

      
      





.event-highlight {
    border-color: #2C4751;
    background-color: #2C4751;
}

      
      





(web) ( js css, web, -, ).

, e:

CLASS Event;

date = DATA DATE (Event);

date(Event e) <- currentDate() WHEN SET(e IS Event);

title = DATA STRING (Event);

title(Event e) <- 'Event' + e WHEN SET(e IS Event);



FORM calendar

    OBJECTS e=Event CUSTOM 'calendar'

    PROPERTIES (e) date, title, NEWEDITDELETE 

;



NAVIGATOR {

    NEW calendar;

}





:









lsFusion , Flatlaf, , , , Intellij. - Flatlaf , - ยซยป . lsFusion :







  • ( ) โ€” -
  • โ€” -


ยซยป . , , / ( ). , lsFusion , , , - ( ). (, ).









OAuth



ยซยป: , , , . :







  • - ( ). , .
  • .


( ) OAuth . , (, lsFusion) / . / , / (, โ€” ). ยซ ยป lsFusion / : Facebook, Google, Github, . (Authorization URI, Token URI ..). , ( OAuth , , , ).







lsFusion โ€” ยซยป ยซ ยป. ยซยป -. ยซ ยป (, ).









, ( ยซยป, OAuth-) ยซ ยป. , ยซ ยป. , , , , .







url user password ( http://myserver?user=X&password=Y



). , , , , VPN.









lsFusion :







  • ( , 'Some text {x.y}'



    ).
  • - :
    • ( ),
    • .


, , . :







  • / .
  • ( ).


ยซ ยป. :







  • , , .
  • , , , .
  • , ( ).


, , :







  • , ;
  • ยซ ยป, .


:







  • , ;
  • .


:







  • .
  • , , Google Translate. , . , .
  • , .
  • PROFIT


, , , - lsFusion. / : guestuk / guestuk ( ), guestbe / guestbe ( ).









lsFusion, , , . :







  • CTRL ( Excel). , ( EDIT_OBJECT



    ) .
  • ยซ ยป .
  • ( ) ยซ ยป.
  • ( CHANGE



    , , )


, .







. , .









ยซ ยป



lsFusion ( ), ( ) . :







  • .
  • , .


. N+1, , , .







-.
(GROUP_CHANGE) :

onChange(a);

PUSH REQUEST

    FOR [FILTER formY.a](ga) AND NOT a=ga DO

        onChange(ga);





onChange โ€” (CHANGE), a โ€” ( , ).

, f(a,b) :

DIALOG formX OBJECTS x = f(a,b) CHANGE//   formX,   f(a,b)    x





? ยซยป. ( CHANGE , ):

REQUEST 

    DIALOG formX OBJECTS x=f(a,b) INPUT DO requestedX() <- x; 

DO 

    f(a,b) <- requestedX();



PUSH REQUEST 

    FOR [FILTER formY.a](ga) AND NOT a=ga DO

        REQUEST 

            DIALOG formX OBJECTS x=f(a,b) INPUT DO requestedX() <- x; 

        DO 

            f(a,b) <- requestedX();





PUSH REQUEST REQUEST ( DO ). , :

PUSH REQUEST 

    FOR [FILTER formY.a](ga) AND NOT a=ga DO

        f(a,b) <- requestedX();





, lsFusion, FOR WHERE:

PUSH REQUEST 

        f(a,b) <- requestedX() WHERE [FILTER formY.a](ga) AND NOT a=ga;





, ยซ ยป.


, (, , ).











( , ) โ€” . , . , :





DESIGN order {

    caption = ' โ„–' + number(o);



    lines {

        caption  = ' (' + (GROUP SUM 1 IF line(OrderDetail od) = o) + ')';

    }

}







, . (, width pattern) ( )









:







  • .
  • , .


, , , . , , . , lsFusion . , ( ). , .











lsFusion ยซ ยป โ€” (, , , ..). , , , , , , , , ( ). / ( , ).







, , , ยซยป. .









, ( ), / - .







http-



, . , - 2 :







  • . javascript, , , css html ( ) .
  • ยซยป . , / , .


( Chrome V8 ), , , . , , โ€” , http-. http- , .







Sekarang, kembali ke lsFusion. Untuk bekerja dengan sistem eksternal, termasuk protokol http, platform menggunakan operator EKSTERNAL. Benar, kekhasan operator ini adalah bahwa pada versi ketiga ini hanya dapat dijalankan di server, yang berarti tidak mungkin menggunakannya untuk pekerjaan yang sama dengan peralatan pada klien. Dengan demikian, dalam versi keempat dari platform untuk protokol HTTP, menjadi mungkin untuk mengeksekusi operator EKSTERNAL pada klien. Secara sintaksis, terlihat seperti ini:





reportX(Pos p) {

    generateUUID();

    EXPORT reportX JSON CHARSET 'UTF-8';

    TRY {

        EXTERNAL HTTP CLIENT 'http://' + hostname(p) + ':16732/requests' PARAMS exportFile();

    } CATCH {

        CASE

            WHEN statusHttp() > 299 THEN

                MESSAGE ' - ' + STRING(statusHttp());

            WHEN NOT statusHttp() THEN

                MESSAGE ' -      v.10';

            ELSE

                MESSAGE ' -      v.10';

    }

}





Secara fisik, seperti saat melakukan tindakan klien lainnya (misalnya, menampilkan formulir / pesan), platform itu sendiri menghentikan tindakan di server, mentransfer kontrol ke klien, menjalankan permintaan http di sana, kemudian mengembalikan kontrol ke server dan melanjutkan eksekusi tindakan yang dihentikan di server.





, . , , , . , , , . , โ€” ยซยป ( OBJECTS) / . , , โ€” FILTERS :





exportAndShowIncomes (Supplier s) {

    // i -      (incomes)

    EXPORT incomes FILTERS supplier(i) = s;

    open(exportFile());

    DIALOG incomes FILTERS supplier(i) = s;

}





Seperti dalam kasus judul yang dihitung, inovasi penting bukanlah fungsi menambahkan filter tambahan ke formulir itu sendiri, tetapi secara umum infrastruktur untuk menggunakan konteks membuka formulir di dalam formulir itu sendiri. Jadi di versi yang akan datang akan mudah untuk menerapkan dukungan untuk menambahkan, misalnya properti atau perintah tambahan saat membuka formulir, sedangkan dalam proses penambahan elemen ini, Anda juga dapat menggunakan parameter dari konteks membuka formulir. Namun, semua elemen tambahan ini (dengan pengecualian filter) sangat jarang bergantung pada konteks, oleh karena itu, untuk menambahkannya, akan lebih logis untuk menggunakan mekanisme pewarisan (agregasi) bentuk, yang juga akan muncul di salah satu versi berikutnya (mekanisme ini akan dibahas secara rinci di bagian selanjutnya. artikel).



Optimasi DOM



, lsFusion -, - . , (- ), Swing ( , / ), / HTML DOM. , . , . , :







  1. โ€œโ€ -.
  2. - .


โ€” . , lsFusion- ( -), . - ( lsFusion), DOM . , - MyCompany ( ). , , ( , / , ).









( github). , (UX) developer experience (DX), . ( -) , .







MyCompany. (, custom-made ), , . -, ERP-, / ยซยป . MyCompany. SME ( ERP ), ( , , Apache 2.0 ). WMS, , , WMS - ( lsFusion), - ( -).










All Articles