define("EventTargetDetailV2", ["ServiceHelper", "ProcessModuleUtilities", "EventTargetDetailV2Resources"],
    function (ServiceHelper, ProcessModuleUtilities, resources) {
        return {
            entitySchemaName: "EventTarget",
            messages: {},
            attributes: {
                "IsEditResponseButtonVisible": {
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    value: false
                },
                "EventResponseModalBox": {
                    dataValueType: Terrasoft.DataValueType.LOOKUP,
                    isLookup: true,
                    referenceSchemaName: "EventResponse"
                },
                "NrbEventResponseList": {
                    dataValueType: Terrasoft.DataValueType.COLLECTION,
                    value: Ext.create("Terrasoft.Collection")
                }
            },
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "insert",
                    "parentName": "Detail",
                    "propertyName": "tools",
                    "name": "EditResponseButton",
                    "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "caption": { "bindTo": "Resources.Strings.EditResponseButtonCaption" },
                        "click": { "bindTo": "onEditResponseButtonClick" },
                        "enabled": { "bindTo": "isAnySelected" },
                        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
                    }
                }
            ]/**SCHEMA_DIFF*/,
            methods: {
 
                /*
                 * Обработчик нажатия на кнопку Изменения отклика.
                 */
                onEditResponseButtonClick: function () {
                    this.askUserResponseResultMessage(this.callMassiveChangeResponseEventProcess);
                },
 
                /*
                 * Вызывает Бизнес-процесс обновления отклика в мероприяиях.
                 */
                callMassiveChangeResponseEventProcess: function (resultValueId) {
                    let selectedItems = this.getSelectedItems();
                    if (!Ext.isEmpty(resultValueId) && !Ext.isEmpty(selectedItems)) {
 
                        let selectedItemsJson = JSON.stringify(selectedItems);
 
                        let args = {
                            sysProcessName: "NrbMassiveChangeResponseEvent",
                            parameters: {
                                NrbRecordsId: selectedItemsJson,
                                NrbEventResponseId: resultValueId
                            },
                            callback: function () {
                                this.hideBodyMask();
                                this.reloadGridData();
                            },
                            scope: this
                        };
                        ProcessModuleUtilities.executeProcess(args);
                    };
                },
 
                /*
                 * Показывает диалоговое окно для выбора нового отклика.
                 */
                askUserResponseResultMessage: function (callback) {
                    let controlConfig = {
                        EventResponse: {
                            dataValueType: Terrasoft.DataValueType.ENUM,
                            caption: this.get("Resources.Strings.EventResponseComboBoxCaption"),
                            value: { bindTo: "EventResponseModalBox" },
                            contentType: Terrasoft.ContentType.ENUM,
                            customConfig: {
                                list: { "bindTo": "NrbEventResponseList" },
                            },
                        }
                    };
 
                    let inputBoxCaption = this.get("Resources.Strings.EventResponseInputBoxCaption");
 
                    Terrasoft.utils.inputBox(inputBoxCaption,
                        function (buttonCode, controlData) {
 
                            let resultValueId = this.getLookupValue("EventResponseModalBox");
 
                            this.set("EventResponseModalBox", null);
 
                            if (buttonCode !== "ok") {
                                return;
                            }
 
                            if (Ext.isEmpty(resultValueId)) {
                                let errorMessage = this.get("Resources.Strings.EventResponseInputBoxErrorCaption");
                                this.showInformationDialog(errorMessage, function () {
                                    this.askUserResponseResultMessage();
                                });
                                return;
                            }
                            Ext.callback(callback, this, [resultValueId]);
                        },
                        ["ok", "cancel"],
                        this,
                        controlConfig,
                        { defaultButton: 0 }
                    );
 
                     //Подписка биндингов в диалоговом окне (самое важное)
                    Terrasoft.MessageBox.controlArray.forEach(function (item) {
                        item.control.bind(this);
                    }, this);
                },
            }
        };
    });

 

Нравится

Поделиться

0 комментариев
Показать все комментарии
	var controlConfig = {
		text: {
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "150px",
			},
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Поле 1:",
			value: ""
		},
		costs: {
			customConfig: {
				className: "Terrasoft.FloatEdit",
			},
			dataValueType: Terrasoft.DataValueType.FLOAT,
			caption: "Поле 2:",
			value: { bindTo: "getСosts" }
		}
	};
	Terrasoft.utils.inputBox("Заголовок",
		function(buttonCode, controlData) {
			if (buttonCode === "ok") {
//Что-то делаем
			}
		},
		["ok", "cancel"],
		this,
		controlConfig,
		{defaultButton: 0}
	);

Есть такой код. Не могу заполнить поля value из переменной (атрибута/функции). Подскажите, как правильно забиндиться? Если написать в value какое значение сразу, то все работает, а если попробовать забиндиться, то пусто.

Нравится

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

Добрый день!
Не очень понятен кейс, зачем нужно биндить значения этих полей.
Заполнить их можно при создании объекта controlConfig. Если надо из переменной, то, например так:

costs: {
	customConfig: {
		className: "Terrasoft.FloatEdit",
	},
	dataValueType: Terrasoft.DataValueType.FLOAT,
	caption: "Поле 2:",
	value: this.get("getСosts")
}

 

Добрый день!
Не очень понятен кейс, зачем нужно биндить значения этих полей.
Заполнить их можно при создании объекта controlConfig. Если надо из переменной, то, например так:

costs: {
	customConfig: {
		className: "Terrasoft.FloatEdit",
	},
	dataValueType: Terrasoft.DataValueType.FLOAT,
	caption: "Поле 2:",
	value: this.get("getСosts")
}

 

Сидоров Александр В., спасибо, решение оказалось проще, чем я думал.

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

Всем привет.

Подскажите, как сделать валидацию полей в inputBox?

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

Нравится

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

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

При нажатии на кнопку в «inputBox» срабатывает метод «onButtonClick» с класса «Terrasoft.MessageBox» (можно посмотреть в all-combined.js) который запускает событие «stateChanged». На него можно подписаться и в своей реализации, например, не скрывать окно если поля не заполнены.

 

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

Коллеги, нужна помощь.

В inputBox пытаюсь вывести колонку DateTime.

Сам вывод получился как то вот так:

Terrasoft.utils.inputBox("Make task value", function(result, arg) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		alert(result);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		name: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "77px"
			},
			isRequired: true
		},
		startDate: {
			dataValueType: Terrasoft.DataValueType.DATE_TIME,
			caption: "Start date",
			customConfig: {
				className: "Terrasoft.Container",
				value: {"bindTo" : "startDate"},
				items: [
					{
						className: "Terrasoft.DateEdit",
						id: "newStartDateEdit",
						width: "50%"
					},
					{
						className: "Terrasoft.TimeEdit",
						id: "newStartTimeEdit",
						width: "50%"
					}
				]
		}
	}
}

Выглядит это дело вот так:

 

При клике на кнопку Next закрывается форма и консоль в red-style с содержимым:

Uncaught TypeError: b[c].control.getValue is not a function
    at i.updateCustomControl (all-combined.js:formatted:79169)
    at i.onStateChanged (all-combined.js:formatted:78983)
    at i.fire (all-combined.js:formatted:6223)
    at i.continueFireEvent (all-combined.js:formatted:7144)
    at i.fireEventArgs (all-combined.js:formatted:7129)
    at i.fireEvent (all-combined.js:formatted:7120)
    at i.<anonymous> (all-combined.js:formatted:79078)
    at i.fire (all-combined.js:formatted:6223)
    at i.continueFireEvent (all-combined.js:formatted:7144)
    at i.fireEventArgs (all-combined.js:formatted:7129)

 

Кто сталкивался или кто знает как решить этот вопрос?

Нравится

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

потестил, он пытается взять value контейнера (этого сделать конечно же нельзя). А по другому никак, ибо Date_Time - это по сути контейнер из 2х других контролов. Можно попробовать раздробить

startDate: {
	caption: "Start date",
	dataValueType: Terrasoft.DataValueType.DATE_TIME,
	value: {"bindTo" : "startDate"},
	customConfig: {
		className: "Terrasoft.DateEdit"
	}
},
startTime: {
	caption: "Strat time",
	dataValueType: Terrasoft.DataValueType.DATE_TIME,
	value: {"bindTo" : "startDate"},
	customConfig: {
		className: "Terrasoft.TimeEdit"
	}
}

 

Пробовали, className: "Terrasoft.TimeEdit" напрочь отказывается показывать. В консоли сообщение о том что присутствует недопустимое значение.

В любом случае логика контролов с типами DATE_TIME и TIME фейлятся в inputBox, похоже это деффект платформы:

DATE_TIME

TIME

Господа, не знаю, что у вас там не работает... У меня завелось вот так:

Terrasoft.utils.inputBox("Make task value", function(result, args) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		//alert(result);
		debugger;
		console.log(args);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		kappa: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "80px"
			},
			value: "",
			isRequired: true
		},
		startDate: {
			caption: "Start date",
			dataValueType: Terrasoft.DataValueType.DATE,
			value: new Date(),
			customConfig: {
				className: "Terrasoft.DateEdit"
			}
		},
		endDate: {
			caption: "Start time",
			dataValueType: Terrasoft.DataValueType.TIME,
			value: new Date(),
			customConfig: {
				className: "Terrasoft.TimeEdit"
			}
		}
});

Правды выглядит это всё сомнительно

И значения придётся вытаскивать из args, которые приходят из модуля в коллбеке.

 

ps. 12 часов ночи, чем я, блин, занимаюсь...

Так. всё. я вконец упоролся, но таки сделал.

Хочется передать привет товарищу из террасофта, который лепит затычки в Terrasoft.utils.controls.getControlConfigByDataValueType. Там в свитчере:

    switch (a) {
    case Terrasoft.DataValueType.TEXT:
        b = {
            className: "Terrasoft.TextEdit"
        };
    //тут куча других типов
    //....
    //А для 3х оставшихся сделать поленились
    case Terrasoft.DataValueType.GUID:
    case Terrasoft.DataValueType.DATE_TIME:
    case Terrasoft.DataValueType.BLOB:
        b = null
    }

Ну и то, что в итоге получилось у меня:

Terrasoft.utils.inputBox("Make task value", function(result, args) {
	if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
		//alert(result);
		debugger;
		console.log(args);
	}
}, [{
		className: "Terrasoft.Button",
		caption: "Next",
		returnCode: "yes"
	}, "Cancel"],
	this,
	{
		kappa: {
			dataValueType: Terrasoft.DataValueType.TEXT,
			caption: "Caption",
			customConfig: {
				className: "Terrasoft.MemoEdit",
				height: "80px"
			},
			value: "",
			isRequired: true
		},
		DateTimer: {
			dataValueType: Terrasoft.DataValueType.DATE_TIME,
			caption: "Start date",
			value: new Date(),
			customConfig: {
				className: "Terrasoft.Container",
				getValue: function() {
					//debugger;
					var dateValue = this.items.items[0].value;
					var timeValue = this.items.items[1].value;
					dateValue.setHours(timeValue.getHours());
					dateValue.setMinutes(timeValue.getMinutes());
					return dateValue;
				},
				items: [
					{
						className: "Terrasoft.DateEdit",
						id: "newStartDateEdit",
						value: new Date(),
						width: "50%"
					},
					{
						className: "Terrasoft.TimeEdit",
						id: "newStartTimeEdit",
						value: new Date(),
						width: "50%"
					}
				]
			}
		}
});

 

Варфоломеев Данила, отдельное вам спасибо!)

Кстати, как насчет вывода в InputBox справочных полей (Terrasoft.DataValueType.LOOKUP)
Есть идеи ?
само по себе справочное поле выводится без проблем, но связать его с какой либо схемой у меня не получилось. 

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

Здравствуйте уважаемое сообщество!
Возникла необходимость открывать для пользователя InputBox в котором отображались бы поля типа "Дата и время". Но при попытке реализации, клиентский модуль падает в ошибку.

Попытка реализации:

var controls = {
                        title: {
                            dataValueType: Terrasoft.DataValueType.TEXT,
                            caption: resources.localizableStrings.SxActivityTitleCaption
                        },
                        start: {
                            dataValueType: Terrasoft.DataValueType.DATE_TIME,
                            caption: resources.localizableStrings.SxActivityStartCaption
                        },
                        due: {
                            dataValueType: Terrasoft.DataValueType.DATE_TIME,
                            caption: resources.localizableStrings.SxActivityDueCaption
                        }
                    };
                    Terrasoft.utils.inputBox(
                        resources.localizableStrings.SxUpSaleBoxCaption,
                        this.runUpSaleProcess,
                        ["ok", "cancel"],
                        this,
                        controls,
                        { defaultButton: 0 }
                    );

Ошибка:
Ошибка

Подскажите чего не хватает и как это добавить? Или как можно реализовать задачу?

Нравится

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

Добрый день.

Судя по всему, Вы не указали пространство имен при создании контрола. Коробочные обьявления контролов:

Ext.define("Terrasoft.controls.HtmlEdit", {
extend: "Terrasoft.Container",
alternateClassName: "Terrasoft.HtmlEdit",

В метод должна прийти строка "Terrasoft.controls." или же "Terrasoft".

"Мотков Илья" написал:

Добрый день.

Судя по всему, Вы не указали пространство имен при создании контрола. Коробочные обьявления контролов:

Ext.define("Terrasoft.controls.HtmlEdit", {
extend: "Terrasoft.Container",
alternateClassName: "Terrasoft.HtmlEdit",

В метод должна прийти строка "Terrasoft.controls." или же "Terrasoft".

Прошу прощения не понял, где что указать требуется. Я ведь создаю контролы не нативным Ext. Я использую "Terrasoft.utils.inputBox", куда пятым параметрам передаю объект с описанием контролов.

И вот такой контрол работает. DATE

start: {
          dataValueType: Terrasoft.DataValueType.DATE,
          caption: resources.localizableStrings.SxActivityStartCaption
}

А вот так уже нет. DATE_TIME

start: {
          dataValueType: Terrasoft.DataValueType.DATE_TIME,
          caption: resources.localizableStrings.SxActivityStartCaption
}
Показать все комментарии

Как динамически задавать значение текстового поля в Terrasoft.utils.inputBox, когда он уже открыт?

Нравится

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

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

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

Через Ext.JS можно все :)

var controls = {
	content: {
		customConfig: {
			className: "Terrasoft.MemoEdit",
			height: "200px",
			markerValue: "html-edit"
		},
		dataValueType: Terrasoft.DataValueType.TEXT,
		value: ""
	}
};
Terrasoft.utils.inputBox(
	"Заголовок",
	function(){},
	["ok", "cancel"],
	this,
	controls
);
 
Ext.get("t-comp0-wrap").select("textarea").update("Some text 2")

Выполните в консоли находясь в любой карточке.

Достучаться до компонента и повеситься на его рендер конечно не получится... ну только если "оверрайдить" ашь от самого "Ext.dom.AbstractElement"

Но если вы можете как либо событийно завязаться на показ инпутбокса - то как заменить я показал.

Спасибо :)

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

Подскажите как скорректировать стили, в конкретно взятом случае ширину окна которое показывается по вызову Terrasoft.utils.inputBox
Пример вызова:

Terrasoft.utils.inputBox(
        "Заполните комментарий возврата",
        function(returnCode, controlData) {
                if (returnCode === "ok") {
                                //do something;
                }
        },
        ["ok", "cancel"],
        this,
        {
                content: {
                        customConfig: {
                                className: "Terrasoft.MemoEdit",
                                height: "200px",
                        },
                        dataValueType: Terrasoft.DataValueType.TEXT,
                        value: ""
                }
        },
        {
                defaultButton: 0,
        }
);

Как редактировать стили внутреннего поля инпута - понятно, в свойстве customConfig
Так же я пробовал передавать стили в последнем аргументе вызова в свойстве style
н/п
...
        {
            style: {width: "600px"}    
            defaultButton: 0,
        }
);

Пробовал назначить стиль через свойство classes , в данном случае я предположил что стиль требуется установить "врапперу", т.к. на странице собственно если просматривать элементы, то речь идет о
id="t-comp0-wrap" class="ts-messagebox-box ts-messagebox-border-style-blue ts-messagebox-center-position" style="height: 415px;">

...
        {
            classes: {wrapClassName: "my-custom-class"}
            defaultButton: 0,
        }
);

PS: Так же в исходных кодах найдено несколько примеров где так-же устанавливаются стили для заголовка через captionClassName - но в моем случае так-же стиль для caption-элемента не назначается.

Нравится

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

Добрый день, Илья!

Для реализации данного кейса лучше написать собственный модуль со стилями. Пример использования такого модуля можно подсмотреть по ссылке: https://academy.terrasoft.ua/documents/technic-sdk/7-9/ispolzovanie-pol…

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

Здравствуйте! Подскажите как принудительно поставить поле в фокус?

У меня по действию в разделе открывается inputBox в котором одно текстовое поле. Как его сразу поставить в фокус?

Нравится

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

как-то так

var columnControl = addConditionView.items.getAt(0).getEl();
if (!columnControl.getValue()) {
	columnControl.focus();
}

Не совсем понял как это использовать. inputBox делаю следующим образом:

var config = {
                BarCode: {
                        dataValueType: Terrasoft.DataValueType.TEXT,
                        caption: 'Штрихкод'
                    }
};
Terrasoft.utils.inputBox('Отсканируйте ', callback, ['ok', 'cancel'], this, config,
                    {
                        defaultButton: 0
                    }
);

В Terrasoft.MessageBox.Items лежит только две кнопки "Ок" и "Отмена". Моего текстового поля там нет.

В Terrasoft.MessageBox.controlConfig есть мой BarCode но как его поставить в фокус на открытии inputBox?

Попробуйте в методе Init() напишите следующее

var tb = document.getElementById('textBoxId');
tb.focus()

Ну через DOM объект я сделал просто вот так:

$( document ).ready(function() {
                    $('.barcode input').focus();
                    $('.barcode input').keypress(function (event) {
                        if (event.which == '13') {
                            event.preventDefault();
                            $('span[data-item-marker=ОК]').click();
                        }
                    });
 });

Но решение на мой взгляд не "кошерное". Я думал может можно как-то с помощью дополнительных параметров поля это реализовать.

А в Terrasoft.MessageBox.init не заходит.

Здраствуйте. Зачем такие усложенения. Человеку нужно чтоб в нужном поле после загрузки страницы в нужном поле установился фокус. Та и в вашем методе нужно к тому же подключать внешнюю библиотеку JQuery. Для такой простенькой задачки подключать внешнюю библиотеку, когда это можно сделать "чистым" Javascript, как по мне нецелесообразно

Не после загрузки страницы а после отображения inputBox и в единственном поле. Библиотека JQuery у меня уже была подключена для других целей. Можно сделать и на чистом Javascript тут как-раз разницы никакой.

А в функции Init() не подойдет проставить фокус?

В Terrasoft.MessageBox.init ? Я переопределяю этот метод и туда не заходит процесс выполнения скрипта.

Извините, сразу не понял. Я думал, Вам просто нужно на карточку.

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

Есть в террасофт из скрипта вызвать диалоговое поле ввода данных наподобие inputbox в Visual Basic?

Нравится

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

Здравствуйте, Илья!

Да, есть готовое окно wnd_InputBox:

         var InputBox = Services.GetNewItemByUSI('wnd_InputBox');
         InputBox.ShowModal();
         var InputText = InputBox.Attributes('Value');

спасибо, работает

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