Добрый день!
в ITIL 7.6
есть такое поле "Категория" в карточке Обращения - оно обязательно к заполнению
Скажите, пожалуйста, где настроена обязательность этого поля?(хотела бы сделать обязательным в зависимости от определенных условий)
В объекте "Обращение" прописано, что колонка "Категория" обязательна к заполнению на уровне приложения, но если унаследовать объект "Обращение", и убрать обязательность этой колонки,
то колонка "Категория" все равно остается обязательной для заполнения - т.е. где-то еще в каком-то скрипте настроена обязательность этой колонки?
Нравится
Привет Дарья.
Для управления обязательностью поля лучше использовать бизнес правила, пример использования: http://www.community.terrasoft.ru/forum/topic/12988
Спасибо за совет)) но я не пытаюсь управлять обязательностью какого-то поля. Я пытаюсь найти, где в стандартной конфигурации Itil 7,6 прописана обязательность колонки категория в обращении. Помимо самого объекта обязательность данной колонки похоже прописана где-то еще, но только вот где?
В самом объекте case у поля Категория стоит признак обязательно на уровне приложения.
Да, стоит, как я уже писала. Но если его снять, то поле будет по-прежнему обязательно. Значит, где-то еще в скрипте прописана обязательность, только вот где?
Обязательность поля Категория проставлена в 2х местах:
1) В самом объекте case;
2) В карточке редактирования обращения CasePage;
Спасибо, Григорий. А можно поточнее - из какой именно схемы casepage - в каком пакете? Я не нашла обязательность этого поля в схемах casepage
Дарья, просто откройте мастером страницу редактиования обращения и снимите в свойствах поля Категория признак обязательно для заполнения.
Григорий, я уже проделывала эти действия..
В самом объекте Обращения снят признак обязательности "на уровне приложения" с колонки Категория
В мастере пробовала снимать этот признак, но поле в карточке обязательно по-прежнему.
Такое ощущение, что он где-то принудительно устанавливается
Добрый день!
Попробуйте убрать обязательность с помощью кода, установить аттрибут "isRequired" в значение false
{ "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 } },
Есть еще вариант с бизнес правилами, их можно использовать для динамического скрытия/установки обязательности/управления доступностью контролов.
Это достаточно универсальный механизм
//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 //Тут может быть ИД, или любой другой тип данных } }] } }
Есть еще один рабочий вариант, если условие слишком сложное, и не может быть выполнено, используя бизнес правила, то можно забиндить метод/или свойство на атрибут контрола 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(); },
Да,я так и планирую использовать подобное бизнес-правило - сделать обязательность этой колонки в зависимости от параметров.
НО для того чтобы это использовать, нужно убрать принудительную обязательность поля Категория, которая непонятно где прописана в стандартной конфигурации
Код, приведенный в первом вашем сообщении, помогает лишь наполовину - убралась красная звездочка рядом с полем - признак обязательности его.
Но все равно остается требование обязательности данного поля - при сохранении карточки выдается сообщение, требующее заполнения поля; и при открытии карточки внизу под полем сообщение "необходимо указать значение"
Так а повесить бизнес-правило?
Атрибут "isRequired": false + правило и все работает.
Это чисто тестовый пример, при создании карточки не требует заполненного поля, но после - да.
И уберите значение по умолчанию, для поля Category, если оно не обязательно
"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 } }] } }
Спасибо!
Атрибут "isRequired": false + правило - заработало ( перекрыло какое-то бизнес-правило в стандартной конфигурации, которое требовало обязательность?)
В качестве бизнес-правило использовало другое правило, не из вашего примера.
Вопрос по вашем примеру
Enums.CardStateV2.ADD
ругается, что Enums is not defined.
Скажите, пожалуйста, что необходимо подключить в скрипт схемы, что он понимал, что такое Enums ?
Так, начнем того, что у нас используется модульный подход к разработке, соответственно, если в зависимостях нет нужных модулей, то работать не будет.
А зачем Вам мой пример?
У Вас все должно работать, если Вы правильновсе сделали.
define("CasePage", ["CasePageResources", "GeneralDetails", "BusinessRuleModule", "ConfigurationEnums"], function(resources, GeneralDetails, BusinessRuleModule, Enums)
Да, пример, собственно, не нужен - просто про модуль спросила.
В общем-то, Атрибут "isRequired": false + бизнес- правило работает.
Хотя так и непонятно до конца, где же крылась обязательность данного поля в базовой конфигурации.
Ну да ладно- главное, что можно ее обойти.
Спасибо
Моя рекомендация, установите себе jetBraine WebStorm, файлы JS стоит выгружать по указанному пути
C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS
Потом в web.config прописать
<add key="CompilerSourcesTempFolderPath" value="C:\inetpub\wwwroot\Название сайта\Terrasoft.WebApp\Resources\ui\Terrasoft\configuration\JS" />
Дальше делаете поиск по файлам, там много можно разных примеров подсмотреть.
"Александр Зубков" написал: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
Единственным вариантом решения многоуровневого условия обязательности полей является применение валидации нужного поля.