Добрый день!
в ITIL 7.6
есть такое поле "Категория" в карточке Обращения - оно обязательно к заполнению
Скажите, пожалуйста, где настроена обязательность этого поля?(хотела бы сделать обязательным в зависимости от определенных условий)
В объекте "Обращение" прописано, что колонка "Категория" обязательна к заполнению на уровне приложения, но если унаследовать объект "Обращение", и убрать обязательность этой колонки,
то колонка "Категория" все равно остается обязательной для заполнения - т.е. где-то еще в каком-то скрипте настроена обязательность этой колонки?
Нравится
Привет Дарья.
Для управления обязательностью поля лучше использовать бизнес правила, пример использования: http://www.community.terrasoft.ru/forum/topic/12988
Спасибо за совет)) но я не пытаюсь управлять обязательностью какого-то поля. Я пытаюсь найти, где в стандартной конфигурации Itil 7,6 прописана обязательность колонки категория в обращении. Помимо самого объекта обязательность данной колонки похоже прописана где-то еще, но только вот где?
В самом объекте case у поля Категория стоит признак обязательно на уровне приложения.
Да, стоит, как я уже писала. Но если его снять, то поле будет по-прежнему обязательно. Значит, где-то еще в скрипте прописана обязательность, только вот где?
Обязательность поля Категория проставлена в 2х местах:
1) В самом объекте case;
2) В карточке редактирования обращения CasePage;
Спасибо, Григорий. А можно поточнее - из какой именно схемы casepage - в каком пакете? Я не нашла обязательность этого поля в схемах casepage
Дарья, просто откройте мастером страницу редактиования обращения и снимите в свойствах поля Категория признак обязательно для заполнения.
Григорий, я уже проделывала эти действия..
В самом объекте Обращения снят признак обязательности "на уровне приложения" с колонки Категория
В мастере пробовала снимать этот признак, но поле в карточке обязательно по-прежнему.
Такое ощущение, что он где-то принудительно устанавливается
Добрый день!
Попробуйте убрать обязательность с помощью кода, установить аттрибут "isRequired" в значение false
[javascript]
{
"operation": "merge",
"name": "Category",
"values": {
"layout": {
"column": 0,
"row": 5,
"colSpan": 12,
"rowSpan": 1
},
"caption": {
"bindTo": "Resources.Strings.CategoryCaption"
},
"textSize": "Default",
"labelConfig": {
"visible": true
},
"enabled": true,
"isRequired": false
}
},
[/javascript]
Есть еще вариант с бизнес правилами, их можно использовать для динамического скрытия/установки обязательности/управления доступностью контролов.
Это достаточно универсальный механизм
[javascript]
//Category - название аттрибута на который мы хочем наложить бизнес-правило
Category": {
//название бизнес-правила
"RequireCategoryFinalState": {
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
//BusinessRuleModule.enums.Property.REQUIRED - тип бп
property: BusinessRuleModule.enums.Property.REQUIRED,
conditions: [{
leftExpression: {
type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
attribute: "Status", //Колонка объекта Case, которая ссылаеться на справочник статусов CaseStatus
attributePath: "IsFinal" //Колонка в таблице Status, то есть Status.IsFinal (CaseStatus)
},
comparisonType: this.Terrasoft.ComparisonType.EQUAL,
rightExpression: {
type: BusinessRuleModule.enums.ValueType.CONSTANT,
value: true //Тут может быть ИД, или любой другой тип данных
}
}]
}
}
[/javascript]
Есть еще один рабочий вариант, если условие слишком сложное, и не может быть выполнено, используя бизнес правила, то можно забиндить метод/или свойство на атрибут контрола isRequired.
Так же надо повесить вызов соответствующих методов на событие init и на изменение одного из значений, которые участвуют в условии.
Простой кейс: при переводе обращение в статус “В работе”, делать обязательным поле Категория
Пример с методом:
[javascript]
/*
Указываем в контроле Category, метод, который будет
определять обязательность для поля
"isRequired":
{
"bindTo": 'isCategoryRequired'
}
В атрибутах надо прописать обработчик, который будет
отрабатывать при изменении значение поля Статус
*/
attributes: {
"Status": {
dependencies: [
{
columns: ["Status"],
methodName: "onStatusItemChanged"
}
]
}
},
/*Повесим вызов метод на init, чтобы при открытия
карточки у нас отрабатывало условие*/
init: function() {
this.callParent(arguments);
this.isCategoryRequired();
},
isCategoryRequired: function() {
var statusId = this.get("Status").value;
return statusId === CONSTANTA.CASESTATUS.ACTIVE;
},
/*Повесим вызов метода при изменении статуса onStatusItemChanged,
чтобы при изменении значения поля Статус
у нас отрабатывала логика*/
onStatusItemChanged: function() {
//Вызов метода/ов, в данном случае метода isCategoryRequired
this.isCategoryRequired();
},
[/javascript]
Пример со свойством, почти тоже самое, только обязятальность поля будет зависит от вартуального свойства:
[javascript]
init: function() {
this.callParent(arguments);
this.checkIfCategoryRequired();
},
checkIfCategoryRequired: function() {
var isRequired,
statusId = this.get("Status").value;
isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
this.set("isCategoryRequired", isRequired);
},
onStatusItemChanged: function() {
this.checkIfCategoryRequired();
},
[/javascript]
Да,я так и планирую использовать подобное бизнес-правило - сделать обязательность этой колонки в зависимости от параметров.
НО для того чтобы это использовать, нужно убрать принудительную обязательность поля Категория, которая непонятно где прописана в стандартной конфигурации
Код, приведенный в первом вашем сообщении, помогает лишь наполовину - убралась красная звездочка рядом с полем - признак обязательности его.
Но все равно остается требование обязательности данного поля - при сохранении карточки выдается сообщение, требующее заполнения поля; и при открытии карточки внизу под полем сообщение "необходимо указать значение"
Так а повесить бизнес-правило?
Атрибут "isRequired": false + правило и все работает.
Это чисто тестовый пример, при создании карточки не требует заполненного поля, но после - да.
И уберите значение по умолчанию, для поля Category, если оно не обязательно
[javascript]
"Category": {
"RequiredTypeOnAdd": {
ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
property: BusinessRuleModule.enums.Property.REQUIRED,
conditions: [{
leftExpression: {
type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
attribute: "Operation"
},
comparisonType: this.Terrasoft.ComparisonType.NOT_EQUAL,
rightExpression: {
type: BusinessRuleModule.enums.ValueType.CONSTANT,
value: Enums.CardStateV2.ADD
}
}]
}
}
[/javascript]
Спасибо!
Атрибут "isRequired": false + правило - заработало ( перекрыло какое-то бизнес-правило в стандартной конфигурации, которое требовало обязательность?)
В качестве бизнес-правило использовало другое правило, не из вашего примера.
Вопрос по вашем примеру
Enums.CardStateV2.ADD
ругается, что Enums is not defined.
Скажите, пожалуйста, что необходимо подключить в скрипт схемы, что он понимал, что такое Enums ?
Так, начнем того, что у нас используется модульный подход к разработке, соответственно, если в зависимостях нет нужных модулей, то работать не будет.
А зачем Вам мой пример?
У Вас все должно работать, если Вы правильновсе сделали.
[javascript]
define("CasePage", ["CasePageResources", "GeneralDetails", "BusinessRuleModule", "ConfigurationEnums"],
function(resources, GeneralDetails, BusinessRuleModule, Enums)
[/javascript]
Да, пример, собственно, не нужен - просто про модуль спросила.
В общем-то, Атрибут "isRequired": false + бизнес- правило работает.
Хотя так и непонятно до конца, где же крылась обязательность данного поля в базовой конфигурации.
Ну да ладно- главное, что можно ее обойти.
Спасибо
Моя рекомендация, установите себе jetBraine WebStorm, файлы JS стоит выгружать по указанному пути
[code]
C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS
[/code]
Потом в web.config прописать
[code]
[/code]
Дальше делаете поиск по файлам, там много можно разных примеров подсмотреть.
"Александр Зубков" написал:init: function() {
this.callParent(arguments);
this.checkIfCategoryRequired();
},checkIfCategoryRequired: function() {
var isRequired,
statusId = this.get("Status").value;
isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
this.set("isCategoryRequired", isRequired);
},onStatusItemChanged: function() {
this.checkIfCategoryRequired();
},
Александр, вы приводили такой пример.
в вашем примере есть CONSTANTA.CASESTATUS.ACTIVE
это определенное значение статуса ( в работе)
Скажите, пожалуйста, где задается подобная CONSTANTA.CASESTATUS.ACTIVE,
где ее необходимо определять?
Спасибо, нашла ответ на свой вопрос
это константа, определенная в модуле по типу
define("UsrConsts", [], function() {
var caseStatus = {
Close: "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
};
return {
CaseStatus: caseStatus
};
});
"Александр Зубков" написал:Есть еще один рабочий вариант, если условие слишком сложное, и не может быть выполнено, используя бизнес правила, то можно забиндить метод/или свойство на атрибут контрола isRequired.
Так же надо повесить вызов соответствующих методов на событие init и на изменение одного из значений, которые участвуют в условии.
Простой кейс: при переводе обращение в статус “В работе”, делать обязательным поле КатегорияПример с методом:
/*
Указываем в контроле Category, метод, который будет
определять обязательность для поля
"isRequired":
{
"bindTo": 'isCategoryRequired'
}
В атрибутах надо прописать обработчик, который будет
отрабатывать при изменении значение поля Статус
*/
attributes: {
"Status": {
dependencies: [
{
columns: ["Status"],
methodName: "onStatusItemChanged"
}
]
}
},
/*Повесим вызов метод на init, чтобы при открытия
карточки у нас отрабатывало условие*/
init: function() {
this.callParent(arguments);
this.isCategoryRequired();
},
isCategoryRequired: function() {
var statusId = this.get("Status").value;
return statusId === CONSTANTA.CASESTATUS.ACTIVE;
},
/*Повесим вызов метода при изменении статуса onStatusItemChanged,
чтобы при изменении значения поля Статус
у нас отрабатывала логика*/
onStatusItemChanged: function() {
//Вызов метода/ов, в данном случае метода isCategoryRequired
this.isCategoryRequired();
},Пример со свойством, почти тоже самое, только обязятальность поля будет зависит от вартуального свойства:
init: function() {
this.callParent(arguments);
this.checkIfCategoryRequired();
},
checkIfCategoryRequired: function() {
var isRequired,
statusId = this.get("Status").value;
isRequired = statusId === CONSTANTA.CASESTATUS.ACTIVE;
this.set("isCategoryRequired", isRequired);
},
onStatusItemChanged: function() {
this.checkIfCategoryRequired();
},
Приведённый пример не работает. Поле становиться обязательным независимо от условий.
Игорь, вопрос. Вы проводили отладку кода?
Также есть же другие способы реализации.
- http://www.community.terrasoft.ru/forum/topic/15340
- http://www.community.terrasoft.ru/forum/topic/12990
Единственным вариантом решения многоуровневого условия обязательности полей является применение валидации нужного поля.