Открытие карточки для просмотра

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

Нравится

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

Первое что напрашивается это конечно же настройка прав доступа:
https://www.youtube.com/watch?v=x5C6VcOhKj4
Колонки не будут серыми и недоступными на изменение, но запись сохранить у пользователя не получится, будет соответствующее сообщение об отсутствии прав.

Другой способ же, бизнес правила по условиям на "только чтение":
https://academy.terrasoft.ru/documents/technic-sdk/7-8/pravilo-bindpara…
Работы тут больше, т.к. на каждое поле прийдется писать свое правило.

"Максим Шевченко" написал:Работы тут больше, т.к. на каждое поле прийдется писать свое правило.

А можно как-то скриптом перебрать все поля страницы и всем поставить "только чтение", как это делалось в 3.х?

Добрый день!
Можно сделать с помощью CSS. Т.е. при открытии карточки вы устанавливаете стиль.
К примеру, чтобы все читалось, но не редактировалось (правда и не кликалось), то можно добавить стиль в основной контейнер карточки: pointer-events: none;
Если же вам нужно чтобы только нужные элементы, то подход тот же, но CSS другой.
Пример:
div input,a,span,div[id*='Container_Control'],div[class='base-edit-clear-icon'] {
pointer-events: none;
}
Можно добавить opacity для визуализации :)

Просто другие варианты трудозатратны, а это простой способ

"Владимир Соколов" написал:А можно как-то скриптом перебрать все поля страницы и всем поставить "только чтение", как это делалось в 3.х?

Ну при помощи Ext.JS можно проделать вот такой "хак"

Ext.ComponentMgr.all.each(function(c){
	var cmp = Ext.ComponentMgr.all.map[c];
	if(cmp.className){
		if(cmp.className.indexOf("Edit") !== -1){
			if(cmp.setEnabled){
				cmp.setEnabled(false)
			}
                }
	}
})

Выполнение этого скрипта сделает все поля карточки недоступными для редактирования.

Есть несколько НО:
1) ререндер карточки - это состояние сбросит.
(в основном это создает проблемы, при переходе из карточки в карточку по Chain, что кстати было бы возможно предусмотреть и исправить, если бы на мой вопрос вот здесь, кто ни будь нашел/дал ответ)
2) это не касается каких либо элементов управления кнопок, пунктов меню и т.д. только поля.

"Владимир Соколов" написал:
Максим Шевченко пишет:

Работы тут больше, т.к. на каждое поле прийдется писать свое правило.

А можно как-то скриптом перебрать все поля страницы и всем поставить "только чтение", как это делалось в 3.х?

Собрал замещающий модуль для BasePageV2. Перебирает все поля и проставляет атрибут Enabled = False. Управляется всё дефолтным параметром "CardState" который передаётся в схему.

define("BasePageV2", ["ConfigurationEnums"], function (enums) {
return {
messages: {

},
methods: {
disableControls: function (item, callback) {
if (item.item) {
this.disableControls(item.item)
} else
if (item.className === "Terrasoft.Container" || item.className === "Terrasoft.GridLayout" || item.className === "Terrasoft.ControlGroup") {
for (item of item.items) {
this.disableControls(item)
}
} else
if (this.isEditClassname(item.className)) {
item.enabled = false;
}
else
console.log(item.className);

if (callback)
callback.call(this);
},
isEditClassname: function (name) {
return this.getEditControlsClassNames().indexOf(name) != -1;
},
getEditControlsClassNames: function () {
var EditControlsClassNames = ["Terrasoft.Label","Terrasoft.DateEdit", "Terrasoft.LookupEdit", "Terrasoft.TextEdit",
"Terrasoft.ListView", "Terrasoft.RadioButton", "Terrasoft.TimeEdit", "Terrasoft.FloatEdit",
"Terrasoft.CheckBoxEdit", "Terrasoft.ComboBoxEdit", "Terrasoft.InlineTextEdit", "Terrasoft.ImageEdit", "Terrasoft.IntegerEdit", "Terrasoft.MemoEdit"]
return EditControlsClassNames;
},
getCardState: function () {
return this.getDefaultValueByName("CardState");
},
init: function () {
var cardState = this.getCardState();
if (cardState && cardState === enums.CardState.View) {
var parentMethod = this.getParentMethod();
var arg = arguments;
this.disableControls(arguments[1].viewConfig[0], function () {
parentMethod.apply(this, arg);
});
}
else {
this.callParent(arguments);
}
}
},
diff: /**SCHEMA_DIFF*/[

]/**SCHEMA_DIFF*/
};
});

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