Есть необходимость настроить сортировку в выпадающем списке редактируемого реестра. 

 

На обычной странице мы решаем эту проблему через атрибут:

"State": {
              lookupListConfig: {
                orders: [{columnPath: "SortCode"}]
              }
            },

 

однако очевидно на детали это не отрабатывает.

 

Вариант "добавить в название цифру чтобы сортировать по алфавиту" не подходит, т.к. значений в справочнике довольно много. Может быть у кого-то был опыт добавление подобного конфига для полей детали с редактируемым реестром? Заранее благодарю

Нравится

2 комментария
Лучший ответ

Если нужно сортировать список в колонке MyColumn по полю справочника SortCode, нужно описать такой метод в схеме детали

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.MyColumn) {
                    result.rowConfig.MyColumn.lookupListConfig = {
                        orders: [{columnPath: "SortCode", direction: Terrasoft.OrderDirection.DESC}]
                    };
                }
                return result;
            },

 

 

 

Если нужно сортировать список в колонке MyColumn по полю справочника SortCode, нужно описать такой метод в схеме детали

getGridRowViewModelConfig: function(config) {
                var result = this.callParent(arguments);
                if (result && result.rowConfig && result.rowConfig.MyColumn) {
                    result.rowConfig.MyColumn.lookupListConfig = {
                        orders: [{columnPath: "SortCode", direction: Terrasoft.OrderDirection.DESC}]
                    };
                }
                return result;
            },

 

 

 

Вадим Курунов,

Спасибо!

Показать все комментарии

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

Возможно, кто-то сталкивался с такой проблемой, поделитесь опытом, как удалось побороть?

И вопрос к поддержке: почему часть логики реализованной в карточке редактирования срабатывает, например, фильтрация, а другая нет? Какая логика из карточки редактирования будет работать в редактируемом реестре, а какая нет?

 

Нравится

2 комментария
Лучший ответ

Если ищете метод, который сработает в редактируемом реестре, то это initEntity (из странички редактирования). Мы Реализовывали заполнение так:

initEntity: function(callback, scope) {
                this.callParent(arguments);
                if (this.isAddMode()) {
                    var DefaultValuesArray = this.get("DefaultValues");
                    var price = this.Ext.Array.findBy(DefaultValuesArray, function(item) {
                        return item.name === "BCPrice";
                    }, this);
                    if (price) {
                        this.set("BCPrice", price.value);
                    }
                    this.calcAmount();
                }
            }

 

Если ищете метод, который сработает в редактируемом реестре, то это initEntity (из странички редактирования). Мы Реализовывали заполнение так:

initEntity: function(callback, scope) {
                this.callParent(arguments);
                if (this.isAddMode()) {
                    var DefaultValuesArray = this.get("DefaultValues");
                    var price = this.Ext.Array.findBy(DefaultValuesArray, function(item) {
                        return item.name === "BCPrice";
                    }, this);
                    if (price) {
                        this.set("BCPrice", price.value);
                    }
                    this.calcAmount();
                }
            }

 

Дмитрий А.,

Спасибо за ответ - получилось.

Показать все комментарии

Привет. 
Нудно создать редактируемый грида в DataView (по аналогии с "Расписанием" в активностях) из отдельной таблицы.
Насколько я понимаю все сводиться к созданию своего аналога GridData, возможно с логикой из схема "Деталь с редактируемым реестром". Но опять же интересуют детали.

Есть идеи или примеры кода по реализации?

Нравится

9 комментариев

Андрей, если интересуют детали, как создать деталь с редактируемым реестром, есть в статье. Также шаблоны разных деталей, как редактируемых, так и нет, есть в бесплатном дополнении.

Зверев Александр,

Создание редактируемой детали на странице не проблема, проблема доставание этого грида и помещение его в схему раздела (Section) по соседству с основным.

По соседству — это как? Он должен выводить с фильтром по записи в основном реестре? Так такое уже есть в любом разделе с редактируемой деталью, если в карточке слева открыть панель с вертикальным реестром. Например, раздел «Заказы»:

Зверев Александр,

по соседству с базовым DataView, а именно на новом(DataView), мной созданным.
Пример что имею ввиду под этим показано на скрине, это раздел Активности: 
 

По сути мне нужно в отдельному DateView создать свой Grid и сделать его редактируемым. Но так как аналогичного решения я не заметил в системе, то мне они и нужны, и я был бы признателен за такие или что-то схожее что повысит мое понимание.

Андреев Андрей Сергеевич,

Возможно, раздел "Планирование" похож на ваши задачи?

Андрей, таких не видел. Есть разные дополнения, добавляющие в разделы ещё одну кнопку, включающую режим с каким-то необычным видом, например, бесплатное «Канбан-доска» или два вида «Диаграммы Гантта» (но те платные). Установив, можно увидеть, как происходит добавление компонента и работа в нём с данными в таблице раздела.

Владимир Соколов пишет:
Возможно, раздел "Планирование" похож на ваши задачи?

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

Зверев Александр пишет:

Кстати, планируется в интерфейсе пользователя появление новых контролов на Angular? Или всё останется в конфигураторе? 

А есть какие-то конкретные пожелания по недостающим компонентам в мастере раздела или главное, чтобы новые и именно на Angular?

Показать все комментарии

При попытке изменить запись в детали с редактируемым реестром возникает ошибка

https://yadi.sk/d/5HXBicLNQI3h5Q

Роли пользователя:

https://yadi.sk/d/rjuN-gR2MMK3qA

Права настроены следующим образом:

https://yadi.sk/d/SFqa8x2djEVUTA

Причем при попытке изменить в консоле видно следующее:

https://yadi.sk/d/eYJZ5dd1Fb_Inw

т.е. как я понимаю, система считает изменяемую запись новой и не дает изменить так как нет прав на добавление. Если в консоле изменять флаг isNew на false, то запись изменяется нормально.

З.Ы. Причем записи получается редактировать через страницу редактирования, значит проблема в редактируемом реестре.

Собственно вопрос: это баг или я не верно настраиваю права?

 

Нравится

3 комментария

У вас не выдано пользователям прав создавать записи в этом разделе
http://prntscr.com/qc9uae

Владимир Соколов,

тк суть в том что мне не нужно давать права создавать записи, нужны права только на редактирование

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

Действительно, на стандартной детали с редактируемым реестром тоже такое наблюдается. Передали информацию о шагах воспроизведения команде разработки для анализа и исправления в будущих версиях продукта.

Показать все комментарии

Добрый день.
Необходимо в редактируемом реестре добавить свойство enabled для поля по условию.
Атрибут условия вычисляется в методе onEntityInitialized Схемы редактирования детали.
Но при загрузке редактируемого реестра ни метод init, ни onEntityInitialized  ни бизнес-правила не отрабатывают.
Как быть в такой ситуации?
 

Нравится

2 комментария
Лучший ответ

Игорь, привет!

Была подобная ситуация - нужно было забиндить enabled поля на поле в связанном справочнике. Делал примерно так:

1. На странице редактирования добавил attribute с именем "{Имя_справочного_поля}.{Имя_колонки_в_справочнике}". Значение его проставлял в onEntityInitialized, и enebled колонки завязал бизнес-правилом на этот аттрибут.

2. На странице детали детали в методе addGridDataColumns добавлял колонку с таким же именем как и аттрибут на странице редактирования (у меня там было bool) и вауля.

 

Дело в том, что правила работают, но в редактируемом реестре происходит поиск свойства (на которое ты забиндил enabled) в колонках текущей строки, соответственно если такой колонки нет в строке, получается как получается.

Костыль, конечно, но попробовать стоит. Если есть более правильный способ - тоже интересно)

Игорь, привет!

Была подобная ситуация - нужно было забиндить enabled поля на поле в связанном справочнике. Делал примерно так:

1. На странице редактирования добавил attribute с именем "{Имя_справочного_поля}.{Имя_колонки_в_справочнике}". Значение его проставлял в onEntityInitialized, и enebled колонки завязал бизнес-правилом на этот аттрибут.

2. На странице детали детали в методе addGridDataColumns добавлял колонку с таким же именем как и аттрибут на странице редактирования (у меня там было bool) и вауля.

 

Дело в том, что правила работают, но в редактируемом реестре происходит поиск свойства (на которое ты забиндил enabled) в колонках текущей строки, соответственно если такой колонки нет в строке, получается как получается.

Костыль, конечно, но попробовать стоит. Если есть более правильный способ - тоже интересно)

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

Показать все комментарии

Добрый день. Возникла задача - сделать редактируемый реестр в мобильном приложении, где могут быть справочные поля или текстовые. По примеру из академии удалось сделать только поля с численным или логическим значением. Добавленные колонки текстового и справочного типа не отобразились вовсе. С этим можно что-то сделать?

Нравится

1 комментарий

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

В базовой версии предусмотрена работа только с цифровыми, дробными и булевскими полями. Ниже базовый метод схемы EditListItem: 

createEditComponentByColumnName: function(columnName) {
        var model = this.getModel();
        var columnConfig = model.ColumnConfigs.get(columnName);
        var config = {
            name: columnName,
            markerValue: columnName
        };
        switch (columnConfig.columnType) {
            case Terrasoft.ColumnTypes.number:
                config.xtype = "tsintegerfield";
                break;
            case Terrasoft.ColumnTypes.decimal:
                config.xtype = "tsfloatfield";
                break;
            case Terrasoft.ColumnTypes.bool:
                config.xtype = "tstoggle";
                break;
            default:
                return null;
        }
        return this.createFieldComponent(config);
    },

 

Мы зафиксируем Ваше пожелание для рассмотрения аналитиками продукта.

Показать все комментарии

Создал редактируемый реестр согласно документации. 

"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}

Мне нужно сменить иконку корзины на крестик. Не важно как. Готов, даже загрузить свою.

Но не получается ее правильно подключить. Как это сделать правильно?

Нравится

1 комментарий

Добрый день.

В детали нужно добавить "activeRowActions", в котором переопределить иконку. Реализацию можно посмотреть в ProductDetailV2UIv2.
                        

Показать все комментарии

 

Я создал деталь с редактируемым реестром и страницу для нее.

 

Мне нужно либо скрыть в активной записи на конкретном справочнике, либо повесить обработчик на событие нажатия на эту кнопку.  И получить в обработчике  информацию на какой записи и справочнике был клик.

https://academy.terrasoft.ru/jscoresdk/source/clearicon.html

По ссылке нашел некоторые методы, но не знаю как их использовать.

Нравится

2 комментария

Вооружаемся напильником и в схеме детали прописываем что-то вроде

getDefaultCellControlsConfig: function(columnName, params) {
	var config = {
		itemType: Terrasoft.ViewItemType.MODEL_ITEM,
		name: columnName,
		labelConfig: {visible: false}
	};
	//columnName - название колонки из объекта
	if (columnName === 'ContainerType') {
		config.hasClearIcon=false;
	}
	return this.Ext.apply(config, params);
},

 

 Добрый день.

Если вы хотите поставить свой обработчик, то в таком случае нужно заместить модуль ConfigurationGrid, в нем переопределить метод renderRowControls. В этом методе происходит генерация моделей полей. Вам нужно в модели нужного поля подписаться на событие “cleariconclick “. Например viewModel.on(“cleariconclick “, myHandler).

Показать все комментарии

Нужно в редактируванном реестре заблокировать некоторые колонки для редактирования, нигде не нашел ничего подобно, такое вообще возможно?

Нравится

3 комментария

1) с помощью бизнес правил. прописать их в странице редактирования карточки этой детали

2) там есть кусок, в котором формируется контрол. можно для определённых полей прописать enabled: false (прям в коде детали)

getDefaultCellControlsConfig: function(columnName, params) {
	var config = {
		itemType: Terrasoft.ViewItemType.MODEL_ITEM,
		name: columnName,
		labelConfig: {visible: false}
	};
	if (columnName === "TmName") {
		config.enabled = false;
	}
}

+можно попробовать в объекте сделать режим использования нужной колонки - никогда (в этом способе я не уверен)

Добрый день! Попробуйте в модуле детали (который от BaseDetailV2 наследуется) определить isEditableColumn(columnName). Чтобы он заработал, в методе на детали generateActiveRowControlsConfig, в конфиге поля задать свойству enabled соответствие методу isEditableColumn

generateActiveRowControlsConfig: function(id, columnsConfig, rowConfig) {
                this.columnsConfig = columnsConfig;
                var gridLayoutItems = [];
                var currentColumnIndex = 0;
                this.Terrasoft.each(columnsConfig, function(columnConfig) {
                    var columnName = columnConfig.key[0].name.bindTo;
                    var column = this.getColumnByColumnName(columnName);
                    var cellConfig = column ? this.getCellControlsConfig(column)
                        : this.getNotFoundCellControlsConfig(columnName);
                    cellConfig = this.Ext.apply({
                        layout: {
                            colSpan: columnConfig.cols,
                            column: currentColumnIndex,
                            row: 0,
                            rowSpan: 1
                        }
                    }, cellConfig);
 
                    cellConfig.enabled = this.isEditableColumn(columnName);
 
                    if (!cellConfig.hasOwnProperty("isNotFound")) {
                        gridLayoutItems.push(cellConfig);
                    }
                    currentColumnIndex += columnConfig.cols;
                }, this);
                var gridData = this.getGridData();
                var activeRow = gridData.get(id);
                var rowClass = {prototype: activeRow};
                BusinessRulesApplier.applyRules(rowClass, gridLayoutItems);
                var viewGenerator = this.Ext.create("Terrasoft.ViewGenerator");
                viewGenerator.viewModelClass = this;
                var gridLayoutConfig = viewGenerator.generateGridLayout({
                    name: this.name,
                    items: gridLayoutItems
                });
                rowConfig.push(gridLayoutConfig);
            }

 

Благодарю! Помогло! Рекомендую!

Показать все комментарии

Добрый день.

У меня есть деталь с редактируемым реестром, в реестре выведено 3 колонки:

1) колонка-справочник: выбирается запись из раздела Контакт

2) колонка-справочник: выбирается вручную из созданного справочника

3) текстовое поле, заблокировано: в данное поле должно подставляться значение из определенной колонки (UsrColumn1) из карточки Контакта

Подскажите, как мне автоматически подтянуть информацию в 3 колонку, при выборе значения в 1 колонке?

Нравится

1 комментарий

Здравствуйте, для РР работают подписки на события, следовательно на странице карточки детали (да хоть она уже и не отображается, часть логики с нее работает, а именно подписки, некоторые методы и бизнес-правила) необходимо доработать атрибуты одноименные нужным вам колонкам, в зависимостях указать при изменении каких колонок тригерить метод, и имя самого метода, а в методе уже через esq читать данные первой колонки, и писать их в 3ю, как-то так:

 

"UsrColumn3": {
	"dependencies": [
		{
			"columns": ["UsrColumn1"],
			"methodName": "onChange1Column"
		}
	]
},
 
....
 
onChange1Column: function() {
	// читаем нужные данные через esq из первой this.get("UsrColumn1") колонки
	и устанавливаем их в 3ю this.set("UsrColumn3", data);
},

 

Показать все комментарии