Вопрос

Кнопка Редактировать, как скрыть для пользователей портала?

Ответ

setIsEditTemplateButtonVisible: function(scope) {
var select = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "SysAdminUnit"
});
 
select.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "Id");
select.addColumn("ConnectionType");
 
var filters = Ext.create("Terrasoft.FilterGroup");
filters.addItem(select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id",
    scope.Terrasoft.SysValue.CURRENT_USER.value));
select.filters = filters;
 
select.execute(function(response) {
    if (response.success) {
        if (response.collection.getCount() > 0) {
            var connectionType = response.collection.getByIndex(0).get("ConnectionType");
            if(connectionType === 1){
                scope.set("isEditTemplateButtonVisible", false);
            }else{
                scope.set("isEditTemplateButtonVisible", true);
            }
        }
    }
}, this);

 

Нравится

Поделиться

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

Вопрос

При создании Листинга возникает сообщение с запросом адреса.

Ответ

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

Нравится

Поделиться

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

Вопрос

После создания web service ошибка при входе в конфигурацию: "An item with the same key has already been added"

Ответ

Возникает по причине того что пользователь мог создать несколько схем исходного кода с одинаковыми namespace.

Необходимо удалить схемы добавленных сервисов из SysSchema после чего заставить приложение быть перекомпилированным обнулив:

update SysWorkspace set AssemblyData = null

 

Нравится

Поделиться

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

Вопрос

Как скрыть кнопки "Добавить" для некоторых типов раздела?

Ответ

Создать замещающую схему раздела:

define("DocumentSectionV2", ["VisaHelper", "ConfigurationConstants", "BaseFiltersGenerateModule"],
    function(VisaHelper, ConfigurationConstants, BaseFiltersGenerateModule) {
        return {
            entitySchemaName: "Document",
            methods: {
                initEditPages: function() {
                    var enabledEditPages = new this.Terrasoft.Collection();
                    this.callParent(arguments);
                    var editPages = this.get("EditPages");
                    var items = editPages.getItems();
                    for (var i = 0; i < items.length; i++) {
                        if (items[i].values.Id !== "2015b538-40d0-4cbf-9301-fa8cae37ae94") {
                            enabledEditPages.add(items[i]);
                        }
                    }
                    this.set("EnabledEditPages", enabledEditPages);
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "SeparateModeAddRecordButton",
                    "parentName": "SeparateModeActionButtonsLeftContainer",
                    "propertyName": "items",
                    "values": {
                        "controlConfig": {
                            "menu": {
                                "items": {
                                    "bindTo": "EnabledEditPages",
                                    "bindConfig": {
                                        "converter": function(editPages) {
                                            if (editPages.getCount() > 1) {
                                                return editPages;
                                            } else {
                                                return null;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                {
                    "operation": "merge",
                    "name": "CombinedModeAddRecordButton",
                    "parentName": "CombinedModeActionButtonsSectionContainer",
                    "propertyName": "items",
                    "values": {
                        "controlConfig": {
                            "menu": {
                                "items": {
                                    "bindTo": "EnabledEditPages",
                                    "bindConfig": {
                                        "converter": function(editPages) {
                                            if (editPages.getCount() > 1) {
                                                return editPages;
                                            } else {
                                                return null;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

 

Нравится

Поделиться

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

Вопрос

Существует ли возможность редактировать длину заголовка поля на странице, а то то как выглядит моя группа полей (см. прилож. скриншот) не совсем удобочитаемо. И если существует, то прошу подсказать как это реализовать.

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

Ответ

Изменить ширину расположение заголовка можно, как вариант, с помощью кода.

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

Примерный алгоритм (на примере колонки с типом «Строка»):

- создать свой модуль(пример модуля CommonCSSV2);

- во вкладке LESS прописать свои CSS (для понимания какие параметры стиля Вам необходимо использовать поможет, например, вкладка Elements в консоли браузера, т.е. отладка приложения). Стоит учесть, что необходимо будет изменять настройки самого контрола, не label;

- на странице страницы в define прописать пользовательский модуль. Например:

define("DashboardDesignerV2", ["css!DashboardDesignerV2CSS""CommonCSSV2"]

- в diff кнопки подключить пользовательский CSS класс . Например:

diff: /**SCHEMA_DIFF*/ [
    {
        "operation": "merge",
        "name": "Confirmed",
        "parentName": "Header",
        "propertyName": "items",
        "values": {
            "wrapClass": ["contact-header-container-label"],
            "layout": {
                "column": 4,
                "row": 3,
                "colSpan": 8
            }
        }
    },

 

Нравится

Поделиться

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

Вопрос

У меня проблема в загрузке изображений после добавления стандартного функционала Примечаний.

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

Ответ

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

Это можно исправить, посмотрев что реализовано в BaseModulePageV2 и воссоздать это у себя в схеме детали.

Для этого необходимо создать объект для детали, на основании Base object with notes (Base), создать мастером деталей деталь на основании этого объекта.

В конфигураторе, в схеме карточки детали добавить:



1. Зависимость от NotesUtilities для requirejs;

2. Атрибут:

attributes: {
    "NotesImagesCollection": {dataValueType:Terrasoft.DataValueType.COLLECTION}
},

3. Миксин:

mixins: {
    NotesUtilities: "Terrasoft.NotesUtilities"
},

4. Методы:

methods: {
        onNotesImagesUploadComplete: function() {
                this.hideBodyMask();
                this.updateFileDetail();
        },
        onNotesImagesUpload: function() {
                this.showBodyMask();
        },
        init: function(callback, scope) {
                this.callParent(arguments);
               this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
        }
},

5. Поле для заметок в diff:

{
        "operation": "insert",
        "parentName": "Header",
        "propertyName": "items",
        "name": "Notes",
        "bindTo": "Notes",
        "values": {
                contentType: Terrasoft.ContentType.RICH_TEXT,
                "layout" : {column: 0, row: 1, colSpan: 24},
                "controlConfig": {
                        "imageLoaded": {
                                "bindTo": "insertImagesToNotes"
                        },
                        "images": {
                                "bindTo": "NotesImagesCollection"
                        }
                }
        },
        "index": 1
}

Код тестовой схемы для страницы редактирования детали:

define("UsrUsrMyDetail1Page", ["NotesUtilities"], function() {
	return {
		entitySchemaName: "UsrMyDetail",
		details: {},
		attributes: {
			"NotesImagesCollection": {dataValueType: Terrasoft.DataValueType.COLLECTION}
		},
		mixins: {
			NotesUtilities: "Terrasoft.NotesUtilities"
		},
		diff: [{
			"operation": "insert",
			"name": "UsrIntbcb7788a-2890-4358-bff3-102e82ea7889",
			"values": {
				"layout": {
					"colSpan": 12,
					"rowSpan": 1,
					"column": 0,
					"row": 0,
					"layoutName": "Header"
				},
				"labelConfig": {},
				"enabled": true,
				"bindTo": "UsrInt"
			},
			"parentName": "Header",
			"propertyName": "items",
			"index": 0
		},
		{
			"operation": "insert",
			"parentName": "Header",
			"propertyName": "items",
			"name": "Notes",
			"bindTo": "Notes",
			"values": {
				contentType: Terrasoft.ContentType.RICH_TEXT,
				"layout" : {column: 0, row: 1, colSpan: 24},
				"controlConfig": {
					"imageLoaded": {
						"bindTo": "insertImagesToNotes"
					},
					"images": {
						"bindTo": "NotesImagesCollection"
					}
				}
			},
			"index": 1
		}],
		methods: {
			onNotesImagesUploadComplete: function() {
				this.hideBodyMask();
				this.updateFileDetail();
			},
			onNotesImagesUpload: function() {
				this.showBodyMask();
			},
			init: function(callback, scope) {
				this.callParent(arguments);
				this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
			}
		},
		rules: {}
	};
});

 

Нравится

Поделиться

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

Добрый день!

Подскажите, пожалуйста, как это сделать:

Зависимость от NotesUtilities для requirejs;

Полагаю, что в схеме детали в разделе надо добавить Dependencies надо добавить зависимость, но в поиске нет NotesUtilities. И что вообще такое requirejs?

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

Схема NotesUtilities в конфигурации есть:

А что такое requirejs, см. https://requirejs.org/

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

Спасибо! Миксин такой, действительно есть, про requirejs, к сожалению, не поняла. Это ПО, которое отдельно надо установить? Простите за глупый, наверно, вопрос, коллеги тоже не в курсе. А сделать такую деталь мне ну очень надо))

Он встроен и уже используется в системе:

В bpm'online для работы с модулями используется загрузчик RequireJS.

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

и вообще этот шаг - обязательный???

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

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

да, просто поставил в тупик этот пункт:

Зависимость от NotesUtilities для requirejs;

Вам, возможно, всё очевидно, мне непонятно, что нужно сделать.

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

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

Задача

Подключить функциональность визирования для нового раздела.

Решение

  1. Создать новый объект для детали [Визы] пользовательского раздела. Название объекта детали формируется из названия объекта раздела + Visa. Например, для раздела UsrInnerRequest название объекта UsrInnerRequestVisa. При создании объекта обязательно унаследоваться от объекта [Базовая виза], добавить поле взаимосвязи с разделом, остальные параметры настроить по примеру объекта [OrderVisa].

    Объект UsrInnerRequest должен администрироваться по записям.
  2. Подключить визирование на страницу редактирования пользовательского раздела, а именно из схемы страницы заказа [OrderPageV2] по ключевому слову Visa перенести все элементы на страницу пользовательского раздела.
  3. Подключить визирование в реестр пользовательского раздела, а именно из схемы реестра раздела Заказы [OrderSectionV2] по ключевому слову Visa перенести все элементы в схему реестра пользовательского раздела.
  4. Скопировать подпроцесс "Получение визы по заказу" и сменить параметр Заказ, вычитку данных и фильтрацию элементов с раздела [Заказ] на пользовательский объект раздела. Название подпроцесса: название раздела + VisaBaseSubprocess.
  5. Скопировать процесс "Визирование заказа" и сменить параметр Заказ, вычитку данных, фильтрацию элементов и ссылку на подпроцесс на актуальные значения. Название процесса: название раздела + VisaProcess. В процессе элементы отправки уведомлений заменить на новый элемент отправки.
  6. Добавить новую системную настройку «Процесс визирования [название пользовательского раздела]» со ссылкой на процесс из п. 5. Параметры настройки смотреть в системной настройке «Процесс визирования заказа».

Для отображения виз в коммуникационной панели необходимо дополнительно:

  1. Скопировать схему [OrderVisaNotificationProvider] и переименовать в Название раздела + VisaNotificationProvider. В схеме по ключевому слову Order заменить его на название объекта пользовательского раздела. И названия полей раздела [Заказы] заменить на названия соответствующих полей пользовательского раздела.
  2. Скриптом в таблице [Провайдер уведомлений] зарегистрировать ранее добавленную схему с типом 0 (в разделе [Справочник] не позволяет сохранить запись с типом 0):
insert into NotificationProvider (ClassName, Type)
values ('Terrasoft.Configuration.UsrInnerRequestVisaNotificationProvider','0')

 

Нравится

Поделиться

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

Вопрос

Как выполнить SQL запрос (чтение, запись, удаление) в базе данных On-demand?

Это может быть полезно если у пользователя нет доступа к базе данных,

но в рамках задачи ему необходимо прочитать или записать какие-то данные непосредственно в таблицу.

Ответ

Импортировать схему из вложения к этой статье.

Опубликовать. Запустить. Пользоваться. 

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

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

Нравится

Поделиться

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

Вопрос

Есть ли возможность создать BusinessRule, которое будет отрабатывать изменения атрибута колонки (например, обязательность) по двум колонкам? 

Ответ

Вот пример бизнес правила, которое делает поле “UsrRequired” обязательным для заполнения только в случае, если поля “UsrText0” и “UsrText1” являются не заполненными:

rules: {
    "UsrRequired": {
        BindParameterRequiredAccountByType: {
            ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
            property: BusinessRuleModule.enums.Property.REQUIRED,
            logical: Terrasoft.LogicalOperatorType.AND,
            conditions: [
                {
                    leftExpression: {
                        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        attribute: "UsrTest0",
                    },
                    comparisonType: Terrasoft.ComparisonType.EQUAL,
                    rightExpression: {
                        type: BusinessRuleModule.enums.ValueType.CONSTANT,
                        value: ""
                    }
                },
                {
                    leftExpression: {
                        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        attribute: "UsrTest1",
                    },
                    comparisonType: Terrasoft.ComparisonType.EQUAL,
                    rightExpression: {
                        type: BusinessRuleModule.enums.ValueType.CONSTANT,
                        value: ""
                    }
                }
            ]
        }
    }
},

 

Нравится

Поделиться

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

Вопрос

Как можно создать ComboBox и заполнить его программно значениями...

Ответ

Пример кода:

define("CasePage", ["CasePageResources", "terrasoft"],
    function(resources, Terrasoft) {
    return {
        entitySchemaName: "Case",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {
            "myEnum": {
                "dataValueType": Terrasoft.DataValueType.ENUM,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "caption": "myEnum"
            },
            "myList": {
                "dataValueType": Terrasoft.DataValueType.ENUM,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "isCollection": true
            }
        },
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "name": "myEnum",
                "values": {
                    "caption": "myEnum",
                    "dataValueType": this.Terrasoft.DataValueType.ENUM,
                    "bindTo": "myEnum",
                    "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
                    "controlConfig": {
                        "className": "Terrasoft.ComboBoxEdit",
                        "list": {
                            "bindTo": "myList"
                        },
                        "change": {
                            "bindTo": "onMyValueChange"
                        },
                        "prepareList": {
                            "bindTo": "prepareMyList"
                        }
                    }
                },
                "parentName": "SolutionTab_gridLayout",
                "propertyName": "items",
                "index": 1
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onPageInitialized: function(callback, scope) {
                if (!this.get("myList")) {
                    this.set("myList", this.Ext.create("Terrasoft.Collection"));
                }
 
                if (callback) {
                    callback.call(scope || this);
                }
            },
            onEntityInitialized: function() {
                this.callParent(arguments);
 
                // and just for debug:
                document.scope = this;
            },
            prepareMyList: function(filter, list) {
                if (list === null) {
                    return;
                }
                list.clear();
                var columns = {};
 
                var value1 = {
                    displayValue: "a123",
                    value: "1"
                };
                var value2 = {
                    displayValue: "b234",
                    value: "2"
                };
                var value3 = {
                    displayValue: "c345",
                    value: "3"
                };
 
                columns[1] = value1;
                columns[2] = value2;
                columns[3] = value3;
 
                list.loadAll(columns);
            },
            onMyValueChange: function(val) {
                if (val && val.displayValue) {
                    console.log("you pick: ", val.displayValue);
                }
            }
        },
        rules: {}
    };
});

 

Нравится

Поделиться

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