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

 

Изображение удалено.

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

UPD: временно решил проблему, добавив стиль элемента:

 

.multiLookupTabPanel {
    display: grid;
}

 

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

 

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

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

Добрый день. Столкнулся с такой проблемой: на странице раздела настроена асинхронная валидация "из коробки". Проблема в том, что она срабатывает при попытке добавить запись в деталь на другой вкладке. Есть ли способ при открытии определенной вкладки убирать обязательность поля?

Нравится

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

Можно, валидируйте обязательность поля от значения атрибута, при нажатии на вкладку собственно меняйте это значение в атрибуте. Если нужно будет что-то более конкретное или пример, дайте знать

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

На странице объекта есть кейс. Каждому шагу кейса соответствует свой статус объекта и вкладка в коллекции Вкладок. Кейс переходит по статусам автоматически. 

Вкладки, не соответствующие шагу, скрываются.

 

Как сделать так, чтобы переключение вкладок тоже происходило автоматически вместе со сменой статусов (шагов кейса)?

Нравится

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

Добрый день.

Для реализации Вам необходимо подписаться на изменение колонки кейса и при её изменении вызывать метод setActiveTab.

Пример реализации для страницы CasePage:

define("CasePage", [], function() {
		return {
			entitySchemaName: "Case",
          	attributes: {
              "ActiveTabName": {
                dependencies: [
                  {
                    columns: ["Status"],
                    methodName: "setActiveTabByStatus"
                  }
                ]
              },
              "StatusTabDictionary": {
                dataValueType: Terrasoft.DataValueType.COLLECTION,
                value: [
                  { statusId: "7e9f1204-f46b-1410-fb9a-0050ba5d6c38", tabName: "CaseInformationTab" },
                  { statusId: "3859c6e7-cbcb-486b-ba53-77808fe6e593", tabName: "TimelineTab" },
                  { statusId: "ae7f411e-f46b-1410-009b-0050ba5d6c38", tabName: "SolutionTab" }
                ]
              }
            },
			methods: {
 
              setActiveTabByStatus: function() {
                var status = this.get("Status");
                if (!status) {
                  return;
                }
 
                var statusTabDictionary = this.get("StatusTabDictionary");
                for (var i = 0; i < statusTabDictionary.length; i++) {
                  var item = statusTabDictionary[i];
                  if (item.statusId === status.value) {
                    this.setActiveTab(item.tabName);
                    return;
                  }
                }
              },
 
              initTabs: function() {
                this.callParent(arguments);
                this.setActiveTabByStatus();
              },
 
              onEntityInitialized: function() {
                this.callParent(arguments);
                this.setActiveTabByStatus();
              }
 
            }
		};
	}
);

 

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

Коллеги, добрый день. 

 

Не могу найти информацию о том, как настроить права доступа на вкладки "Обращение". 

Требуется "забрать" возможноть видеть вкладки у части агентов, после определённого события. 

Нравится

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

Обычно такое делается так: создаётся администрируемая операция, добавляются права на неё нужным пользователям (а лучше группе, а пользователей туда), затем в коде карточки на открытии проверяют права на операцию и показывают или скрывают вкладку. Как тут.

 

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

 

Ну и программное скрытие вкладок не спасёт от сильно хитрых пользователей, которые могут и подправить код на стороне браузера. Надёжнее забрать права на колонки или на таблицы деталей.

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

Зачастую не требуется настолько секьюрного подхода.

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

Тогда программно проверять права на операцию у пользователя. Если совсем неважны права, то можно и фичей, чтобы пользователь сам решил, что ему надо (хотя изначально этот механизм не совсем для того).

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

Хочу для некоторых своих категорий активностей скрыть некоторые вкладки, например, Файлы и примечания.

Нашел на форуме способ this.get("TabsCollection") + removeByKey.

И всё бы хорошо, но combinedMode, т.е. если я удалил вкладку, то открывая другую активность, где эта вкладка должна присутствовать, пользователь ее не видит. Казалось бы insert, но кого?

Есть ли полноценный работающий пример на этот случай?

Нравится

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

removeByKey возврщает удаляемый объект. Вы можете создать переменную, в которую сохранять удаляемые объекты. После этого, когда необходимо можно использовать на TabsCollection метод add и возвращать вкладку, когда нужно.

Золотарев Артем Андреевич,

А где можно создать такую глобальную переменную? Если я делаю

 

this.set("mActivityParticipantTab", tabsCollection.removeByKey("ActivityParticipantTab"));

то при заходе в новую активность this.get("mActivityParticipantTab") у меня undefined.

Во-первых, следите за контекстом. Проверьте, что вы set и get делаете в одном контексте. Также, если вы будете прятать несколько вкладок, то лучше будет использовать Terrasoft.DataValueType.COLLECTION и делать не "set", a "add", т.к. в переменной может храниться только одна вкладка.

Во-вторых, можно просто использовать контекст this и в него сохранить (что-то типа такого this.hiddenTabs = Ext.create("Terrasoft.Collection");)

Вероятнее всего вы пытаетесь делать this.get в контексте другого объекта, и там его нет

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

Здравствуйте.Очень хотелось бы получить возможность самостоятельно давать название, которое используется в коде для вкладок и групп полей. Также хотелось бы, чтобы мастер использовал какой-то единый стандарт для именования созданных разделов,деталей, вкладок, групп полей. От версии к версии продукта именование меняется и, к сожалению, не всегда в лучшую сторону. Например: 1. Не всегда используются ресурсы в карточках редактирования для свойства caption в diff. 2. Созданный раздел (и все относящиеся к нему схемы) в заголовке имеют название родительской схемы 3. К станицам деталей и самим схемам детали зачем-то приписывается 1. (UsrSchema1Detail, UsrAddIfro1Page) 4. Вкладки и группы полей именуются с добавлением id, хотя в одной из версий была возможность давать имя для вкладки. 5. В какой-то из версий можно было дать название вкладкам, в более поздних версиях данный функционал отсутствует. Прикреплю скриншет результата работы мастера раздела в версии 7.9

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

Ой, еще некоторые схемы после работы Мастера начинаются с UsrUsr (зачем-то повторяется)

И добавлю сюда пожелание при создании страниц раздела для разных типов использовать наследование (с возможностью редактирования родительской страницы). Так как чаще всего все страницы Контрагентов, например, на 80% должны иметь общий наследуемые функционал, а не повторяться в странице каждого типа

"Владимир Соколов" написал:при создании страниц раздела для разных типов использовать наследование (с возможностью редактирования родительской страницы)

Поддерживаю, буквально недавно стояла такая задача, пришлось править таблицы в БД.

"Пащенко Александр Сергеевич" написал:пришлось править таблицы в БД

Мы без правок БД наследовали, но
1) много ручной работы
2) родительскую схему после этого получается редактировать только руками

Но плюсы перевешивают эти минусы!

Александр, здравствуйте!

Ниже обратная связь по Вашим замечаниям:

"Пащенко Александр Сергеевич" написал:
Очень хотелось бы получить возможность самостоятельно давать название, которое используется в коде для вкладок и групп полей.

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

Зафиксировали и передали информацию в департамент разработки для рассмотрения реализации в будущих версиях приложения.

"Пащенко Александр Сергеевич" написал:
1. Не всегда используются ресурсы в карточках редактирования для свойства caption в diff.

Если мы правильно поняли, то такая ситуация возможна если замещенная схема находится по иерархии выше родительского.

"Пащенко Александр Сергеевич" написал:
2. Созданный раздел (и все относящиеся к нему схемы) в заголовке имеют название родительской схемы

Зафиксировали и передали информацию в департамент разработки для рассмотрения реализации в будущих версиях.

"Пащенко Александр Сергеевич" написал:
3. К станицам деталей и самим схемам детали зачем-то приписывается 1. (UsrSchema1Detail, UsrAddIfro1Page)

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

"Пащенко Александр Сергеевич" написал:
4. Вкладки и группы полей именуются с добавлением id, хотя в одной из версий была возможность давать имя для вкладки.

Данная логика была реализована в текущих версиях для того, чтобы избежать возникновения дублей с одинаковыми названиями в схеме. Если Вы знакомы с программированием, то Вы наверняка знаете, что нельзя, чтобы в коде были объявлены два и более объекта с одинаковым названием.

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


[/quote]

Такая возможность есть на текущий момент в мастере раздела (рис. 1).

"Владимир Соколов" написал:

И добавлю сюда пожелание при создании страниц раздела для разных типов использовать наследование (с возможностью редактирования родительской страницы). Так как чаще всего все страницы Контрагентов, например, на 80% должны иметь общий наследуемые функционал, а не повторяться в странице каждого типа

Пожелание зафиксировали. К сожалению, при создании нескольких страниц редактирования, созданные страницы наследуются от BasePageV2.
Для решения твоей задачи:
1) Типизируй страницы редактирования раздела
Предположим при типизации раздела была создана страница с названием OldPage
2) Перейди в конфигурацию
3) Создай свою схему в конфигурации, назвав ее нужным именем (например MyPage)
4) Унаследуй ее от нужной страницы редактирования
5) Сохрани изменения
6) Выполни запрос:
update SysModuleEdit
set CardSchemaUId = (select Uid from SysSchema where name = MyPage and ExtendParent = 0)
where CardSchemaUId = (select Uid from SysSchema where name = OldPage and ExtendParent = 0)

"Владимир Соколов" написал:

Ой, еще некоторые схемы после работы Мастера начинаются с UsrUsr (зачем-то повторяется)

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

Дмитрий, спасибо за быструю обратную связь.
В третьем пункте также было замечание, что детали называются UsrSchema1Detail. (вне зависимости от того, как называется объект).

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

Такая возможность есть на текущий момент в мастере раздела (рис. 1).

Здесь речь идет не о том, какой заголовок вкладки будет видеть пользователь в интерфейсе, а именно о том, как она будет называться в коде в секции diff (свойство Name).

"Пащенко Александр Сергеевич" написал:Здесь речь идет не о том, какой заголовок вкладки будет видеть пользователь в интерфейсе, а именно о том, как она будет называться в коде в секции diff (свойство Name).

Да, потом сложно в коде ориентироваться

Добавлю, что при включенном svn мастер самостоятельно не ставит замки на схемы.

"Пащенко Александр Сергеевич" написал:

Добавлю, что при включенном svn мастер самостоятельно не ставит замки на схемы.

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

Отдел разработки работает над исправлением этой проблемы.

Добрый день. Вот еще новые "Фичи" работы мастера. Теперь если добавлять новое поле на страницу, то в названии у него никак не фигурирует название колонки, вместо этого написано, например "Float"+случайный Id.

Кроме того, все проблемы, которые описаны в данной теме все еще присутствуют, а уже прошло более года.

Александр, здравствуйте!

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

Касательно замечания "Теперь если добавлять новое поле на страницу, то в названии у него никак не фигурирует название колонки, вместо этого написано, например "Float"+случайный Id.". Название колонки прописано в атрибуте "bindTo" в "values" поля. Данное поведение реализовано намеренно и скорее необходимо для того, чтоб если поля добавлять несколько раз в карточку, они в схеме были уникальными, и не было потом свалов в Мастере, например. Пожелание на доработку мы, конечно же, передали.

Одеяненко Юлия,

Безусловно, мастер стал более функциональным и удобным.

Ранее он брал название поля, а не его тип и добавлял к нему Id. Это было понятно. Сейчас же почему-то это изменили. Это влечет за собой дополнительную работу по исправлению названий для разработчиков, чтобы это хоть как-то было читаемо в дальнейшем. 

Аналогично с названием схем, созданных мастером деталей. Префикс в названии страницы дублируется дважды, детали называются по схема "Schema{0}Detail", их тоже приходится переименовывать.

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

 

Для пользователя, который не заходит в конфигурацию, никакой разницы нет, а для разработчика - это двойная работа, которая отнимает время.

Хотелось бы узнать предполагаемые сроки для данных правок и планируются ли они вообще?

Александр, здравствуйте!

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

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

Я динамически добавляю/удаляю вкладки на итогах (напрямую в базе), но чтоб только что примененные изменения отобразились необходимо обновить страницу, т.к. итоги должны быть зарегистрированы в Terrasoft.DashboardManager. Подскажите, есть ли способ обновлять структуру итогов программно, не обновляя страницу?

Нравится

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

Все оказалось очень сложно. Необходимо опубликовать сообщение с не очевидным названием ReloadDashboard.

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

Добрый день!
Есть задача создать Вкладку "История филиалов", в которой отображать стандартные детали филиалов данного контрагента (из детали Взаимосвязи).
В принципе добавить детали по филиалам ясно. Переопределить return в AccountPageV2, и возвращать значение функции, которая добавит в структуру страницы нужные детали(в detailes) и элементы страницы (в diff).
Загвоздка заключается, в том, что если пользователь захочет внести изменения в структуру страницы через "Мастер раздела", то мастер сформирует стандартную структуру страницы, затерев функцию динамического формирования Вкладку "История филиалов".
Может кто-нибудь сталкивался с подобной задачей или может подсказать в какую сторону двигаться, чтобы обойти эту проблему.
Спасибо.

Нравится

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

Здравтсвуйте, Игорь!
Если я правильно понял, то замещать таким образом модуль некорректно. Все замещающие модули должны иметь идентичную структуру с маркерными комментариями, чтобы мастер разделов мог с ними работать. Можно предпринять 2 вещи:
1) динамику отображения вкладки реализовать с помощью методов и зависимостей таким образом, чтобы сохранилась структура модуля. Хотя я может быть неверно понял то, как Вы хотите замещать страницу. На всякий случай приведите код.
2) разместить свой замещающий модуль страницы в отдельном пакете, чтобы мастер разделов создавал свой модуль и не "затирал" Ваш.

Здравствуйте!
Схема такая:

define('AccountPageV2', ['AccountPageV2Resources', 'GeneralDetails', 'BusinessRuleModule'],
function(resources, GeneralDetails, BusinessRuleModule) {
	var pageConfig =  {
		entitySchemaName: 'Account',
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		attributes: {},
		methods: {},
		rules: {},
		userCode: {}
	}
	function UpdateBaseConfig(pageConfig){
	//Здесь делаю запрос к таблице Relations. получаю все филиалы текущего контрагента
	// Обновляю структуру baseConfig.diff и baseConfig.details - добавляю детали для каждого филиала на на вкладку "история филиалов"
		return pageConfig;
	}
	return UpdateBaseConfig(pageConfig);
});

Очень интересно Ваше мнение. Спасибо.

Здравствуйте, Игорь!
В целом, это некорректный подход, но трюк с выносом этой схемы в другой пакет может сработать. Но опять же, мастер раздела, скорее всего "не увидит" Вашего автогенерированного конфига и может возникнуть конфликт при отрисовке контролов.

Боюсь, что если мастер сгенерирует новый замещающий клиентский модуль в новом пакете, то замещённый модуль, в котором будет моя логика не отработает.
Можно ли каким-то образом обратиться к Diff при отрисовке карточки контрагента?

Вы можете унаследоваться от карточки контрагента и назвать её таким же именем.

"Олейников Владимир Владимирович" написал:Вы можете унаследоваться от карточки контрагента и назвать её таким же именем.

Не совсем понял Ваше предложение.
Я и так работаю с замещающим клиентским модулем карточки контрагента.

Думаю, что мастер раздела её просто не откроет даже, так как не распознает вашу структуру

"Олейников Владимир Владимирович" написал:Думаю, что мастер раздела её просто не откроет даже, так как не распознает вашу структуру

Открывает, ведь структура возвращается стандартная.

Тогда и перезатирать не должен

Вы пробовали вносить изменения? Мастер перезатирает? Или вы только так думаете?

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

Игорь, в самом первом комментарии я Вам написал рекомендацию по этому поводу:

"Андрей Каспаревич" написал:2) разместить свой замещающий модуль страницы в отдельном пакете, чтобы мастер разделов создавал свой модуль и не "затирал" Ваш.

Вы пробовали так сделать? Есть ли какие-то результаты?

"Андрей Каспаревич" написал:Вы пробовали так сделать? Есть ли какие-то результаты?

Да, исходный клиентский модуль не затирается, но меня смущает тот факт, что новый клиентский модуль имеет стандартную структуру и дублирует весь массив details. Не будут ли в нём отражаться детали, которые были сформированы динамически.
И ещё: каким образом можно сделать синхронный запрос к таблице Relationship для получения массива филиалов, связанных с текущим контрагентом?

Также в моём примере есть недочет - страница собирается один раз, и для того чтобы моя динамическая вкладка собралась для другого контрагента, нужно выйти обратно в реестр раздела.

Игорь, добрый день.
Проанализировав Ваш код, можем сказать что весь массив details дублироваться не будет.
Отвечая на второй вопрос, для выполнения синхронного запроса, нужно реализовать метод, одним из параметров которого, будет callback-функция:
syncRequest: function(callback, scope) {
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: this.entitySchemaName
});
// добавляем в запрос нужные колонки
esq.addColumn("Id");
// объявляем необходимые фильтры
esq.filters.add("primaryColumnFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", this.get("PrimaryColumnValue")));
esq.filters.add("nameFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Name", this.get("Name")));
esq.getEntityCollection(function(response) {
if (response && response.success) {
if (response.collection.getCount() > 0) {
result.message = “Текс ошибки”;
result.success = false;
}
// непосредственно вызов callback-метода, который будет обрабатывать результат запроса
callback.call(scope || this, response);
}
}, this);
}
}
Спасибо.

Не совсем понятно, какую функцию передавать в callback, если нам необходимо в итоге получить дополненную структуру AccountPageV2? и где выполнять перебор связанных филиалов?

Игорь, добрый день.
Проанализировали еще раз Вашу задачу, и предлагаем использовать вариант вызова запросов цепочкой :
onPreviousElementChanged: function() {
Terrasoft.chain(
function(next) {
//запрос
/*this.getPreviousElementData(function(response) {
if (this.validateResponse(response)) {
next();
}
}, this);*/
},
function(next) {
//обработка данных запросов

/*this.set("isElementChanged", true);
this.onDelayTypeChanged();
this.set("isElementChanged", false);*/
next();
},
this);
},
Спасибо.

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

Доброго времени суток!

Столкнулся с такой проблемой: нужно добавить новые вкладки (!не детали) в карточку контакта.
Добавил, но проблема заключается в том, что их нужно динамически показывать/скрывать в зависимости от типа контакта. Метод SetVisible() не отрабатывает. Если просто присваивать свойству вкладки Visible true/false, то отрабатывает лишь при открытии карточки.

Каким образом можно реализовать данную задачу?

Нравится

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

"Constantine" написал:Если просто присваивать свойству вкладки Visible true/false, то отрабатывает лишь при открытии карточки.

Это если только на OnPrepare поставили, а если еще попробовать на OnDatasetDataChange поставить скрытие или отображение вкладок?

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

Если просто присваивать свойству вкладки Visible true/false, то отрабатывает лишь при открытии карточки.

Это если только на OnPrepare поставили, а если еще попробовать на OnDatasetDataChange поставить скрытие или отображение вкладок?


Вопрос по BPMonline, не по 3.X

Да что же со мной такое, почти никогда не замечаю, что для BPM.

Тогда попробуйте вместо SetVisible(true) использовать Hidden.

Page.MainTab.Hidden = false; //сделать видимым

Премного благодарен

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

Каким образом можно создать вкладку в разделе, для web содержимого с другого сервера ?

Нравится

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

Мы это делали с помощью стандартной функциональности - через Пользовательские запросы. Тогда появляется не вкладка, а деталь

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

Добрый день!
Посмотрите реализацию детали "Web", попробуйте сделать по аналогии.

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

Для того, чтобы добавить новую вкладку в реестре, следует в окне раздела добавить компонент Page, создавть в нем Window Container и привязать к своему окну.

tasks

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

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

попытался выбрать wnd_URLView, ну далее не понятно куда ввести url

Андрей, как описано выше, попробуйте использовать wnd_WebInfoDetail

В этом случае у Вас будет активно окно ввода адреса.

Для того, чтобы задать конкретный URL при загрузке делать, следует в функции OnPrepare

webinfo

При необходимости также можно отключить видимость для контрола с адресом.

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