Добрый день коллеги!
Как можно доработать wnd_SchedulerArea что бы иметь возможность создания задач в Terrasoft 3.4.1 по аналогии с Outlook.
Выделяем время в Рассписании -> Пишем название задачи -> Задача создается в определенном промежутке времени
Нравится
Добрый день!
Посмотрите сюда, пожалуйста, правильно ли я Вас понял?
Здравствуйте, АльфаКрыса!
Для реализации подобной функциональности необходимо отредактировать скрипт scr_SchedulerArea следующим образом:
1. В конец функции function Initialize(Window) добавить строки:
[javascript]
ScheduleControl.AllowInplaceEditing = true;
SetObjectEventDispatcher(Self, ScheduleControl, ScheduleControl.UID,
'OnAfterInplaceInsertEvent', 'ScheduleControlOnAfterInplaceInsertEvent');
SetObjectEventDispatcher(Self, ScheduleControl, ScheduleControl.UID,
'OnAfterInplaceEditEvent', 'ScheduleControlOnAfterInplaceEditEvent');
[/javascript]
2. Добавить в блок функций следующие функции:
[javascript]
function CreateContactsInTask(TaskID, WorkflowItemID, OwnerID, ContactInTaskIDs,
IsNotShowMessage) {
var ContactInTaskDataset = GetContactInTaskDataset();
if (Assigned(ContactInTaskIDs)) {
if ((ContactInTaskIDs.length == 1) && (ContactInTaskIDs[0] == OwnerID) &&
(IsEmptyValue(WorkflowItemID))) {
return;
}
if ((IsEmptyValue(WorkflowItemID)) && (!IsNotShowMessage)) {
var mResult =
ShowConfirmationDialog("Добавить контакты, указаные в фильтре, на деталь 'Контакты'?");
if (mResult != wmrYes) {
return;
}
}
for (var i = 0; i < ContactInTaskIDs.length; i++) {
if (OwnerID != ContactInTaskIDs[i]) {
AddContactInTask(ContactInTaskDataset, TaskID,
ContactInTaskIDs[i], false);
}
}
}
ContactInTaskDataset.Close();
}
function GetActualTaskStatusID(StartDate, DueDate) {
var Now = new Date(System.Now());
var StatusID = '{FB10FCB1-DE0E-446D-81E8-A0C456E2C3AB}';
if (GetDateDiff(StartDate, DueDate, 'Minute') < 1440) {
if ((StartDate < Now) && (Now < DueDate)) {
StatusID = '{9E289E42-9A0E-4A9C-A57F-049754310D95}';
} else
if (DueDate < Now) {
StatusID = '{F598ECDB-4EEF-4FA8-9E69-A36B053501E5}';
}
}
return StatusID;
}
[/javascript]
3. Добавить в конец скрипта функцию обработчика события:
[javascript]
function ScheduleControlOnAfterInplaceInsertEvent(ScheduleControl, Caption) {
if (!Caption) {
return;
}
var RecordID = ''
try {
RecordID = Connector.GenGUID();
var TaskDataset = GetSingleItemByCode('ds_Task', 'InplaceInsert');
TaskDataset.Append();
TaskDataset('ID') = RecordID;
TaskDataset('Title') = Caption;
TaskDataset('StartDate') = ScheduleControl.SelectionStart;
TaskDataset('DueDate') = ScheduleControl.SelectionFinish;
TaskDataset('StatusID') = GetActualTaskStatusID(
ScheduleControl.SelectionStart, ScheduleControl.SelectionFinish);
var Minutes = Math.round((ScheduleControl.SelectionFinish -
ScheduleControl.SelectionStart)/1000/60);
TaskDataset('Duration') = Minutes;
TaskDataset('ShowInScheduler') = true;
var OwnerID = GetAttribute(Self, 'OwnerID');
TaskDataset('OwnerID') = OwnerID;
TaskDataset.Post();
var MainWindow = Self.Attributes('MainWindow');
if (MainWindow) {
var ContactInTaskIDs = MainWindow.Attributes('ContactsFilterArray');
if (ContactInTaskIDs) {
CreateContactsInTask(RecordID, null, OwnerID, ContactInTaskIDs, false);
}
}
} finally {
if (RecordID) {
SchedulerArea.EventsDataset.RefreshRecord(RecordID, true);
}
}
}
[/javascript]
Обратите внимание, обработчик в окне при этом привязывать не нужно, иначе событие будет отрабатывать дважды.
После выделения области в расписании следует нажать Enter для того. чтобы приступить к редактированию задачи.
Анна спасибо за божественный код! Все работает Usability x 2