Добрый день, уважаемые коллеги!

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

Попыталась поискать решение по материалам сообщества, но так и не разобралась, можно ли реализовать такую потребность и каким образом.

https://community.terrasoft.ru/articles/susestvuet-li-v-79-sposob-zadat-cvet-stroke-v-reestre-mobilnogo-prilozenia

https://community.terrasoft.ru/questions/napisanie-stilei-dla-mobilnoi-versii

https://community.terrasoft.ru/articles/kak-v-mobilnoi-versii-prilozenia-vyvesti-dopolnitelnye-kolonki-v-reestra-razdela

 

Подскажите, пожалуйста, понять как работает Terrasoft.util.writeStyles:

  1. можно ли и как в данном случае использовать Terrasoft.util.writeStyles (сложилось впечатление, что стиль определяется для реестра/схемы в целом)?
  2. Если реализация возможна, то на каком типе схемы для реестра надо обращаться к Terrasoft.util.writeStyles ?

Благодарю за помощь

Нравится

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

Марина, это немного нетривиальная задача, но она реализуема.

 

Как подобное можно реализовать. Для этого нужно по сути реализовать свой компонент реестра\грида, расширив базовый компонент list. Именно так сделано в разделе «Лента»\”Feed” (см. MobileFeedList, MobileSocialMessageGridPageView).

  1. Создать свой компонент, расширив базовый list. Например, если нужно менять стиль только основного выводимого поля, то можно реализовать в нем только метод getApplyItemTplPrimaryColumnFn. Что-то типа:

 

Ext.define("Terrasoft.configuration.MyList", {
   extend: "Ext.Terrasoft.List",
   xtype: "cfmylist",
 
   getApplyItemTplPrimaryColumnFn: function() {
      return function(values) {
         var config = this.primaryColumnConfig;
         var value = this.getValueByConfig(config, values);
         var typeId = values["Type"];
         var isRed = false;
         if (typeId === "some_type_value") {
            isRed = true;
         }
         if (value) {
            return "<div class=\"x-list-title\" " + isRed ? "style=\"color: red;\"" : "" + ">" + value + "</div>";
         }
         return "";
      };
   }
 
});

 

  1. Во view страницы реестра своего раздела указать в качестве используемого компонента свой разработанный компонент из п.1.
Ext.define("Terrasoft.configuration.view.ContactGridPage", {
   extend: "Terrasoft.view.BaseGridPage.View",
   xtype: "contactgridpageview",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   },
  1. Прописать в манифесте в CustomSchemas схему, в которой реализовали свой компонент.

Марина, это немного нетривиальная задача, но она реализуема.

 

Как подобное можно реализовать. Для этого нужно по сути реализовать свой компонент реестра\грида, расширив базовый компонент list. Именно так сделано в разделе «Лента»\”Feed” (см. MobileFeedList, MobileSocialMessageGridPageView).

  1. Создать свой компонент, расширив базовый list. Например, если нужно менять стиль только основного выводимого поля, то можно реализовать в нем только метод getApplyItemTplPrimaryColumnFn. Что-то типа:

 

Ext.define("Terrasoft.configuration.MyList", {
   extend: "Ext.Terrasoft.List",
   xtype: "cfmylist",
 
   getApplyItemTplPrimaryColumnFn: function() {
      return function(values) {
         var config = this.primaryColumnConfig;
         var value = this.getValueByConfig(config, values);
         var typeId = values["Type"];
         var isRed = false;
         if (typeId === "some_type_value") {
            isRed = true;
         }
         if (value) {
            return "<div class=\"x-list-title\" " + isRed ? "style=\"color: red;\"" : "" + ">" + value + "</div>";
         }
         return "";
      };
   }
 
});

 

  1. Во view страницы реестра своего раздела указать в качестве используемого компонента свой разработанный компонент из п.1.
Ext.define("Terrasoft.configuration.view.ContactGridPage", {
   extend: "Terrasoft.view.BaseGridPage.View",
   xtype: "contactgridpageview",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   },
  1. Прописать в манифесте в CustomSchemas схему, в которой реализовали свой компонент.

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

 

Александр, огромное спасибо за подробное описание алгоритма с примерами. Стала пытаться реализовать алгоритм и столкнулась с проблемой во 2-м пункте :)

 

В конкретной ситуации рассматривается реестр Контрагентов. Сейчас отображается MobileAccountGridPage, который надо изменить и в коде которого:

Ext.define("AccountGridPage.View", {
	extend: "Terrasoft.view.BaseGridPage.View",
	xtype: "accountgridpage",
	config: {
		id: "AccountGridPage",
		navigationPanel: {
			id: "AccountGridPage_navigationPanel",
			title: LocalizableStrings["AccountGridPage_navigationPanel_title"]
		},
		grid: {
			id: "AccountGridPage_grid",
			iconCls: "user",
			store: "AccountGridPage.Store"
		}
	}
});

Так как здесь я не могу вносить изменения, то пытаюсь реализовать либо как:

- расширение от вышеуказанного класса "AccountGridPage.View", но в этом случае возникает ошибка - Uncaught Error: [Ext.Loader] Failed loading 'AccountGridPage/View.js', please verify that the file exists

- расширение от класса "Terrasoft.view.AccountGridPage.View" , возникает ошибка - sencha-touch-all-debug.js:8634 Uncaught Error: [Ext.Loader] Failed loading 'app/view/AccountGridPage/View.js', please verify that the file exists,

- расширение от "Terrasoft.view.BaseGridPage.View", но в этом случае ничего не происходит.

Ext.define("Terrasoft.configuration.view.UsrAccountGridPage", {
 // extend: "Terrasoft.view.AccountGridPage.View", //  Failed loading 'app/view/AccountGridPage/View.js'
 // extend: "AccountGridPage.View", // ошибка Failed loading 'AccountGridPage/View.js
  extend: "Terrasoft.view.BaseGridPage.View", // ничего не происходит
   xtype: "usraccountgridpage",
   config: {
      grid: {
         xtype: "cfmylist",
      },
   }
});

Как правильно выполнить расширение в данном случае? Благодарю за помощь

Можно скопировать текст текущей view (MobileAccountGridPage, если не ошибаюсь), создать свою схему, вставить туда скопированный текст, у свойства grid указать свой новый xtype компонента грида и не забыть указать эту схему в манифесте в свойстве Grid у модели Account.

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

 

Александр, попробую. Благодарю Вас за ценные рекомендации

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

Коллеги, доброго времени суток!



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

 

Кейс: 

в реестре раздела Контрагенты вывести дополнительную колонку с названием "Контакты", и для каждой записи выводить имена всех Контактов соответствующего Контрагента (из детали "Контакты контрагента").

 

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

Необходимо, чтобы контакты отображались даже когда строка неактивна, то есть также, как данные других колонок (всегда).

Обычным способом такую колонку добавить не получается.

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

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

Заранее спасибо за помощь!

 

Нравится

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

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

Дмитрий Анисько пишет:

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

Лучше всего именно так. На уровне встроенного БП объекта детали или отдельным БП заполнять новое текстовое поле в объекте раздела. Можно ещё триггером в базе, но это Вам не подойдёт.

Дмитрий Анисько пишет:

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

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

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

 

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

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

1. Добавляем view с 2 колонками - Guid и string. Средствами sql формируем запрос, который в первую колонку будет возвращать Id контрагента, во вторую все "склеенные" в одну строку имена относящихся к нему контактов

2. В контрагенте добавляем колонку-справочник на нашу view (не забываем про галочку контроля целосности)

3. На событии OnInserting контрагента копируем значение колонки Id в колонку из п.2

4. Дальше пользуемся базовой настройкой колонок

 

Манипуляции из пп. 2-3 нужны для того, чтобы сохранить прямую связь

Лопатин Константин,



Большое спасибо за ответ, но указанный способ не подходит.

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

 

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

 

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

Дмитрий Анисько пишет:

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

Лучше всего именно так. На уровне встроенного БП объекта детали или отдельным БП заполнять новое текстовое поле в объекте раздела. Можно ещё триггером в базе, но это Вам не подойдёт.

Дмитрий Анисько пишет:

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

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

Коллеги, большое спасибо за ответы.

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

Дмитрий Анисько пишет:

Коллеги, большое спасибо за ответы.

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

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

 

Нужно сохранить поддержку всех 3-х субд, а создавать View для каждой - не очень удобно

Тоже не вижу особой проблемы с учетом того, что синтаксис аналогичный.

Лопатин Константин пишет:

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

Честно, не тестировал три обсуждаемых варианта, но можно предположить, что данные меняют намного реже, чем читают, следовательно затраты на обновление меньше, чем каждый раз вычислять. Хотя, возможно, с view всё не так страшно, ведь запрос отрабатывает не сервере БД раз и  целиком через веб-сервер попадает в браузер. В случае же программной вычитки для каждой записи каждый раз будут отрабатывать и БД, и сервер приложений.

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

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

Возник следующий вопрос.

Необходимо в реестр справочника, например Статусы обращения, вывести значения колонки IsFinal аналогично методу setSubtitleColumns согласно SDK

https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra

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

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

 

 

 

 

 

Пример необходимой реализации, колонка контакт:

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

 

 

 

 

 

 

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

Попытки задания Subtitle через дополнительный модуль, подключённый в манифесте для раздела Case, не дал результата. Что-то делаю не так.

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

Спасибо!

 

Нравится

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

Примеры использования этого свойства есть в «коробке» в схемах MobileLookupGridPageConfig, MobileLookupGridOpportunityPageConfig, MobileCaseMessageHistoryModuleConfig и MobileCaseMessageHistoryModuleConfig. Судя по названию, вторая схема как раз может использоваться для окна выбора из справочника. Её код:

Terrasoft.sdk.LookupGridPage.setSubtitleColumns("Opportunity", ["Account"]);

 

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

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

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

Алексей, добрый день!

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

Вы можете следить за новым функционалом на сайте Академии Террасофт по ссылке https://academy.terrasoft.ru/documents/upcoming-releases

Здравствуйте, Алексей! Спасибо за идею. Данная функциональность уже запланирована на ближайшие релизы. В версии 7.12.0 фиксированные заголовки уже доступны в списках аналитики (итоги).

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

http://joxi.ru/823pxM1F9aRL5A

Александр Свистунов,

конечно!

Появилась информация о том, когда будет задача реализована? 

Савельева Анастасия,

Алексей-Карягин,

Александр Свистунов,

Здравствуйте. Данный функционал уже реализован и будет доступен после обновления на версию 7.15.2

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

Есть хорошая статья

https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/kak-vydelit-cv…

и всё, что в ней написано, хорошо работает. 

Но мне надо, чтобы активная запись не меняла свой цвет на дефолтный. Как это сделать?

Нравится

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

Добрый день, Алексей!

Не совсем ясна задача. Вы хотите, чтобы активная запись выделялась другим цветом? Тогда вам нужно создать модуль (не замещающий, а именно просто модуль), на вкладке LESS прописать CSS стили для CSS-класса grid-row-selected, например так:

.grid-row-selected {
	background-color: #000000 !important;
}

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

define("UsrContactSectionCss", [],
		function() {
			return {};
		});

Теперь нужно переопределить ContactSectionV2 и в него прописать зависимость от наших прописанных стилей, добавив беред названием модуля "css!", т.е. код может быть такой:

define("ContactSectionV2", ["css!UsrContactSectionCss"], function() {
	return {
		entitySchemaName: "Contact",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

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

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

Возможно ли сделать нумерацию строк в реестре?

Возможно ли сделать нумерацию строк в каждом реестре BPM (разделы, детали)?

Пишу сюда в надежде на помощь ибо нет даже предположений как это сделать(

Нравится

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

А вам нужна именно нумерация строк или записей?

Второе решается более-менее стандартными методами, а цель первого не совсем понятна

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

именно строк, меняем сортировку, фильтры - нумерация та самая - 1,2,3,4. Многие цели клиентов нам не понятны...

Добрый день, Виталий!

Самый простой способ сделать это в разделе - это заместить обьект и добавить к нему целочисленное поле, в котором динамически проставлять нумерацию. Можно сделать и добавление колнки динамически, а не через обьект, но это намного сложнее и может привести к проблемам в некоторых разделах. Например, к разделу "Контакт" добавим поле с именем UsrRowNumber. Для этого после добавления поля к обьекту "Контакт" нужно настроить отображение колонок и вывести новосозданное поле. А потом на странице раздела ContactPageV2 переопределить метод onGridDataLoaded, чтобы получилось примерно такое:

onGridDataLoaded: function() {
  this.callParent(arguments);
  for (var i = 0; i < this.getGridData().collection.items.length; i++) {
    var itemId = this.getGridData().collection.items[i].get("Id");
    this.getGridData().get(itemId).set("UsrRowNumber", (i + 1));
  }
},

Таким образом, будет работать нумерация в разделе "Контакты". Скорее всего вам не нужна будет сортировка по этой колонке реестра, так как это не даст никакой сортировки. В этом случае можно переопределить также метод sortColumn, в котором проверять какая колонка сейчас будет отсортирована и не сортировать, если это колонка UsrRowNumber. Как пример:

sortColumn: function(index) {
  var columnsSettingsProfile = this.get("Profile");
  var columnsConfig = columnsSettingsProfile.DataGrid.listedConfig;
  var columnName;
  if (!Ext.isEmpty(columnsConfig)) {
    var columns = this.Ext.decode(columnsConfig);
    var column = columns.items[index];
    columnName = column.bindTo;
  }
  if (columnName !== "UsrRowNumber") {
    this.callParent(arguments);
  }
}

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

Если же говорить про детали, то тут немного проще динамически добавить колонку. Можно попробовать перехватить Profile детали в котором находятся конфиги на отображение в списочном и плиточном отображении (listedConfig и tiledConfig). 

К примеру в методе initProfile после вызова this.callParent(arguments) взять this.get("Profile") и динамически изменить listedConfig (или tiledConfig) для изменения конфигурации колонок грида. Сначала конфиг нужно распарсить (можно использовать либо Ext.decode, либо JSON.parse), модифицировать как вам необходимо и вернуть орбатно с помощью this.set("Profile", newProfile).

Может и пойдет такое, но хотят чтобы это было в каждом раздели и детали, представление только списком будет. Без создания колонки в объекте можно сделать? Динамически нужно)

Радчук Виталий Владимирович,

Чтобы сделать сразу на всех деталях нужно делать перехват Profile как описано выше, но этот перехват делать на базовой клиентской схеме детали грида (например, BaseGridDetailV2) и тогда все будет работать для всех деталей, которые от него наследуются.

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

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

Хочу настроить функцию Количество по связанному объекту и вывести значение в реестр как здесь https://academy.terrasoft.ru/documents/marketing/7-8/nastroyka-kolonok-…

Вопрос в том, что где-то фильтрация доступна, а где-то нет, хотя всё как будто одинаково.

Почему? Что влияет на это?

Нравится

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

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

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

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

Добрый день.

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



1) Вшить в раздел Контрагенты фильтр или группу, которую нельзя снять. Идельно - дать пользователю возможность выбирать 1 из групп, но запретить любую прочую фильтрацию, или доступ к реестру без группы.

2) Сделать зеркальный раздел, который будет с иными правами доступа. Контрагенты будут доступны для чтения всем и будут использоваться для дедубликации, но не будет доступен в виде реестра пользователям. Контрагент Зеркало будет с ограниченными правами доступа и доступен в виде реестра. Данный вариант выглядит значительно сложнее в дальнейшем администрировании. 

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

Нравится

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

Данил. Вам стоит смотреть в сторону замещения метода initQueryFilters в разделе. Он будет фильтровать записи при загрузке раздела и физически снять его пользователи не смогут.

В лиде делать выбор не из объекта Контрагенты, а из объекта, построенного на VIEW (заодно и покажете только те поля, которые хотите показать).

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

Добрый день коллеги, подскажите как сделать так что бы при открытии раздела в реестре не отображались записи до того момента пока не выставишь фильтры. Заранее благодарен. BPM 7.7

Нравится

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

Вы можете переопределить метод загрузки данных, проверять количество фильтров, и, к примеру, ничего не делать если фильтров нет. Пример:

define("ContactSectionV2", ["ContactSectionV2Resources"],
	function(resources) {
		return {
			entitySchemaName: "Contact",
			diff: /**SCHEMA_DIFF*/[
			]/**SCHEMA_DIFF*/,
			methods: {
				loadGridData: function() {
 
					var filters = this.getFilters();
					if (filters.collection.items.length === 0) {
						return;
					}
 
					this.beforeLoadGridData();
					var esq = this.getGridDataESQ();
					this.initQueryColumns(esq);
					this.initQuerySorting(esq);
					this.initQueryFilters(esq);
					this.initQueryOptions(esq);
					this.initQueryEvents(esq);
					esq.getEntityCollection(function(response) {
						this.destroyQueryEvents(esq);
						this.updateLoadedGridData(response, this.onGridDataLoaded, this);
						this.checkNotFoundColumns(response);
					}, this);
				}
			}
		};
	}
);

Можно так же, очищать реестр в блоке if, на случай если кто-то снимет фильтр обратно.

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

версия: 7.8 service
1. Как сделать вторую вкладку в разделе? что бы можно было там выводить другие поля из карточки.
2. Как сделать чтобы две-три колонки кроме своих названий имели еще одно общее которое будет написано вверху.

Нравится

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

Виталий, здравствуйте!

Если мы правильно поняли, то как вариант Вы можете воспользоваться базовыми средствами:

1. Вы можете добавить вкладку через мастер раздела;

2. Добавить и назвать группу полей, затем расположить пользовательские колонки;

Также можете посмотреть ознакомительный видеоролик - https://www.youtube.com/watch?v=DLFjsAR2CbI&t=271s

Нет, не то, это должна быть другая вкладка реестра, как в 3.х: "все контакты", "мои контакты". Такое можно сделать?

Здравствуйте, Виталий!

В bpm'online 7.8 есть представления разделов. По умолчанию в разделах есть два представления:
1) Список
2) Итоги

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

Это сложная реализация, требующая навыков программирования на языке JS.

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

Можете дать ссылку на документацию(более сложного способа)? Если она есть по именно данному случаю.

Здравствуйте, подобную задачу решали тут:

http://www.community.terrasoft.ru/blogs/12682
И тут: http://www.community.terrasoft.ru/forum/topic/15335

Удачи.

О, благодарю, то что нужно, а что по второму вопросу? он тоже касается реестра

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

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

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

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