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

Мне надо повесить проверку для фильтра "Заголовок".
Если с обычным фильтром можно как-то решить вопрос через getFilter, то как стучать в расширенные?
 

Нравится

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

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

 

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

 

С уважением,
Олег

Удалось достать значения фильтров, но понял что используя getFilter мою задачу реализовать не выйдет. Во-первых я никак не могу переопределить кнопку "применить" из схемы которая рисует и собирает конфиг расширенного фильтра - ExtendedFilterEditModelV2.
Во-вторых, как я понял, в коробке при инициализации раздела по дефолту применяется фильтрация из профайла текущего пользователя и метод getFilter при открытии раздела отрабатывает несколько раз.

Прикрепляю код переопределенной схемы раздела.
 

define("ActivitySectionV2", ["ExtendedFilterEditModelV2"], function(ExtendedFilterEditModelV2) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
 
            getFilters: function () {
                var filters = this.callParent(arguments);
                var customFilters = filters.contains("CustomFilters") ? filters.get("CustomFilters") : null;
                //debugger;
                var count = 0;
                for(var i in customFilters.collection.keys) { 
                    if(customFilters.collection.items[i].isEnabled && customFilters.collection.items[i].leftExpressionCaption == "Заголовок"){ 
                        var headerCaption = customFilters.collection.items[i].rightExpression.parameter.value; //rightExpression.parameter.value
                        if(headerCaption == null || headerCaption.length < 3) { 
                            this.showInformationDialog("WORKING");
                            //this.applyFilters();
                            return filters;
                        }
                    }
                }
                return filters;
            },
 
            applyButton: function() {
                this.showInformationDialog("btn handler works");
            },
        }
 
	};
});

По сути минимально хотелось бы достичь фикса кнопки applyButton, чтобы при apply отлавливать фильтрацию и отображать свое сообщение пользователю.
Буду благодарен за любую помощь.

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

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

Мне нужна кастомная вьюха со стилями и сеткой creatio, без привязки к разделу.
Создал объект , который наследует BaseEntity, добавил необходимые поля со скрина, но с реализацией пейджи как поступить не знаю.
Подскажите в каком направлении двигаться.

 

Нравится

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

Владислав, добрый день!

Пример подобной страницы. В разделе Документы добавлена кнопка открытия страницы:

define("DocumentSectionV2", [], function() {
	return {
		entitySchemaName: "Document",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
					"operation": "insert",
					"name": "OpenCustomPageButton",
					"values": {
						"style": "red",
						"itemType": 5,
						"caption": {
							"bindTo": "Resources.Strings.OpenCustomPageButtonCaption"
						},
						"click": {
							"bindTo": "onOpenCustomPageButtonClick"
						}
					},
				"parentName": "CombinedModeActionButtonsCardLeftContainer",
				"propertyName": "items",
				"index": 9
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onOpenCustomPageButtonClick: function() {
				var config = {
					moduleId: "SectionModuleV2_DocumentSectionV2_CardModuleV2_chain",
					moduleName: "CardModuleV2",
					operation: "add",
					schemaName: "UsrObjectWithoutSectionPage"
				};
				this.openCardInChain(config);
			},
		}
	};
});

Сама страница объекта без раздела:

define("UsrObjectWithoutSectionPage", [], function() {
  return {
    entitySchemaName: "UsrObjectWithoutSection",
    details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
    diff: /**SCHEMA_DIFF*/[
		{
				"operation": "insert",
				"name": "Namec84346b3-955b-4b9e-b061-af463ee8d8da",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "ProfileContainer"
					},
					"bindTo": "UsrName"
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 0
			}
	]/**SCHEMA_DIFF*/,
    methods: {}
    };
});

 

Владислав, добрый день!

Пример подобной страницы. В разделе Документы добавлена кнопка открытия страницы:

define("DocumentSectionV2", [], function() {
	return {
		entitySchemaName: "Document",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
					"operation": "insert",
					"name": "OpenCustomPageButton",
					"values": {
						"style": "red",
						"itemType": 5,
						"caption": {
							"bindTo": "Resources.Strings.OpenCustomPageButtonCaption"
						},
						"click": {
							"bindTo": "onOpenCustomPageButtonClick"
						}
					},
				"parentName": "CombinedModeActionButtonsCardLeftContainer",
				"propertyName": "items",
				"index": 9
			}
		]/**SCHEMA_DIFF*/,
		methods: {
			onOpenCustomPageButtonClick: function() {
				var config = {
					moduleId: "SectionModuleV2_DocumentSectionV2_CardModuleV2_chain",
					moduleName: "CardModuleV2",
					operation: "add",
					schemaName: "UsrObjectWithoutSectionPage"
				};
				this.openCardInChain(config);
			},
		}
	};
});

Сама страница объекта без раздела:

define("UsrObjectWithoutSectionPage", [], function() {
  return {
    entitySchemaName: "UsrObjectWithoutSection",
    details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
    diff: /**SCHEMA_DIFF*/[
		{
				"operation": "insert",
				"name": "Namec84346b3-955b-4b9e-b061-af463ee8d8da",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "ProfileContainer"
					},
					"bindTo": "UsrName"
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 0
			}
	]/**SCHEMA_DIFF*/,
    methods: {}
    };
});

 

Дима Вовченко,

Благодарю Вас за ответ, Дмитрий!

 

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

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

Например у меня есть правило:

rules: {

            "Status": {

                "FiltrationStatusNrbUseInCalls": {

                    ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,

                    autocomplete: true,

                    autoClean: true,

                    baseAttributePatch: "Finish",

                    comparisonType: Terrasoft.ComparisonType.EQUAL,

                    type: BusinessRuleModule.enums.ValueType.CONSTANT,

                    value: true

                },

        },

},

и оно не работает, ошибки в консоли нет.

но если я буду фильтровать по полю с id (например укажу baseAttributePatch: "Id"? а в value конкретный Id), то фильтр работает.

 "Status" указан в атрибутах, как виртуальная колонка.

Нравится

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

Решила вопрос сама, где бы не располагалась фильтрация, будь то в секции filters у атрибута, или в rules, для справочников типа ENUM это не работает. Помогло только вынести метод getLookupQuery и все его зависимые методы на страницу. 

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

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

Я разрабатываю свое модально окно, по нажатию на кнопку в карточке, хочу открыть модальную форму, в которой есть ряд справочных полей. Каждое справочное поле описано в атрибутах как виртуальная колонка, я накладываю какие-то фильтры на них, но эти фильтры почему-то не срабатывают.
Как добавляю модальное окно: 

1) Создаю в пакете модель представления страницы и указываю в качестве родителя BaseModalBoxPage

2) Код страницы:

 define("NrbTestModalBox", [],
    function() {
        return {
            mixins: {},
            messages: {},
            attributes: {
                "Contact": {
                    isRequired: true,
                    dataValueType: Terrasoft.DataValueType.LOOKUP,
                    referenceSchemaName: "Contact",
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    lookupListConfig: {
                        filters: [
                            function () {
                                debugger;
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("ContactFilter",
                                                Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "CreatedById", null));

                                return filterGroup;
                            }
                        ]
                    }
                },
            },
            details: {},
            diff: /**SCHEMA_DIFF*/[

                {
                    "operation": "insert",
                    "name": "mainBoxContainerGrid",
                    "parentName": "CardContentWrapper",
                    "propertyName": "items",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
                        "items": []
                    }
                },
                {
                    "operation": "insert",
                    "parentName": "mainBoxContainerGrid",
                    "propertyName": "items",
                    "name": "Contact",
                    "values": {
                        "bindTo": "Contact",
                        "caption": "Контакт",
                        "contentType": Terrasoft.ContentType.ENUM,
                        "layout": {
                            "column": 0,
                            "row": 0,
                            "colSpan": 24
                        }
                    },
                }
            ]/**SCHEMA_DIFF*/,
            methods: {
                init: function() {
                    this.callParent(arguments);
                },
 
                getLookupQuery: function(filter, column) {
                    var esq = this.callParent(arguments);
                    var lookupListConfig = this.getLookupListConfig(column);
                    if (lookupListConfig) {
                        this.Terrasoft.each(lookupListConfig.columns, function(column) {
                            if (!esq.columns.contains(column)) {
                                esq.addColumn(column);
                            }
                        }, this);
                    }
 
                    var schemaColumn = this.getColumnByName(column);
                    if (schemaColumn.lookupListConfig && schemaColumn.lookupListConfig.filter) {
                        esq.filters.addItem(schemaColumn.lookupListConfig.filter());
                    }
 
                    return esq;
                },
                getLookupListConfig: function(columnName) {
                    var schemaColumn = this.getColumnByName(columnName);
                    if (!schemaColumn) {
                        return null;
                    }
                    var lookupListConfig = schemaColumn.lookupListConfig;
                    if (!lookupListConfig) {
                        return null;
                    }
                    var excludedProperty = ["filters", "filter"];
                    var config = {};
                    this.Terrasoft.each(lookupListConfig, function(property, propertyName) {
                        if (excludedProperty.indexOf(propertyName) === -1) {
                            config[propertyName] = property;
                        }
                    });
                    return config;
                }
            }
        };
    });

 

3) Вызываю модальное окно так: 

this.sandbox.loadModule("ModalBoxSchemaModule", {
id: this.sandbox.id + "_NrbTestModalBox", //NrbCompleteCallModalBox
instanceConfig: {
     moduleInfo: {
           schemaName: "NrbTestModalBox",
     },          
 }
});

 

 

debugger не срабатывает при разворачивании справочника. Подскажите пожалуйста, в чем у меня ошибка?

Нравится

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

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

Однако, возможно дело в том, как вы в атрибуте работаете со значением CreatedBy.

Для теста создал подобный фильтр для поля Owner:

attributes: {
			"Owner": {
                "dataValueType": Terrasoft.DataValueType.LOOKUP,
                "lookupListConfig": {
                    "filters": [
                        function() {
                            var filterGroup = Ext.create("Terrasoft.FilterGroup");
                            filterGroup.add("TestSd",
                                Terrasoft.createColumnIsNullFilter("[Contact:Id].CreatedBy")
										   );
                            return filterGroup;
                        }
                    ]
                }
			}
		},

Обратите внимание каким образом я ищу контакты с CreatedBy null:

Terrasoft.createColumnIsNullFilter("[Contact:Id].CreatedBy").

Возможно данный пример вам поможет.

Показать все комментарии
Лучший ответ
[OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
             UriTemplate = "/UpdateUser/{id}")]
        [return: MessageParameter(Name = "result")]
 
        public Result UpdateUser(PortalUser user, string id){}

UriTemplate = "/UpdateUser/{id}" если я тебя правильно понял

[OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
             UriTemplate = "/UpdateUser/{id}")]
        [return: MessageParameter(Name = "result")]
 
        public Result UpdateUser(PortalUser user, string id){}

UriTemplate = "/UpdateUser/{id}" если я тебя правильно понял

Dima Avdoshin, 

дякую :)

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

Коллеги, здравствуйте.

Подскажите, пожалуйста, смогу ли я создать новый раздел на портале Customer Portal по базовому объекту, например, "Активность" и, соответственно, настроить страницу портала, автоматизацию и пр? В академии я вижу такие формулировки, которые, как кажется, могут относиться к моему вопросу, но смысл их мне неочевиден:

1. Дополнительные разделы: возможность создания 3 (трёх) кастомных разделов для ваших портальных пользователей. Кастомный раздел — новый раздел, дополнительно созданный в системе, но без возможности наследования функционала базовых разделов - https://www.terrasoft.ru/portal/price

2. Пользовательские разделы портала создаются с нуля и должны иметь минимальную связь с данными разделов основного приложения - https://academy.terrasoft.ru/docs/user/drugie_reshenija/portal/obzor_po…

 

Нравится

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

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

Клиентский портал (Customer Portal) действительно позволяет настраивать и использовать до трех пользовательских разделов на портале.

Пользовательский раздел сначала нужно создать в приложении и затем на его основе создать портальную версию этого раздела. Разделы [ Обращения ] и [ База знаний ], также доступны пользователям клиентского портала, а для пользователей продукта Creatio Bank Customer Journey будет доступен раздел [ Заявки ]. Дополнительно можно вывести на портал раздел [ Документы ], если он доступен в основном приложении.

Обратите внимание, что создание раздела на основе лицензируемого объекта из состава базового продукта не считается пользовательским разделом.

 

А можно ли в кастомном разделе отображать деталь с Активностями, связанными с этой записью раздела?

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

Добрый вечер ! Как настроить бизнес правила для группы полей которые находятся во вкладке.

Пример

На странице раздела есть вкладка под названием "Карточка" Code (ProjectMap)

в "Карточка" есть 5 групп полей .

Нужно чтобы  (Если)

поле "Название проекта" (Поле не находится в той же вкладке) НЕ Заполнено 

ТО

Делать поле редактируемым 

и тут уже не поле, а группы полей которые находятся во вкладке "Карточка"

Пробывал следующим образом : Тип "Поле" заменяю на "Атрибут" тут пишу Code(ProjectMap) (Система определяет его ) после сохраняю обнавляю, но б.правило не отрабатывает . 

Для теста попробывал сделать редактируемым какое-то НЕ Атрибут а обычное Поле - всё ок , всё робит .

 

Нравится

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

Добрый день!
На данный момент делать всю группу редактируемой пользовательскими средствами нет возможности.
Как вариант можно настроить несколько бизнес-правил редактирования на все поля из группы.
Либо настроить видимость данной группы только при определенных условиях, а когда она видна, тогда ее можно и редактировать соответственно.

Yanina Ryssjanova,

 

Добрый день. Полей много - всего  45  ))) 

Просто скрывать для этой задачи к сожалению не получится ) Информация должна быть видимым (( ,спасибо за отклик! 

Tigran Gevorgyan пишет:

Yanina Ryssjanova,

Добрый день. Полей много - всего  45  ))) 

Просто скрывать для этой задачи к сожалению не получится ) Информация должна быть видимым (( ,спасибо за отклик! 

Сделайте 2 вкладки. На одной одно состояние (редактируемое), на другое - другое. Прячьте ненужную вкладку с помощью правил

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

 

Да, как вариант подойдёт , но в этом случае тоже потребуется для отображении значений полей в 2 вкладках 45 правил . Решил созданием 45 правил , пока не решут вопрос с разрабом. Всем спасибо .

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

Создан шаблон. В нем есть макрос Status# - "Статус обращения" при рассылке направляется получателю на английском языке - EN.

В шаблон был добавлен язык RU - но статус по прежнему направляется на языке EN. Выбрать RU по умолчанию нет возможности, возможности удалить EN и оставить RU также нет.

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

Прикрепленные файлы

Нравится

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

Евгения, здравствуйте.

Насколько мне известно, [#Status#] берёт локализованное значение из справочника стадий, опираясь на язык общения контакта, потому не играет роли сам язык шаблона.

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

 

Дополнительно на команде разработки есть задача на доработку этого функционала.

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

Здравствуйте! Поймали необъяснимый баг.

Есть C# в котором замещается метод CreateReport из ReportHelper

Приведу пример:

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text.RegularExpressions;
using System.Web;
using Terrasoft.Common;
using Terrasoft.Core;
using Terrasoft.Core.Factories;
using Terrasoft.Reports;
using System.Web.Script.Serialization;
using Terrasoft.Core.Entities;
 
namespace Terrasoft.Configuration.ReportService
{
	[Terrasoft.Core.Factories.Override]
	class OnellectReportHelper : ReportHelper
	{
		public override string CreateReport(string entitySchemaUId, string reportSchemaUId, string templateId,
				string recordId, string reportParameters, bool convertInPDF) {
			string key = base.CreateReport(entitySchemaUId, reportSchemaUId, templateId, recordId, reportParameters, convertInPDF);
			string reportName = "Метод генерации названия файла";
			if (!reportName.IsNullOrEmpty())
			{
				object reportObj = UserConnection.SessionData[key];
				var report = (ReportData)reportObj;
				report.Caption = Uri.EscapeDataString(reportName);
				UserConnection.SessionData[key] = report;
			}
			return key;	
		}
	}
}

Так вот под Windows проблем нет, все отрабатывает корректно, но некоторые клиенты стали жаловаться, что именование файлов работает как в коробке. Выяснилось, что они используют Safari. Если запустить генерацию печатных форм в Chrome, то название формируется согласно замещающему методы.

 

Не могу понять, куда копать. Mac-а для отладки под рукой нет. По идее код можно вставить на любой среде и тогда все печатные формы должны выгружаться с названием из переменной reportName. Может кто-то проверит под маком и Safari, повторится ли баг?

Нравится

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

Мы для тестов под Mac использовали облачный сервис. Например, https://www.macincloud.com

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

Я нашел проблему. Почему-то Safari берет название не из метаданных файла, а из caption, которое было сгенерировано на фронте. Метод downloadReport из PrintReportUtilities, передается caption с фронта.

		downloadReport: function(caption, key) {
			var report = document.createElement("a");
			report.href = "../rest/ReportService/GetReportFile/" + key;
			report.download = caption;
			if (this.Ext.isIE) {
				report.target = "_blank";
			}
			document.body.appendChild(report);
			report.click();
			document.body.removeChild(report);
		}

Получилось обойти это, изменив объект printForm в методе generatePrintForm в BasePageV2

generatePrintForm: function(printForm) {
   printForm.$Caption = "Имя файла";
   return this.callParent(arguments);
}

Правда с получением названия отчета из бекэнда пришлось повозиться, так и не смог по нормальному вызвать callParent внутри callService, т.к. название отчета получал через сервис. Забил на это дело с вызовом callParent и полностью скопировал код метода generatePrintForm из PrintReportUtilities, без всякого наследования...возможно это аукнется в одном из обновлений, но таков путь...

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

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

Нравится

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

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

 

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

 

Готовых скриптов по решению этой задачи также нет.

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