Создание задач в рассписании 3.4.1 как в Outlook

Добрый день коллеги!
Как можно доработать wnd_SchedulerArea что бы иметь возможность создания задач в Terrasoft 3.4.1 по аналогии с Outlook.
Выделяем время в Рассписании -> Пишем название задачи -> Задача создается в определенном промежутке времени

Нравится

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

Добрый день!
Посмотрите сюда, пожалуйста, правильно ли я Вас понял?

Здравствуйте, АльфаКрыса!

Для реализации подобной функциональности необходимо отредактировать скрипт 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

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