+ Добавить пост
Добрый день коллеги!Как можно доработать wnd_SchedulerArea что бы иметь возможность создания задач в Terrasoft 3.4.1 по аналогии с Outlook. Выделяем время в Рассписании -> Пишем название задачи -> Задача создается в определенном промежутке времени
Нравится
Добрый день! Посмотрите сюда, пожалуйста, правильно ли я Вас понял?
Здравствуйте, АльфаКрыса!
Для реализации подобной функциональности необходимо отредактировать скрипт scr_SchedulerArea следующим образом:
1. В конец функции function Initialize(Window) добавить строки:
ScheduleControl.AllowInplaceEditing = true; SetObjectEventDispatcher(Self, ScheduleControl, ScheduleControl.UID, 'OnAfterInplaceInsertEvent', 'ScheduleControlOnAfterInplaceInsertEvent'); SetObjectEventDispatcher(Self, ScheduleControl, ScheduleControl.UID, 'OnAfterInplaceEditEvent', 'ScheduleControlOnAfterInplaceEditEvent');
2. Добавить в блок функций следующие функции:
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; }
3. Добавить в конец скрипта функцию обработчика события:
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); } } }
Обратите внимание, обработчик в окне при этом привязывать не нужно, иначе событие будет отрабатывать дважды.
После выделения области в расписании следует нажать Enter для того. чтобы приступить к редактированию задачи.
Анна спасибо за божественный код! Все работает Usability x 2