Добрый день!

 

Есть задача по реализации кнопки-меню с динамическим списком. Нужно создать кнопку по типу Actions или Print.

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

attributes: {
	"ButtonMenu": {dataValueType: this.Terrasoft.DataValueType.COLLECTION},
},
methods: {
	init: function() {
		this.callParent(arguments);
		this.initMenuItems();
	},
initMenuItems:function(){
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "MyList"
	});
	esq.addColumn("Caption");
	esq.filters.add("Section", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Section.Id", "f7856ad3-fa4c-4106-9a6c-d8dcd87331eb"));
	esq.execute(function (response) {
	        if (!response.success) {
		       return;
	        }
	        var actionMenuItems = Ext.create("Terrasoft.BaseViewModelCollection");
		response.collection.each(function(item) {
 
			var isVisible = this.getVisibility(item.get("Caption"));
			actionMenuItems.addItem(this.getButtonMenuItem({
				"Caption": item.get("Caption"),
				"Click": {bindTo: "callMyProcess"},
				"Enabled": isVisible
			}));
		},this);
		this.set("ButtonMenu", actionMenuItems);
	},this);			
}
},
		diff: /**SCHEMA_DIFF*/[
			{
                "operation": "insert",
                "parentName": "LeftContainer",
                "propertyName": "items",
                "name":"MenuButton",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                    "caption": "Test",
                    "menu": {
                        "items": {"bindTo": "ButtonMenu"}
                    }
                }
            }
		]/**SCHEMA_DIFF*/

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

 

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

 

Что сделано не правильно?

Подскажите, пожалуйста, как решить данную задачу.

 

Заранее спасибо.

Нравится

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

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

 

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

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

 

 

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

 

 

Доброго времени суток коллеги. Я столкнулся с проблемой у меня есть функция:
 

 calculateBalance: function() {
                var amount = this.get("UsrBudgetSales");
                if (!amount) {
                    amount = 0;
                }
                var paymentAmount = this.get("UsrFacticallySum");
                if (!paymentAmount) {
                    paymentAmount = 0;
                }
                var result = amount - paymentAmount;
                this.set("UsrEqualsBudget", result);
 
            }

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

Не могу сделать проверку тут,

	onPageClick: function(SetHelloAttribute, calculateBalance) {
                // if(какая-то проверка) {
                    this.calculateBalance();
               // }
 

Как я понял свойство set сразу же устанавливает значение в поле. А в methodName она вызывается? 

  dependencies: [
                    {
                        columns: ["UsrBudgetSales", "UsrFacticallySum"],
                        methodName: "calculateBalance"
                    }

Буду благодарен разъяснение. Так как недавно начал изучать Creatio, мог ошибиться в общей логике. Спасибо

Нравится

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

Добрый вечер.

 

В dependencies в свойстве columns указываются поля, при изменении которых вызывается метод, описанный в methodName.

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

 

Таким образом для того, чтобы функция вызывалась только по нажатию кнопки Вам нужно полностью закомментировать блок dependencies и вызывать функцию только в обработчике нажатия кнопки [Вычислить].

Добрый вечер.

 

В dependencies в свойстве columns указываются поля, при изменении которых вызывается метод, описанный в methodName.

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

 

Таким образом для того, чтобы функция вызывалась только по нажатию кнопки Вам нужно полностью закомментировать блок dependencies и вызывать функцию только в обработчике нажатия кнопки [Вычислить].

Алла Савельева, Все сработало. Благодарю

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

Приветы, есть аттрибуты

attributes: {
            "IsButtonVisible": {
                "dataValueType": Terrasoft.DataValueType.BOOLEAN,
                "value": false
            },
            "ButtonCaption": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "value": "Test"
            }
        },

{
            "operation": "insert",
            "name": "bnBackCall",
            "parentName": "DataGrid",
            "propertyName": "activeRowActions",
            "index": 111,
            "values": {
                "className": "Terrasoft.Button",
                "style": Terrasoft.controls.ButtonEnums.style.GREY,
                "caption": "Позвонить",
                //"caption": { "bindTo": "ButtonCaption" },
                "tag": "tagBnBackCall"
            }
        },
                {
                    "operation": "merge",
                    "name": "DataGridActiveRowOpenAction", 
                    "values": {
                        "visible": { "bindTo": "IsButtonVisible" }
                    }
                },
        {
            "operation": "merge",
            "name": "DataGridActiveRowCopyAction", 
            "values": {
                //"visible": { "bindTo": "IsButtonVisible" }
                "caption": { "bindTo": "ButtonCaption" },
                //"caption": "12345",
            }
        },

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

Аттрибут IsButtonVisible биндится все ок к той же кнопке

Какое волшебство с caption как его менять у кнопки в rowSelected например, если атрибут не биндится

Нравится

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

Эм. А ресурсы вам чем не угодили? Caption-ы лучше через них задавать.

Варфоломеев Данила,

У меня на кнопке должно выводится "Позвонить (номерЗвонка)" тут нет смысла в ресурсах тк динамический каптион в чистом виде. Сейчас зашито вот такое: 

rowSelected: function (Id) {
                this.logStep('rowSelected(' + Id + ') started!');
                this.readCallCount(Id);
                this.sleep(500);
                var itemId = '#SxCandidateSectionDataGridGrid-actions-item-' + Id;
                var jsRow = this.Ext.select(itemId);
                jsRow.elements[0].lastElementChild.previousElementSibling.innerText = this.getButtonCaption();
                //jsRow.select('span').item(6).dom.innerHTML = this.getButtonCaption();
                this.logStep('rowSelected(' + Id + ') finished!');
                //bn.setText(this.getButtonCaption());
                //bn.text = this.getButtonCaption();
                
            },

Как сделать нормально через атрибуты платформы или еще что-то из платформы?

QArt пишет:
Как сделать нормально

 Добавить в ресурсы 2 строчки. TemplateFormatString - "Позвонить {0}" и CallButtonCaption - ""

забиндить caption кнопки

"caption": {bindTo: "Resources.Strings.CallButtonCaption"}

И в любом месте в коде
 

var number = /*номер телефона*/;
this.set("Resources.Strings.CallButtonCaption", 
     Ext.String.format(this.get("Resources.Strings.TemplateFormatString"), number));

 

Варфоломеев Данила пишет:

QArt пишет:
Как сделать нормально

 Добавить в ресурсы 2 строчки. TemplateFormatString - "Позвонить {0}" и CallButtonCaption - ""

забиндить caption кнопки

<span><span>"caption"</span></span><span>:</span> <span>{</span>bindTo<span>:</span> <span><span>"Resources.Strings.CallButtonCaption"</span></span><span>}</span>

И в любом месте в коде
 


 
var number = /*номер телефона*/;
this.set("Resources.Strings.CallButtonCaption", 
     Ext.String.format(this.get("Resources.Strings.TemplateFormatString"), number));

Спасибо, буду пробовать.

Менять ресурс - норм практика - ок. В c# так не делал, надо будет попробовать :) Но тут не c#. 

Можете подсказать как определить является ли текущий юзар админом? Версия 7.11 онлайн сэйлз энтерпрайз

Попробовал следовать вашему совету, кнопка пропала (как и в случае с обычным атрибутом типа ТЕКСТ), не знаю что делаю не так. Но вот что написано:

Что делаю не так??? (Версия 7.11 онлайн сэйлз энтерпрайз) Заранее спасибо!

В консоли и БД вижу что все значения верные, вот только кнопки нет ((

{
            "operation": "insert",
            "name": "bnBackCall",
            "parentName": "DataGrid",
            "propertyName": "activeRowActions",
            "index": 111,
            "values": {
                "className": "Terrasoft.Button",
                "style": Terrasoft.controls.ButtonEnums.style.GREY,
                //"caption": "Позвонить",
                "caption": {bindTo: "Resources.Strings.rButtonCallCaption"},
                //"caption": { "bindTo": "ButtonCaption" },
                "tag": "tagBnBackCall"
            }
        },

 getButtonCaption: function()
            {
                var result = this.get("Resources.Strings.rButtonCallCaption");
                this.logStep('getButtonCaption = ' + result);
                return result;
            },
            
            setButtonCaption: function(callCount)
            {
                this.logStep('setButtonCaption(' + callCount + ') started!');
                var caption = 'Позвонить';
                if (callCount > 0)
                    caption += ' (' + callCount + ')';
                //this.set("ButtonCaption", caption);
                //this.logStep('setButtonCaption(' + callCount + ')');
                //this.logStep('getButtonCaption() = ' + this.getButtonCaption());
                this.set("Resources.Strings.rButtonCallCaption", caption);
                this.logStep('setButtonCaption has finished!');
            },

QArt,

у вас точно название в ресурсах такое как вы указываете 

http://prntscr.com/ilfjl6 ?

Попробуйте сделать как в примере http://prntscr.com/ilflfw

Demchenko Olha,

Спасибо за ответы, регистр точно совпадает и посимвольно тоже. Вроде js и c# регистрочувствительны и все такое. Может это в 7.11 версии кнопки мутировали :) Многое меняется, мне ребята скидывали функцию по определению админ текущий пользователь или нет, но у них более ранние версии и у меня таких столбцов в бд просто нет, хотя таблица с таким именем есть. Может подобную функцию добавят в число стандартных? Или вынесут массив ролей текущего пользователя на клиента, гуид же доступен. Еще пожелание делать синхронные запросы, не только асинхронные (чтобы можно было указать). Есть норм книга? Еще раз спасибо, хороших выходных.

QArt,

Есть стандартные константы в схеме ConfigurationConstants и там присутствует id сисадминов - http://prntscr.com/im7k0g

Получить id сисадмина можно так: ConfigurationConstants.SysAdminUnit.Id.SysAdministrators

Остаётся получить id текущего пользователя, например this.Terrasoft.SysValue.CURRENT_USER.value, и определить его роли из таблици SysUserInRole.

Потом проверить есть ли среди полученных ролей роль сисадмина. Пример работы с SysUserInRole из коробки - http://prntscr.com/im7y7o

Все примеры по версии 7.11

Спасибо! Еще бы книгу нормальную, как настроить WebStorm чтобы он подтянул платформу? А то от него пользы, если править замещенный клиентский модуль только как от "модного блокнота". Заранее спасибо.

QArt,

В WebStorm вы можете работать со всеми js файлами посли их выгрузки. При этом должны подтягиваться все переменные\методы и т.д. А если вы скачиваете отдельно файл и открываете его, то конечно это будет как "блокнот".

Demchenko Olha,

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

https://prnt.sc/im7y7o к слову. Как выгрузить все файлы для нормальной разработки в WebStorm??? (взять из папки сайта на сервере)

У нас erp enterprise 7.11 on site install.

Что делаю не так?? Можно алгоритм для начала нормальной разработки?? бОльшое спасибо, заранее!

QArt,

По всем схемам вы можете искать и в браузере - 

http://prntscr.com/in5nri

Касательно начала разработки, можете ознакомиться со статьей - https://academy.terrasoft.ru/documents/technic-sdk/7-11/rabota-s-klient…

Demchenko Olha,

Спасибо, но искать по всем сборкам пробовал (ctrl+shift+f) у нас не нашлось. Вот скрин - https://prnt.sc/in6qd6 

Работать из файловой системы буду пробовать уже завтра, спасибо!

 

QArt,

Откройте панель уведомлений и попробойте ещё раз. Ну или откройте схему CtiPanel в конфигурации и посмотрите там код.

Demchenko Olha,

Спасибо, пробовал искать ctiPanel в веб интерфейсе и открывал все схемы, которые нашла платформа и нигде нет - это было вчера. Сегодня начал пробовать "работать из файловой системы" и получил https://prnt.sc/inl1yd - это после правки web.config согласно - https://academy.terrasoft.ru/documents/technic-sdk/7-11/razrabotka-v-fa… права на папку IIS юзарам дали - полный доступ. Что я не так делаю?

QArt,

Напишите в поддержку по этому поводу.

Demchenko Olha,

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

QArt,

Напишите на support@bpmonline.com, опишите проблему и приложите скрины.

Demchenko Olha,

Спасибо! С праздником - 

https://www.graziosgeles.lt/wp-content/uploads/2016/10/raudona-puokste… 

QArt, воспроизведите ошибку еще раз, после направьте в поддержку полные логи приложения. Сохраняются они на веб-сервере по пути C:\Windows\Temp\BPMonline\Site_ID

QArt пишет:

Demchenko Olha,

Спасибо, пробовал искать ctiPanel в веб интерфейсе и открывал все схемы, которые нашла платформа и нигде нет - это было вчера. Сегодня начал пробовать "работать из файловой системы" и получил https://prnt.sc/inl1yd - это после правки web.config согласно - https://academy.terrasoft.ru/documents/technic-sdk/7-11/razrabotka-v-fa… права на папку IIS юзарам дали - полный доступ. Что я не так делаю?

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

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

Подскажите , кто знает, вот есть кнопка в верхнем правом углу , на любой странице, кнопка профиля, при нажатие на неё открывается меню , как в это меню добавить свою запись\кнопку ?

Нравится

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

Замещаете MainHeaderSchema и переопределяете loadProfileButtonMenu и вставляете необходимые код, который будет вызывать пользовательский метод

Спасибо большое, это именно тот модуль. Но что-то пошло не так ...

http://pixs.ru/showimage/Bezimyanni_3822167_22664458.png

Пропал в целом хедер страницы, и кнопки профиля. Я создал замещающую страницу, скопировал код который был, вставил, и изменил этот метод, просто добавил кнопку ещё одну, и метод для неё, который открывал бы страницу редактирования. И вот так получилось.

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

"Заставный Роман" написал: Я создал замещающую страницу, скопировал код который был...

Т.е. вы вставили код из родительской схемы?

Да. Но пропали картинки, а не дублируются функции

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

define("MainHeaderSchema", [], function() {
	return {
		methods: {
			// обработчик нажатия на новый пункт меню
			myClickMethod: function() {
				window.console.log("работает");
			},
			//перегрузка родительского метода
			loadProfileButtonMenu: function() {
				//вызов родительского метода
				this.callParent();
				//пользовательская реализация
				var profileMenuCollection = this.get("ProfileMenuCollection");
				//сепаратор
				profileMenuCollection.addItem(this.Ext.create("Terrasoft.BaseViewModel", {
					values: {
						Type: "Terrasoft.MenuSeparator",
						Caption: ""
					}
				}));
				//новый пункт меню
				//используются существующие картинки и строки
				profileMenuCollection.addItem(this.Ext.create("Terrasoft.BaseViewModel", {
					values: {
						Caption: this.get("Resources.Strings.ProfileMenuItemCaption"),
						Click: {
							bindTo: "myClickMethod"
						},
						MarkerValue: this.get("Resources.Strings.ProfileMenuItemCaption"),
						ImageConfig: this.get("Resources.Images.ContactEmptyPhoto")
					}
				}));
			}
		}
	};
});

После сохранения схемы и обновления страницы приложения полцчится так, как на прикрепленной картинке

"Симута Роман Русланович" написал:

Т.е. вы вставили код из родительской схемы?


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

Пожалуйста :)

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

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

На даний момент бачу два варіанти вирішення задачі:
1) Створити динамічну підгрупу "Новые". Для цієї підгрупи в позиції назви динамічно показувати кількість нових звернень;
2) На головній сторінці добавити кнопку за прикладом кнопки вхідних email-ів і зав"язати на ній схожий функціонал, тільки не для email-ів, а для нових пов"язаних звернень.

Який з цих варіантів є більш прийнятним ?
Можливо знайдуться ще якісь варіанти ?

Нравится

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

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

Почав з варіанту (2).
Відразу зіткнувся з необхідністю розмістити зображення на кнопці.
Вибрав png-файл 16x16 (в інших розмірах відображається лише лівий верхній сегмент від зображення), підтягнув його на кнопку і тепер маю наступне:
- коли кнопка активна (Включить [x]), то на кнопці проявляється зображення з файлу;
- коли кнопка неактивна, то на кнопці пусто - тільки жовтий фон.

І як це лікувати ?

"Котенко Александр" написал:настроить соответствующую динамическую группу с просмотром количества записей в строке итогов

Цей варіант не зовсім підходить, бо він передбачає необхідність зайти в групу.
Замовник хоче, щоб на групу не треба було заходити, але щоб кількість нових пов"язаних звернень відображалася десь безпосередньо перед очима, - це і має спонукати замовника зайти на групу для роботи з цими зверненнями.

Варіант (1) в моєму викладі передбачає постійне оновлення кількості звернень в позиції назви групи, а не в ітогах.

"Ігор Андрусенко" написал:
- коли кнопка активна (Включить [x]), то на кнопці проявляється зображення з файлу;
- коли кнопка неактивна, то на кнопці пусто - тільки жовтий фон.

А если поместить кнопку в групу контролов и включать-выключать активность у группы, то такое же поведение?

Я її розмістив поміж кнопками
UnreadEmailCountButton і NewRemindingsCountButton
в групі NavigationButtonsControlLayout.
Включенні-виключення групи дає той же самий ефект.

Я так розумію, що є якийсь секрет в "приготуванні" файлу-зображення для кнопки, який заствляє зображення вести себе правильно, бо параметри самої кнопки співпадають з аналогічними параметрами "правильних" кнопок.

Да, сss стили :)
Заходите в консоль, далее на кнопку с лупой ("обзор элементов"), тыкайте на вашу кнопку, и посмотрите что там за стили применяются в момент нажатия. Вполне возможно, что position -161px какой нибудь устанавливается.
Там можно сразу и подредактировать и проверить эффект. Когда добьетесь своего, запоминаете название Ccs класса (вроде .base-text-edit .on-hover) который вы редактировали, созадете свой модуль, во вкладку less копируете исправленный класс, и подключаете его в define страницы: "имяМодуля!css".

А и да, еще в Diff потом в кнопку в свойство "controlConfig" нужно добавить "classes".
Я так делал, когда нужно было поменять поведения правой кнопки в текстовом контроле:

controlConfig: {
 
				"classes": ["lookup-edit-right-icon-custom"],
 
			}

Це в дизайнері сторінки ?

css подключается в дизайнере страницы, да. А создается в элементе с типом "модуль" во вкладке LESS.

но не спешите, сначала отладьте все в консоли:

Ох, простите, мои рекомендации относительно 7.х. У вас, я так понимаю, 5.х.... Тогда, к сожалению, тут вам не помогу :(

З файлу SolutionResources.xml витягнув зображення для кнопки непрочитаних email-ів (UnreadEmailCountButton) в коді Base64.
Розкодував код у файл image.png
Виявилось, таки правда, - хитро приготований файл для іконки.
По його прикладу приготував свій файл для нових пов'язаних звернень 16x64.
Ось така організація:

Игорь, с таким форматом файла кнопка заработала как надо?

На сторінці [MainPage] створив нову кнопку [NewServiceRequestLinkedButton].
Добавив лічильник нових пов'язаних звернень в SQL-функцію [fn_GetContactCounters],
в [MainPageEventsProcessSchema].[PageLoadCompleteScriptTask] добавив код обробки для новоствореної кнопки у змінній [remindingTimerScript]:

PageContainer_NewServiceRequestLinkedButton.
	setEnabled(userCounters.newIncidentsLinkedCount > 0);
PageContainer_NewServiceRequestLinkedButton.
	setCaption(userCounters.newIncidentsLinkedCount.toString());
if (userCounters.newIncidentsLinkedCount && userCounters.newIncidentsLinkedCount > 0) { 
	PageContainer_NewServiceRequestLinkedButton.setButtonStyle('yellow');
} else {
	PageContainer_NewServiceRequestLinkedButton.setButtonStyle('blue');											   
}

На даний момент маю ось такий результат:
Якщо є нові пов'язані звернення:

І якщо немає:

То есть решение было и в правильной картинке, и в выставлении Enabled, и в выставлении стиля?

Тепер ще треба до кнопки прив'язати функціонал переходу в розділ [Обращения] і забезпечити, щоб активною ставала динамічна група.

"Зверев Александр" написал:То есть решение было и в правильной картинке, и в выставлении Enabled, и в выставлении стиля?

Так. Без правильної картинки при відсутності потрібних звернень картинка взагалі не відображалася.
При чому зображення не відображалося вже в самому дизайнері.

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

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