how to dynamic change richselect(combo, select) options to item in datatable

var dlg= webix.ui({
  view: "datatable",
  id: "dt",
  width: 400,
  height: 400,
  editable: true,
  columns: [
    {id: "condition", width: 100, editor: "richselect", options: []}//"aa","bb"]}
  ]
});
var item_id=$$("dt").add({condition: ""});
$$("dt").getItem(item_id).condition.options = ["cc","dd"];

I can use similar code in normal “richselect”, but can’t use to change options to item in datatable

You can’t define collection of options for each column, it can be defined only for all cells in the column

If you need to show different options in the editor, you can use onAfterEditStart API to catch the moment when the editor is visible and update a content of the editor from this event handler.

got it

Hi maksim, Could you please provide a sample code snippet for this?
(I’m trying to conditionally change the options of a combo when edit starts.)

Hi @Baga,

Here’s a quick sample

http://webix.com/snippet/44b849f7

But in such case, the best practice if to filter options, i.e.

filter can be a more complex function

list.filter(function(itemObj){
    return true; //false;
})

depending on some conditions, each item (itemObj) can be displayed or not.

http://webix.com/snippet/b11e53c5

Please check the related topic with more complex samples:

http://forum.webix.com/discussion/comment/9447/#Comment_9447

great Thanks!

so cool

Спасибо за ваш пример!

Но есть один нюанс. Если изначально инициировать опции как массив [“option1”, “optinon1”] объект коллекции this.getColumnConfig(id.column).collection не создается! Соответсвенно методы clearAll() и parse() недоступны.

https://snippet.webix.com/u4tz16kr

А ведь в документации по API сказано что такая инициация тоже разрешается.

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

Коллекция представляет собой независимое хранилище данных для конкретного столбца, в котором содержатся элементы с id/value.
Поэтому в массиве следует указать id и value и тогда всё сработает
https://snippet.webix.com/92fcr2a5
Как вариант, можно не использовать clearAll и parse, а сделать немного иначе:

 on:{
    onBeforeEditStart:function(id){ 
    if (id.column == "initial"){
      this.getColumnConfig(id.column).options = ["A", "B"];
    }
  }}

Пример: https://snippet.webix.com/gl959ni7

Привет всем… вот этот пример идеально решает мою задачу
https://snippet.webix.com/iz4jxejh

нужно для каждой строки свой набор опций… Но есть один нюанс, фильтр работает как like т.е. Если мы фильтруем по группе <2> то в результат попадают элементы которые находится в группе 12 и 2 или 25, как сделать жесткий фильтр???

Уже нашел решение… сразу не понял…
list.filter(function(itemObj){
return true; //false;
})
т.е. в моем случае это выглядит так …

this.getEditor().getPopup().getList().filter(
function(itemObj){
if(itemObj.group == row[‘type’]) return true;
else return false;
}
) ;
:slight_smile: может кто сразу тоже не доедет)))

Не могу добиться чтобы опции для richselect обновлялись сразу.
Вот такая функция срабатывает на beforeeditstart, но с первого раза при клике на ячейку таблицы показывает пустой список. Если закрыть его и кликнуть второй раз - показывает заполненный список.

            onBeforeEditStart: function(itm, evt, wtvr){
              if(itm["column"]=='flex_list'){
                options = this.getColumnConfig(itm.column).collection
                options.load('./pricing_lists_fx')
              }
            }

Пробовал заменять .load() на обертку из webix.ajax().get() и уже в then() обновлять коллекцию - результат тот же :frowning:

попробуйте заполнить не collection, а непосредственно richselect.

var editor = table.getEditor();
if (editor) {
    editor.getPopup().getList().load('./pricing_lists_fx');
}

Получилось, но не совсем.
На этапе beforeeditstart редактора нет и table.getEditor() возвращает undefined.
На этапе aftereditstart редактор уже есть - появляется пустой richselect на мгновение, и чувствуется задержка вызванная загрузкой. После загрузки он заполняется.

загрузка динамическая, поэтому задержка неизбежна.
но если url статический, то надо просто указать options:'./pricing_lists_fx' в конфиге колонки.

Указал, не сильно помогло, но в целом полагаю сойдет и так.
В любом случае мигает пустой список, поскольку перед загрузкой мне приходится его очищать: editor.getPopup().getList().clearAll(), иначе свежие варианты не подгружаются.