datatable, rest, problem with new lines

webix ver 3.4.5

there are datatable:

webix.ready(function () {
    var toolbar = {
        id: "tlbr", view: "toolbar", elements: [
            {view: "label", label: "Атрибуты"},
            {
                id: "btn_add_col", view: 'button', label: "Add", width: 45, click: function () {
                table = $$("table_attr");
                table.unselect();
                table.editRow(table.add({col_is_active:true}));
            }
            },
            {
                view: 'button', label: "Del", width: 45,
                click: function () {
                    $$("table_attr").remove($$('table_attr').getSelectedId());
                }
            }
        ]
    };
    var table = {
        container: "box",
        view: "datatable",
        header: "Атрибуты",
        id: 'table_attr',
        select: "row",
        resizeColumn: true,
        minHeight: 135,
        autoheight: true,
        editable: true,

        editaction: "custom",
        liveValidation:true,
        columns: [
            {id: "col_id", hidden: true, header: {text: "№"}},
            {id:'col_group_id', editor:"select",options:[]},
            {id: "col_name", header: {text: "col_name"}, editor: "text"},
            {id: "col_title", header: {text: "col_title"}, editor: "text", fillspace: true},
            {id: "measurement_id", hidden: true, header: {text: "Ед. изм."}},
            {
                id: "col_type_id", header: {text: "col_type"}, editor: "select", options: [
                {id: 1, value: 'INTEGER'},
                {id: 2, value: 'FLOAT'},
                {id: 3, value: 'TEXT'},
                {id: 4, value: 'DATE'},
                {id: 5, value: 'OBJECT'}
            ]
            },
            {id:'col_obj_id', header:{text:'Объект'}, editor:"select",options:[]},
            {id: 'col_del_action',width:175, header: {text: 'Действие при удалении'},editor: 'select', options:['SET NULL', 'DELETE']},
            {id: 'col_is_active', header:{text:'Вкл'}, checkValue:true, uncheckValue:false, template:'{common.checkbox()}'},
            {id: "col_is_pk", hidden: true},
            {id: "col_is_sys", hidden: true},
            {id: "col_id_parent", hidden: true}
        ],
        save: 'rest->/myapi',
        url: 'rest->/myapi',
        on:{
            "onItemDblClick":function(id){
                this.editRow(id);
            }
        },
        rules:{
            col_name:webix.rules.isNotEmpty
        }
    };
    attr = webix.ui({
        container:'box',
        rows: [toolbar, table]
    });
    webix.event(window, "resize", function () {
        attr.adjust();
    })
});

after adding a new row post request have only 3 fields: ‘col_group_id’, ‘col_name’ and ‘col_is_active’.

Sending of all fields possible with this scenario:

  • add new row

  • doubleclick on it(enable editing)

  • edit cells, dont edit mandatory cell

  • click somewhere to disable row editing

  • doubleclick on row, edit mandatory cell

  • click somewhere again

looks like it’s a not adequate behaviour

what am I doing wrong?

Hi,

According to the validation concept, if validation fails, the data cannot be sent to the server.

Неужто у меня английский такой плохой?

Проблема не в том, что при сфейленой валидации данные не уходят, это как раз нормально.

Проблема в том, что когда валидация проходит - уходят не все поля и добиться чтобы ушли все можно только знатно поплясав с бубном. Это так и задумано, это баг или это у меня руки кривые?

@ariant, попробуйте такое решение:

var $originalRest = webix.proxy.rest;
webix.proxy.rest = webix.extend({
   save:function(){
      webix.delay($originalRest.save, this, arguments, 1);
   }
}, $originalRest);

@Listopad test: http://webix.com/snippet/f242ce93 в консоли посмотрите результат после сохранения. очевидно, есть какой-то баг. скорее всего объект заполняется после операции save.

@intregal, спасибо, ваш вариант помог

судя по всему валидация при редактировании строки тоже не очень работает, возможно по тем же причинам. onValidationError выстреливает шесть раз

Здравствуйте,

На самом деле это нормальное поведение для Datatable, да и любого другого data компонента - что было добавлено, с тем он и работает.

Т.е. если вы добавили только одно поле table.add({col_is_active:true}), то таблица будет именно с ним и работать. Только id будет сгенерировано автоматически.

Почему поля добавляются после редактирования? Потому что оно берется из text editor, который в вашем случае отдает пустую строку. Вы используете редактор сразу для всех полей - появляются значения для всех открытых редакторов типа text.

Почему работает с delay? Эта та самая задержка на отрисовку, при которой происходит закрытие редактора и добавление его значений в объект.

Правильным решением будет ввести значения по умолчанию, которые будут выставлены, если данные для этих полей не пришли.

view: "datatable",
defaultData:{
      col_id:"",
      col_group_id:""
}

http://webix.com/snippet/2dfd9cc7

@Helga http://webix.com/snippet/f242ce93 там совершенно другая проблема. введите все поля (по возможности) и посмотрите результат в консоли после нажатия enter (т.е. после сохранения). в оригинальном рест-прокси задержка не используется, тогда как в дебаг-прокси используется.

Да, это особенность редактирования целым рядом. Редакторы отдельных полей закрываются последовательно, и на сервер отправляются те данные, которые уже можно отправить (валидные), причем отправление элемента с тем же id блокируется (это уже особенность DataProcessor).

Delay позволяет отложить запрос на сервер, в это время данные элемента заполняются всеми полями.

Такое поведение - явный баг, поэтому будем править.