Общий салют! Как/ или откуда подтягиваются данные в блок mainHeader? Интересует взаимодействие с ФИО контакта (id: MainHeaderSchemaPageHeaderCaptionLabel), которое расположено в шапке на странице любого контакта (здесь это Accom).Изображение удалено.

Нравится

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

Добрый день.

 

Посмотрите в схеме карточки BasePageV2 (пакет NUI) реализацию функции getPageHeaderCaption.

Добрый день.

 

Посмотрите в схеме карточки BasePageV2 (пакет NUI) реализацию функции getPageHeaderCaption.

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

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

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

https://community.terrasoft.ru/questions/izmenenie-soderzimogo-label - в этом решении не особо понятно, как это сделать.

Спасибо!

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

Нравится

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

возможно кому-то будет полезно

define("UsrVisualModule", [],
    function () {
        var btnCount = 0;
        var lbl;
        var btn;
        var lblCaptionText = "Количество нажатий: " + btnCount;
        return {
            diff: /**SCHEMA_DIFF*/[
            {
                  //...
                  //...
            }
            ]/**SCHEMA_DIFF*/,
 
            config:{},
            myView:{},
            viewModel:{},
            init: function () {
                this.initViewModel();
            },
 
            initViewModel: function () {
 
                this.viewModel = Ext.create("Terrasoft.BaseViewModel", {
                    values: {
                         lblCaption: lblCaptionText,
                         btnCaption: "Нажми"
                    },
                    methods: {
                        onBtnClick: function () {
                            btnCount++;
                            //window.alert("Кнопка была нажата! btnCount = " + btnCount);
                            lblCaptionText = "Количество нажатий: " + btnCount;
                            this.set("lblCaption", lblCaptionText);
                            return this.myView;
                        }
                    },
                });
            },
            render: function (renderTo) {
                lbl = Ext.create("Terrasoft.Label", {
                caption:
                    {
                        bindTo: "lblCaption"
                    },
                });
 
                btn = Ext.create("Terrasoft.Button", {
                id: "click-btn",
                className: "Terrasoft.Button",
                caption:
                    {
                        bindTo: "btnCaption"
                    },
                style: Terrasoft.controls.ButtonEnums.style.RED,
                click: {
                    bindTo: "onBtnClick"
                },
                });
 
                this.myView = Ext.create("Terrasoft.Container", {
                    id: "myContainer",
                    items: [lbl, btn],
                    renderTo: renderTo
                });
 
                this.myView.bind(this.viewModel);
                return this.myView;
            },
            destroy: function () {
                this.myView.destroy();
                this.viewModel.destroy();
            }
        };
    });

 

Евгений, а что именно не заработало при таком способе? Можете показать код?

 

Похожий подход используется, например, в CommentsWithFilesModulesHelper:

items: [
	{
		id: 'comments-button-' + UId,
		selectors: {
			wrapEl: '#comments-button-' + UId
		},
		className: 'Terrasoft.Button',
		style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
		iconAlign: Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		imageConfig: {
			bindTo: 'getCommentsIconConfig'
		},
		tag: UId,
		caption: {
			bindTo: 'CommentsCountCaption'
		},
		click: {
			bindTo: 'onCommentViewChanged'
		}
	},

И заполнение этого атрибута результатом выборки:

setCommentsCount: function(needSelect, recordId) {
	var commentsCount = this.get('CommentsCount');
	if (!commentsCount || needSelect) {
		var select = this.getCommentSelect.call(this, recordId);
		select.getEntityCollection(this.setCommentsCountValue, this);
	}
},
setCommentsCountValue: function(response) {
	if (!this.isInstance) {
		return;
	}
	var count = 0;
	if ((response.success && response.collection &&
		response.collection.collection.items.length > 0)) {
		count = response.collection.collection.items[0].get('KnowledgeBaseCount');
	} else if (response.rowsAffected > 0) {
		count = response.rows[0].KnowledgeBaseCount;
	}
	this.set('CommentsCount', count);
	var commentCaption = '';
	if (count > 0) {
		commentCaption = count;
	}
	this.set('CommentsCountCaption', commentCaption);
},

Либо есть более низкоуровневый подход, где вместо атрибута к элементу подвязывают сразу функцию в свойство changeMethod, как описано тут. Для Caption его применяют в ContentBuilderElement:

/**
 * Setter for this.caption property.
 * @protected
 * @param {String} value New value.
 */
setCaption: function(value) {
	if (this.caption === value) {
return;
	}
	this.caption = value;
	if (this.rendered) {
this.reRender();
	}
},
...
caption: {
	changeMethod: "setCaption"
},

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

 

А изначальный способ ещё используют в PageDesignerUtilities для headerCaption:

headerContainer.add([{
	className: "Terrasoft.Label",
	id: "caption-label",
	selectors: {wrapEl: "#caption-label"},
	caption: {bindTo: "headerCaption"}
}, {
...
headerCaption: {
	type: Terrasoft.ViewModelColumnType.ATTRIBUTE,
	dataValueType: Terrasoft.DataValueType.TEXT
},
...
if (!config.isNew) {
	setViewModelValues(config, viewModel);
	viewModel.set("headerCaption", localizableStrings.Column);
} else {
...
	viewModel.set("headerCaption", localizableStrings.NewColumnWindowHeaderCaption);
}

 

возможно кому-то будет полезно

define("UsrVisualModule", [],
    function () {
        var btnCount = 0;
        var lbl;
        var btn;
        var lblCaptionText = "Количество нажатий: " + btnCount;
        return {
            diff: /**SCHEMA_DIFF*/[
            {
                  //...
                  //...
            }
            ]/**SCHEMA_DIFF*/,
 
            config:{},
            myView:{},
            viewModel:{},
            init: function () {
                this.initViewModel();
            },
 
            initViewModel: function () {
 
                this.viewModel = Ext.create("Terrasoft.BaseViewModel", {
                    values: {
                         lblCaption: lblCaptionText,
                         btnCaption: "Нажми"
                    },
                    methods: {
                        onBtnClick: function () {
                            btnCount++;
                            //window.alert("Кнопка была нажата! btnCount = " + btnCount);
                            lblCaptionText = "Количество нажатий: " + btnCount;
                            this.set("lblCaption", lblCaptionText);
                            return this.myView;
                        }
                    },
                });
            },
            render: function (renderTo) {
                lbl = Ext.create("Terrasoft.Label", {
                caption:
                    {
                        bindTo: "lblCaption"
                    },
                });
 
                btn = Ext.create("Terrasoft.Button", {
                id: "click-btn",
                className: "Terrasoft.Button",
                caption:
                    {
                        bindTo: "btnCaption"
                    },
                style: Terrasoft.controls.ButtonEnums.style.RED,
                click: {
                    bindTo: "onBtnClick"
                },
                });
 
                this.myView = Ext.create("Terrasoft.Container", {
                    id: "myContainer",
                    items: [lbl, btn],
                    renderTo: renderTo
                });
 
                this.myView.bind(this.viewModel);
                return this.myView;
            },
            destroy: function () {
                this.myView.destroy();
                this.viewModel.destroy();
            }
        };
    });

 

Показать все комментарии
Допустим установили для поля с типом чекбокс свойство "enabled": false. В таком случае клик по названию поля всё-равно позволяет установить/снять чекбокс. А вот клик по самому "квадратику" чекбокса ни к чему не приводит.Думаю будет лучше убрать возможность клика по label. BPMOnline 7.4
4 комментария

Вот все молчат, а я бы это на поддержку отправил как БАГ серьезный в интерфейсе :cry:
Чекбокс серый, а менять значение можно кликом по тексту с заголовком, красота же!

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

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

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

Данная ошибка была устранена в последних версиях 7.5. Поэтому для решения данной проблемы необходимо выполнить обновление.

А для 7.4.1 что-нибудь предложите в качестве решения? Может в коде что нехитрое прописать

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

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

Возникло затруднение - на Label в некотором окне нужно вывести заранее сформированный текст типа списка, само собой определенным образом разбитый на строчки. Подскажите, как бы это сделать?

Попытка добавить "\r\n" не помогла;
System.Environment.NewLine не помогает;
"\n" не помогает.

Как вариант буду рад совету как реализовать перенос строк в MemoEdit...

Нравится

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

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

К сожалению свойства WordWrap для UI элемента Label не предусмотрено, в результате поместить многострочный текст в этот компонент невозможно.

Для MemoEdit же, если для компонента установлено свойство WordWrap, служебные символы перевода строки работают:

Page.MemoEdit1.Value = "this \r\n is \r\n multiline \r\n text. "; 

С лэйблом грустно... :sad:

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

var MessageText = "this \r\n is \r\n multiline \r\n text. ";
UserTask1.PageUId = new Guid("{c527453b-2c64-40dc-bd4d-48b43be79c54}");
var TaskPageParameters = new Dictionary<string,string>();
TaskPageParameters.Add("MessageText", MessageText);
UserTask1.PageParameters = TaskPageParameters;

На окне в PageLoadComplete для MemoEdit.Value назначаю значение параметра

string queryString = Page.Request.QueryString.ToString();
if (queryString.Contains("MessageText")) {
	Page.MessageEdit.Value = Page.Request.QueryString["MessageText"].ToString();
}

С таким текстом в MessageText окно не поднимается вообще... понятно почему - не проходит в QueryString символы \r\n

Соответственно переформулируем проблему - можно ли как то для поднимаемого действием окна все это передать другим способом?
Дежурный вариант - вместо разрывов строк ставить символы и уже на окне парсить и разбивать на строки, помещать в мемо. Может быть есть метод поизящнее?

Александр, а если попробовать так?

var MessageText = @"this \r\n is \r\n multiline \r\n text. ";

Александр, попробуйте

HttpUtility.UrlEncode(MessageText)

"Олейник Дмитрий" написал:

Александр, а если попробовать так?

var MessageText = @"this \r\n is \r\n multiline \r\n text. ";


Получилось, спасибо!

"Раловец Ольга" написал:

Александр, попробуйте

HttpUtility.UrlEncode(MessageText)


Выдает "The name HttpUtility doesnt exist in the current context"

Чтобы два раза не вставать:smile: спрошу в этой же теме у гуру BPM

Есть строка со списком Id (разделенных точкой с запятой, например)

string selectedIds = "deb710e4-f36b-1410-e886-00155d010cbf;7eb620fa-f36b-1410-ea86-00155d010cbf";

Нужно в запрос вида

var SomeSelect = new Select(Page.UserConnection)
	.Column("SomeTable", "SomeField")
	.From("SomeTable")
	.Where("SomeTable", "Id").IsEqual(Column.Parameter(selectedIdsParameter))
	as Select;

подставить этот набор значений Id в selectedIdsParameter... туда же не просто строка selectedIds должна передаваться? И уместен ли здесь IsEqual?

"Александр Кудряшов" написал:Выдает "The name HttpUtility doesnt exist in the current context"

using System.Web.
Это еще может пригодиться особенно, если захотите в QueryString какой-то ReturnUrl поместить.

"Александр Кудряшов" написал:Нужно в запрос вида
var SomeSelect = new Select(Page.UserConnection)
        .Column("SomeTable", "SomeField")
        .From("SomeTable")
        .Where("SomeTable", "Id").IsEqual(Column.Parameter(selectedIdsParameter))
        as Select;
подставить этот набор значений Id в selectedIdsParameter... туда же не просто строка selectedIds должна передаваться? И уместен ли здесь IsEqual?

вместо IsEqual подойдет In(), в который можно передавать массив Column.Parameter

 .Where("SomeTable", "Id").In(Column.Parameter(selectedIds))

такой вариант не вызывает ругательств при компиляции, но фильтруется только по первому Id из списка (как будто IsEqual)

Вы в In передали один экземпляр Column.Parameter, в который передали массив значений, а нужно в In передать массив Column.Parameter, в каждый из которых передать по одному значению из selectedIds

Сломал мозг, пытаясь передать массив из Column.Parameter:cry:

QueryColumnExpression[] ArrayParam = new QueryColumnExpression[selectedNodes.Count];
for(int i = 0; i< selectedNodes.Count; i++){
    ArrayParam[ i ] = Column.Parameter(selectedNodes[i].Values["Id"].ToString());
}

[update] заработало! Именно таким образом, ошибка была у меня в другом куске кода. В фильтр In успешно передается массив параметров.

Для In нашла только один пример, через константы.

var select = new Select(userConnection)
				.Column("Name")
				.From("Country")
				.Where("Name").In(Column.Const("TestValue1"), Column.Const("TestValue2"));

может не в тему, можно как-то вставить подзапрос в колонку, вернее как подзапрос вставить понятно, а вот как использовать колонку основного запроса в виде параметра непонятно

Select headContactSelect = new Select(UserConnection)
                        .Column("DivisionGroups", "Id")
			.Column(new Select(UserConnection).Top(1)
							.Column("AUC", "ContactId")
						.From("SysUserInRole").As("UIR")
						.InnerJoin("SysAdminUnit").As("AUC")
							.On("AUC", "Id").IsEqual("UIR", "SysUserId")
						.Where("UIR", "SysRoleId").IsEqual('<<Column>>'))
				.As("HeadContactId")
		.From(hDivisionsExpression).As("DivisionGroups")
		.Where("DivisionGroups", "SysAdminUnitTypeValue").IsEqual(Column.Parameter(2))
			.And("DivisionGroups", "Level").IsEqual(Column.Parameter(2)) as Select;

Хочу вместо этого '<>' использовать Column("DivisionGroups", "Id")?

Александр, посмотрите здесь, может найдете решение Вашей задачи.

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

Доюрый день! Подскажите пожалуйста возможно ли текст в контроле Label в карточки редактирования сделать определённого цвета(например красным) и жирным? Заранее спасибо!

Нравится

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

Добрый день, Сергей!

Для всех компонентов окна, имеющих заголовки (в т.ч. для меток Label), доступно свойство CaptionColor (тип целое число), которое регулирует цвет заголовка. Тип шрифта, жирность и курсив установить пока нельзя.
Пожелания по необходимым улучшениям и функциональности компонентов приветствуются.
Желаю успехов!

Оно доступно только в рантайме, а есть какой-то спооб добавить его в инспектор?

Добавить Property в инспектор можно, однако в итоге будет доступно целочисленное свойство, в котором необходимо указать десятичное значение цвета.
На всякий случай опишу процесс добавления свойства в инспектор:
1. Открываем файл WindowSettings.xml.
2. Находим ветку, начинающуюся строкой: Item Type="ComponentType" Code="Label"
3. В списке Properties добавляем новый элемент:

Item Name="CaptionColor" Group="Design" Description="CaptionColor"

(строку нужно указать в тэгах, см. существующие примеры)
4. Сохраняем файл и перезапускаем Администратор.
5. Наблюдаем в инспекторе объектов для компонента Label новое свойство.

Аналогично можно реализовать добавление этого свойства для других компонентов, содержащих заголовок (все DataControls).

Желаю успехов!

Спасибо, разобрался. Но, похоже, редактор съел кусок второго и третий пункт :)

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

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